github.com/v2fly/tools@v0.100.0/internal/lsp/cmd/check.go (about)

     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.
     4  
     5  package cmd
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  
    12  	"github.com/v2fly/tools/internal/span"
    13  	errors "golang.org/x/xerrors"
    14  )
    15  
    16  // check implements the check verb for gopls.
    17  type check struct {
    18  	app *Application
    19  }
    20  
    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:
    27  
    28    $ gopls check internal/lsp/cmd/check.go
    29  `)
    30  	f.PrintDefaults()
    31  }
    32  
    33  // Run performs the check on the files specified by args and prints the
    34  // results to stdout.
    35  func (c *check) Run(ctx context.Context, args ...string) error {
    36  	if len(args) == 0 {
    37  		// no files, so no results
    38  		return nil
    39  	}
    40  	checking := map[span.URI]*cmdFile{}
    41  	var uris []span.URI
    42  	// now we ready to kick things off
    43  	conn, err := c.app.connect(ctx)
    44  	if err != nil {
    45  		return err
    46  	}
    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)
    52  		if file.err != nil {
    53  			return file.err
    54  		}
    55  		checking[uri] = file
    56  	}
    57  	if err := conn.diagnoseFiles(ctx, uris); err != nil {
    58  		return err
    59  	}
    60  	conn.Client.filesMu.Lock()
    61  	defer conn.Client.filesMu.Unlock()
    62  
    63  	for _, file := range checking {
    64  		for _, d := range file.diagnostics {
    65  			spn, err := file.mapper.RangeSpan(d.Range)
    66  			if err != nil {
    67  				return errors.Errorf("Could not convert position %v for %q", d.Range, d.Message)
    68  			}
    69  			fmt.Printf("%v: %v\n", spn, d.Message)
    70  		}
    71  	}
    72  	return nil
    73  }