google / closure-compiler

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

NullPointerException on ES6-style destructuring var declaration. #1207

Closed mikesamuel closed 8 years ago

mikesamuel commented 8 years ago

I get an internal error report running the compiler against RegExp.make.js/issue11.

To reproduce

  1. I downloaded the latest compiler from http://dl.google.com/closure-compiler/compiler-latest.zip
  2. Checkout issue 11: git clone -b issue11 git@github.com:mikesamuel/regexp-make-js.git regexp-make-js-issue11
  3. Run the compiler java -jar tools/compiler.jar --language_in=ECMASCRIPT6 --warning_level=VERBOSE --jscomp_error="*" --compilation_level=ADVANCED --js RegExp.make.js --externs externs.js

I see the below.

RegExp.make.js:988: WARNING - Missing "..." in type annotation for rest parameter.
  function make(ctor, flags, template, ...values) {
                                       ^

RegExp.make.js:310: ERROR - Unable to infer type of constant.
      wholeInput,  // Is the input whole.
      ^

RegExp.make.js:311: ERROR - Unable to infer type of constant.
      startCharset,
      ^

RegExp.make.js:312: ERROR - Unable to infer type of constant.
      range,
      ^

RegExp.make.js:313: ERROR - Unable to infer type of constant.
      endCharset,
      ^

RegExp.make.js:314: ERROR - Unable to infer type of constant.
      bracket,
      ^

RegExp.make.js:315: ERROR - Unable to infer type of constant.
      operators,
      ^

RegExp.make.js:316: ERROR - Unable to infer type of constant.
      count,
      ^

RegExp.make.js:317: ERROR - Unable to infer type of constant.
      escape,
      ^

RegExp.make.js:318: ERROR - Unable to infer type of constant.
      backref,
      ^

RegExp.make.js:319: ERROR - Unable to infer type of constant.
      other: otherOpt
             ^

10 error(s), 1 warning(s)
java.lang.RuntimeException: INTERNAL COMPILER ERROR.
Please report this problem.

INTERNAL COMPILER ERROR.
Please report this problem.

null
  Node(VAR): RegExp.make.js:988:50
  function make(ctor, flags, template, ...values) {
  Parent(BLOCK): RegExp.make.js:988:50
  function make(ctor, flags, template, ...values) {

  Node(FUNCTION make): RegExp.make.js:988:2
  function make(ctor, flags, template, ...values) {
  Parent(BLOCK): RegExp.make.js:5:27
RegExp.make = (function () {

    at com.google.javascript.rhino.jstype.JSTypeRegistry.createFromTypeNodesInternal(JSTypeRegistry.java:1570)
    at com.google.javascript.rhino.jstype.JSTypeRegistry.createFromTypeNodesInternal(JSTypeRegistry.java:1576)
    at com.google.javascript.rhino.jstype.JSTypeRegistry.createFromTypeNodesInternal(JSTypeRegistry.java:1658)
    at com.google.javascript.rhino.jstype.JSTypeRegistry.createFromTypeNodesInternal(JSTypeRegistry.java:1576)
    at com.google.javascript.rhino.jstype.JSTypeRegistry.createTypeFromCommentNode(JSTypeRegistry.java:1564)
    at com.google.javascript.rhino.jstype.JSTypeRegistry.createTypeFromCommentNode(JSTypeRegistry.java:77)
    at com.google.javascript.rhino.JSTypeExpression.evaluate(JSTypeExpression.java:98)
    at com.google.javascript.jscomp.TypedScopeCreator$AbstractScopeBuilder.getDeclaredTypeInAnnotation(TypedScopeCreator.java:726)
    at com.google.javascript.jscomp.TypedScopeCreator$AbstractScopeBuilder.getDeclaredType(TypedScopeCreator.java:1340)
    at com.google.javascript.jscomp.TypedScopeCreator$AbstractScopeBuilder.defineName(TypedScopeCreator.java:817)
    at com.google.javascript.jscomp.TypedScopeCreator$AbstractScopeBuilder.defineVar(TypedScopeCreator.java:776)
    at com.google.javascript.jscomp.TypedScopeCreator$AbstractScopeBuilder.visit(TypedScopeCreator.java:540)
    at com.google.javascript.jscomp.TypedScopeCreator$LocalScopeBuilder.visit(TypedScopeCreator.java:2006)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:609)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:603)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:603)
    at com.google.javascript.jscomp.NodeTraversal.traverseFunction(NodeTraversal.java:643)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:595)
    at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:295)
    at com.google.javascript.jscomp.NodeTraversal.traverseTyped(NodeTraversal.java:565)
    at com.google.javascript.jscomp.TypedScopeCreator$LocalScopeBuilder.build(TypedScopeCreator.java:1953)
    at com.google.javascript.jscomp.TypedScopeCreator.createScope(TypedScopeCreator.java:237)
    at com.google.javascript.jscomp.TypedScopeCreator.createScope(TypedScopeCreator.java:99)
    at com.google.javascript.jscomp.MemoizedScopeCreator.createScope(MemoizedScopeCreator.java:87)
    at com.google.javascript.jscomp.MemoizedScopeCreator.createScope(MemoizedScopeCreator.java:47)
    at com.google.javascript.jscomp.NodeTraversal.getScope(NodeTraversal.java:739)
    at com.google.javascript.jscomp.NodeTraversal.getTypedScope(NodeTraversal.java:755)
    at com.google.javascript.jscomp.TypeInferencePass$FirstScopeBuildingCallback.enterScope(TypeInferencePass.java:133)
    at com.google.javascript.jscomp.NodeTraversal.pushScope(NodeTraversal.java:676)
    at com.google.javascript.jscomp.NodeTraversal.traverseFunction(NodeTraversal.java:627)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:595)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:603)
    at com.google.javascript.jscomp.NodeTraversal.traverseFunction(NodeTraversal.java:643)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:595)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:603)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:603)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:603)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:603)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:603)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:603)
    at com.google.javascript.jscomp.NodeTraversal.traverseWithScope(NodeTraversal.java:352)
    at com.google.javascript.jscomp.TypeInferencePass.inferAllScopes(TypeInferencePass.java:103)
    at com.google.javascript.jscomp.TypeInferencePass.process(TypeInferencePass.java:73)
    at com.google.javascript.jscomp.DefaultPassConfig$47$1.process(DefaultPassConfig.java:1466)
    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.check(Compiler.java:758)
    at com.google.javascript.jscomp.Compiler.compileInternal(Compiler.java:674)
    at com.google.javascript.jscomp.Compiler.access$000(Compiler.java:89)
    at com.google.javascript.jscomp.Compiler$2.call(Compiler.java:632)
    at com.google.javascript.jscomp.Compiler$2.call(Compiler.java:629)
    at com.google.javascript.jscomp.CompilerExecutor$2.call(CompilerExecutor.java:93)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: INTERNAL COMPILER ERROR.
