tntim96 / JSCover

JSCover is a JavaScript Code Coverage Tool that measures line, branch and function coverage
GNU General Public License v2.0
399 stars 84 forks source link

IllegalStateException when for ... of is used #276

Closed karottenreibe closed 5 years ago

karottenreibe commented 5 years ago

Run the following modified docs/example/script.js through JSCover v2.0.8. It reproduces the problem.

Expected: JS is instrumented Actual:

java.lang.IllegalStateException: FOR_OF 9 [length: 50] [source_file: /doc/example/script.js]
    at com.google.common.base.Preconditions.checkState(Preconditions.java:507)
    at com.google.javascript.jscomp.CodeGenerator.add(CodeGenerator.java:717)
    at com.google.javascript.jscomp.CodeGenerator.add(CodeGenerator.java:662)
    at com.google.javascript.jscomp.CodeGenerator.add(CodeGenerator.java:104)
    at com.google.javascript.jscomp.CodeGenerator.addFunction(CodeGenerator.java:1421)
    at com.google.javascript.jscomp.CodeGenerator.add(CodeGenerator.java:403)
    at com.google.javascript.jscomp.CodeGenerator.add(CodeGenerator.java:662)
    at com.google.javascript.jscomp.CodeGenerator.add(CodeGenerator.java:104)
    at com.google.javascript.jscomp.CodePrinter.toSource(CodePrinter.java:878)
    at com.google.javascript.jscomp.CodePrinter.access$300(CodePrinter.java:40)
    at com.google.javascript.jscomp.CodePrinter$Builder.build(CodePrinter.java:813)
    at jscover.instrument.SourceProcessor.instrumentSource(SourceProcessor.java:476)
    at jscover.instrument.SourceProcessor.processSourceWithoutHeader(SourceProcessor.java:435)
    at jscover.instrument.SourceProcessor.processSource(SourceProcessor.java:423)
    at jscover.instrument.SourceProcessor.processSourceForServer(SourceProcessor.java:411)
    at jscover.instrument.InstrumenterService.instrumentJSForProxyServer(InstrumenterService.java:374)
    at jscover.server.InstrumentingRequestHandler.handleGet(InstrumentingRequestHandler.java:466)
    at jscover.server.HttpServer.run(HttpServer.java:416)

It looks like the for ... of statement is not fully supported.

Reproduction JS:

function getMessage(number) {
    return 'You selected the number '+number+'.';
}
function getMessage4() {
    return 'You selected the number 4.';
}
function go(element) {
    var a = [1,2,3,4];
    for (const r of a) {
        console.log(r);
    }

    var m = [[1,2],[3,4]];
    for (const [x, y] of m) {
        console.log(x);
        console.log(y);
    }
  var message;
  if (element.id === 'radio1') {
    message = 'You selected the number 1.';
  }
  else if (element.id === 'radio2') {
    message = getMessage(2);
  }
  else if (element.id === 'radio3') {
    message = getMessage(3);
  }
  else if (element.id === 'radio4') {
    message = getMessage4();
  }
  var div = document.getElementById('request');
  div.className = 'black';
  div = document.getElementById('result');
  div.innerHTML = '<p>' + message + '</p>';
  div.innerHTML += '<p>If you are running the instrumented version of this program, you can click the "Summary" tab to view a coverage report.</p>';
}
tntim96 commented 5 years ago

I think I've fixed this. You can either build from source, or if using maven, you can test the snapshot with:

<!--- Configure repository --->
<repositories>
    <repository>
        <id>sonatype-nexus-snapshots</id>
        <name>Sonatype Nexus Snapshots</name>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>
<!--- Configure snapshot --->
<dependency>
    <groupId>com.github.tntim96</groupId>
    <artifactId>JSCover</artifactId>
    <version>2.0.9-SNAPSHOT</version>
</dependency>

...or just download the latest build here.

karottenreibe commented 5 years ago

Thank you, I can confirm that this version fixes the bug. Thanks for the very fast response :-)