| 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 76802e8b9e0c651f561661878c008f76625b2b8d..2ec422c5711388ffb51f08ae6f66cad41d0d3711 100644
|
| --- a/compiler/java/com/google/dart/compiler/parser/DartParser.java
|
| +++ b/compiler/java/com/google/dart/compiler/parser/DartParser.java
|
| @@ -1110,13 +1110,13 @@ public class DartParser extends CompletionHooksParserBase {
|
| }
|
|
|
| List<DartTypeParameter> typeParameters = parseTypeParametersOpt();
|
| - List<DartParameter> params = parseFormalParameterList();
|
| + FormalParameters params = parseFormalParameterList();
|
| expect(Token.SEMICOLON);
|
| validateNoDefaultParameterValues(
|
| - params,
|
| + params.val,
|
| ParserErrorCode.DEFAULT_VALUE_CAN_NOT_BE_SPECIFIED_IN_TYPEDEF);
|
|
|
| - return done(new DartFunctionTypeAlias(name, returnType, params, typeParameters));
|
| + return done(new DartFunctionTypeAlias(name, returnType, params.val, typeParameters));
|
| }
|
|
|
| /**
|
| @@ -1516,7 +1516,7 @@ public class DartParser extends CompletionHooksParserBase {
|
| name = doneWithoutConsuming(new DartPropertyAccess(name, parseIdentifier()));
|
| }
|
| done(name);
|
| - List<DartParameter> formals = parseFormalParameterList();
|
| + FormalParameters formals = parseFormalParameterList();
|
| int parametersCloseParen = ctx.getTokenLocation().getBegin();
|
|
|
| // Parse redirecting factory
|
| @@ -1532,8 +1532,8 @@ public class DartParser extends CompletionHooksParserBase {
|
| redirectedConstructorName = parseIdentifier();
|
| }
|
| expect(Token.SEMICOLON);
|
| - DartFunction function = doneWithoutConsuming(new DartFunction(formals, parametersCloseParen,
|
| - null, null));
|
| + DartFunction function = doneWithoutConsuming(new DartFunction(formals.val,
|
| + formals.optionalOpenOffset, formals.optionalCloseOffset, parametersCloseParen, null, null));
|
| return DartMethodDefinition.create(name, function, modifiers, redirectedTypeName,
|
| redirectedConstructorName);
|
| }
|
| @@ -1541,10 +1541,12 @@ public class DartParser extends CompletionHooksParserBase {
|
| DartFunction function;
|
| if (peekPseudoKeyword(0, NATIVE_KEYWORD)) {
|
| modifiers = modifiers.makeNative();
|
| - function = new DartFunction(formals, parametersCloseParen, parseNativeBlock(modifiers), null);
|
| + function = new DartFunction(formals.val, formals.optionalOpenOffset,
|
| + formals.optionalCloseOffset, parametersCloseParen, parseNativeBlock(modifiers), null);
|
| } else {
|
| - function = new DartFunction(formals, parametersCloseParen,
|
| - parseFunctionStatementBody(!modifiers.isExternal(), true), null);
|
| + function = new DartFunction(formals.val, formals.optionalOpenOffset,
|
| + formals.optionalCloseOffset, parametersCloseParen, parseFunctionStatementBody(
|
| + !modifiers.isExternal(), true), null);
|
| }
|
| doneWithoutConsuming(function);
|
| return DartMethodDefinition.create(name, function, modifiers, null);
|
| @@ -1670,15 +1672,16 @@ public class DartParser extends CompletionHooksParserBase {
|
| }
|
|
|
| // Parse the parameters definitions.
|
| - List<DartParameter> parameters;
|
| + FormalParameters parametersInfo;
|
| if (modifiers.isGetter() && peek(0) != Token.LPAREN) {
|
| // TODO: For now the parameters are optional so that both the old and new style will be
|
| // accepted, but eventually parameters should be disallowed.
|
| - parameters = new ArrayList<DartParameter>();
|
| + parametersInfo = new FormalParameters(new ArrayList<DartParameter>(), -1, -1);
|
| } else {
|
| //reportError(position(), ParserErrorCode.DEPRECATED_GETTER);
|
| - parameters = parseFormalParameterList();
|
| + parametersInfo = parseFormalParameterList();
|
| }
|
| + List<DartParameter> parameters = parametersInfo.val;
|
| int parametersCloseParen = ctx.getTokenLocation().getBegin();
|
|
|
| if (arity != -1) {
|
| @@ -1718,6 +1721,7 @@ public class DartParser extends CompletionHooksParserBase {
|
| }
|
| expect(Token.SEMICOLON);
|
| DartFunction function = doneWithoutConsuming(new DartFunction(parameters,
|
| + parametersInfo.optionalOpenOffset, parametersInfo.optionalCloseOffset,
|
| parametersCloseParen, null, returnType));
|
| return DartMethodDefinition.create(name, function, modifiers, redirectedTypeName,
|
| redirectedConstructorName);
|
| @@ -1747,8 +1751,9 @@ public class DartParser extends CompletionHooksParserBase {
|
| }
|
| }
|
|
|
| - DartFunction function = doneWithoutConsuming(new DartFunction(parameters, parametersCloseParen,
|
| - body, returnType));
|
| + DartFunction function = doneWithoutConsuming(new DartFunction(parameters,
|
| + parametersInfo.optionalOpenOffset, parametersInfo.optionalCloseOffset,
|
| + parametersCloseParen, body, returnType));
|
| return DartMethodDefinition.create(name, function, modifiers, initializers);
|
| }
|
|
|
| @@ -1988,6 +1993,18 @@ public class DartParser extends CompletionHooksParserBase {
|
| setMetadata(definition, metadata);
|
| return done(definition);
|
| }
|
| +
|
| + private static class FormalParameters {
|
| + private final List<DartParameter> val;
|
| + private final int optionalOpenOffset;
|
| + private final int optionalCloseOffset;
|
| + public FormalParameters(List<DartParameter> parameters, int optionalOpenOffset,
|
| + int optionalCloseOffset) {
|
| + this.val = parameters;
|
| + this.optionalOpenOffset = optionalOpenOffset;
|
| + this.optionalCloseOffset = optionalCloseOffset;
|
| + }
|
| + }
|
|
|
| /**
|
| * <pre>
|
| @@ -2016,9 +2033,11 @@ public class DartParser extends CompletionHooksParserBase {
|
| * </pre>
|
| */
|
| @Terminals(tokens = {Token.COMMA, Token.RPAREN})
|
| - private List<DartParameter> parseFormalParameterList() {
|
| + private FormalParameters parseFormalParameterList() {
|
| beginFormalParameterList();
|
| List<DartParameter> params = new ArrayList<DartParameter>();
|
| + int optionalOpenOffset = -1;
|
| + int optionalCloseOffset = -1;
|
| expect(Token.LPAREN);
|
| boolean done = optional(Token.RPAREN);
|
| boolean isOptional = false;
|
| @@ -2029,22 +2048,26 @@ public class DartParser extends CompletionHooksParserBase {
|
| reportErrorWithoutAdvancing(ParserErrorCode.CANNOT_MIX_OPTIONAL_AND_NAMED_PARAMETERS);
|
| }
|
| isOptional = true;
|
| + optionalOpenOffset = ctx.getTokenLocation().getBegin();
|
| }
|
| if (!isNamed && optional(Token.LBRACE)) {
|
| if (isOptional) {
|
| reportErrorWithoutAdvancing(ParserErrorCode.CANNOT_MIX_OPTIONAL_AND_NAMED_PARAMETERS);
|
| }
|
| isNamed = true;
|
| + optionalOpenOffset = ctx.getTokenLocation().getBegin();
|
| }
|
|
|
| DartParameter param = parseFormalParameter(isOptional, isNamed);
|
| params.add(param);
|
|
|
| if (isOptional && optional(Token.RBRACK)) {
|
| + optionalCloseOffset = ctx.getTokenLocation().getBegin();
|
| expectCloseParen();
|
| break;
|
| }
|
| if (isNamed && optional(Token.RBRACE)) {
|
| + optionalCloseOffset = ctx.getTokenLocation().getBegin();
|
| expectCloseParen();
|
| break;
|
| }
|
| @@ -2064,7 +2087,7 @@ public class DartParser extends CompletionHooksParserBase {
|
| }
|
| }
|
|
|
| - return done(params);
|
| + return new FormalParameters(done(params), optionalOpenOffset, optionalCloseOffset);
|
| }
|
|
|
| /**
|
| @@ -2138,7 +2161,7 @@ public class DartParser extends CompletionHooksParserBase {
|
| if (hasVar) {
|
| reportError(position(), ParserErrorCode.FUNCTION_TYPED_PARAMETER_IS_VAR);
|
| }
|
| - functionParams = parseFormalParameterList();
|
| + functionParams = parseFormalParameterList().val;
|
| validateNoDefaultParameterValues(
|
| functionParams,
|
| ParserErrorCode.DEFAULT_VALUE_CAN_NOT_BE_SPECIFIED_IN_CLOSURE);
|
| @@ -2191,7 +2214,8 @@ public class DartParser extends CompletionHooksParserBase {
|
| break;
|
| }
|
|
|
| - DartParameter parameter = new DartParameter(paramName, type, functionParams, defaultExpr, modifiers);
|
| + DartParameter parameter = new DartParameter(paramName, type, functionParams, defaultExpr,
|
| + modifiers);
|
| setMetadata(parameter, metadata);
|
| return done(parameter);
|
| }
|
| @@ -3448,10 +3472,11 @@ public class DartParser extends CompletionHooksParserBase {
|
| default:
|
| return null;
|
| }
|
| - List<DartParameter> params = parseFormalParameterList();
|
| + FormalParameters params = parseFormalParameterList();
|
| int parametersCloseParen = ctx.getTokenLocation().getBegin();
|
| DartBlock body = parseFunctionStatementBody(true, isDeclaration);
|
| - DartFunction function = new DartFunction(params, parametersCloseParen, body, returnType);
|
| + DartFunction function = new DartFunction(params.val, params.optionalOpenOffset,
|
| + params.optionalCloseOffset, parametersCloseParen, body, returnType);
|
| doneWithoutConsuming(function);
|
| return function;
|
| }
|
|
|