Index: compiler/java/com/google/dart/compiler/parser/DartParser.java |
diff --git a/compiler/java/com/google/dart/compiler/parser/DartParser.java b/compiler/java/com/google/dart/compiler/parser/DartParser.java |
index 06f9faea14c06b346931151ffb674a41a49a4bde..3698adc641c53a4403b6fa05a25c4bb37edfe2a8 100644 |
--- a/compiler/java/com/google/dart/compiler/parser/DartParser.java |
+++ b/compiler/java/com/google/dart/compiler/parser/DartParser.java |
@@ -640,6 +640,7 @@ public class DartParser extends CompletionHooksParserBase { |
List<DartTypeParameter> typeParameters = parseTypeParametersOpt(); |
List<DartParameter> params = parseFormalParameterList(); |
expect(Token.SEMICOLON); |
+ validateNoDefaultParameterValues(params, ParserErrorCode.DEFAULT_PARAMETER_TYPEDEF); |
return done(new DartFunctionTypeAlias(name, returnType, params, typeParameters)); |
} |
@@ -977,8 +978,26 @@ public class DartParser extends CompletionHooksParserBase { |
// Parse the parameters definitions. |
List<DartParameter> parameters = parseFormalParameterList(); |
- if (arity != -1 && parameters.size() != arity) { |
- reportError(position(), ParserErrorCode.ILLEGAL_NUMBER_OF_PARAMETERS); |
+ if (arity != -1) { |
+ if (parameters.size() != arity) { |
+ reportError(position(), ParserErrorCode.ILLEGAL_NUMBER_OF_PARAMETERS); |
+ } |
+ // In methods with required arity each parameter is required. |
+ for (DartParameter parameter : parameters) { |
+ if (parameter.getModifiers().isNamed()) { |
+ reportError(parameter, ParserErrorCode.EACH_PARAMETER_IS_REQUIRED); |
zundel
2011/11/15 16:16:57
I think this message is a bit confusing. Could we
|
+ } |
+ } |
+ } |
+ |
+ // Interface method declaration can not have default values for named parameters. |
+ if (isParsingInterface) { |
+ validateNoDefaultParameterValues(parameters, ParserErrorCode.DEFAULT_PARAMETER_INTERFACE); |
+ } |
+ |
+ // Abstract method declaration can not have default values for named parameters. |
+ if (modifiers.isAbstract()) { |
+ validateNoDefaultParameterValues(parameters, ParserErrorCode.DEFAULT_PARAMETER_ABSTRACT); |
} |
// Parse initializer expressions for constructors. |
@@ -1240,13 +1259,13 @@ public class DartParser extends CompletionHooksParserBase { |
List<DartParameter> params = new ArrayList<DartParameter>(); |
expect(Token.LPAREN); |
boolean done = optional(Token.RPAREN); |
- boolean hasNamed = false; |
+ boolean isNamed = false; |
while (!done) { |
- if (!hasNamed && optional(Token.LBRACK)) { |
- hasNamed = true; |
+ if (!isNamed && optional(Token.LBRACK)) { |
+ isNamed = true; |
} |
- DartParameter param = parseFormalParameter(hasNamed); |
+ DartParameter param = parseFormalParameter(isNamed); |
params.add(param); |
done = optional(Token.RBRACK); |
@@ -1286,7 +1305,7 @@ public class DartParser extends CompletionHooksParserBase { |
beginFormalParameter(); |
DartExpression paramName = null; |
DartTypeNode type = null; |
- DartExpression initExpr = null; |
+ DartExpression defaultExpr = null; |
List<DartParameter> functionParams = null; |
boolean hasVar = false; |
Modifiers modifiers = Modifiers.NONE; |
@@ -1329,6 +1348,7 @@ public class DartParser extends CompletionHooksParserBase { |
reportError(position(), ParserErrorCode.FUNCTION_TYPED_PARAMETER_IS_VAR); |
} |
functionParams = parseFormalParameterList(); |
+ validateNoDefaultParameterValues(functionParams, ParserErrorCode.DEFAULT_PARAMETER_CLOSURE); |
} else { |
// Not a function parameter. |
if (isVoidType) { |
@@ -1348,7 +1368,7 @@ public class DartParser extends CompletionHooksParserBase { |
// Default parameter -- only allowed for named parameters. |
if (isNamed) { |
consume(Token.ASSIGN); |
- initExpr = parseExpression(); |
+ defaultExpr = parseExpression(); |
} else { |
reportError(position(), ParserErrorCode.DEFAULT_POSITIONAL_PARAMETER); |
} |
@@ -1359,7 +1379,7 @@ public class DartParser extends CompletionHooksParserBase { |
break; |
} |
- return done(new DartParameter(paramName, type, functionParams, initExpr, modifiers)); |
+ return done(new DartParameter(paramName, type, functionParams, defaultExpr, modifiers)); |
} |
/** |
@@ -1385,6 +1405,20 @@ public class DartParser extends CompletionHooksParserBase { |
} |
/** |
+ * Validates that given {@link DartParameter}s have no default values, or marks existing default |
+ * values with given {@link ErrorCode}. |
+ */ |
+ private void validateNoDefaultParameterValues(List<DartParameter> parameters, |
+ ErrorCode errorCode) { |
+ for (DartParameter parameter : parameters) { |
+ DartExpression defaultExpr = parameter.getDefaultExpr(); |
+ if (defaultExpr != null) { |
+ reportError(defaultExpr, errorCode); |
+ } |
+ } |
+ } |
+ |
+ /** |
* Parse an expression. |
* |
* <pre> |