Index: sdk/lib/_internal/compiler/implementation/scanner/parser.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart |
index dcfbc59a8c783ac8722cff723fe17a80aae4707a..63e7da7a422e1244f7b3bbb062c99615361ba082 100644 |
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart |
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart |
@@ -4,6 +4,17 @@ |
part of scanner; |
+class FormalParameterType { |
+ final String type; |
+ const FormalParameterType(this.type); |
+ bool get isRequired => this == REQUIRED; |
+ bool get isPositional => this == POSITIONAL; |
+ bool get isNamed => this == NAMED; |
+ static final REQUIRED = const FormalParameterType('required'); |
+ static final POSITIONAL = const FormalParameterType('positional'); |
+ static final NAMED = const FormalParameterType('named'); |
+} |
+ |
/** |
* An event generating parser of Dart programs. This parser expects |
* all tokens in a linked list (aka a token stream). |
@@ -306,13 +317,13 @@ class Parser { |
token = parseOptionalFormalParameters(token, true); |
break; |
} |
- token = parseFormalParameter(token); |
+ token = parseFormalParameter(token, FormalParameterType.REQUIRED); |
} while (optional(',', token)); |
listener.endFormalParameters(parameterCount, begin, token); |
return expect(')', token); |
} |
- Token parseFormalParameter(Token token) { |
+ Token parseFormalParameter(Token token, FormalParameterType type) { |
listener.beginFormalParameter(token); |
token = parseModifiers(token); |
// TODO(ahe): Validate that there are formal parameters if void. |
@@ -335,6 +346,15 @@ class Parser { |
Token equal = token; |
token = parseExpression(token.next); |
listener.handleValuedFormalParameter(equal, token); |
+ if (type.isRequired) { |
+ listener.reportError(equal, |
+ MessageKind.REQUIRED_PARAMETER_WITH_DEFAULT); |
+ } else if (type.isNamed && identical('=', value)) { |
+ listener.reportError(equal, MessageKind.NAMED_PARAMETER_WITH_EQUALS); |
+ } else if (type.isPositional && identical(':', value)) { |
+ listener.reportError(equal, |
+ MessageKind.POSITIONAL_PARAMETER_WITH_EQUALS); |
+ } |
} |
listener.endFormalParameter(thisKeyword); |
return token; |
@@ -347,7 +367,9 @@ class Parser { |
int parameterCount = 0; |
do { |
token = token.next; |
- token = parseFormalParameter(token); |
+ var type = isNamed ? FormalParameterType.NAMED |
+ : FormalParameterType.POSITIONAL; |
+ token = parseFormalParameter(token, type); |
++parameterCount; |
} while (optional(',', token)); |
listener.endOptionalFormalParameters(parameterCount, begin, token); |