github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/imports/forward.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 imports implements a Go pretty-printer (like package "go/format") 6 // that also adds or removes import statements as necessary. 7 package imports // import "golang.org/x/tools/imports" 8 9 import ( 10 "io/ioutil" 11 "log" 12 13 "golang.org/x/tools/internal/gocommand" 14 intimp "golang.org/x/tools/internal/imports" 15 ) 16 17 // Options specifies options for processing files. 18 type Options struct { 19 Fragment bool // Accept fragment of a source file (no package statement) 20 AllErrors bool // Report all errors (not just the first 10 on different lines) 21 22 Comments bool // Print comments (true if nil *Options provided) 23 TabIndent bool // Use tabs for indent (true if nil *Options provided) 24 TabWidth int // Tab width (8 if nil *Options provided) 25 26 FormatOnly bool // Disable the insertion and deletion of imports 27 } 28 29 // Debug controls verbose logging. 30 var Debug = false 31 32 // LocalPrefix is a comma-separated string of import path prefixes, which, if 33 // set, instructs Process to sort the import paths with the given prefixes 34 // into another group after 3rd-party packages. 35 var LocalPrefix string 36 37 // Process formats and adjusts imports for the provided file. 38 // If opt is nil the defaults are used, and if src is nil the source 39 // is read from the filesystem. 40 // 41 // Note that filename's directory influences which imports can be chosen, 42 // so it is important that filename be accurate. 43 // To process data “as if” it were in filename, pass the data as a non-nil src. 44 func Process(filename string, src []byte, opt *Options) ([]byte, error) { 45 var err error 46 if src == nil { 47 src, err = ioutil.ReadFile(filename) 48 if err != nil { 49 return nil, err 50 } 51 } 52 if opt == nil { 53 opt = &Options{Comments: true, TabIndent: true, TabWidth: 8} 54 } 55 intopt := &intimp.Options{ 56 Env: &intimp.ProcessEnv{ 57 GocmdRunner: &gocommand.Runner{}, 58 }, 59 LocalPrefix: LocalPrefix, 60 AllErrors: opt.AllErrors, 61 Comments: opt.Comments, 62 FormatOnly: opt.FormatOnly, 63 Fragment: opt.Fragment, 64 TabIndent: opt.TabIndent, 65 TabWidth: opt.TabWidth, 66 } 67 if Debug { 68 intopt.Env.Logf = log.Printf 69 } 70 return intimp.Process(filename, src, intopt) 71 } 72 73 // VendorlessPath returns the devendorized version of the import path ipath. 74 // For example, VendorlessPath("foo/bar/vendor/a/b") returns "a/b". 75 func VendorlessPath(ipath string) string { 76 return intimp.VendorlessPath(ipath) 77 }