// Copyright 2019 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 cmd import ( "bytes" "context" "flag" "fmt" "net/url" "os" "strings" "golang.org/x/tools/internal/lsp/browser" "golang.org/x/tools/internal/lsp/debug" "golang.org/x/tools/internal/lsp/source" ) // version implements the version command. type version struct { app *Application } func (v *version) Name() string { return "version" } func (v *version) Usage() string { return "" } func (v *version) ShortHelp() string { return "print the gopls version information" } func (v *version) DetailedHelp(f *flag.FlagSet) { fmt.Fprint(f.Output(), ``) f.PrintDefaults() } // Run prints version information to stdout. func (v *version) Run(ctx context.Context, args ...string) error { debug.PrintVersionInfo(ctx, os.Stdout, v.app.verbose(), debug.PlainText) return nil } // bug implements the bug command. type bug struct{} func (b *bug) Name() string { return "bug" } func (b *bug) Usage() string { return "" } func (b *bug) ShortHelp() string { return "report a bug in gopls" } func (b *bug) DetailedHelp(f *flag.FlagSet) { fmt.Fprint(f.Output(), ``) f.PrintDefaults() } const goplsBugPrefix = "x/tools/gopls: " const goplsBugHeader = `ATTENTION: Please answer these questions BEFORE submitting your issue. Thanks! #### What did you do? If possible, provide a recipe for reproducing the error. A complete runnable program is good. A link on play.golang.org is better. A failing unit test is the best. #### What did you expect to see? #### What did you see instead? ` // Run collects some basic information and then prepares an issue ready to // be reported. func (b *bug) Run(ctx context.Context, args ...string) error { buf := &bytes.Buffer{} fmt.Fprint(buf, goplsBugHeader) debug.PrintVersionInfo(ctx, buf, true, debug.Markdown) body := buf.String() title := strings.Join(args, " ") if !strings.HasPrefix(title, goplsBugPrefix) { title = goplsBugPrefix + title } if !browser.Open("https://github.com/golang/go/issues/new?title=" + url.QueryEscape(title) + "&body=" + url.QueryEscape(body)) { fmt.Print("Please file a new issue at golang.org/issue/new using this template:\n\n") fmt.Print(body) } return nil } type apiJSON struct{} func (sj *apiJSON) Name() string { return "api-json" } func (sj *apiJSON) Usage() string { return "" } func (sj *apiJSON) ShortHelp() string { return "print json describing gopls API" } func (sj *apiJSON) DetailedHelp(f *flag.FlagSet) { fmt.Fprint(f.Output(), ``) f.PrintDefaults() } func (sj *apiJSON) Run(ctx context.Context, args ...string) error { fmt.Fprintf(os.Stdout, source.GeneratedAPIJSON) return nil }