blob: 6bdda9e6f5c160dc1e86ff8e00206d288eecaf64 [file] [log] [blame]
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package source
import (
"context"
"go/token"
"path/filepath"
"strings"
"golang.org/x/tools/internal/lsp/protocol"
)
func CodeLens(ctx context.Context, snapshot Snapshot, fh FileHandle) ([]protocol.CodeLens, error) {
f, _, m, _, err := snapshot.View().Session().Cache().ParseGoHandle(fh, ParseFull).Parse(ctx)
if err != nil {
return nil, err
}
const ggDirective = "//go:generate"
for _, c := range f.Comments {
for _, l := range c.List {
if !strings.HasPrefix(l.Text, ggDirective) {
continue
}
fset := snapshot.View().Session().Cache().FileSet()
rng, err := newMappedRange(fset, m, l.Pos(), l.Pos()+token.Pos(len(ggDirective))).Range()
if err != nil {
return nil, err
}
dir := filepath.Dir(fh.Identity().URI.Filename())
return []protocol.CodeLens{
{
Range: rng,
Command: protocol.Command{
Title: "run go generate",
Command: "generate",
Arguments: []interface{}{dir, false},
},
},
{
Range: rng,
Command: protocol.Command{
Title: "run go generate ./...",
Command: "generate",
Arguments: []interface{}{dir, true},
},
},
}, nil
}
}
return nil, nil
}