From 9b52acc62ac167d606ac96055d8201548458792a Mon Sep 17 00:00:00 2001 From: Asger Feldthaus Date: Thu, 6 Feb 2020 16:26:16 +0000 Subject: [PATCH] TS: Handle export * as ns --- .../js/parser/TypeScriptASTConverter.java | 18 +++++++++++++----- .../ExportNamespaceSpecifier/client.ts | 3 +++ .../TypeScript/ExportNamespaceSpecifier/lib.ts | 1 + .../ExportNamespaceSpecifier/reexport.ts | 1 + .../ExportNamespaceSpecifier/test.expected | 1 + .../ExportNamespaceSpecifier/test.ql | 3 +++ 6 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/client.ts create mode 100644 javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/lib.ts create mode 100644 javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/reexport.ts create mode 100644 javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/test.expected create mode 100644 javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/test.ql diff --git a/javascript/extractor/src/com/semmle/js/parser/TypeScriptASTConverter.java b/javascript/extractor/src/com/semmle/js/parser/TypeScriptASTConverter.java index 1b0e5421497..c4dbf02aa3a 100644 --- a/javascript/extractor/src/com/semmle/js/parser/TypeScriptASTConverter.java +++ b/javascript/extractor/src/com/semmle/js/parser/TypeScriptASTConverter.java @@ -34,6 +34,7 @@ import com.semmle.js.ast.ExportAllDeclaration; import com.semmle.js.ast.ExportDeclaration; import com.semmle.js.ast.ExportDefaultDeclaration; import com.semmle.js.ast.ExportNamedDeclaration; +import com.semmle.js.ast.ExportNamespaceSpecifier; import com.semmle.js.ast.ExportSpecifier; import com.semmle.js.ast.Expression; import com.semmle.js.ast.ExpressionStatement; @@ -507,6 +508,8 @@ public class TypeScriptASTConverter { return convertNamespaceDeclaration(node, loc); case "ModuleBlock": return convertModuleBlock(node, loc); + case "NamespaceExport": + return convertNamespaceExport(node, loc); case "NamespaceExportDeclaration": return convertNamespaceExportDeclaration(node, loc); case "NamespaceImport": @@ -1170,11 +1173,11 @@ public class TypeScriptASTConverter { private Node convertExportDeclaration(JsonObject node, SourceLocation loc) throws ParseError { Literal source = tryConvertChild(node, "moduleSpecifier", Literal.class); if (hasChild(node, "exportClause")) { - return new ExportNamedDeclaration( - loc, - null, - convertChildren(node.get("exportClause").getAsJsonObject(), "elements"), - source); + List specifiers = + hasKind(node.get("exportClause"), "NamespaceExport") + ? Collections.singletonList(convertChild(node, "exportClause")) + : convertChildren(node.get("exportClause").getAsJsonObject(), "elements"); + return new ExportNamedDeclaration(loc, null, specifiers, source); } else { return new ExportAllDeclaration(loc, source); } @@ -1187,6 +1190,11 @@ public class TypeScriptASTConverter { convertChild(node, "name")); } + private Node convertNamespaceExport(JsonObject node, SourceLocation loc) throws ParseError { + // Convert the "* as ns" from an export declaration. + return new ExportNamespaceSpecifier(loc, convertChild(node, "name")); + } + private Node convertExpressionStatement(JsonObject node, SourceLocation loc) throws ParseError { Expression expression = convertChild(node, "expression"); return new ExpressionStatement(loc, expression); diff --git a/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/client.ts b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/client.ts new file mode 100644 index 00000000000..b4004f7005b --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/client.ts @@ -0,0 +1,3 @@ +import { ns } from "./reexport"; + +ns.foo(); diff --git a/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/lib.ts b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/lib.ts new file mode 100644 index 00000000000..f99d4277774 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/lib.ts @@ -0,0 +1 @@ +export function foo() {} diff --git a/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/reexport.ts b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/reexport.ts new file mode 100644 index 00000000000..19c4b621498 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/reexport.ts @@ -0,0 +1 @@ +export * as ns from "./lib"; diff --git a/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/test.expected b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/test.expected new file mode 100644 index 00000000000..6403f1793a4 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/test.expected @@ -0,0 +1 @@ +| reexport.ts:1:13:1:14 | ns | diff --git a/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/test.ql b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/test.ql new file mode 100644 index 00000000000..44f3f9d7fd4 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ExportNamespaceSpecifier/test.ql @@ -0,0 +1,3 @@ +import javascript + +query ExportNamespaceSpecifier test_ExportNamespaceSpecifier() { any() }