From 34adc40bd10339b7c8a2ae2b2cb487323db21e68 Mon Sep 17 00:00:00 2001 From: alexeagle Date: Thu, 29 Jan 2015 17:41:56 -0800 Subject: [PATCH] Fix a compiler crash with ES5 inputs when the language_out is ES6. The ES6->ES5 passes were being enabled incorrectly based on the assumption that was the only kind of transpilation. ------------- Created by MOE: http://code.google.com/p/moe-java MOE_MIGRATED_REVID=85117586 --- src/com/google/javascript/jscomp/CompilerOptions.java | 8 ++++++-- .../google/javascript/jscomp/DefaultPassConfig.java | 6 +++--- .../com/google/javascript/jscomp/IntegrationTest.java | 11 ++++++++++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/com/google/javascript/jscomp/CompilerOptions.java b/src/com/google/javascript/jscomp/CompilerOptions.java index 483de5c9c82..b3cf5374308 100644 --- a/src/com/google/javascript/jscomp/CompilerOptions.java +++ b/src/com/google/javascript/jscomp/CompilerOptions.java @@ -1634,9 +1634,13 @@ public LanguageMode getLanguageOut() { return languageOut; } - boolean needsConversion() { + /** + * @return whether we are currently transpiling from ES6 to a lower version. + */ + boolean lowerFromEs6() { return languageOut != LanguageMode.NO_TRANSPILE - && languageIn != languageOut; + && languageIn.isEs6OrHigher() + && !languageOut.isEs6OrHigher(); } @Override diff --git a/src/com/google/javascript/jscomp/DefaultPassConfig.java b/src/com/google/javascript/jscomp/DefaultPassConfig.java index ee9b82d15f2..2ae3a2887d6 100644 --- a/src/com/google/javascript/jscomp/DefaultPassConfig.java +++ b/src/com/google/javascript/jscomp/DefaultPassConfig.java @@ -216,11 +216,11 @@ protected List getChecks() { checks.add(closureRewriteModule); } - if (options.needsConversion() || options.aggressiveVarCheck.isOn()) { + if (options.lowerFromEs6() || options.aggressiveVarCheck.isOn()) { checks.add(checkVariableReferences); } - if (options.needsConversion()) { + if (options.lowerFromEs6()) { checks.add(es6RenameVariablesInParamLists); checks.add(es6SplitVariableDeclarations); checks.add(es6ConvertSuper); @@ -234,7 +234,7 @@ protected List getChecks() { return checks; } - if (options.needsConversion()) { + if (options.lowerFromEs6()) { checks.add(es6RuntimeLibrary); } diff --git a/test/com/google/javascript/jscomp/IntegrationTest.java b/test/com/google/javascript/jscomp/IntegrationTest.java index 3dc997b9ab0..f34658f7cb1 100644 --- a/test/com/google/javascript/jscomp/IntegrationTest.java +++ b/test/com/google/javascript/jscomp/IntegrationTest.java @@ -2876,7 +2876,16 @@ public void testIssue937() { test(options, code, result); } - + public void testES5toES6() throws Exception { + CompilerOptions options = createCompilerOptions(); + options.setAllowEs6Out(true); + options.setLanguageIn(LanguageMode.ECMASCRIPT5_STRICT); + options.setLanguageOut(LanguageMode.ECMASCRIPT6_STRICT); + CompilationLevel.SIMPLE_OPTIMIZATIONS + .setOptionsForCompilationLevel(options); + String code = "f = function(c) { for (var i = 0; i < c.length; i++) {} };"; + compile(options, code); + } public void testIssue787() { CompilerOptions options = createCompilerOptions();