Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,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.
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.
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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of (or in addition to?) a precommit hook, what about adding this to the list of tests in ./test/config.json so that when somebody forgets to regenerate the rewriter it blocks merging the commit on github?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both, and one depending on the other so they always agree is what I would vote for