diff --git a/src/com/google/javascript/jscomp/CommandLineRunner.java b/src/com/google/javascript/jscomp/CommandLineRunner.java index ecbc4f213e9..102affe0f04 100644 --- a/src/com/google/javascript/jscomp/CommandLineRunner.java +++ b/src/com/google/javascript/jscomp/CommandLineRunner.java @@ -173,8 +173,7 @@ private static class Flags { @Option( name = "--strict_mode_input", handler = BooleanOptionHandler.class, - usage = "Assume input sources are to run in strict mode." - + " Ignored for language modes earlier than ECMASCRIPT_2016.") + usage = "Assume input sources are to run in strict mode.") private boolean strictModeInput = true; // Turn on (very slow) extra sanity checks for use when modifying the diff --git a/src/com/google/javascript/jscomp/Compiler.java b/src/com/google/javascript/jscomp/Compiler.java index e70cd2c1284..42c4c4e691f 100644 --- a/src/com/google/javascript/jscomp/Compiler.java +++ b/src/com/google/javascript/jscomp/Compiler.java @@ -473,7 +473,7 @@ protected void reconcileOptionsWithGuards() { options.checkGlobalThisLevel); } - if (expectStrictModeInput()) { + if (options.expectStrictModeInput()) { options.setWarningLevel( DiagnosticGroups.ES5_STRICT, CheckLevel.ERROR); @@ -491,21 +491,6 @@ protected void reconcileOptionsWithGuards() { } } - private boolean expectStrictModeInput() { - switch (options.getLanguageIn()) { - case ECMASCRIPT3: - case ECMASCRIPT5: - case ECMASCRIPT6: - return false; - case ECMASCRIPT5_STRICT: - case ECMASCRIPT6_STRICT: - case ECMASCRIPT6_TYPED: - return true; - default: - return options.isStrictModeInput(); - } - } - /** * Initializes the instance state needed for a compile job. */ @@ -2681,7 +2666,7 @@ Config getParserConfig(ConfigContext context) { Config.LanguageMode configLanguageMode = getParserConfigLanguageMode( options.getLanguageIn()); Config.StrictMode strictMode = - expectStrictModeInput() ? Config.StrictMode.STRICT : Config.StrictMode.SLOPPY; + options.expectStrictModeInput() ? Config.StrictMode.STRICT : Config.StrictMode.SLOPPY; parserConfig = createConfig(configLanguageMode, strictMode); // Externs must always be parsed with at least ES5 language mode. externsParserConfig = diff --git a/src/com/google/javascript/jscomp/CompilerOptions.java b/src/com/google/javascript/jscomp/CompilerOptions.java index f36f061a111..d6dfe318672 100644 --- a/src/com/google/javascript/jscomp/CompilerOptions.java +++ b/src/com/google/javascript/jscomp/CompilerOptions.java @@ -1151,10 +1151,8 @@ public void setWrapGoogModulesForWhitespaceOnly(boolean enable) { /** * Are the input files written for strict mode? - * - *

