golang.org/x/tools/gopls@v0.15.3/internal/cmd/format.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 "golang.org/x/tools/gopls/internal/protocol" 13 ) 14 15 // format implements the format verb for gopls. 16 type format struct { 17 EditFlags 18 app *Application 19 } 20 21 func (c *format) Name() string { return "format" } 22 func (c *format) Parent() string { return c.app.Name() } 23 func (c *format) Usage() string { return "[format-flags] <filerange>" } 24 func (c *format) ShortHelp() string { return "format the code according to the go standard" } 25 func (c *format) DetailedHelp(f *flag.FlagSet) { 26 fmt.Fprint(f.Output(), ` 27 The arguments supplied may be simple file names, or ranges within files. 28 29 Example: reformat this file: 30 31 $ gopls format -w internal/cmd/check.go 32 33 format-flags: 34 `) 35 printFlagDefaults(f) 36 } 37 38 // Run performs the check on the files specified by args and prints the 39 // results to stdout. 40 func (c *format) Run(ctx context.Context, args ...string) error { 41 if len(args) == 0 { 42 return nil 43 } 44 c.app.editFlags = &c.EditFlags 45 conn, err := c.app.connect(ctx, nil) 46 if err != nil { 47 return err 48 } 49 defer conn.terminate(ctx) 50 for _, arg := range args { 51 spn := parseSpan(arg) 52 file, err := conn.openFile(ctx, spn.URI()) 53 if err != nil { 54 return err 55 } 56 loc, err := file.spanLocation(spn) 57 if err != nil { 58 return err 59 } 60 if loc.Range.Start != loc.Range.End { 61 return fmt.Errorf("only full file formatting supported") 62 } 63 p := protocol.DocumentFormattingParams{ 64 TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI}, 65 } 66 edits, err := conn.Formatting(ctx, &p) 67 if err != nil { 68 return fmt.Errorf("%v: %v", spn, err) 69 } 70 if err := applyTextEdits(file.mapper, edits, c.app.editFlags); err != nil { 71 return err 72 } 73 } 74 return nil 75 }