From f3b4abd806c392ff0bf8566009e750ebc01ae355 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 21 Oct 2016 11:37:54 -0400 Subject: [PATCH] cmd/go: allow 'go generate' even if imports do not resolve Maybe the go generate is generating the imports, or maybe there's some other good reason the code is incomplete. The help text already says: Note that go generate does not parse the file, so lines that look like directives in comments or multiline strings will be treated as directives. We'll still reject Go source files that don't begin with a package statement or have a syntax error in the import block, but those are I think more defensible rejections. Fixes #16307. Change-Id: I4f8496c02fdff993f038adfed2df4db7f067dc06 Reviewed-on: https://go-review.googlesource.com/31659 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/cmd/go/generate.go | 2 ++ src/cmd/go/go_test.go | 14 ++++++++++++++ src/cmd/go/pkg.go | 7 +++++++ src/cmd/go/testdata/src/gencycle/gencycle.go | 5 +++++ 4 files changed, 28 insertions(+) create mode 100644 src/cmd/go/testdata/src/gencycle/gencycle.go diff --git a/src/cmd/go/generate.go b/src/cmd/go/generate.go index d5b955af92..2d92a0c100 100644 --- a/src/cmd/go/generate.go +++ b/src/cmd/go/generate.go @@ -136,6 +136,8 @@ func init() { } func runGenerate(cmd *Command, args []string) { + ignoreImports = true + if generateRunFlag != "" { var err error generateRunRE, err = regexp.Compile(generateRunFlag) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index f445aef5bd..2f883c94df 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -2349,6 +2349,20 @@ func TestGoGenerateEnv(t *testing.T) { } } +func TestGoGenerateBadImports(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("skipping because windows has no echo command") + } + + // This package has an invalid import causing an import cycle, + // but go generate is supposed to still run. + tg := testgo(t) + defer tg.cleanup() + tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata")) + tg.run("generate", "gencycle") + tg.grepStdout("hello world", "go generate gencycle did not run generator") +} + func TestGoGetCustomDomainWildcard(t *testing.T) { testenv.MustHaveExternalNetwork(t) diff --git a/src/cmd/go/pkg.go b/src/cmd/go/pkg.go index a3018bce45..2f5e90faf4 100644 --- a/src/cmd/go/pkg.go +++ b/src/cmd/go/pkg.go @@ -24,6 +24,8 @@ import ( "unicode" ) +var ignoreImports bool // control whether we ignore imports in packages + // A Package describes a single package found in a directory. type Package struct { // Note: These fields are part of the go command's public API. @@ -181,6 +183,11 @@ func (p *Package) copyBuild(pp *build.Package) { p.TestImports = pp.TestImports p.XTestGoFiles = pp.XTestGoFiles p.XTestImports = pp.XTestImports + if ignoreImports { + p.Imports = nil + p.TestImports = nil + p.XTestImports = nil + } } // isStandardImportPath reports whether $GOROOT/src/path should be considered diff --git a/src/cmd/go/testdata/src/gencycle/gencycle.go b/src/cmd/go/testdata/src/gencycle/gencycle.go new file mode 100644 index 0000000000..600afd93e9 --- /dev/null +++ b/src/cmd/go/testdata/src/gencycle/gencycle.go @@ -0,0 +1,5 @@ +//go:generate echo hello world + +package gencycle + +import _ "gencycle" -- 2.48.1