Chromium Code Reviews| 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> |