Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Unified Diff: compiler/java/com/google/dart/compiler/parser/DartParser.java

Issue 8564027: Report errors for default parameter values, issue 351 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Tweaks for tests and other Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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>

Powered by Google App Engine
This is Rietveld 408576698