go/types: allow filename arguments to generator for easier manual use

Change-Id: I96b25fae1dcbfae55f57c07de9529c6663ad28d4
Reviewed-on: https://go-review.googlesource.com/c/go/+/461602
Reviewed-by: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
diff --git a/src/go/types/generator.go b/src/go/types/generator.go
index 4f7d666..2972f5e 100644
--- a/src/go/types/generator.go
+++ b/src/go/types/generator.go
@@ -11,6 +11,8 @@
 
 import (
 	"bytes"
+	"flag"
+	"fmt"
 	"go/ast"
 	"go/format"
 	"go/parser"
@@ -30,34 +32,50 @@
 var fset = token.NewFileSet()
 
 func main() {
+	flag.Parse()
+
+	// process provided filenames, if any
+	if flag.NArg() > 0 {
+		for _, filename := range flag.Args() {
+			fmt.Println("generating", filename)
+			generate(filename, filemap[filename])
+		}
+		return
+	}
+
+	// otherwise process per filemap below
 	for filename, action := range filemap {
-		// parse src
-		srcFilename := filepath.FromSlash(runtime.GOROOT() + "/src/" + srcDir + "/" + filename)
-		file, err := parser.ParseFile(fset, srcFilename, nil, parser.ParseComments)
-		if err != nil {
-			log.Fatal(err)
-		}
+		generate(filename, action)
+	}
+}
 
-		// fix package name
-		file.Name.Name = strings.ReplaceAll(file.Name.Name, "types2", "types")
+func generate(filename string, action action) {
+	// parse src
+	srcFilename := filepath.FromSlash(runtime.GOROOT() + "/src/" + srcDir + "/" + filename)
+	file, err := parser.ParseFile(fset, srcFilename, nil, parser.ParseComments)
+	if err != nil {
+		log.Fatal(err)
+	}
 
-		// rewrite AST as needed
-		if action != nil {
-			action(file)
-		}
+	// fix package name
+	file.Name.Name = strings.ReplaceAll(file.Name.Name, "types2", "types")
 
-		// format AST
-		var buf bytes.Buffer
-		buf.WriteString("// Code generated by \"go run generator.go\"; DO NOT EDIT.\n\n")
-		if err := format.Node(&buf, fset, file); err != nil {
-			log.Fatal(err)
-		}
+	// rewrite AST as needed
+	if action != nil {
+		action(file)
+	}
 
-		// write dst
-		dstFilename := filepath.FromSlash(runtime.GOROOT() + "/src/" + dstDir + "/" + filename)
-		if err := os.WriteFile(dstFilename, buf.Bytes(), 0o644); err != nil {
-			log.Fatal(err)
-		}
+	// format AST
+	var buf bytes.Buffer
+	buf.WriteString("// Code generated by \"go run generator.go\"; DO NOT EDIT.\n\n")
+	if err := format.Node(&buf, fset, file); err != nil {
+		log.Fatal(err)
+	}
+
+	// write dst
+	dstFilename := filepath.FromSlash(runtime.GOROOT() + "/src/" + dstDir + "/" + filename)
+	if err := os.WriteFile(dstFilename, buf.Bytes(), 0o644); err != nil {
+		log.Fatal(err)
 	}
 }