diff options
author | Robert Griesemer <gri@golang.org> | 2009-12-16 16:53:56 -0800 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2009-12-16 16:53:56 -0800 |
commit | 59a3cae402d648041d766051894c432d73ff89e3 (patch) | |
tree | 4ce5826db328fb2725da6a4bbdc6850561e6fc1f | |
parent | 8bf58725b23a25a4d153a9b90624eb95c0aeca12 (diff) | |
download | go-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.go | 19 |
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 |