From a6820b65cbc585f32697cac047f2260c069ec4b7 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Fri, 7 Jan 2011 15:04:41 -0800 Subject: [PATCH] gofmt: don't attempt certain illegal rewrites (e.g.: echo 'package main' | gofmt -r 'x->7' cannot change the package name to 7) R=rsc CC=golang-dev https://golang.org/cl/3913041 --- src/cmd/gofmt/rewrite.go | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/cmd/gofmt/rewrite.go b/src/cmd/gofmt/rewrite.go index a87dbeb8cd..8ea5334e97 100644 --- a/src/cmd/gofmt/rewrite.go +++ b/src/cmd/gofmt/rewrite.go @@ -66,13 +66,19 @@ func rewriteFile(pattern, replace ast.Expr, p *ast.File) *ast.File { } -var positionType = reflect.Typeof(token.NoPos) -var identType = reflect.Typeof((*ast.Ident)(nil)) - - -func isWildcard(s string) bool { - rune, size := utf8.DecodeRuneInString(s) - return size == len(s) && unicode.IsLower(rune) +// setValue is a wrapper for x.SetValue(y); it protects +// the caller from panics if x cannot be changed to y. +func setValue(x, y reflect.Value) { + defer func() { + if x := recover(); x != nil { + if s, ok := x.(string); ok && strings.HasPrefix(s, "type mismatch") { + // x cannot be set to y - ignore this rewrite + return + } + panic(x) + } + }() + x.SetValue(y) } @@ -86,21 +92,31 @@ func apply(f func(reflect.Value) reflect.Value, val reflect.Value) reflect.Value case *reflect.SliceValue: for i := 0; i < v.Len(); i++ { e := v.Elem(i) - e.SetValue(f(e)) + setValue(e, f(e)) } case *reflect.StructValue: for i := 0; i < v.NumField(); i++ { e := v.Field(i) - e.SetValue(f(e)) + setValue(e, f(e)) } case *reflect.InterfaceValue: e := v.Elem() - v.SetValue(f(e)) + setValue(v, f(e)) } return val } +var positionType = reflect.Typeof(token.NoPos) +var identType = reflect.Typeof((*ast.Ident)(nil)) + + +func isWildcard(s string) bool { + rune, size := utf8.DecodeRuneInString(s) + return size == len(s) && unicode.IsLower(rune) +} + + // match returns true if pattern matches val, // recording wildcard submatches in m. // If m == nil, match checks whether pattern == val. -- 2.48.1