diff options
Diffstat (limited to 'src/cmd/vet')
-rw-r--r-- | src/cmd/vet/main.go | 10 | ||||
-rw-r--r-- | src/cmd/vet/testdata/stdversion/go.mod | 3 | ||||
-rw-r--r-- | src/cmd/vet/testdata/stdversion/stdversion.go | 5 | ||||
-rw-r--r-- | src/cmd/vet/vet_test.go | 31 |
4 files changed, 49 insertions, 0 deletions
diff --git a/src/cmd/vet/main.go b/src/cmd/vet/main.go index c5197284b5..eff82dcc71 100644 --- a/src/cmd/vet/main.go +++ b/src/cmd/vet/main.go @@ -6,6 +6,8 @@ package main import ( "cmd/internal/objabi" + "cmd/internal/telemetry" + "flag" "golang.org/x/tools/go/analysis/unitchecker" @@ -32,6 +34,7 @@ import ( "golang.org/x/tools/go/analysis/passes/sigchanyzer" "golang.org/x/tools/go/analysis/passes/slog" "golang.org/x/tools/go/analysis/passes/stdmethods" + "golang.org/x/tools/go/analysis/passes/stdversion" "golang.org/x/tools/go/analysis/passes/stringintconv" "golang.org/x/tools/go/analysis/passes/structtag" "golang.org/x/tools/go/analysis/passes/testinggoroutine" @@ -44,8 +47,10 @@ import ( ) func main() { + telemetry.Start() objabi.AddVersionFlag() + telemetry.Inc("vet/invocations") unitchecker.Main( appends.Analyzer, asmdecl.Analyzer, @@ -70,6 +75,7 @@ func main() { sigchanyzer.Analyzer, slog.Analyzer, stdmethods.Analyzer, + stdversion.Analyzer, stringintconv.Analyzer, structtag.Analyzer, tests.Analyzer, @@ -80,4 +86,8 @@ func main() { unsafeptr.Analyzer, unusedresult.Analyzer, ) + + // It's possible that unitchecker will exit early. In + // those cases the flags won't be counted. + telemetry.CountFlags("vet/flag:", *flag.CommandLine) } diff --git a/src/cmd/vet/testdata/stdversion/go.mod b/src/cmd/vet/testdata/stdversion/go.mod new file mode 100644 index 0000000000..90ae83b840 --- /dev/null +++ b/src/cmd/vet/testdata/stdversion/go.mod @@ -0,0 +1,3 @@ +module stdversion + +go 1.21 diff --git a/src/cmd/vet/testdata/stdversion/stdversion.go b/src/cmd/vet/testdata/stdversion/stdversion.go new file mode 100644 index 0000000000..ba5846cd13 --- /dev/null +++ b/src/cmd/vet/testdata/stdversion/stdversion.go @@ -0,0 +1,5 @@ +package stdversion + +import "reflect" + +var _ = reflect.TypeFor[int]() // ERROR "reflect.TypeFor requires go1.22 or later \(module is go1.21\)" diff --git a/src/cmd/vet/vet_test.go b/src/cmd/vet/vet_test.go index 278a88afb3..ad42cf1d7c 100644 --- a/src/cmd/vet/vet_test.go +++ b/src/cmd/vet/vet_test.go @@ -152,6 +152,37 @@ func TestVet(t *testing.T) { t.Log("vet stderr:\n", cmd.Stderr) } }) + + // The stdversion analyzer requires a lower-than-tip go + // version in its go.mod file for it to report anything. + // So again we use a testdata go.mod file to "downgrade". + t.Run("stdversion", func(t *testing.T) { + cmd := testenv.Command(t, testenv.GoToolPath(t), "vet", "-vettool="+vetPath(t), ".") + cmd.Env = append(os.Environ(), "GOWORK=off") + cmd.Dir = "testdata/stdversion" + cmd.Stderr = new(strings.Builder) // all vet output goes to stderr + cmd.Run() + stderr := cmd.Stderr.(fmt.Stringer).String() + + filename := filepath.FromSlash("testdata/stdversion/stdversion.go") + + // Unlike the tests above, which runs vet in cmd/vet/, this one + // runs it in subdirectory, so the "full names" in the output + // are in fact short "./rangeloop.go". + // But we can't just pass "./rangeloop.go" as the "full name" + // argument to errorCheck as it does double duty as both a + // string that appears in the output, and as file name + // openable relative to the test directory, containing text + // expectations. + // + // So, we munge the file. + stderr = strings.ReplaceAll(stderr, filepath.FromSlash("./stdversion.go"), filename) + + if err := errorCheck(stderr, false, filename, filepath.Base(filename)); err != nil { + t.Errorf("error check failed: %s", err) + t.Log("vet stderr:\n", cmd.Stderr) + } + }) } func cgoEnabled(t *testing.T) bool { |