From 03a2204c30272db3823333e66a3e83e39676087b Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Wed, 13 Mar 2019 14:38:33 +0000 Subject: [PATCH] JavaScript: Improve support for dynamic imports. `yield import(...)` previously caused a syntax error, now it is parsed correctly. `parseYield` is the only place where the value of `startsExpr` matters, so this change should not affect anything else. --- .../src/com/semmle/jcorn/TokenType.java | 2 +- .../src/com/semmle/js/extractor/Main.java | 2 +- .../tests/esnext/input/yield-import.js | 3 + .../esnext/output/trap/yield-import.js.trap | 177 ++++++++++++++++++ 4 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 javascript/extractor/tests/esnext/input/yield-import.js create mode 100644 javascript/extractor/tests/esnext/output/trap/yield-import.js.trap diff --git a/javascript/extractor/src/com/semmle/jcorn/TokenType.java b/javascript/extractor/src/com/semmle/jcorn/TokenType.java index bb96198115e4..25d6ee9cb533 100644 --- a/javascript/extractor/src/com/semmle/jcorn/TokenType.java +++ b/javascript/extractor/src/com/semmle/jcorn/TokenType.java @@ -183,7 +183,7 @@ public void updateContext(Parser parser, TokenType prevType) { _class = new TokenType(kw("class")), _extends = new TokenType(kw("extends").beforeExpr()), _export = new TokenType(kw("export")), - _import = new TokenType(kw("import")), + _import = new TokenType(kw("import").startsExpr()), _null = new TokenType(kw("null").startsExpr()), _true = new TokenType(kw("true").startsExpr()), _false = new TokenType(kw("false").startsExpr()), diff --git a/javascript/extractor/src/com/semmle/js/extractor/Main.java b/javascript/extractor/src/com/semmle/js/extractor/Main.java index e92553898e8d..1a5f92ca4ae5 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/Main.java +++ b/javascript/extractor/src/com/semmle/js/extractor/Main.java @@ -37,7 +37,7 @@ public class Main { * A version identifier that should be updated every time the extractor changes in such a way that * it may produce different tuples for the same file under the same {@link ExtractorConfig}. */ - public static final String EXTRACTOR_VERSION = "2019-03-11"; + public static final String EXTRACTOR_VERSION = "2019-03-13"; public static final Pattern NEWLINE = Pattern.compile("\n"); diff --git a/javascript/extractor/tests/esnext/input/yield-import.js b/javascript/extractor/tests/esnext/input/yield-import.js new file mode 100644 index 000000000000..abf030b6587d --- /dev/null +++ b/javascript/extractor/tests/esnext/input/yield-import.js @@ -0,0 +1,3 @@ +function* f() { + yield import("foo") +} diff --git a/javascript/extractor/tests/esnext/output/trap/yield-import.js.trap b/javascript/extractor/tests/esnext/output/trap/yield-import.js.trap new file mode 100644 index 000000000000..54996ba291ed --- /dev/null +++ b/javascript/extractor/tests/esnext/output/trap/yield-import.js.trap @@ -0,0 +1,177 @@ +#10000=@"/yield-import.js;sourcefile" +files(#10000,"/yield-import.js","yield-import","js",0) +#10001=@"/;folder" +folders(#10001,"/","") +containerparent(#10001,#10000) +#10002=@"loc,{#10000},0,0,0,0" +locations_default(#10002,#10000,0,0,0,0) +hasLocation(#10000,#10002) +#20000=@"global_scope" +scopes(#20000,0) +#20001=@"script;{#10000},1,1" +#20002=* +lines(#20002,#20001,"function* f() {"," +") +#20003=@"loc,{#10000},1,1,1,15" +locations_default(#20003,#10000,1,1,1,15) +hasLocation(#20002,#20003) +#20004=* +lines(#20004,#20001," yield import(""foo"")"," +") +#20005=@"loc,{#10000},2,1,2,21" +locations_default(#20005,#10000,2,1,2,21) +hasLocation(#20004,#20005) +indentation(#10000,2," ",2) +#20006=* +lines(#20006,#20001,"}"," +") +#20007=@"loc,{#10000},3,1,3,1" +locations_default(#20007,#10000,3,1,3,1) +hasLocation(#20006,#20007) +numlines(#20001,3,3,0) +#20008=* +tokeninfo(#20008,7,#20001,0,"function") +#20009=@"loc,{#10000},1,1,1,8" +locations_default(#20009,#10000,1,1,1,8) +hasLocation(#20008,#20009) +#20010=* +tokeninfo(#20010,8,#20001,1,"*") +#20011=@"loc,{#10000},1,9,1,9" +locations_default(#20011,#10000,1,9,1,9) +hasLocation(#20010,#20011) +#20012=* +tokeninfo(#20012,6,#20001,2,"f") +#20013=@"loc,{#10000},1,11,1,11" +locations_default(#20013,#10000,1,11,1,11) +hasLocation(#20012,#20013) +#20014=* +tokeninfo(#20014,8,#20001,3,"(") +#20015=@"loc,{#10000},1,12,1,12" +locations_default(#20015,#10000,1,12,1,12) +hasLocation(#20014,#20015) +#20016=* +tokeninfo(#20016,8,#20001,4,")") +#20017=@"loc,{#10000},1,13,1,13" +locations_default(#20017,#10000,1,13,1,13) +hasLocation(#20016,#20017) +#20018=* +tokeninfo(#20018,8,#20001,5,"{") +#20019=@"loc,{#10000},1,15,1,15" +locations_default(#20019,#10000,1,15,1,15) +hasLocation(#20018,#20019) +#20020=* +tokeninfo(#20020,7,#20001,6,"yield") +#20021=@"loc,{#10000},2,3,2,7" +locations_default(#20021,#10000,2,3,2,7) +hasLocation(#20020,#20021) +#20022=* +tokeninfo(#20022,7,#20001,7,"import") +#20023=@"loc,{#10000},2,9,2,14" +locations_default(#20023,#10000,2,9,2,14) +hasLocation(#20022,#20023) +#20024=* +tokeninfo(#20024,8,#20001,8,"(") +#20025=@"loc,{#10000},2,15,2,15" +locations_default(#20025,#10000,2,15,2,15) +hasLocation(#20024,#20025) +#20026=* +tokeninfo(#20026,4,#20001,9,"""foo""") +#20027=@"loc,{#10000},2,16,2,20" +locations_default(#20027,#10000,2,16,2,20) +hasLocation(#20026,#20027) +#20028=* +tokeninfo(#20028,8,#20001,10,")") +#20029=@"loc,{#10000},2,21,2,21" +locations_default(#20029,#10000,2,21,2,21) +hasLocation(#20028,#20029) +#20030=* +tokeninfo(#20030,8,#20001,11,"}") +hasLocation(#20030,#20007) +#20031=* +tokeninfo(#20031,0,#20001,12,"") +#20032=@"loc,{#10000},4,1,4,0" +locations_default(#20032,#10000,4,1,4,0) +hasLocation(#20031,#20032) +toplevels(#20001,0) +#20033=@"loc,{#10000},1,1,4,0" +locations_default(#20033,#10000,1,1,4,0) +hasLocation(#20001,#20033) +#20034=@"var;{f};{#20000}" +variables(#20034,"f",#20000) +#20035=* +stmts(#20035,17,#20001,0,"functio ... foo"")\n}") +#20036=@"loc,{#10000},1,1,3,1" +locations_default(#20036,#10000,1,1,3,1) +hasLocation(#20035,#20036) +stmtContainers(#20035,#20001) +#20037=* +exprs(#20037,78,#20035,-1,"f") +hasLocation(#20037,#20013) +exprContainers(#20037,#20035) +literals("f","f",#20037) +decl(#20037,#20034) +#20038=* +scopes(#20038,1) +scopenodes(#20035,#20038) +scopenesting(#20038,#20000) +#20039=@"var;{arguments};{#20038}" +variables(#20039,"arguments",#20038) +isArgumentsObject(#20039) +isGenerator(#20035) +#20040=* +stmts(#20040,1,#20035,-2,"{\n yie ... foo"")\n}") +#20041=@"loc,{#10000},1,15,3,1" +locations_default(#20041,#10000,1,15,3,1) +hasLocation(#20040,#20041) +stmtContainers(#20040,#20035) +#20042=* +stmts(#20042,2,#20040,0,"yield import(""foo"")") +#20043=@"loc,{#10000},2,3,2,21" +locations_default(#20043,#10000,2,3,2,21) +hasLocation(#20042,#20043) +stmtContainers(#20042,#20035) +#20044=* +exprs(#20044,69,#20042,0,"yield import(""foo"")") +hasLocation(#20044,#20043) +enclosingStmt(#20044,#20042) +exprContainers(#20044,#20035) +#20045=* +exprs(#20045,99,#20044,0,"import(""foo"")") +#20046=@"loc,{#10000},2,9,2,21" +locations_default(#20046,#10000,2,9,2,21) +hasLocation(#20045,#20046) +enclosingStmt(#20045,#20042) +exprContainers(#20045,#20035) +#20047=* +exprs(#20047,4,#20045,0,"""foo""") +hasLocation(#20047,#20027) +enclosingStmt(#20047,#20042) +exprContainers(#20047,#20035) +literals("foo","""foo""",#20047) +#20048=* +entry_cfg_node(#20048,#20001) +#20049=@"loc,{#10000},1,1,1,0" +locations_default(#20049,#10000,1,1,1,0) +hasLocation(#20048,#20049) +#20050=* +exit_cfg_node(#20050,#20001) +hasLocation(#20050,#20032) +successor(#20035,#20050) +#20051=* +entry_cfg_node(#20051,#20035) +hasLocation(#20051,#20049) +#20052=* +exit_cfg_node(#20052,#20035) +#20053=@"loc,{#10000},3,2,3,1" +locations_default(#20053,#10000,3,2,3,1) +hasLocation(#20052,#20053) +successor(#20040,#20042) +successor(#20042,#20047) +successor(#20047,#20045) +successor(#20045,#20044) +successor(#20044,#20052) +successor(#20051,#20040) +successor(#20037,#20035) +successor(#20048,#20037) +numlines(#10000,3,3,0) +filetype(#10000,"javascript")