google / google/closure-compiler

Crash in compiler when trying to use externs to define CommonJS loaded React

Open
#1,145 8 comments 0 reactions 0 assignees View on GitHub
bug P3
Dominant language
JavaScript
Stars
7.7k
Forks
1.2k
Avg merge
2d 12h
Merged PRs (30d)
6

Description

```
java.lang.RuntimeException: INTERNAL COMPILER ERROR.
Please email js-compiler@google.com with this stack trace and repro steps (a CL# and a build target).

Unexpected variable Symbol
Node(NAME Symbol): [synthetic:2] :34:2
Symbol = $jscomp.global.Symbol || {};
Parent(ASSIGN): [synthetic:2] :34:2
Symbol = $jscomp.global.Symbol || {};

at com.google.javascript.jscomp.VarCheck.visit(VarCheck.java:202)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:607)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:601)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:601)
at com.google.javascript.jscomp.NodeTraversal.traverseBlockScope(NodeTraversal.java:650)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:595)
at com.google.javascript.jscomp.NodeTraversal.traverseFunction(NodeTraversal.java:641)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:593)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:601)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:601)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:601)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:601)
at com.google.javascript.jscomp.NodeTraversal.traverseRoots(NodeTraversal.java:318)
at com.google.javascript.jscomp.VarCheck.process(VarCheck.java:142)
at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:285)
at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:217)
at com.google.javascript.jscomp.Compiler.optimize(Compiler.java:1912)
at com.google.javascript.jscomp.Compiler.compileInternal(Compiler.java:692)
```

Test case:
https://closure-compiler-debugger.appspot.com/#input0%3Dgoog.module(%2522test%2522)%253B%250A%250A%250Alet%2520React%2520%253D%2520%252F**%2520%2540type%2520%257BReact%257D%2520*%252F(require(%2522React%2522))%253B%250A%250Aclass%2520MyClass%2520extends%2520React.Component%2520%257B%250A%257D%250A%250Aexports%2520%253D%2520MyClass%253B%250A%26input1%26conformanceConfig%26externs%3D%252F**%250A%2520*%2520%2540type%2520%257BObject%257D%250A%2520*%2520%2540const%250A%2520*%252F%250Avar%2520React%2520%253D%2520%257B%257D%253B%250A%250A%252F**%250A*%2520%2540constructor%250A*%252F%250AReact.Component%2520%253D%2520function()%2520%257B%257D%253B%250A%250A%252F**%250A*%2520%2540param%2520%257Bstring%257D%2520module%250A*%2520%2540return%2520%257B*%257D%250A*%252F%250Avar%2520require%2520%253D%2520function(module)%2520%257B%2520return%2520%257B%257D%253B%2520%257D%253B%250A%26refasterjs-template%26CLOSURE_PASS%3D1%26LANG_IN_IS_ES6%3D1

Externs

``` javascript
/**
* @type {Object}
* @const
*/
var React = {};

/**
* @constructor
*/
React.Component = function() {};

/**
* @param {string} module
* @return {*}
*/
var require = function(module) { return {}; };
```

Code

``` javascript
goog.module("test");

let React = /** @type {React} */(require("React"));

class MyClass extends React.Component {
}

exports = MyClass;
```

See discussion:
https://groups.google.com/forum/#!topic/closure-compiler-discuss/-r7XK8j5yfA

When I run it locally I don't get this crash, instead I get:

```
WARNING - Misplaced type annotation. Type annotations are not allowed here. Are you missing parentheses?
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.