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> |