]> Cypherpunks repositories - gostls13.git/commitdiff
gofmt: support for ... after actual arguments
authorRobert Griesemer <gri@golang.org>
Wed, 22 Sep 2010 21:05:14 +0000 (14:05 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 22 Sep 2010 21:05:14 +0000 (14:05 -0700)
Pending acceptance of the proposed language change.

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

src/pkg/go/ast/ast.go
src/pkg/go/parser/parser.go
src/pkg/go/parser/parser_test.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 6cdc8850c3da50e29bc6e51682d1170877754dfe..10396e40449036ffa4fe27b047f1d57b5c123800 100644 (file)
@@ -210,10 +210,11 @@ type (
 
        // A CallExpr node represents an expression followed by an argument list.
        CallExpr struct {
-               Fun    Expr           // function expression
-               Lparen token.Position // position of "("
-               Args   []Expr         // function arguments
-               Rparen token.Position // positions of ")"
+               Fun      Expr           // function expression
+               Lparen   token.Position // position of "("
+               Args     []Expr         // function arguments
+               Ellipsis token.Position // position of "...", if any
+               Rparen   token.Position // position of ")"
        }
 
        // A StarExpr node represents an expression of the form "*" Expression.
index c5edfdf25a8eebfd8b75fb4cb60603372228d63d..e13640a91a4ea019d33790be87b702c27b7c1281 100644 (file)
@@ -942,8 +942,13 @@ func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr {
        lparen := p.expect(token.LPAREN)
        p.exprLev++
        var list vector.Vector
-       for p.tok != token.RPAREN && p.tok != token.EOF {
+       var ellipsis token.Position
+       for p.tok != token.RPAREN && p.tok != token.EOF && !ellipsis.IsValid() {
                list.Push(p.parseExpr())
+               if p.tok == token.ELLIPSIS {
+                       ellipsis = p.pos
+                       p.next()
+               }
                if p.tok != token.COMMA {
                        break
                }
@@ -952,7 +957,7 @@ func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr {
        p.exprLev--
        rparen := p.expect(token.RPAREN)
 
-       return &ast.CallExpr{fun, lparen, makeExprList(&list), rparen}
+       return &ast.CallExpr{fun, lparen, makeExprList(&list), ellipsis, rparen}
 }
 
 
index a3cc84383d5626a707d42007334ff90977f33a8d..3998049ac4707284edf3a465e7d31ce6fcef68cb 100644 (file)
@@ -37,6 +37,7 @@ var validPrograms = []interface{}{
        `package main; func f(func() func() func())` + "\n",
        `package main; func f(...T)` + "\n",
        `package main; func f(float, ...int)` + "\n",
+       `package main; func f(x int, a ...int) { f(0, a...); f(1, a...,) }` + "\n",
        `package main; type T []int; var a []bool; func f() { if a[T{42}[0]] {} }` + "\n",
        `package main; type T []int; func g(int) bool { return true }; func f() { if g(T{42}[0]) {} }` + "\n",
        `package main; type T []int; func f() { for _ = range []int{T{42}[0]} {} }` + "\n",
index 404c7b0adcf40b929421031d79d4ab14d0105e6c..2451116fdb64f39e77d2d195c03f6051d88e47d2 100644 (file)
@@ -686,7 +686,7 @@ func splitSelector(expr ast.Expr) (body, suffix ast.Expr) {
        case *ast.CallExpr:
                body, suffix = splitSelector(x.Fun)
                if body != nil {
-                       suffix = &ast.CallExpr{suffix, x.Lparen, x.Args, x.Rparen}
+                       suffix = &ast.CallExpr{suffix, x.Lparen, x.Args, x.Ellipsis, x.Rparen}
                        return
                }
        case *ast.IndexExpr:
@@ -847,6 +847,9 @@ func (p *printer) expr1(expr ast.Expr, prec1, depth int, ctxt exprContext, multi
                p.expr1(x.Fun, token.HighestPrec, depth, 0, multiLine)
                p.print(x.Lparen, token.LPAREN)
                p.exprList(x.Lparen, x.Args, depth, commaSep|commaTerm, multiLine, x.Rparen)
+               if x.Ellipsis.IsValid() {
+                       p.print(x.Ellipsis, token.ELLIPSIS)
+               }
                p.print(x.Rparen, token.RPAREN)
 
        case *ast.CompositeLit:
index 0436bf11ff5107e16f737885f4b6dfc0fdacd912..d8cd90efed428bdac21b024a6d7801b163fcfeea 100644 (file)
@@ -169,6 +169,13 @@ func _() {
 }
 
 
+func f(x int, args ...int) {
+       f(0, args...)
+       f(1, args)
+       f(2, args[0])
+}
+
+
 func _() {
        _ = T{}
        _ = struct{}{}
index b79916624105aa7d7521d21cc62ce74c07e06c5b..7dac6fd74abc1a4e6012b5b9dc243264e5cedd17 100644 (file)
@@ -169,6 +169,13 @@ func _() {
 }
 
 
+func f(x int, args ...int) {
+       f(0, args...)
+       f(1, args)
+       f(2, args[0])
+}
+
+
 func _() {
        _ = T{}
        _ = struct{}{}
index d7009b3773c61e7c57e5cdb3a90cf599d6866d66..6b3f579def09eed06c134df2e85728fd51c19381 100644 (file)
@@ -169,6 +169,13 @@ func _() {
 }
 
 
+func f(x int, args ...int) {
+       f(0, args...)
+       f(1, args)
+       f(2, args[0])
+}
+
+
 func _() {
        _ = T{}
        _ = struct{}{}