aboutsummaryrefslogtreecommitdiff
path: root/src/go/parser/parser.go
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2015-01-09 13:19:19 -0800
committerRobert Griesemer <gri@golang.org>2015-03-20 22:13:21 +0000
commit492ac4b8663094b0f98aebf1e378b19f123d0b7b (patch)
tree452341f8443cb4a94da1a7e92cf8f71b5f4b8436 /src/go/parser/parser.go
parent98182c86b1e5536ec617793e9127a76197e88ba0 (diff)
downloadgo-492ac4b8663094b0f98aebf1e378b19f123d0b7b.tar.gz
go-492ac4b8663094b0f98aebf1e378b19f123d0b7b.zip
go/parser: permit type elision from composite literal map keys
Per pending https://go-review.googlesource.com/2591 . Change-Id: I1ce9d1c629e9fc43dbd862b3433aa5840f46656c Reviewed-on: https://go-review.googlesource.com/2621 Reviewed-by: Alan Donovan <adonovan@google.com>
Diffstat (limited to 'src/go/parser/parser.go')
-rw-r--r--src/go/parser/parser.go26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go
index f2df9a76d1..0095d7facf 100644
--- a/src/go/parser/parser.go
+++ b/src/go/parser/parser.go
@@ -1259,7 +1259,7 @@ func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr {
return &ast.CallExpr{Fun: fun, Lparen: lparen, Args: list, Ellipsis: ellipsis, Rparen: rparen}
}
-func (p *parser) parseElement(keyOk bool) ast.Expr {
+func (p *parser) parseValue(keyOk bool) ast.Expr {
if p.trace {
defer un(trace(p, "Element"))
}
@@ -1287,16 +1287,30 @@ func (p *parser) parseElement(keyOk bool) ast.Expr {
x := p.checkExpr(p.parseExpr(keyOk))
if keyOk {
if p.tok == token.COLON {
- colon := p.pos
- p.next()
// Try to resolve the key but don't collect it
// as unresolved identifier if it fails so that
// we don't get (possibly false) errors about
// undeclared names.
p.tryResolve(x, false)
- return &ast.KeyValueExpr{Key: x, Colon: colon, Value: p.parseElement(false)}
+ } else {
+ // not a key
+ p.resolve(x)
}
- p.resolve(x) // not a key
+ }
+
+ return x
+}
+
+func (p *parser) parseElement() ast.Expr {
+ if p.trace {
+ defer un(trace(p, "Element"))
+ }
+
+ x := p.parseValue(true)
+ if p.tok == token.COLON {
+ colon := p.pos
+ p.next()
+ x = &ast.KeyValueExpr{Key: x, Colon: colon, Value: p.parseValue(false)}
}
return x
@@ -1308,7 +1322,7 @@ func (p *parser) parseElementList() (list []ast.Expr) {
}
for p.tok != token.RBRACE && p.tok != token.EOF {
- list = append(list, p.parseElement(true))
+ list = append(list, p.parseElement())
if !p.atComma("composite literal") {
break
}