Skip to content

Commit

Permalink
Merge pull request #5770 from systay/rewriter
Browse files Browse the repository at this point in the history
Visitor generator cleanup
  • Loading branch information
sougou authored Feb 3, 2020
2 parents 9c98edc + 2e66f6f commit 6a71f24
Show file tree
Hide file tree
Showing 15 changed files with 57 additions and 57 deletions.
4 changes: 1 addition & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,7 @@ parser:
make -C go/vt/sqlparser

visitor:
go build -o visitorgen go/visitorgen/main/main.go
./visitorgen -input=go/vt/sqlparser/ast.go -output=$(REWRITER)
rm ./visitorgen
go generate go/vt/sqlparser/rewriter.go

# To pass extra flags, run test.go manually.
# For example: go run test.go -docker=false -- --extra-flag
Expand Down
2 changes: 1 addition & 1 deletion go/vt/sqlparser/rewriter.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -17,44 +17,46 @@ limitations under the License.
package main

import (
"bytes"
"flag"
"fmt"
"go/parser"
"go/token"
"io/ioutil"
"os"

"vitess.io/vitess/go/visitorgen"
"vitess.io/vitess/go/exit"
"vitess.io/vitess/go/vt/log"

"vitess.io/vitess/go/vt/sqlparser/visitorgen"
)

var (
inputFile = flag.String("input", "", "input file to use")
outputFile = flag.String("output", "", "output file")
compare = flag.Bool("compareOnly", false, "instead of writing to the output file, compare if the generated visitor is still valid for this ast.go")
)

const usage = `Usage of visitorgen:
go run go/visitorgen/main/main.go -input=/path/to/ast.go -output=/path/to/rewriter.go
go run /path/to/visitorgen/main -input=/path/to/ast.go -output=/path/to/rewriter.go
`

func main() {
flag.Usage = func() {
os.Stderr.WriteString(usage)
os.Stderr.WriteString("\nOptions:\n")
flag.PrintDefaults()

}
defer exit.Recover()
flag.Usage = printUsage
flag.Parse()

if *inputFile == "" || *outputFile == "" {
fmt.Println("> " + *inputFile)
fmt.Println("> " + *outputFile)
panic("need input and output file")
printUsage()
exit.Return(1)
}

fs := token.NewFileSet()
file, err := parser.ParseFile(fs, *inputFile, nil, parser.DeclarationErrors)
if err != nil {
panic(err)
log.Error(err)
exit.Return(1)
}

astWalkResult := visitorgen.Walk(file)
Expand All @@ -64,49 +66,45 @@ func main() {
replacementMethods := visitorgen.EmitReplacementMethods(vd)
typeSwitch := visitorgen.EmitTypeSwitches(vd)

fw := newFileWriter(*outputFile)
defer fw.Close()

fw.writeln(fileHeader)
fw.writeln(replacementMethods)
fw.write(applyHeader)
fw.writeln(typeSwitch)
fw.writeln(fileFooter)
}

type fileWriter struct {
file *os.File
}

func newFileWriter(file string) *fileWriter {
f, err := os.Create(file)
if err != nil {
panic(err)
b := &bytes.Buffer{}
fmt.Fprint(b, fileHeader)
fmt.Fprintln(b)
fmt.Fprintln(b, replacementMethods)
fmt.Fprint(b, applyHeader)
fmt.Fprintln(b, typeSwitch)
fmt.Fprintln(b, fileFooter)

if *compare {
currentFile, err := ioutil.ReadFile(*outputFile)
if err != nil {
log.Error(err)
exit.Return(1)
}
if !bytes.Equal(b.Bytes(), currentFile) {
fmt.Println("rewriter needs to be re-generated: go generate " + *outputFile)
exit.Return(1)
}
} else {
err = ioutil.WriteFile(*outputFile, b.Bytes(), 0644)
if err != nil {
log.Error(err)
exit.Return(1)
}
}
return &fileWriter{file: f}
}

func (fw *fileWriter) writeln(s string) {
fw.write(s)
fw.write("\n")
}

func (fw *fileWriter) write(s string) {
_, err := fw.file.WriteString(s)
if err != nil {
panic(err)
}
}

func (fw *fileWriter) Close() {
fw.file.Close()
func printUsage() {
os.Stderr.WriteString(usage)
os.Stderr.WriteString("\nOptions:\n")
flag.PrintDefaults()
}

const fileHeader = `// Code generated by visitorgen/main/main.go. DO NOT EDIT.
package sqlparser
//go:generate make visitor
//go:generate go run visitorgen/main -input=ast.go -output=rewriter.go
import (
"reflect"
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
9 changes: 1 addition & 8 deletions misc/git/hooks/visitorgen
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,4 @@

# this script, which should run before committing code, makes sure that the visitor is re-generated when the ast changes

make visitor REWRITER=tmp_rewriter.go
if ! cmp -s "tmp_rewriter.go" "go/vt/sqlparser/rewriter.go"; then
echo "The ast.go has changed, but not rewriter.go"
echo "You should 'make visitor' to update the generated rewriter"
rm -f tmp_rewriter.go
exit 1
fi
rm -f tmp_rewriter.go
go run ./go/vt/sqlparser/visitorgen/main -compareOnly=true -input=go/vt/sqlparser/ast.go -output=go/vt/sqlparser/rewriter.go
11 changes: 11 additions & 0 deletions test/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,17 @@
"RetryMax": 1,
"Tags": []
},
"check_make_visitor": {
"File": "",
"Args": [],
"Command": [
"misc/git/hooks/visitorgen"
],
"Manual": false,
"Shard": 5,
"RetryMax": 1,
"Tags": []
},
"java": {
"File": "",
"Args": [],
Expand Down

0 comments on commit 6a71f24

Please sign in to comment.