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>
This commit is contained in:
Robert Griesemer 2023-01-11 16:01:56 -08:00 committed by Gopher Robot
parent 5ce9d9fee8
commit 4cc8d0eea9
1 changed files with 41 additions and 23 deletions

View File

@ -11,6 +11,8 @@ package main
import (
"bytes"
"flag"
"fmt"
"go/ast"
"go/format"
"go/parser"
@ -30,34 +32,50 @@ const (
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)
}
}