From b7c4e8db666a8f47e24e2e21dbf8ad2402b93a8a Mon Sep 17 00:00:00 2001 From: Robert van Gent Date: Thu, 25 Oct 2018 10:07:18 -0700 Subject: [PATCH] wire: use multiline errors instead of one single line for errors with traces (google/go-cloud#571) --- internal/wire/analyze.go | 13 +++--- .../MultipleBindings/want/wire_errs.txt | 42 ++++++++++++++++--- .../MultipleMissingInputs/want/wire_errs.txt | 11 +++-- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/internal/wire/analyze.go b/internal/wire/analyze.go index e0e69f8..5b22628 100644 --- a/internal/wire/analyze.go +++ b/internal/wire/analyze.go @@ -141,11 +141,12 @@ dfs: index.Set(curr.t, errAbort) continue } - neededBy := []string{types.TypeString(curr.t, nil)} + sb := new(strings.Builder) + fmt.Fprintf(sb, "no provider found for %s", types.TypeString(curr.t, nil)) for f := curr.up; f != nil; f = f.up { - neededBy = append(neededBy, fmt.Sprintf("%s in %s", types.TypeString(f.t, nil), set.srcMap.At(f.t).(*providerSetSrc).description(fset, f.t))) + fmt.Fprintf(sb, "\nneeded by %s in %s", types.TypeString(f.t, nil), set.srcMap.At(f.t).(*providerSetSrc).description(fset, f.t)) } - ec.add(fmt.Errorf("no provider found for %s", strings.Join(neededBy, ", needed by "))) + ec.add(errors.New(sb.String())) index.Set(curr.t, errAbort) continue case pv.IsProvider(): @@ -445,8 +446,8 @@ func bindingConflictError(fset *token.FileSet, typ types.Type, set *ProviderSet, } else { fmt.Fprintf(sb, set.VarName) } - fmt.Fprintf(sb, " has multiple bindings for %s (", types.TypeString(typ, nil)) - fmt.Fprintf(sb, "current binding: %s", strings.Join(cur.trace(fset, typ), " <- ")) - fmt.Fprintf(sb, "; previous binding: %s", strings.Join(prev.trace(fset, typ), " <- ")) + fmt.Fprintf(sb, " has 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, "previous:\n<- %s", strings.Join(prev.trace(fset, typ), "\n<- ")) return notePosition(fset.Position(set.Pos), errors.New(sb.String())) } diff --git a/internal/wire/testdata/MultipleBindings/want/wire_errs.txt b/internal/wire/testdata/MultipleBindings/want/wire_errs.txt index 56c177e..b9f66dd 100644 --- a/internal/wire/testdata/MultipleBindings/want/wire_errs.txt +++ b/internal/wire/testdata/MultipleBindings/want/wire_errs.txt @@ -1,11 +1,41 @@ -/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo (current binding: provider "provideFooAgain" (/wire_gopath/src/example.com/foo/foo.go:x:y); previous binding: provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) +/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo +current: +<- provider "provideFooAgain" (/wire_gopath/src/example.com/foo/foo.go:x:y) +previous: +<- provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) -/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo (current binding: provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y); previous binding: provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) <- provider set "Set" (/wire_gopath/src/example.com/foo/foo.go:x:y) +/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo +current: +<- provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) +previous: +<- provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) +<- provider set "Set" (/wire_gopath/src/example.com/foo/foo.go:x:y) -/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo (current binding: provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y); previous binding: provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) <- provider set "Set" (/wire_gopath/src/example.com/foo/foo.go:x:y) <- provider set "SuperSet" (/wire_gopath/src/example.com/foo/foo.go:x:y) +/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo +current: +<- provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) +previous: +<- provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) +<- provider set "Set" (/wire_gopath/src/example.com/foo/foo.go:x:y) +<- provider set "SuperSet" (/wire_gopath/src/example.com/foo/foo.go:x:y) -/wire_gopath/src/example.com/foo/foo.go:x:y: SetWithDuplicateBindings has multiple bindings for example.com/foo.Foo (current binding: provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) <- provider set "Set" (/wire_gopath/src/example.com/foo/foo.go:x:y) <- provider set "SuperSet" (/wire_gopath/src/example.com/foo/foo.go:x:y); previous binding: provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) <- provider set "Set" (/wire_gopath/src/example.com/foo/foo.go:x:y) +/wire_gopath/src/example.com/foo/foo.go:x:y: SetWithDuplicateBindings has multiple bindings for example.com/foo.Foo +current: +<- provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) +<- provider set "Set" (/wire_gopath/src/example.com/foo/foo.go:x:y) +<- provider set "SuperSet" (/wire_gopath/src/example.com/foo/foo.go:x:y) +previous: +<- provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) +<- provider set "Set" (/wire_gopath/src/example.com/foo/foo.go:x:y) -/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo (current binding: wire.Value (/wire_gopath/src/example.com/foo/wire.go:x:y); previous binding: provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) +/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Foo +current: +<- wire.Value (/wire_gopath/src/example.com/foo/wire.go:x:y) +previous: +<- provider "provideFoo" (/wire_gopath/src/example.com/foo/foo.go:x:y) -/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Bar (current binding: wire.Bind (/wire_gopath/src/example.com/foo/wire.go:x:y); previous binding: provider "provideBar" (/wire_gopath/src/example.com/foo/foo.go:x:y) \ No newline at end of file +/wire_gopath/src/example.com/foo/wire.go:x:y: wire.Build has multiple bindings for example.com/foo.Bar +current: +<- wire.Bind (/wire_gopath/src/example.com/foo/wire.go:x:y) +previous: +<- provider "provideBar" (/wire_gopath/src/example.com/foo/foo.go:x:y) \ No newline at end of file diff --git a/internal/wire/testdata/MultipleMissingInputs/want/wire_errs.txt b/internal/wire/testdata/MultipleMissingInputs/want/wire_errs.txt index 386de29..0780072 100644 --- a/internal/wire/testdata/MultipleMissingInputs/want/wire_errs.txt +++ b/internal/wire/testdata/MultipleMissingInputs/want/wire_errs.txt @@ -1,7 +1,12 @@ /wire_gopath/src/example.com/foo/wire.go:x:y: inject injectMissingOutputType: no provider found for example.com/foo.Foo, output of injector -/wire_gopath/src/example.com/foo/wire.go:x:y: inject injectMultipleMissingTypes: no provider found for example.com/foo.Foo, needed by example.com/foo.Baz in provider "provideBaz" (/wire_gopath/src/example.com/foo/foo.go:x:y) +/wire_gopath/src/example.com/foo/wire.go:x:y: inject injectMultipleMissingTypes: no provider found for example.com/foo.Foo +needed by example.com/foo.Baz in provider "provideBaz" (/wire_gopath/src/example.com/foo/foo.go:x:y) -/wire_gopath/src/example.com/foo/wire.go:x:y: inject injectMultipleMissingTypes: no provider found for example.com/foo.Bar, needed by example.com/foo.Baz in provider "provideBaz" (/wire_gopath/src/example.com/foo/foo.go:x:y) +/wire_gopath/src/example.com/foo/wire.go:x:y: inject injectMultipleMissingTypes: no provider found for example.com/foo.Bar +needed by example.com/foo.Baz in provider "provideBaz" (/wire_gopath/src/example.com/foo/foo.go:x:y) -/wire_gopath/src/example.com/foo/wire.go:x:y: inject injectMissingRecursiveType: no provider found for example.com/foo.Foo, needed by example.com/foo.Zip in provider "provideZip" (/wire_gopath/src/example.com/foo/foo.go:x:y), needed by example.com/foo.Zap in provider "provideZap" (/wire_gopath/src/example.com/foo/foo.go:x:y), needed by example.com/foo.Zop in provider "provideZop" (/wire_gopath/src/example.com/foo/foo.go:x:y) \ No newline at end of file +/wire_gopath/src/example.com/foo/wire.go:x:y: inject injectMissingRecursiveType: no provider found for example.com/foo.Foo +needed by example.com/foo.Zip in provider "provideZip" (/wire_gopath/src/example.com/foo/foo.go:x:y) +needed by example.com/foo.Zap in provider "provideZap" (/wire_gopath/src/example.com/foo/foo.go:x:y) +needed by example.com/foo.Zop in provider "provideZop" (/wire_gopath/src/example.com/foo/foo.go:x:y) \ No newline at end of file