Skip to content

Commit 5996466

Browse files
findleyrgopherbot
authored andcommitted
go/types: add a test that generated files match types2
Adjust the go/types file generation to run in a test, so that we can easily reuse the existing logic to verify that the current content of go/types matches the expected result of generating from types2. This test will enforce that we don't forget to regenerate go/types when making changes to types2. Change-Id: Iee14b1402065f7f0ecbcf28000e07a06c08fa42e Reviewed-on: https://go-review.googlesource.com/c/go/+/462758 Run-TryBot: Robert Findley <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Robert Griesemer <[email protected]> Auto-Submit: Robert Findley <[email protected]>
1 parent e587a76 commit 5996466

39 files changed

+82
-70
lines changed

src/go/types/array.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/basic.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/chan.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/context.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/context_test.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/gccgosizes.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/generate.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
// license that can be found in the LICENSE file.
44

55
// This file exists only to drive go:generate.
6-
//go:generate go run generator.go
6+
//go:generate go test -run=Generate -write=all
77

88
package types

src/go/types/generator.go renamed to src/go/types/generate_test.go

+44-32
Original file line numberDiff line numberDiff line change
@@ -2,81 +2,93 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
//go:build ignore
6-
75
// This file implements a custom generator to create various go/types
86
// source files from the corresponding types2 files.
97

10-
package main
8+
package types_test
119

1210
import (
1311
"bytes"
1412
"flag"
15-
"fmt"
1613
"go/ast"
1714
"go/format"
1815
"go/parser"
1916
"go/token"
20-
"log"
17+
"internal/diff"
2118
"os"
2219
"path/filepath"
2320
"runtime"
2421
"strings"
22+
"testing"
2523
)
2624

25+
var filesToWrite = flag.String("write", "", `go/types files to generate, or "all" for all files`)
26+
2727
const (
28-
srcDir = "cmd/compile/internal/types2"
29-
dstDir = "go/types"
28+
srcDir = "/src/cmd/compile/internal/types2/"
29+
dstDir = "/src/go/types/"
3030
)
3131

32-
var fset = token.NewFileSet()
33-
34-
func main() {
35-
flag.Parse()
36-
37-
// process provided filenames, if any
38-
if flag.NArg() > 0 {
39-
for _, filename := range flag.Args() {
40-
generate(filename, filemap[filename])
32+
// TestGenerate verifies that generated files in go/types match their types2
33+
// counterpart. If -write is set, this test actually writes the expected
34+
// content to go/types; otherwise, it just compares with the existing content.
35+
func TestGenerate(t *testing.T) {
36+
// If filesToWrite is set, write the generated content to disk.
37+
// In the special case of "all", write all files in filemap.
38+
write := *filesToWrite != ""
39+
var files []string // files to process
40+
if *filesToWrite != "" && *filesToWrite != "all" {
41+
files = strings.Split(*filesToWrite, ",")
42+
} else {
43+
for file := range filemap {
44+
files = append(files, file)
4145
}
42-
fmt.Printf("generated %d files\n", flag.NArg())
43-
return
4446
}
4547

46-
// otherwise process per filemap below
47-
for filename, action := range filemap {
48-
generate(filename, action)
48+
for _, filename := range files {
49+
generate(t, filename, write)
4950
}
50-
fmt.Printf("generated %d files\n", len(filemap))
5151
}
5252

53-
func generate(filename string, action action) {
53+
func generate(t *testing.T, filename string, write bool) {
5454
// parse src
55-
srcFilename := filepath.FromSlash(runtime.GOROOT() + "/src/" + srcDir + "/" + filename)
55+
srcFilename := filepath.FromSlash(runtime.GOROOT() + srcDir + filename)
5656
file, err := parser.ParseFile(fset, srcFilename, nil, parser.ParseComments)
5757
if err != nil {
58-
log.Fatal(err)
58+
t.Fatal(err)
5959
}
6060

6161
// fix package name
6262
file.Name.Name = strings.ReplaceAll(file.Name.Name, "types2", "types")
6363

6464
// rewrite AST as needed
65-
if action != nil {
65+
if action := filemap[filename]; action != nil {
6666
action(file)
6767
}
6868

6969
// format AST
7070
var buf bytes.Buffer
71-
buf.WriteString("// Code generated by \"go run generator.go\"; DO NOT EDIT.\n\n")
71+
buf.WriteString("// Code generated by \"go test -run=Generate -write=all\"; DO NOT EDIT.\n\n")
7272
if err := format.Node(&buf, fset, file); err != nil {
73-
log.Fatal(err)
73+
t.Fatal(err)
7474
}
75+
generatedContent := buf.Bytes()
7576

76-
// write dst
77-
dstFilename := filepath.FromSlash(runtime.GOROOT() + "/src/" + dstDir + "/" + filename)
78-
if err := os.WriteFile(dstFilename, buf.Bytes(), 0o644); err != nil {
79-
log.Fatal(err)
77+
dstFilename := filepath.FromSlash(runtime.GOROOT() + dstDir + filename)
78+
onDiskContent, err := os.ReadFile(dstFilename)
79+
if err != nil {
80+
t.Fatalf("reading %q: %v", filename, err)
81+
}
82+
83+
if d := diff.Diff(filename+" (on disk)", onDiskContent, filename+" (generated)", generatedContent); d != nil {
84+
if write {
85+
t.Logf("applying change:\n%s", d)
86+
if err := os.WriteFile(dstFilename, generatedContent, 0o644); err != nil {
87+
t.Fatalf("writing %q: %v", filename, err)
88+
}
89+
} else {
90+
t.Errorf("generated file content does not match:\n%s", string(d))
91+
}
8092
}
8193
}
8294

src/go/types/hilbert_test.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/infer.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/instantiate.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/instantiate_test.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/lookup.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/main_test.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/map.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/named.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/object.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/object_test.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/objset.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/package.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/pointer.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/predicates.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/scope.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/selection.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/sizes.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/slice.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/subst.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/termlist.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/termlist_test.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/tuple.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/typelists.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/typeparam.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/typeterm.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/typeterm_test.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/under.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/unify.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/universe.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/util_test.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/go/types/validtype.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)