From a8c7c0b8e164d2406753dc15cab3c0ad5c8612b4 Mon Sep 17 00:00:00 2001 From: Robert van Gent Date: Wed, 12 Sep 2018 14:05:54 -0700 Subject: [PATCH] wire: omit the local package identifier if it matches the package name (google/go-cloud#385) Fixes google/go-cloud#424 --- .../testdata/CopyOtherDecls/want/wire_gen.go | 2 +- .../testdata/ExportedValue/want/wire_gen.go | 2 +- .../want/wire_gen.go | 2 +- .../ImportedInterfaceBinding/want/wire_gen.go | 2 +- .../testdata/InterfaceValue/want/wire_gen.go | 4 +-- .../MultipleSimilarPackages/want/wire_gen.go | 8 ++--- .../NamingWorstCaseAllInOne/want/wire_gen.go | 6 ++-- .../wire/testdata/PkgImport/want/wire_gen.go | 2 +- .../wire/testdata/Vendor/want/wire_gen.go | 2 +- internal/wire/wire.go | 29 +++++++++++++------ 10 files changed, 35 insertions(+), 24 deletions(-) diff --git a/internal/wire/testdata/CopyOtherDecls/want/wire_gen.go b/internal/wire/testdata/CopyOtherDecls/want/wire_gen.go index 2e64e56..70c1340 100644 --- a/internal/wire/testdata/CopyOtherDecls/want/wire_gen.go +++ b/internal/wire/testdata/CopyOtherDecls/want/wire_gen.go @@ -6,7 +6,7 @@ package main import ( - fmt "fmt" + "fmt" ) // Injectors from foo.go: diff --git a/internal/wire/testdata/ExportedValue/want/wire_gen.go b/internal/wire/testdata/ExportedValue/want/wire_gen.go index a340ecb..9b504e7 100644 --- a/internal/wire/testdata/ExportedValue/want/wire_gen.go +++ b/internal/wire/testdata/ExportedValue/want/wire_gen.go @@ -6,7 +6,7 @@ package main import ( - bar "example.com/bar" + "example.com/bar" ) // Injectors from wire.go: diff --git a/internal/wire/testdata/ExportedValueDifferentPackage/want/wire_gen.go b/internal/wire/testdata/ExportedValueDifferentPackage/want/wire_gen.go index 859ffea..98574e6 100644 --- a/internal/wire/testdata/ExportedValueDifferentPackage/want/wire_gen.go +++ b/internal/wire/testdata/ExportedValueDifferentPackage/want/wire_gen.go @@ -6,7 +6,7 @@ package main import ( - os "os" + "os" ) // Injectors from wire.go: diff --git a/internal/wire/testdata/ImportedInterfaceBinding/want/wire_gen.go b/internal/wire/testdata/ImportedInterfaceBinding/want/wire_gen.go index 02f1b22..420770b 100644 --- a/internal/wire/testdata/ImportedInterfaceBinding/want/wire_gen.go +++ b/internal/wire/testdata/ImportedInterfaceBinding/want/wire_gen.go @@ -6,7 +6,7 @@ package main import ( - foo "example.com/foo" + "example.com/foo" ) // Injectors from wire.go: diff --git a/internal/wire/testdata/InterfaceValue/want/wire_gen.go b/internal/wire/testdata/InterfaceValue/want/wire_gen.go index 6b69e22..376bd01 100644 --- a/internal/wire/testdata/InterfaceValue/want/wire_gen.go +++ b/internal/wire/testdata/InterfaceValue/want/wire_gen.go @@ -6,8 +6,8 @@ package main import ( - io "io" - strings "strings" + "io" + "strings" ) // Injectors from wire.go: diff --git a/internal/wire/testdata/MultipleSimilarPackages/want/wire_gen.go b/internal/wire/testdata/MultipleSimilarPackages/want/wire_gen.go index d564706..26ad830 100644 --- a/internal/wire/testdata/MultipleSimilarPackages/want/wire_gen.go +++ b/internal/wire/testdata/MultipleSimilarPackages/want/wire_gen.go @@ -6,10 +6,10 @@ package main import ( - bar "example.com/bar" - baz "example.com/baz" - foo "example.com/foo" - fmt "fmt" + "example.com/bar" + "example.com/baz" + "example.com/foo" + "fmt" ) // Injectors from wire.go: diff --git a/internal/wire/testdata/NamingWorstCaseAllInOne/want/wire_gen.go b/internal/wire/testdata/NamingWorstCaseAllInOne/want/wire_gen.go index 0f647cb..b1ea251 100644 --- a/internal/wire/testdata/NamingWorstCaseAllInOne/want/wire_gen.go +++ b/internal/wire/testdata/NamingWorstCaseAllInOne/want/wire_gen.go @@ -7,9 +7,9 @@ package main import ( context2 "context" - fmt "fmt" - os "os" - reflect "reflect" + "fmt" + "os" + "reflect" ) // Injectors from foo.go: diff --git a/internal/wire/testdata/PkgImport/want/wire_gen.go b/internal/wire/testdata/PkgImport/want/wire_gen.go index be14076..bebce37 100644 --- a/internal/wire/testdata/PkgImport/want/wire_gen.go +++ b/internal/wire/testdata/PkgImport/want/wire_gen.go @@ -6,7 +6,7 @@ package main import ( - bar "example.com/bar" + "example.com/bar" ) // Injectors from wire.go: diff --git a/internal/wire/testdata/Vendor/want/wire_gen.go b/internal/wire/testdata/Vendor/want/wire_gen.go index 605d593..3202b15 100644 --- a/internal/wire/testdata/Vendor/want/wire_gen.go +++ b/internal/wire/testdata/Vendor/want/wire_gen.go @@ -6,7 +6,7 @@ package main import ( - bar "example.com/bar" + "example.com/bar" ) // Injectors from wire.go: diff --git a/internal/wire/wire.go b/internal/wire/wire.go index 3b0d873..0204fde 100644 --- a/internal/wire/wire.go +++ b/internal/wire/wire.go @@ -134,11 +134,18 @@ func copyNonInjectorDecls(g *gen, files []*ast.File, info *types.Info) { } } +// importInfo holds info about an import. +type importInfo struct { + name string + // fullpath is the full, possibly vendored, path. + fullpath string +} + // gen is the file-wide generator state. type gen struct { currPackage string buf bytes.Buffer - imports map[string]string + imports map[string]*importInfo values map[ast.Expr]string prog *loader.Program // for positions and determining package names } @@ -146,7 +153,7 @@ type gen struct { func newGen(prog *loader.Program, pkg string) *gen { return &gen{ currPackage: pkg, - imports: make(map[string]string), + imports: make(map[string]*importInfo), values: make(map[ast.Expr]string), prog: prog, } @@ -172,9 +179,13 @@ func (g *gen) frame() []byte { } sort.Strings(imps) for _, path := range imps { - // TODO(light): Omit the local package identifier if it matches - // the package name. - fmt.Fprintf(&buf, "\t%s %q\n", g.imports[path], path) + // Omit the local package identifier if it matches the package name. + info := g.imports[path] + if g.prog.Package(info.fullpath).Pkg.Name() == info.name { + fmt.Fprintf(&buf, "\t%q\n", path) + } else { + fmt.Fprintf(&buf, "\t%s %q\n", info.name, path) + } } buf.WriteString(")\n\n") } @@ -414,21 +425,21 @@ func (g *gen) qualifyImport(path string) string { if i := strings.LastIndex(path, vendorPart); i != -1 && (i == 0 || path[i-1] == '/') { unvendored = path[i+len(vendorPart):] } - if name := g.imports[unvendored]; name != "" { - return name + if info := g.imports[unvendored]; info != nil { + return info.name } // TODO(light): Use parts of import path to disambiguate. name := disambiguate(g.prog.Package(path).Pkg.Name(), func(n string) bool { // Don't let an import take the "err" name. That's annoying. return n == "err" || g.nameInFileScope(n) }) - g.imports[unvendored] = name + g.imports[unvendored] = &importInfo{name: name, fullpath: path} return name } func (g *gen) nameInFileScope(name string) bool { for _, other := range g.imports { - if other == name { + if other.name == name { return true } }