google / closure-compiler

A JavaScript checker and optimizer.
https://developers.google.com/closure/compiler/
Apache License 2.0
7.39k stars 1.15k forks source link

Compiler crash for dynamic imports importing goog.module #3841

Open theseanl opened 3 years ago

theseanl commented 3 years ago

a.js

goog.module('a');
import('./b.js').then(out => {
    console.log(out.b);
});

b.js

goog.module('b');
/** @type {number} */
exports.b = 1;

compiler flags

--language_in=ECMASCRIPT_2020
--language_out=ECMASCRIPT_2020
--chunk_output_type=ES_MODULES
--emit_use_strict=false

--js=b.js
--chunk=b_out:1
--js=a.js
--chunk=a_out:1:b_out

Then the compiler crashes with a message to report it.

On a related note, I have a question: Is dynamic import supposed to work in goog.module? Or is it supposed to use some other Closure Library function to achieve on-demand loading of other goog.modules?

concavelenz commented 3 years ago

Dynamic import can not import a goog.module. It must be a ES6 module.

Can you provide the stack trace that you see with the crash?

theseanl commented 3 years ago
java.lang.RuntimeException: INTERNAL COMPILER ERROR.
Please report this problem.

null
  Node(DYNAMIC_IMPORT): a.js:1:0
import('./b.js').then(out => {
  Parent(GETPROP then): a.js:1:17
import('./b.js').then(out => {

        at com.google.javascript.jscomp.ClosureRewriteModule.getBinaryModuleNamespace(ClosureRewriteModule.java:328)
        at com.google.javascript.jscomp.ModuleRenaming$GlobalizedModuleName.create(ModuleRenaming.java:213)
        at com.google.javascript.jscomp.RewriteDynamicImports.visit(RewriteDynamicImports.java:128)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:872)
        at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:1000)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:868)
        at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:1000)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:868)
        at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:1000)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:868)
        at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:1000)
        at com.google.javascript.jscomp.NodeTraversal.handleScript(NodeTraversal.java:780)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:832)
        at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:1000)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:868)
        at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:459)
        at com.google.javascript.jscomp.NodeTraversal.access$200(NodeTraversal.java:38)
        at com.google.javascript.jscomp.NodeTraversal$Builder.traverse(NodeTraversal.java:398)
        at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:468)
        at com.google.javascript.jscomp.RewriteDynamicImports.process(RewriteDynamicImports.java:94)
        at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:317)
        at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:232)
        at com.google.javascript.jscomp.Compiler.check(Compiler.java:1062)
        at com.google.javascript.jscomp.Compiler.performChecksAndTranspilation(Compiler.java:860)
        at com.google.javascript.jscomp.Compiler.lambda$stage1Passes$4(Compiler.java:792)
        at com.google.javascript.jscomp.CompilerExecutor.lambda$runInCompilerThread$0(CompilerExecutor.java:101)
        at java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(Thread.java:834)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:519)
        at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
Caused by: java.lang.NullPointerException
        ... 32 more
concavelenz commented 3 years ago

@ChadKillingsworth to comment.

ChadKillingsworth commented 3 years ago

Well the compiler definitely shouldn't crash - I can look at that. I'm going to have to do some research though about how ES Module imports work with goog.module. Specifically, what would import * as modNs from '/path/to/goog/module.js' work?