Skip to content

Commit

Permalink
Fix parser bug where that allowed invalid parenthesized expression wi…
Browse files Browse the repository at this point in the history
…thout a warning.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130986781
  • Loading branch information
concavelenz authored and brad4d committed Aug 23, 2016
1 parent 7b8ae08 commit 6ffb18b
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 11 deletions.
21 changes: 14 additions & 7 deletions src/com/google/javascript/jscomp/parsing/parser/Parser.java
Expand Up @@ -2633,14 +2633,24 @@ private ParseTree parseCoverParenthesizedExpressionAndArrowParameterList() {
// Case ( ) // Case ( )
if (peek(TokenType.CLOSE_PAREN)) { if (peek(TokenType.CLOSE_PAREN)) {
eat(TokenType.CLOSE_PAREN); eat(TokenType.CLOSE_PAREN);
return new FormalParameterListTree(getTreeLocation(start), ImmutableList.<ParseTree>of()); if (peek(TokenType.ARROW)) {
return new FormalParameterListTree(getTreeLocation(start), ImmutableList.<ParseTree>of());
} else {
reportError("invalid parenthesized expression");
return new MissingPrimaryExpressionTree(getTreeLocation(start));
}
} }
// Case ( ... BindingIdentifier ) // Case ( ... BindingIdentifier )
if (peek(TokenType.SPREAD)) { if (peek(TokenType.SPREAD)) {
ParseTree result = new FormalParameterListTree( ImmutableList<ParseTree> params = ImmutableList.of(
getTreeLocation(start), ImmutableList.of(parseParameter(ParamContext.IMPLEMENTATION))); parseParameter(ParamContext.IMPLEMENTATION));
eat(TokenType.CLOSE_PAREN); eat(TokenType.CLOSE_PAREN);
return result; if (peek(TokenType.ARROW)) {
return new FormalParameterListTree(getTreeLocation(start), params);
} else {
reportError("invalid parenthesized expression");
return new MissingPrimaryExpressionTree(getTreeLocation(start));
}
} }
// For either of the two remaining cases: // For either of the two remaining cases:
// ( Expression ) // ( Expression )
Expand Down Expand Up @@ -2796,9 +2806,6 @@ private ParseTree parseAssignment(Expression expressionIn) {
if (peek(TokenType.ARROW)) { if (peek(TokenType.ARROW)) {
return completeAssignmentExpressionParseAtArrow(left, expressionIn); return completeAssignmentExpressionParseAtArrow(left, expressionIn);
} }
if (left.type == ParseTreeType.FORMAL_PARAMETER_LIST) {
reportError("invalid paren expression");
}


if (peekAssignmentOperator()) { if (peekAssignmentOperator()) {
left = transformLeftHandSideExpression(left); left = transformLeftHandSideExpression(left);
Expand Down
27 changes: 23 additions & 4 deletions test/com/google/javascript/jscomp/parsing/ParserTest.java
Expand Up @@ -2634,15 +2634,34 @@ public void testRestParameters_ES5() {
getRequiresEs6Message(Feature.REST_PARAMETERS)); getRequiresEs6Message(Feature.REST_PARAMETERS));
} }


public void testExpressionsThatLookLikeParameters() { public void testExpressionsThatLookLikeParameters1() {
mode = LanguageMode.ECMASCRIPT6; mode = LanguageMode.ECMASCRIPT6;
parseError("();", "invalid paren expression"); parseError("();", "invalid parenthesized expression");
expectFeatures(Feature.REST_PARAMETERS); expectFeatures(Feature.REST_PARAMETERS);
parseError("(...xs);", "invalid paren expression"); parseError("(...xs);", "invalid parenthesized expression");
parseError("(x, ...xs);", "A rest parameter must be in a parameter list."); parseError("(x, ...xs);", "A rest parameter must be in a parameter list.");
parseError("(a, b, c, ...xs);", "A rest parameter must be in a parameter list."); parseError("(a, b, c, ...xs);", "A rest parameter must be in a parameter list.");
} }


public void testExpressionsThatLookLikeParameters2() {
mode = LanguageMode.ECMASCRIPT6;
parseError("!()", "invalid parenthesized expression");
parseError("().method", "invalid parenthesized expression");
parseError("() || a", "invalid parenthesized expression");
parseError("() && a", "invalid parenthesized expression");
parseError("x = ()", "invalid parenthesized expression");
}

public void testExpressionsThatLookLikeParameters3() {
expectFeatures(Feature.REST_PARAMETERS);
mode = LanguageMode.ECMASCRIPT6;
parseError("!(...x)", "invalid parenthesized expression");
parseError("(...x).method", "invalid parenthesized expression");
parseError("(...x) || a", "invalid parenthesized expression");
parseError("(...x) && a", "invalid parenthesized expression");
parseError("x = (...x)", "invalid parenthesized expression");
}

public void testDefaultParametersWithRestParameters() { public void testDefaultParametersWithRestParameters() {
mode = LanguageMode.ECMASCRIPT6; mode = LanguageMode.ECMASCRIPT6;
expectFeatures(Feature.DEFAULT_PARAMETERS, Feature.REST_PARAMETERS); expectFeatures(Feature.DEFAULT_PARAMETERS, Feature.REST_PARAMETERS);
Expand Down Expand Up @@ -2778,7 +2797,7 @@ public void testArrow1() {
getRequiresEs6Message(Feature.ARROW_FUNCTIONS)); getRequiresEs6Message(Feature.ARROW_FUNCTIONS));
} }


public void testArrowInvalid() { public void testArrowInvalid1() {
mode = LanguageMode.ECMASCRIPT6; mode = LanguageMode.ECMASCRIPT6;
parseError("*()=>1;", "primary expression expected"); parseError("*()=>1;", "primary expression expected");
expectFeatures(Feature.ARROW_FUNCTIONS); expectFeatures(Feature.ARROW_FUNCTIONS);
Expand Down

0 comments on commit 6ffb18b

Please sign in to comment.