Index: dart/lib/compiler/implementation/scanner/parser.dart |
diff --git a/dart/lib/compiler/implementation/scanner/parser.dart b/dart/lib/compiler/implementation/scanner/parser.dart |
index 98bb484f0920a73208110583fd78a74adb61e472..2dba34448856d03d18dd38c41edc678f64f266ab 100644 |
--- a/dart/lib/compiler/implementation/scanner/parser.dart |
+++ b/dart/lib/compiler/implementation/scanner/parser.dart |
@@ -142,8 +142,12 @@ class Parser { |
do { |
++parameterCount; |
token = token.next; |
- if (optional('[', token)) { |
- token = parseOptionalFormalParameters(token); |
+ String value = token.stringValue; |
+ if (value === '[') { |
+ token = parseOptionalFormalParameters(token, false); |
+ break; |
+ } else if (value === '{') { |
+ token = parseOptionalFormalParameters(token, true); |
break; |
} |
token = parseFormalParameter(token); |
@@ -169,7 +173,8 @@ class Parser { |
token = parseFormalParameters(token); |
listener.handleFunctionTypedFormalParameter(token); |
} |
- if (optional('=', token)) { |
+ String value = token.stringValue; |
+ if (('=' === value) || (':' === value)) { |
// TODO(ahe): Validate that these are only used for optional parameters. |
Token equal = token; |
token = parseExpression(token.next); |
@@ -179,10 +184,10 @@ class Parser { |
return token; |
} |
- Token parseOptionalFormalParameters(Token token) { |
+ Token parseOptionalFormalParameters(Token token, bool isNamed) { |
Token begin = token; |
listener.beginOptionalFormalParameters(begin); |
- assert(optional('[', token)); |
+ assert((isNamed && optional('{', token)) || optional('[', token)); |
int parameterCount = 0; |
do { |
token = token.next; |
@@ -190,7 +195,11 @@ class Parser { |
++parameterCount; |
} while (optional(',', token)); |
listener.endOptionalFormalParameters(parameterCount, begin, token); |
- return expect(']', token); |
+ if (isNamed) { |
+ return expect('}', token); |
+ } else { |
+ return expect(']', token); |
+ } |
} |
Token parseTypeOpt(Token token) { |