diff --git a/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java b/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java index b135f0ce3f3..c52dd5c1c20 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java +++ b/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java @@ -560,6 +560,7 @@ public class ASTExtractor { } else if (sourceType == SourceType.MODULE) { Label moduleScopeKey = trapwriter.globalID("module;{" + locationManager.getFileLabel() + "}," + locationManager.getStartLine() + "," + locationManager.getStartColumn()); scopeManager.enterScope(3, moduleScopeKey, toplevelLabel); + scopeManager.addVariables("exports"); // needed for Closure modules - spuriously added for ES6 modules trapwriter.addTuple("isModule", toplevelLabel); } diff --git a/javascript/extractor/src/com/semmle/js/extractor/JSExtractor.java b/javascript/extractor/src/com/semmle/js/extractor/JSExtractor.java index 9b252011264..7f4861e544d 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/JSExtractor.java +++ b/javascript/extractor/src/com/semmle/js/extractor/JSExtractor.java @@ -29,8 +29,8 @@ public class JSExtractor { this.config = config; } - // heuristic: if `import` or `export` appears at the beginning of a line, it's probably a module - private static final Pattern containsImportOrExport = Pattern.compile("(?m)^([ \t]*)(import|export)\\b"); + // heuristic: if `import`, `export`, or `goog.module` appears at the beginning of a line, it's probably a module + private static final Pattern containsModuleIndicator = Pattern.compile("(?m)^([ \t]*)(import|export|goog\\.module)\\b"); public Pair extract(TextualExtractor textualExtractor, String source, int toplevelKind, ScopeManager scopeManager) throws ParseError { // if the file starts with `{ "":` it won't parse as JavaScript; try parsing as JSON instead @@ -69,7 +69,7 @@ public class JSExtractor { if (sourceType != SourceType.AUTO) return sourceType; if (config.getEcmaVersion().compareTo(ECMAVersion.ECMA2015) >= 0) { - Matcher m = containsImportOrExport.matcher(source); + Matcher m = containsModuleIndicator.matcher(source); if (m.find() && (allowLeadingWS || m.group(1).isEmpty())) return SourceType.MODULE; } diff --git a/javascript/extractor/src/com/semmle/js/extractor/Main.java b/javascript/extractor/src/com/semmle/js/extractor/Main.java index 792823af247..98950f212f8 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/Main.java +++ b/javascript/extractor/src/com/semmle/js/extractor/Main.java @@ -41,7 +41,7 @@ public class Main { * 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-01-29"; + public static final String EXTRACTOR_VERSION = "2019-02-04"; public static final Pattern NEWLINE = Pattern.compile("\n");