1 // Copyright 2019 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
12 "golang.org/x/tools/internal/span"
13 errors "golang.org/x/xerrors"
16 // check implements the check verb for gopls.
21 func (c *check) Name() string { return "check" }
22 func (c *check) Usage() string { return "<filename>" }
23 func (c *check) ShortHelp() string { return "show diagnostic results for the specified file" }
24 func (c *check) DetailedHelp(f *flag.FlagSet) {
25 fmt.Fprint(f.Output(), `
26 Example: show the diagnostic results of this file:
28 $ gopls check internal/lsp/cmd/check.go
33 // Run performs the check on the files specified by args and prints the
35 func (c *check) Run(ctx context.Context, args ...string) error {
37 // no files, so no results
40 checking := map[span.URI]*cmdFile{}
42 // now we ready to kick things off
43 conn, err := c.app.connect(ctx)
47 defer conn.terminate(ctx)
48 for _, arg := range args {
49 uri := span.URIFromPath(arg)
50 uris = append(uris, uri)
51 file := conn.AddFile(ctx, uri)
57 if err := conn.diagnoseFiles(ctx, uris); err != nil {
60 conn.Client.filesMu.Lock()
61 defer conn.Client.filesMu.Unlock()
63 for _, file := range checking {
64 for _, d := range file.diagnostics {
65 spn, err := file.mapper.RangeSpan(d.Range)
67 return errors.Errorf("Could not convert position %v for %q", d.Range, d.Message)
69 fmt.Printf("%v: %v\n", spn, d.Message)