Skip to content

Commit 627f35b

Browse files
committed
JS: Ensure ParseError instead of CastError for malformed patterns
1 parent 7356bf4 commit 627f35b

2 files changed

Lines changed: 15 additions & 0 deletions

File tree

‎javascript/extractor/src/com/semmle/jcorn/Parser.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2359,6 +2359,7 @@ protected List<Expression> toAssignableList(List<Expression> exprList, boolean i
23592359
} else if (last != null && last instanceof SpreadElement) {
23602360
Expression arg = ((SpreadElement) last).getArgument();
23612361
arg = (Expression) this.toAssignable(arg, isBinding);
2362+
if (!(arg instanceof IPattern)) this.unexpected(arg.getLoc().getStart());
23622363
exprList.set(end - 1, last = new RestElement(last.getLoc(), arg));
23632364
--end;
23642365
}

‎javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.semmle.js.extractor.test;
22

3+
import com.semmle.jcorn.CustomParser;
34
import com.semmle.jcorn.Options;
45
import com.semmle.jcorn.Parser;
6+
import com.semmle.jcorn.SyntaxError;
57
import com.semmle.util.io.WholeIO;
68
import com.semmle.util.tests.TestPaths;
79
import java.io.File;
810
import java.nio.charset.StandardCharsets;
11+
import org.junit.Assert;
912
import org.junit.Test;
1013

1114
public class RobustnessTests {
@@ -30,4 +33,15 @@ public void permissiveDestructuringTest() {
3033
+ "({ method(...{ value },) {} });\n";
3134
new Parser(new Options(), src, 0).parse();
3235
}
36+
37+
@Test
38+
public void parenthesizedRestParameterTest() {
39+
try {
40+
new CustomParser(new Options().preserveParens(true), "async(...(x)) => x", 0)
41+
.parse();
42+
Assert.fail("Expected syntax error, but parsing succeeded.");
43+
} catch (SyntaxError expected) {
44+
Assert.assertEquals("Unexpected token (1:9)", expected.getMessage());
45+
}
46+
}
3347
}

0 commit comments

Comments
 (0)