]> Cypherpunks repositories - gostls13.git/commitdiff
gofmt: permit omission of first index in slice expression
authorRobert Griesemer <gri@golang.org>
Fri, 27 Aug 2010 21:49:49 +0000 (14:49 -0700)
committerRobert Griesemer <gri@golang.org>
Fri, 27 Aug 2010 21:49:49 +0000 (14:49 -0700)
R=rsc
CC=golang-dev, r
https://golang.org/cl/2053041

src/pkg/go/ast/ast.go
src/pkg/go/parser/parser.go
src/pkg/go/printer/nodes.go
src/pkg/go/printer/testdata/expressions.golden
src/pkg/go/printer/testdata/expressions.input
src/pkg/go/printer/testdata/expressions.raw

index 93e962cefb26009f57609e29487ab2961a28d0c7..6cdc8850c3da50e29bc6e51682d1170877754dfe 100644 (file)
@@ -196,7 +196,7 @@ type (
        // An SliceExpr node represents an expression followed by slice indices.
        SliceExpr struct {
                X     Expr // expression
-               Index Expr // beginning of slice range
+               Index Expr // beginning of slice range; or nil
                End   Expr // end of slice range; or nil
        }
 
index 55e0dadf8f50c8aa3d89d6d0f72965cea66bac72..c5edfdf25a8eebfd8b75fb4cb60603372228d63d 100644 (file)
@@ -913,7 +913,10 @@ func (p *parser) parseIndexOrSlice(x ast.Expr) ast.Expr {
 
        p.expect(token.LBRACK)
        p.exprLev++
-       index := p.parseExpr()
+       var index ast.Expr
+       if p.tok != token.COLON {
+               index = p.parseExpr()
+       }
        if p.tok == token.COLON {
                p.next()
                var end ast.Expr
index 9e5665089e78934b101ddf80be65c4e633194c17..404c7b0adcf40b929421031d79d4ab14d0105e6c 100644 (file)
@@ -826,9 +826,11 @@ func (p *printer) expr1(expr ast.Expr, prec1, depth int, ctxt exprContext, multi
                // TODO(gri): should treat[] like parentheses and undo one level of depth
                p.expr1(x.X, token.HighestPrec, 1, 0, multiLine)
                p.print(token.LBRACK)
-               p.expr0(x.Index, depth+1, multiLine)
+               if x.Index != nil {
+                       p.expr0(x.Index, depth+1, multiLine)
+               }
                // blanks around ":" if both sides exist and either side is a binary expression
-               if depth <= 1 && x.End != nil && (isBinary(x.Index) || isBinary(x.End)) {
+               if depth <= 1 && x.Index != nil && x.End != nil && (isBinary(x.Index) || isBinary(x.End)) {
                        p.print(blank, token.COLON, blank)
                } else {
                        p.print(token.COLON)
index 44f3a63ff47afb3d267171c8fc31b9826ea89f7f..39c4c34164e487c8b23e07e3d390627f7e20329b 100644 (file)
@@ -31,6 +31,9 @@ func _() {
        _ = 1 + a
        _ = a + 1
        _ = a + b + 1
+       _ = s[a]
+       _ = s[a:]
+       _ = s[:b]
        _ = s[1:2]
        _ = s[a:b]
        _ = s[0:len(s)]
@@ -56,6 +59,7 @@ func _() {
        _ = s[a : b-c]
        _ = s[0:]
        _ = s[a+b]
+       _ = s[:b-c]
        _ = s[a+b:]
        _ = a[a<<b+1]
        _ = a[a<<b+1:]
index 5aec976e130a4aa878f40d591906a6f79b08dbc5..0c0b813a63cb52fd4c846db025491ce9b52e2007 100644 (file)
@@ -31,6 +31,9 @@ func _() {
        _ = 1+a
        _ = a+1
        _ = a+b+1
+       _ = s[a]
+       _ = s[a:]
+       _ = s[:b]
        _ = s[1:2]
        _ = s[a:b]
        _ = s[0:len(s)]
@@ -56,6 +59,7 @@ func _() {
        _ = s[a : b-c]
        _ = s[0:]
        _ = s[a+b]
+       _ = s[: b-c]
        _ = s[a+b :]
        _ = a[a<<b+1]
        _ = a[a<<b+1 :]
index 7580701b682b91f0542dcf826b55c6ce852d3fa9..cba8636c48332acfe6fd1c4a88967b3c7b7c3baf 100644 (file)
@@ -31,6 +31,9 @@ func _() {
        _ = 1 + a
        _ = a + 1
        _ = a + b + 1
+       _ = s[a]
+       _ = s[a:]
+       _ = s[:b]
        _ = s[1:2]
        _ = s[a:b]
        _ = s[0:len(s)]
@@ -56,6 +59,7 @@ func _() {
        _ = s[a : b-c]
        _ = s[0:]
        _ = s[a+b]
+       _ = s[:b-c]
        _ = s[a+b:]
        _ = a[a<<b+1]
        _ = a[a<<b+1:]