wire: improve error for a provider set with a binding but no corresponding provider (#126)

Fixes #113
This commit is contained in:
Robert van Gent
2019-02-11 08:58:30 -08:00
committed by Ross Light
parent b869afc095
commit d810929d49
6 changed files with 17 additions and 17 deletions

View File

@@ -353,9 +353,11 @@ func buildProviderMap(fset *token.FileSet, hasher typeutil.Hasher, set *Provider
} }
concrete := providerMap.At(b.Provided) concrete := providerMap.At(b.Provided)
if concrete == nil { if concrete == nil {
pos := fset.Position(b.Pos) setName := set.VarName
typ := types.TypeString(b.Provided, nil) if setName == "" {
ec.add(notePosition(pos, fmt.Errorf("no binding for %s", typ))) setName = "provider set"
}
ec.add(notePosition(fset.Position(b.Pos), fmt.Errorf("wire.Bind of concrete type %q to interface %q, but %s does not include a provider for %q", b.Provided, b.Iface, setName, b.Provided)))
continue continue
} }
providerMap.Set(b.Iface, concrete) providerMap.Set(b.Iface, concrete)
@@ -438,12 +440,10 @@ func verifyAcyclic(providerMap *typeutil.Map, hasher typeutil.Hasher) []error {
// for the same output type. // for the same output type.
func bindingConflictError(fset *token.FileSet, typ types.Type, set *ProviderSet, cur, prev *providerSetSrc) error { func bindingConflictError(fset *token.FileSet, typ types.Type, set *ProviderSet, cur, prev *providerSetSrc) error {
sb := new(strings.Builder) sb := new(strings.Builder)
if set.VarName == "" { if set.VarName != "" {
fmt.Fprintf(sb, "wire.Build") fmt.Fprintf(sb, "%s has ", set.VarName)
} else {
fmt.Fprintf(sb, set.VarName)
} }
fmt.Fprintf(sb, " has multiple bindings for %s\n", types.TypeString(typ, nil)) fmt.Fprintf(sb, "multiple bindings for %s\n", types.TypeString(typ, nil))
fmt.Fprintf(sb, "current:\n<- %s\n", strings.Join(cur.trace(fset, typ), "\n<- ")) fmt.Fprintf(sb, "current:\n<- %s\n", strings.Join(cur.trace(fset, typ), "\n<- "))
fmt.Fprintf(sb, "previous:\n<- %s", strings.Join(prev.trace(fset, typ), "\n<- ")) fmt.Fprintf(sb, "previous:\n<- %s", strings.Join(prev.trace(fset, typ), "\n<- "))
return notePosition(fset.Position(set.Pos), errors.New(sb.String())) return notePosition(fset.Position(set.Pos), errors.New(sb.String()))

View File

@@ -1,4 +1,4 @@
example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo example.com/foo/wire.go:x:y: multiple bindings for example.com/foo.Foo
current: current:
<- provider "provideFoo" (example.com/foo/foo.go:x:y) <- provider "provideFoo" (example.com/foo/foo.go:x:y)
<- provider set "Set" (example.com/foo/foo.go:x:y) <- provider set "Set" (example.com/foo/foo.go:x:y)

View File

@@ -1,4 +1,4 @@
example.com/foo/wire.go:x:y: wire.Build has multiple bindings for string example.com/foo/wire.go:x:y: multiple bindings for string
current: current:
<- argument b to injector function inject (example.com/foo/wire.go:x:y) <- argument b to injector function inject (example.com/foo/wire.go:x:y)
previous: previous:

View File

@@ -1,17 +1,17 @@
example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo example.com/foo/wire.go:x:y: multiple bindings for example.com/foo.Foo
current: current:
<- provider "provideFooAgain" (example.com/foo/foo.go:x:y) <- provider "provideFooAgain" (example.com/foo/foo.go:x:y)
previous: previous:
<- provider "provideFoo" (example.com/foo/foo.go:x:y) <- provider "provideFoo" (example.com/foo/foo.go:x:y)
example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo example.com/foo/wire.go:x:y: multiple bindings for example.com/foo.Foo
current: current:
<- provider "provideFoo" (example.com/foo/foo.go:x:y) <- provider "provideFoo" (example.com/foo/foo.go:x:y)
previous: previous:
<- provider "provideFoo" (example.com/foo/foo.go:x:y) <- provider "provideFoo" (example.com/foo/foo.go:x:y)
<- provider set "Set" (example.com/foo/foo.go:x:y) <- provider set "Set" (example.com/foo/foo.go:x:y)
example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo example.com/foo/wire.go:x:y: multiple bindings for example.com/foo.Foo
current: current:
<- provider "provideFoo" (example.com/foo/foo.go:x:y) <- provider "provideFoo" (example.com/foo/foo.go:x:y)
previous: previous:
@@ -28,13 +28,13 @@ previous:
<- provider "provideFoo" (example.com/foo/foo.go:x:y) <- provider "provideFoo" (example.com/foo/foo.go:x:y)
<- provider set "Set" (example.com/foo/foo.go:x:y) <- provider set "Set" (example.com/foo/foo.go:x:y)
example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo example.com/foo/wire.go:x:y: multiple bindings for example.com/foo.Foo
current: current:
<- wire.Value (example.com/foo/wire.go:x:y) <- wire.Value (example.com/foo/wire.go:x:y)
previous: previous:
<- provider "provideFoo" (example.com/foo/foo.go:x:y) <- provider "provideFoo" (example.com/foo/foo.go:x:y)
example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Bar example.com/foo/wire.go:x:y: multiple bindings for example.com/foo.Bar
current: current:
<- wire.Bind (example.com/foo/wire.go:x:y) <- wire.Bind (example.com/foo/wire.go:x:y)
previous: previous:

View File

@@ -1 +1 @@
example.com/foo/foo.go:x:y: no binding for *example.com/foo.foo example.com/foo/foo.go:x:y: wire.Bind of concrete type "*example.com/foo.foo" to interface "example.com/foo.fooer", but setB does not include a provider for "*example.com/foo.foo"

View File

@@ -276,7 +276,7 @@ func (g *gen) frame() []byte {
if len(g.anonImports) > 0 { if len(g.anonImports) > 0 {
buf.WriteString("import (\n") buf.WriteString("import (\n")
anonImps := make([]string, 0, len(g.anonImports)) anonImps := make([]string, 0, len(g.anonImports))
for path, _ := range g.anonImports { for path := range g.anonImports {
anonImps = append(anonImps, path) anonImps = append(anonImps, path)
} }
sort.Strings(anonImps) sort.Strings(anonImps)