Ignored for language modes that do not support strict mode. */ - private boolean isStrictModeInput = true; + private Optional isStrictModeInput = Optional.absent(); /** Which algorithm to use for locating ES6 and CommonJS modules */ ModuleLoader.ResolutionMode moduleResolutionMode; @@ -2721,18 +2719,7 @@ public void setConformanceConfigs(List configs) { } public boolean shouldEmitUseStrict() { - return this.emitUseStrict.or(getDefaultEmitUseStrict()); - } - - boolean getDefaultEmitUseStrict() { - switch (getLanguageOut()) { - case ECMASCRIPT3: - case ECMASCRIPT5: - case ECMASCRIPT6: - return false; - default: - return true; - } + return this.emitUseStrict.or(getLanguageOut().isDefaultStrict()); } public CompilerOptions setEmitUseStrict(boolean emitUseStrict) { @@ -3031,6 +3018,19 @@ public static enum LanguageMode { */ NO_TRANSPILE; + + /** Whether this language mode defaults to strict mode */ + boolean isDefaultStrict() { + switch (this) { + case ECMASCRIPT3: + case ECMASCRIPT5: + case ECMASCRIPT6: + return false; + default: + return true; + } + } + /** Whether this is ECMAScript 5 or higher. */ public boolean isEs5OrHigher() { Preconditions.checkState(this != NO_TRANSPILE); @@ -3310,12 +3310,12 @@ boolean isExplicitlyOn() { } } - public boolean isStrictModeInput() { - return isStrictModeInput; + public boolean expectStrictModeInput() { + return isStrictModeInput.or(getLanguageIn().isDefaultStrict()); } public CompilerOptions setStrictModeInput(boolean isStrictModeInput) { - this.isStrictModeInput = isStrictModeInput; + this.isStrictModeInput = Optional.of(isStrictModeInput); return this; } diff --git a/src/com/google/javascript/jscomp/DefaultPassConfig.java b/src/com/google/javascript/jscomp/DefaultPassConfig.java index 6232a425aeb..335aee8b0bd 100644 --- a/src/com/google/javascript/jscomp/DefaultPassConfig.java +++ b/src/com/google/javascript/jscomp/DefaultPassConfig.java @@ -2357,7 +2357,7 @@ protected CompilerPass create(AbstractCompiler compiler) { options.inlineFunctions, options.inlineLocalFunctions, true, - options.assumeStrictThis() || options.isStrictModeInput(), + options.assumeStrictThis() || options.expectStrictModeInput(), options.assumeClosuresOnlyCaptureReferences, options.maxFunctionSizeAfterInlining); } diff --git a/src/com/google/javascript/jscomp/parsing/Config.java b/src/com/google/javascript/jscomp/parsing/Config.java index f522253802e..1b733c0d58c 100644 --- a/src/com/google/javascript/jscomp/parsing/Config.java +++ b/src/com/google/javascript/jscomp/parsing/Config.java @@ -16,8 +16,6 @@ package com.google.javascript.jscomp.parsing; -import static com.google.common.base.Preconditions.checkArgument; - import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.javascript.jscomp.parsing.parser.FeatureSet; @@ -140,7 +138,6 @@ public enum RunMode { LanguageMode languageMode, boolean parseInlineSourceMaps, StrictMode strictMode) { - checkArgument(!(languageMode == LanguageMode.ECMASCRIPT3 && strictMode == StrictMode.STRICT)); this.parseInlineSourceMaps = parseInlineSourceMaps; this.annotationNames = buildAnnotationNames(annotationWhitelist); this.parseJsDocDocumentation = parseJsDocDocumentation; diff --git a/src/com/google/javascript/jscomp/parsing/parser/Parser.java b/src/com/google/javascript/jscomp/parsing/parser/Parser.java index cf974052675..a7d130f9ec6 100644 --- a/src/com/google/javascript/jscomp/parsing/parser/Parser.java +++ b/src/com/google/javascript/jscomp/parsing/parser/Parser.java @@ -16,8 +16,6 @@ package com.google.javascript.jscomp.parsing.parser; -import static com.google.common.base.Preconditions.checkArgument; - import com.google.common.collect.ImmutableList; import com.google.common.io.BaseEncoding; import com.google.errorprone.annotations.FormatMethod; @@ -234,7 +232,6 @@ public static enum Mode { private final boolean warnTrailingCommas; public Config(Mode mode, boolean isStrictMode) { - checkArgument(!(mode == Mode.ES3 && isStrictMode)); parseTypeSyntax = mode == Mode.TYPESCRIPT; atLeast6 = !(mode == Mode.ES3 || mode == Mode.ES5); this.isStrictMode = isStrictMode; diff --git a/test/com/google/javascript/jscomp/CommandLineRunnerTest.java b/test/com/google/javascript/jscomp/CommandLineRunnerTest.java index 8732fe505a3..c86b0818498 100644 --- a/test/com/google/javascript/jscomp/CommandLineRunnerTest.java +++ b/test/com/google/javascript/jscomp/CommandLineRunnerTest.java @@ -1493,11 +1493,25 @@ public void testTwoParseErrors() { public void testES3() { args.add("--language_in=ECMASCRIPT3"); args.add("--language_out=ECMASCRIPT3"); + args.add("--strict_mode_input=false"); useStringComparison = true; test( "var x = f.function", "var x=f[\"function\"];", RhinoErrorReporter.INVALID_ES3_PROP_NAME); + testSame("var let;"); + } + + public void testES3plusStrictModeChecks() { + args.add("--language_in=ECMASCRIPT3"); + args.add("--language_out=ECMASCRIPT3"); + useStringComparison = true; + test( + "var x = f.function", + "var x=f[\"function\"];", + RhinoErrorReporter.INVALID_ES3_PROP_NAME); + test("var let", RhinoErrorReporter.PARSE_ERROR); + test("function f(x) { delete x; }", StrictModeCheck.DELETE_VARIABLE); } public void testES6TranspiledByDefault() { @@ -1515,6 +1529,7 @@ public void testES5ChecksInVerbose() { public void testES5() { args.add("--language_in=ECMASCRIPT5"); + args.add("--strict_mode_input=false"); test("var x = f.function", "var x = f.function"); test("var let", "var let"); }