]> Cypherpunks repositories - gostls13.git/commitdiff
gofmt: fix for gofmt rewrite feature
authorRobert Griesemer <gri@golang.org>
Mon, 15 Mar 2010 22:42:09 +0000 (15:42 -0700)
committerRobert Griesemer <gri@golang.org>
Mon, 15 Mar 2010 22:42:09 +0000 (15:42 -0700)
Fixes #643.

R=rsc
CC=golang-dev
https://golang.org/cl/576041

src/cmd/gofmt/doc.go
src/cmd/gofmt/rewrite.go

index 4b4adba030bb7ff7ddbcac0fced59eb889f2b40c..2e4c40c216d751c75864b569f3ae9a9058990185 100644 (file)
@@ -41,8 +41,8 @@ The rewrite rule specified with the -r flag must be a string of the form:
        pattern -> replacement
 
 Both pattern and replacement must be valid Go expressions.
-In the pattern, single-character lowercase identifers serve as
-wildcards matching arbitrary subexpressions; those expressions
+In the pattern, single-character lowercase identifiers serve as
+wildcards matching arbitrary sub-expressions; those expressions
 will be substituted for the same identifiers in the replacement.
 
 
index b2b21597db1f10b8602b6073ce0ab8d81f95d54a..9c238fab20b38e918a67052faf6e4ffc00d902fd 100644 (file)
@@ -46,7 +46,7 @@ func parseExpr(s string, what string) ast.Expr {
 }
 
 
-// rewriteFile applys the rewrite rule pattern -> replace to an entire file.
+// rewriteFile applies the rewrite rule 'pattern -> replace' to an entire file.
 func rewriteFile(pattern, replace ast.Expr, p *ast.File) *ast.File {
        m := make(map[string]reflect.Value)
        pat := reflect.NewValue(pattern)
@@ -127,9 +127,19 @@ func match(m map[string]reflect.Value, pattern, val reflect.Value) bool {
                return false
        }
 
-       // Token positions need not match.
-       if pattern.Type() == positionType {
+       // Special cases.
+       switch pattern.Type() {
+       case positionType:
+               // token positions don't need to match
                return true
+       case identType:
+               // For identifiers, only the names need to match
+               // (and none of the other *ast.Object information).
+               // This is a common case, handle it all here instead
+               // of recursing down any further via reflection.
+               p := pattern.Interface().(*ast.Ident)
+               v := val.Interface().(*ast.Ident)
+               return p == nil && v == nil || p != nil && v != nil && p.Name() == v.Name()
        }
 
        p := reflect.Indirect(pattern)