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");
}