Skip to content

Commit e2bd3d1

Browse files
committed
[GR-69425] Fix auto-generated externs conflicting with closure externs
PullRequest: graal/22048
2 parents dac0cfd + 77d9256 commit e2bd3d1

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

web-image/src/com.oracle.svm.hosted.webimage.closurecompiler/src/com/oracle/svm/hosted/webimage/closurecompiler/ClosureCompilerSupportImpl.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,32 +109,44 @@ public String applyClosureCompiler(String inputSourceCode) {
109109

110110
final CompilerOptions closureCompOpts = createClosureCompilerOptions();
111111

112-
List<SourceFile> externs = new ArrayList<>();
112+
/*
113+
* Collect externs we generate in separate list so that only those are dumped when
114+
* pre-closure dumping is turned on.
115+
*/
116+
List<SourceFile> ourExterns = new ArrayList<>();
113117

114118
// Add externs file that exposes the user-facing Web Image VM API.
115-
externs.add(vmApiExterns());
119+
ourExterns.add(vmApiExterns());
116120
// Add externs file for externally defined JavaScript classes.
117-
externs.add(jsExterns());
121+
ourExterns.add(jsExterns());
118122

119123
/*
120124
* Node.js externs are always needed due to the feature detection referencing node-specific
121125
* variables
122126
*/
123-
externs.add(nodejsExterns());
127+
ourExterns.add(nodejsExterns());
124128

125129
// Dump all externs files generated by Web Image
126-
for (SourceFile f : externs) {
130+
for (SourceFile f : ourExterns) {
127131
dumpPreClosure(f.getName(), f::getCode);
128132
}
129133

134+
List<SourceFile> externs = new ArrayList<>();
135+
/*
136+
* Add the closure compiler externs first. Otherwise, those externs may redeclare symbols in
137+
* our externs and fail the compilation. Our externs suppress those warnings to not fail the
138+
* compilation.
139+
*/
130140
try {
131141
// TODO also add externs for stuff we use in our code (e.g process.argv for node)
132142
// With that we could enable property renaming
133143
externs.addAll(AbstractCommandLineRunner.getBuiltinExterns(closureCompOpts.getEnvironment()));
134144
} catch (IOException e) {
135-
VMError.shouldNotReachHere(e);
145+
throw VMError.shouldNotReachHere(e);
136146
}
137147

148+
externs.addAll(ourExterns);
149+
138150
final Compiler closureCompiler = new Compiler();
139151
Result r = compile(closureCompiler, externs, sourceCode, closureCompOpts);
140152
if (!r.warnings.isEmpty()) {
@@ -338,14 +350,16 @@ private SourceFile jsExterns() {
338350
for (Map.Entry<String, JSCodeGenTool.ExternClassDescriptor> entry : variables.entrySet()) {
339351
String var = entry.getKey();
340352
JSCodeGenTool.ExternClassDescriptor descriptor = entry.getValue();
341-
sb.append("var ").append(var).append(" = " + getExternClass(descriptor) + ";\n");
353+
sb.append("/** @suppress {checkVars|duplicate} */\n");
354+
sb.append("var ").append(var).append(" = ").append(getExternClass(descriptor)).append(";\n");
342355
sb.append("\n");
343356
}
344357

345358
for (Map.Entry<String, JSCodeGenTool.ExternClassDescriptor> entry : components.entrySet()) {
346359
String comp = entry.getKey();
347360
JSCodeGenTool.ExternClassDescriptor descriptor = entry.getValue();
348-
sb.append(comp).append(" = " + getExternClass(descriptor) + ";\n");
361+
sb.append("/** @suppress {checkVars|duplicate} */\n");
362+
sb.append(comp).append(" = ").append(getExternClass(descriptor)).append(";\n");
349363
sb.append("\n");
350364
}
351365

0 commit comments

Comments
 (0)