aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2009-12-16 16:53:56 -0800
committerRobert Griesemer <gri@golang.org>2009-12-16 16:53:56 -0800
commit59a3cae402d648041d766051894c432d73ff89e3 (patch)
tree4ce5826db328fb2725da6a4bbdc6850561e6fc1f
parent8bf58725b23a25a4d153a9b90624eb95c0aeca12 (diff)
downloadgo-59a3cae402d648041d766051894c432d73ff89e3.tar.gz
go-59a3cae402d648041d766051894c432d73ff89e3.zip
- Parse expressions as opposed to statements for gofmt rewrite patterns.
Allows stand-alone types (e.g. []int as patterns) and doesn't require a semicolon at the end (which are now mandatory terminators). - Fix a matcher bug. R=rsc CC=golang-dev https://golang.org/cl/179088
-rw-r--r--src/cmd/gofmt/rewrite.go19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/cmd/gofmt/rewrite.go b/src/cmd/gofmt/rewrite.go
index fe35bfb08d..94f7912a38 100644
--- a/src/cmd/gofmt/rewrite.go
+++ b/src/cmd/gofmt/rewrite.go
@@ -37,21 +37,12 @@ func initRewrite() {
// but there are problems with preserving formatting and also
// with what a wildcard for a statement looks like.
func parseExpr(s string, what string) ast.Expr {
- stmts, err := parser.ParseStmtList("input", s)
+ x, err := parser.ParseExpr("input", s)
if err != nil {
fmt.Fprintf(os.Stderr, "parsing %s %s: %s\n", what, s, err)
os.Exit(2)
}
- if len(stmts) != 1 {
- fmt.Fprintf(os.Stderr, "%s must be single expression\n", what)
- os.Exit(2)
- }
- x, ok := stmts[0].(*ast.ExprStmt)
- if !ok {
- fmt.Fprintf(os.Stderr, "%s must be single expression\n", what)
- os.Exit(2)
- }
- return x.X
+ return x
}
@@ -147,6 +138,9 @@ func match(m map[string]reflect.Value, pattern, val reflect.Value) bool {
switch p := p.(type) {
case *reflect.SliceValue:
v := v.(*reflect.SliceValue)
+ if p.Len() != v.Len() {
+ return false
+ }
for i := 0; i < p.Len(); i++ {
if !match(m, p.Elem(i), v.Elem(i)) {
return false
@@ -156,6 +150,9 @@ func match(m map[string]reflect.Value, pattern, val reflect.Value) bool {
case *reflect.StructValue:
v := v.(*reflect.StructValue)
+ if p.NumField() != v.NumField() {
+ return false
+ }
for i := 0; i < p.NumField(); i++ {
if !match(m, p.Field(i), v.Field(i)) {
return false