]> Cypherpunks repositories - gostls13.git/commitdiff
- Parse expressions as opposed to statements for gofmt rewrite patterns.
authorRobert Griesemer <gri@golang.org>
Thu, 17 Dec 2009 00:53:56 +0000 (16:53 -0800)
committerRobert Griesemer <gri@golang.org>
Thu, 17 Dec 2009 00:53:56 +0000 (16:53 -0800)
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

src/cmd/gofmt/rewrite.go

index fe35bfb08dea8ce9f0ee33263cc2c734a5ceeb9d..94f7912a38b8db2cbacd33d5065b900a235e8245 100644 (file)
@@ -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