diff options
author | Michael Matloob <matloob@golang.org> | 2019-12-05 14:37:23 -0500 |
---|---|---|
committer | Michael Matloob <matloob@golang.org> | 2019-12-11 18:27:46 +0000 |
commit | 0d087302095d5a67b68da7330cad27b122905472 (patch) | |
tree | bcf01109aef405880e049590f26377ef5e5615ff /go/packages/packages_test.go | |
parent | 912f50adde0ebdacca1c0cd288f88b18b645f731 (diff) | |
download | golang-x-tools-0d087302095d5a67b68da7330cad27b122905472.tar.gz |
go/packages: add import stack to error messages when there's an import cycle
This amends the error message to add the import stack for import cycle
error messages. The information in structured in the go list error, but there's
no good place to put the information in the go/packages error.
One alternative is to add the import stack field to go/packages's error type,
but we can always do that later if necessary.
Change-Id: I5ea25e4cafd23d69d5589dd2430f39ece70173f7
Reviewed-on: https://go-review.googlesource.com/c/tools/+/210079
Run-TryBot: Michael Matloob <matloob@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
Diffstat (limited to 'go/packages/packages_test.go')
-rw-r--r-- | go/packages/packages_test.go | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/go/packages/packages_test.go b/go/packages/packages_test.go index 43f20c85c..5d286e900 100644 --- a/go/packages/packages_test.go +++ b/go/packages/packages_test.go @@ -2556,6 +2556,36 @@ func TestLoadModeStrings(t *testing.T) { } } +func TestCycleImportStack(t *testing.T) { + packagestest.TestAll(t, testCycleImportStack) +} +func testCycleImportStack(t *testing.T, exporter packagestest.Exporter) { + exported := packagestest.Export(t, exporter, []packagestest.Module{{ + Name: "golang.org/fake", + Files: map[string]interface{}{ + "a/a.go": `package a; import _ "golang.org/fake/b"`, + "b/b.go": `package b; import _ "golang.org/fake/a"`, + }}}) + defer exported.Cleanup() + + exported.Config.Mode = packages.NeedName | packages.NeedImports + pkgs, err := packages.Load(exported.Config, "golang.org/fake/a") + if err != nil { + t.Fatal(err) + } + if len(pkgs) != 1 { + t.Fatalf("Expected 1 package, got %v", pkgs) + } + pkg := pkgs[0] + if len(pkg.Errors) != 1 { + t.Fatalf("Expected one error in package, got %v", pkg.Errors) + } + expected := "import cycle not allowed: import stack: [golang.org/fake/a golang.org/fake/b golang.org/fake/a]" + if pkg.Errors[0].Msg != expected { + t.Fatalf("Expected error %q, got %q", expected, pkg.Errors[0].Msg) + } +} + func errorMessages(errors []packages.Error) []string { var msgs []string for _, err := range errors { |