From 3a3760180dfddb250a108d3cc871b6eaa2ffc362 Mon Sep 17 00:00:00 2001 From: Robert van Gent Date: Thu, 2 Aug 2018 14:00:17 -0700 Subject: [PATCH] wire: fill in ProviderSet.VarName when the set is a package variable (google/go-cloud#279) Rename ProviderSet.Name to ProviderSet.VarName. Fixes google/go-cloud#277 --- cmd/wire/main.go | 4 ++-- internal/wire/analyze.go | 8 ++++---- internal/wire/parse.go | 17 +++++++++-------- internal/wire/testdata/UnusedProviders/out.txt | 2 +- internal/wire/wire.go | 2 +- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/cmd/wire/main.go b/cmd/wire/main.go index 9011e98..742bad5 100644 --- a/cmd/wire/main.go +++ b/cmd/wire/main.go @@ -217,8 +217,8 @@ func gather(info *wire.Info, key wire.ProviderSetID) (_ []outGroup, imports map[ continue } visited[curr] = struct{}{} - if curr.Name != "" && !(curr.PkgPath == key.ImportPath && curr.Name == key.VarName) { - imports[formatProviderSetName(curr.PkgPath, curr.Name)] = struct{}{} + if curr.VarName != "" && !(curr.PkgPath == key.ImportPath && curr.VarName == key.VarName) { + imports[formatProviderSetName(curr.PkgPath, curr.VarName)] = struct{}{} } for _, imp := range curr.Imports { next = append(next, imp) diff --git a/internal/wire/analyze.go b/internal/wire/analyze.go index 19c5d87..48f4db9 100644 --- a/internal/wire/analyze.go +++ b/internal/wire/analyze.go @@ -248,10 +248,10 @@ func verifyArgsUsed(set *ProviderSet, used []*providerSetSrc) []error { } } if !found { - if imp.Name == "" { + if imp.VarName == "" { errs = append(errs, errors.New("unused provider set")) } else { - errs = append(errs, fmt.Errorf("unused provider set %q", imp.Name)) + errs = append(errs, fmt.Errorf("unused provider set %q", imp.VarName)) } } } @@ -429,12 +429,12 @@ func verifyAcyclic(providerMap *typeutil.Map, hasher typeutil.Hasher) []error { func bindingConflictError(fset *token.FileSet, pos token.Pos, typ types.Type, prevSet *ProviderSet) error { typString := types.TypeString(typ, nil) var err error - if prevSet.Name == "" { + if prevSet.VarName == "" { err = fmt.Errorf("multiple bindings for %s (previous binding at %v)", typString, fset.Position(prevSet.Pos)) } else { err = fmt.Errorf("multiple bindings for %s (previous binding in %q.%s)", - typString, prevSet.PkgPath, prevSet.Name) + typString, prevSet.PkgPath, prevSet.VarName) } return notePosition(fset.Position(pos), err) } diff --git a/internal/wire/parse.go b/internal/wire/parse.go index 87b7928..1d014f4 100644 --- a/internal/wire/parse.go +++ b/internal/wire/parse.go @@ -46,9 +46,9 @@ type ProviderSet struct { Pos token.Pos // PkgPath is the import path of the package that declared this set. PkgPath string - // Name is the variable name of the set, if it came from a package + // VarName is the variable name of the set, if it came from a package // variable. - Name string + VarName string Providers []*Provider Bindings []*IfaceBinding @@ -202,7 +202,7 @@ func Load(bctx *build.Context, wd string, pkgs []string) (*Info, []error) { if buildCall == nil { continue } - set, errs := oc.processNewSet(pkgInfo, buildCall) + set, errs := oc.processNewSet(pkgInfo, buildCall, "") if len(errs) > 0 { ec.add(notePositionAll(prog.Fset.Position(fn.Pos()), errs)...) continue @@ -393,7 +393,7 @@ func (oc *objectCache) get(obj types.Object) (val interface{}, errs []error) { break } } - return oc.processExpr(oc.prog.Package(obj.Pkg().Path()), spec.Values[i]) + return oc.processExpr(oc.prog.Package(obj.Pkg().Path()), spec.Values[i], obj.Name()) case *types.Func: return processFuncProvider(oc.prog.Fset, obj) default: @@ -424,7 +424,7 @@ func (oc *objectCache) varDecl(obj *types.Var) *ast.ValueSpec { // processExpr converts an expression into a Wire structure. It may // return a *Provider, a structProviderPair, an *IfaceBinding, a // *ProviderSet, or a *Value. -func (oc *objectCache) processExpr(pkg *loader.PackageInfo, expr ast.Expr) (interface{}, []error) { +func (oc *objectCache) processExpr(pkg *loader.PackageInfo, expr ast.Expr, varName string) (interface{}, []error) { exprPos := oc.prog.Fset.Position(expr.Pos()) expr = astutil.Unparen(expr) if obj := qualifiedIdentObject(&pkg.Info, expr); obj != nil { @@ -440,7 +440,7 @@ func (oc *objectCache) processExpr(pkg *loader.PackageInfo, expr ast.Expr) (inte } switch fnObj.Name() { case "NewSet": - pset, errs := oc.processNewSet(pkg, call) + pset, errs := oc.processNewSet(pkg, call, varName) return pset, notePositionAll(exprPos, errs) case "Bind": b, err := processBind(oc.prog.Fset, &pkg.Info, call) @@ -476,16 +476,17 @@ type structProviderPair struct { ptrProvider *Provider } -func (oc *objectCache) processNewSet(pkg *loader.PackageInfo, call *ast.CallExpr) (*ProviderSet, []error) { +func (oc *objectCache) processNewSet(pkg *loader.PackageInfo, call *ast.CallExpr, varName string) (*ProviderSet, []error) { // Assumes that call.Fun is wire.NewSet or wire.Build. pset := &ProviderSet{ Pos: call.Pos(), PkgPath: pkg.Pkg.Path(), + VarName: varName, } ec := new(errorCollector) for _, arg := range call.Args { - item, errs := oc.processExpr(pkg, arg) + item, errs := oc.processExpr(pkg, arg, "") if len(errs) > 0 { ec.add(errs...) continue diff --git a/internal/wire/testdata/UnusedProviders/out.txt b/internal/wire/testdata/UnusedProviders/out.txt index 3c1af1e..08a452d 100644 --- a/internal/wire/testdata/UnusedProviders/out.txt +++ b/internal/wire/testdata/UnusedProviders/out.txt @@ -1,5 +1,5 @@ ERROR -unused provider set +unused provider set "unusedSet" unused provider "provideUnused" unused value of type string unused interface binding to type foo.Fooer diff --git a/internal/wire/wire.go b/internal/wire/wire.go index b7a0596..be08875 100644 --- a/internal/wire/wire.go +++ b/internal/wire/wire.go @@ -86,7 +86,7 @@ func generateInjectors(g *gen, pkgInfo *loader.PackageInfo) (injectorFiles []*as g.p("// Injectors from %s:\n\n", name) injectorFiles = append(injectorFiles, f) } - set, errs := oc.processNewSet(pkgInfo, buildCall) + set, errs := oc.processNewSet(pkgInfo, buildCall, "") if len(errs) > 0 { ec.add(notePositionAll(g.prog.Fset.Position(fn.Pos()), errs)...) continue