Skip to content

Commit cd5af88

Browse files
committed
Avoid parsing JS files when building a bundle
This avoids the case where LazyParsedDependencyInfo.getLoadFlags() might parse the entire file to check if a JS file can be bundled as a Closure or ES6 module. Fixes #4006
1 parent 7a8150f commit cd5af88

File tree

8 files changed

+38
-9
lines changed

8 files changed

+38
-9
lines changed

src/com/google/javascript/jscomp/AbstractCommandLineRunner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2403,7 +2403,7 @@ void printBundleTo(JSChunk module, Appendable out) throws IOException {
24032403
// ES6 modules will need a runtime in a bundle. Skip appending this runtime if there are no
24042404
// ES6 modules to cut down on size.
24052405
for (CompilerInput input : inputs) {
2406-
if ("es6".equals(input.getLoadFlags().get("module"))) {
2406+
if (input.isEs6Module()) {
24072407
appendRuntimeTo(out);
24082408
break;
24092409
}

src/com/google/javascript/jscomp/Compiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2232,7 +2232,7 @@ private List<CompilerInput> parsePotentialModules(Iterable<CompilerInput> inputs
22322232
// Only process files that are detected as ES6 modules
22332233
if (!options.getDependencyOptions().shouldPrune()
22342234
|| !JsFileRegexParser.isSupported()
2235-
|| "es6".equals(input.getLoadFlags().get("module"))) {
2235+
|| input.isEs6Module()) {
22362236
filteredInputs.add(input);
22372237
}
22382238
}

src/com/google/javascript/jscomp/CompilerInput.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,16 @@ public String toString() {
571571
return getName();
572572
}
573573

574+
@Override
575+
public boolean isEs6Module() {
576+
return getDependencyInfo().isEs6Module();
577+
}
578+
579+
@Override
580+
public boolean isGoogModule() {
581+
return getDependencyInfo().isGoogModule();
582+
}
583+
574584
@Override
575585
public ImmutableMap<String, String> getLoadFlags() {
576586
return getDependencyInfo().getLoadFlags();

src/com/google/javascript/jscomp/LazyParsedDependencyInfo.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ public LazyParsedDependencyInfo(DependencyInfo delegate, JsAst ast, AbstractComp
4343
this.compiler = checkNotNull(compiler);
4444
}
4545

46+
@Override
47+
public boolean isEs6Module() {
48+
// Instead of doing a full parse to look this up, just ask the delegate, which at least has this much info
49+
return delegate.isEs6Module();
50+
}
51+
52+
@Override
53+
public boolean isGoogModule() {
54+
// Instead of doing a full parse to look this up, just ask the delegate, which at least has this much info
55+
return delegate.isGoogModule();
56+
}
57+
4658
@Override
4759
public ImmutableMap<String, String> getLoadFlags() {
4860
if (loadFlags == null) {

src/com/google/javascript/jscomp/deps/ClosureBundler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ public void appendTo(Appendable out, DependencyInfo info, File content, Charset
189189
/** Append the contents of the CharSource to the supplied appendable. */
190190
public void appendTo(Appendable out, DependencyInfo info, CharSource content) throws IOException {
191191
String code = content.read();
192-
if (info.isModule()) {
192+
if (info.isGoogModule()) {
193193
mode.appendGoogModule(transpile(code), out, sourceUrl);
194-
} else if ("es6".equals(info.getLoadFlags().get("module")) && transpiler == Transpiler.NULL) {
194+
} else if (info.isEs6Module() && transpiler == Transpiler.NULL) {
195195
// TODO(johnplaisted): Make the default transpiler the ES_MODULE_TO_CJS_TRANSPILER. Currently
196196
// some code is passing in unicode identifiers in non-ES6 modules the compiler fails to parse.
197197
// Once this compiler bug is fixed we can always transpile.

src/com/google/javascript/jscomp/deps/DependencyInfo.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ abstract static class Builder {
140140
/** Whether the symbol is provided by a module */
141141
boolean isModule();
142142

143+
default boolean isEs6Module() {
144+
return "es6".equals(getLoadFlags().get("module"));
145+
}
146+
default boolean isGoogModule() {
147+
return "goog".equals(getLoadFlags().get("module"));
148+
}
149+
143150
/** Whether the file '@externs' annotation. */
144151
boolean getHasExternsAnnotation();
145152

@@ -152,7 +159,7 @@ abstract static class Builder {
152159
*/
153160
abstract class Base implements DependencyInfo {
154161
@Override public boolean isModule() {
155-
return "goog".equals(getLoadFlags().get("module"));
162+
return isGoogModule();
156163
}
157164

158165
@Override

src/com/google/javascript/jscomp/deps/DepsGenerator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ private Map<String, DependencyInfo> removeMungedSymbols(
219219

220220
ImmutableList<String> provides = dependencyInfo.getProvides();
221221

222-
if ("es6".equals(dependencyInfo.getLoadFlags().get("module"))) {
222+
if (dependencyInfo.isEs6Module()) {
223223
String mungedProvide = loader.resolve(dependencyInfo.getName()).toModuleName();
224224
// Filter out the munged symbol.
225225
// Note that at the moment ES6 modules should not have any other provides! In the future
@@ -278,7 +278,7 @@ private void validateDependencies(Iterable<DependencyInfo> preparsedFileDependen
278278
reportSameFile(namespace, depInfo);
279279
} else {
280280
depInfo.isModule();
281-
boolean providerIsEs6Module = "es6".equals(provider.getLoadFlags().get("module"));
281+
boolean providerIsEs6Module = provider.isEs6Module();
282282

283283
switch (require.getType()) {
284284
case ES6_IMPORT:
@@ -363,7 +363,7 @@ private void addToProvideMap(
363363
.toModuleName());
364364
} else {
365365
// ES6 modules already provide these munged symbols.
366-
if (!"es6".equals(depInfo.getLoadFlags().get("module"))) {
366+
if (!depInfo.isEs6Module()) {
367367
provides.add(loader.resolve(depInfo.getName()).toModuleName());
368368
}
369369
}

src/com/google/javascript/jscomp/deps/SortedDependencies.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ private void processInputs() {
207207
|| (provides.size() == 1
208208
&& firstProvide.startsWith("module$")
209209
// ES6 modules should always be considered as exporting something.
210-
&& !"es6".equals(userOrderedInput.getLoadFlags().get("module")))) {
210+
&& !userOrderedInput.isEs6Module())) {
211211
nonExportingInputs.put(
212212
ModuleNames.fileToModuleName(userOrderedInput.getName()), userOrderedInput);
213213
}

0 commit comments

Comments
 (0)