]> Cypherpunks repositories - gostls13.git/commitdiff
gofmt: -s flag simplifies "for _ = range x"
authorRobert Griesemer <gri@golang.org>
Thu, 17 Jul 2014 16:40:27 +0000 (09:40 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 17 Jul 2014 16:40:27 +0000 (09:40 -0700)
LGTM=adonovan, rsc
R=rsc, adonovan
CC=golang-codereviews
https://golang.org/cl/117800043

src/cmd/gofmt/gofmt_test.go
src/cmd/gofmt/simplify.go
src/cmd/gofmt/testdata/ranges.golden [new file with mode: 0644]
src/cmd/gofmt/testdata/ranges.input [new file with mode: 0644]

index b767a6bf553f56338e2cda62a827a37fb9c2d549..ca44f3dcf7a6c361c82807c00682ba92df3f4173 100644 (file)
@@ -75,6 +75,7 @@ var tests = []struct {
        {"testdata/composites.input", "-s"},
        {"testdata/slices1.input", "-s"},
        {"testdata/slices2.input", "-s"},
+       {"testdata/ranges.input", "-s"},
        {"testdata/old.input", ""},
        {"testdata/rewrite1.input", "-r=Foo->Bar"},
        {"testdata/rewrite2.input", "-r=int->bool"},
index b05aa2480dfa776bb3a8d236e9bca4890d1f5530..69f7bf23c0b2de7b3e7f909ea65fd0fc9bd39b36 100644 (file)
@@ -97,16 +97,26 @@ func (s *simplifier) Visit(node ast.Node) ast.Visitor {
                //       x, y := b[:n], b[n:]
 
        case *ast.RangeStmt:
-               // a range of the form: for x, _ = range v {...}
+               // a range of the form: for x, _ = range v {...}
                // can be simplified to: for x = range v {...}
-               if ident, _ := n.Value.(*ast.Ident); ident != nil && ident.Name == "_" {
+               // - a range of the form: for _ = range v {...}
+               // can be simplified to: for range v {...}
+               if isBlank(n.Value) {
                        n.Value = nil
                }
+               if isBlank(n.Key) && n.Value == nil {
+                       n.Key = nil
+               }
        }
 
        return s
 }
 
+func isBlank(x ast.Expr) bool {
+       ident, ok := x.(*ast.Ident)
+       return ok && ident.Name == "_"
+}
+
 func simplify(f *ast.File) {
        var s simplifier
 
diff --git a/src/cmd/gofmt/testdata/ranges.golden b/src/cmd/gofmt/testdata/ranges.golden
new file mode 100644 (file)
index 0000000..4216852
--- /dev/null
@@ -0,0 +1,28 @@
+// Test cases for range simplification.
+package p
+
+func _() {
+       for a, b = range x {
+       }
+       for a = range x {
+       }
+       for _, b = range x {
+       }
+       for range x {
+       }
+
+       for a = range x {
+       }
+       for range x {
+       }
+
+       for a, b := range x {
+       }
+       for a := range x {
+       }
+       for _, b := range x {
+       }
+
+       for a := range x {
+       }
+}
diff --git a/src/cmd/gofmt/testdata/ranges.input b/src/cmd/gofmt/testdata/ranges.input
new file mode 100644 (file)
index 0000000..4b02d51
--- /dev/null
@@ -0,0 +1,18 @@
+// Test cases for range simplification.
+package p
+
+func _() {
+       for a, b = range x {}
+       for a, _ = range x {}
+       for _, b = range x {}
+       for _, _ = range x {}
+
+       for a = range x {}
+       for _ = range x {}
+
+       for a, b := range x {}
+       for a, _ := range x {}
+       for _, b := range x {}
+
+       for a := range x {}
+}