Please report this problem.

null
  Node(VAR): RegExp.make.js:988:50
  function make(ctor, flags, template, ...values) {
  Parent(BLOCK): RegExp.make.js:988:50
  function make(ctor, flags, template, ...values) {
mikesamuel commented 8 years ago

The compiler runs without an exception when I address the first warning by replacing

  /**
   * ...
   *  @param {!Array.<*>} values an array of n parts to interpolate between
   *     the end of the corresponding raw part and the start of its follower.
   */
  function make(ctor, flags, template, ...values) {

with

  /**
   * ...
   * @param {...*} values an array of n parts to interpolate between
   *     the end of the corresponding raw part and the start of its follower.
   */
  function make(ctor, flags, template, ...values) {
mikesamuel commented 8 years ago

Here's a minimal case that repros the problem.

  /**
   * @param {!Array.<*>} x
   */
  function foo(...x) {

    var { y } = x;
  }

compiled using the latest version of the compiler via

$ java -jar tools/compiler.jar --language_in=ECMASCRIPT6 \
  --warning_level=VERBOSE --jscomp_error="*" \
  --compilation_level=ADVANCED --js min-repro-case.js

on

$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
ChadKillingsworth commented 8 years ago

Your repo case is missing the --language_out=ECMASCRIPT5 flag - but I confirmed the exception even with transpilation.

MatrixFrog commented 8 years ago

https://closure-compiler-debugger.appspot.com/#input0%3D%2520%2520%252F**%250A%2520%2520%2520*%2520%2540param%2520%257B!Array.%253C*%253E%257D%2520x%250A%2520%2520%2520*%252F%250A%2520%2520function%2520foo(...x)%2520%257B%250A%250A%2520%2520%2520%2520var%2520%257B%2520y%2520%257D%2520%253D%2520x%253B%250A%2520%2520%257D%26input1%26conformanceConfig%26externs%26refasterjs-template%26includeDefaultExterns%3D1%26CHECK_SYMBOLS%3D1%26CHECK_TYPES%3D1%26LANG_IN_IS_ES6%3D1%26MISSING_PROPERTIES%3D1%26PRESERVE_TYPE_ANNOTATIONS%3D1%26PRETTY_PRINT%3D1%26TRANSPILE%3D1

MatrixFrog commented 8 years ago

I think I forgot the magic word "fixed" but that commit should have fixed this.