1
0
mirror of https://github.com/golang/go synced 2024-11-06 00:26:11 -07:00
go/internal/lsp/mod/code_lens.go
Rohan Challa bc664416c6 internal/lsp: fix error handling when getting go.mod codelens
This change has a fix for mod/codelens: check if we get an error from ParseModHandles().Upgrades(). This change also only runs codelens on save.

Change-Id: I6dab7ddf3a08c650e4c670b039b1e99153ec8187
Reviewed-on: https://go-review.googlesource.com/c/tools/+/219478
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
Run-TryBot: Rohan Challa <rohan@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
2020-02-14 19:54:16 +00:00

69 lines
1.7 KiB
Go

package mod
import (
"context"
"fmt"
"golang.org/x/tools/internal/lsp/protocol"
"golang.org/x/tools/internal/lsp/source"
"golang.org/x/tools/internal/lsp/telemetry"
"golang.org/x/tools/internal/span"
"golang.org/x/tools/internal/telemetry/trace"
)
func CodeLens(ctx context.Context, snapshot source.Snapshot, uri span.URI) ([]protocol.CodeLens, error) {
realURI, _ := snapshot.View().ModFiles()
// Check the case when the tempModfile flag is turned off.
if realURI == "" {
return nil, nil
}
// Only get code lens on the go.mod for the view.
if uri != realURI {
return nil, nil
}
ctx, done := trace.StartSpan(ctx, "mod.CodeLens", telemetry.File.Of(realURI))
defer done()
pmh, err := snapshot.ParseModHandle(ctx)
if err != nil {
return nil, err
}
f, m, upgrades, err := pmh.Upgrades(ctx)
if err != nil {
return nil, err
}
var codelens []protocol.CodeLens
for _, req := range f.Require {
dep := req.Mod.Path
latest, ok := upgrades[dep]
if !ok {
continue
}
// Get the range of the require directive.
s, e := req.Syntax.Start, req.Syntax.End
line, col, err := m.Converter.ToPosition(s.Byte)
if err != nil {
return nil, err
}
start := span.NewPoint(line, col, s.Byte)
line, col, err = m.Converter.ToPosition(e.Byte)
if err != nil {
return nil, err
}
end := span.NewPoint(line, col, e.Byte)
rng, err := m.Range(span.New(uri, start, end))
if err != nil {
return nil, err
}
codelens = append(codelens, protocol.CodeLens{
Range: rng,
Command: protocol.Command{
Title: fmt.Sprintf("Upgrade dependency to %s", latest),
Command: "upgrade.dependency",
Arguments: []interface{}{uri, dep},
},
})
}
return codelens, err
}