From 78d0445c72b35668b34cfed038c6101e6206e16b Mon Sep 17 00:00:00 2001 From: blickly Date: Wed, 1 Jun 2016 07:58:17 -0700 Subject: [PATCH] Make parsing.Config immutable again. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=123752380 --- .../google/javascript/jscomp/Compiler.java | 16 +++-- .../javascript/jscomp/CompilerOptions.java | 52 +++++++--------- .../jscomp/gwt/client/JsfileParser.java | 6 +- .../javascript/jscomp/parsing/Config.java | 61 ++++++++++++------- .../javascript/jscomp/parsing/IRFactory.java | 10 +-- .../jscomp/parsing/JsDocInfoParser.java | 6 +- .../jscomp/parsing/ParserRunner.java | 34 +++++++++-- .../jscomp/parsing/AttachJsdocsTest.java | 11 ++-- .../jscomp/parsing/JsDocInfoParserTest.java | 52 +++++++++++----- .../javascript/jscomp/parsing/ParserTest.java | 26 ++++---- 10 files changed, 169 insertions(+), 105 deletions(-) diff --git a/src/com/google/javascript/jscomp/Compiler.java b/src/com/google/javascript/jscomp/Compiler.java index aa7d47850bd..201f6b82c14 100644 --- a/src/com/google/javascript/jscomp/Compiler.java +++ b/src/com/google/javascript/jscomp/Compiler.java @@ -2153,11 +2153,17 @@ Config getParserConfig(ConfigContext context) { } protected Config createConfig(Config.LanguageMode mode) { - Config config = ParserRunner.createConfig(mode, options.extraAnnotationNames); - config.setPreserveDetailedSourceInfo(options.preservesDetailedSourceInfo()); - config.setKeepGoing(options.canContinueAfterErrors()); - config.setParseJsDocDocumentation(options.isParseJsDocDocumentation()); - config.setPreserveJsDocWhitespace(options.isPreserveJsDocWhitespace()); + Config config = + ParserRunner.createConfig( + mode, + options.isParseJsDocDocumentation(), + options.preservesDetailedSourceInfo() + ? Config.SourceLocationInformation.PRESERVE + : Config.SourceLocationInformation.DISCARD, + options.canContinueAfterErrors() + ? Config.RunMode.KEEP_GOING + : Config.RunMode.STOP_AFTER_ERROR, + options.extraAnnotationNames); return config; } diff --git a/src/com/google/javascript/jscomp/CompilerOptions.java b/src/com/google/javascript/jscomp/CompilerOptions.java index 865696d0deb..5c0fafa73be 100644 --- a/src/com/google/javascript/jscomp/CompilerOptions.java +++ b/src/com/google/javascript/jscomp/CompilerOptions.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; +import com.google.javascript.jscomp.parsing.Config; import com.google.javascript.rhino.IR; import com.google.javascript.rhino.Node; import com.google.javascript.rhino.SourcePosition; @@ -126,8 +127,7 @@ public boolean shouldGenerateTypedExterns() { return generateTypedExterns; } - private boolean parseJsDocDocumentation = false; - private boolean preserveJsDocWhitespace = false; + private Config.JsDocParsing parseJsDocDocumentation = Config.JsDocParsing.TYPES_ONLY; /** * Even if checkTypes is disabled, clients such as IDEs might want to still infer types. @@ -1852,7 +1852,10 @@ public void setIdeMode(boolean ideMode) { setContinueAfterErrors(ideMode); setAllowHotswapReplaceScript(ideMode); setPreserveDetailedSourceInfo(ideMode); - setParseJsDocDocumentation(ideMode); + setParseJsDocDocumentation( + ideMode + ? Config.JsDocParsing.INCLUDE_DESCRIPTIONS_NO_WHITESPACE + : Config.JsDocParsing.TYPES_ONLY); } public void setAllowHotswapReplaceScript(boolean allowRecompilation) { @@ -1879,14 +1882,23 @@ boolean canContinueAfterErrors() { return continueAfterErrors; } + + @Deprecated + public void setParseJsDocDocumentation(boolean parseJsDocDocumentation) { + setParseJsDocDocumentation( + parseJsDocDocumentation + ? Config.JsDocParsing.INCLUDE_DESCRIPTIONS_NO_WHITESPACE + : Config.JsDocParsing.TYPES_ONLY); + } + /** - * Enables or disables the parsing of JSDoc documentation. When IDE mode is - * enabled then documentation is always parsed. + * Enables or disables the parsing of JSDoc documentation, and optionally also + * the preservation of all whitespace and formatting within a JSDoc comment. + * By default, whitespace is collapsed for all comments except {@literal @license} and + * {@literal @preserve} blocks, * - * @param parseJsDocDocumentation - * True to enable JSDoc documentation parsing, false to disable it. */ - public void setParseJsDocDocumentation(boolean parseJsDocDocumentation) { + public void setParseJsDocDocumentation(Config.JsDocParsing parseJsDocDocumentation) { this.parseJsDocDocumentation = parseJsDocDocumentation; } @@ -1895,32 +1907,10 @@ public void setParseJsDocDocumentation(boolean parseJsDocDocumentation) { * * @return True when JSDoc documentation will be parsed, false if not. */ - public boolean isParseJsDocDocumentation() { + public Config.JsDocParsing isParseJsDocDocumentation() { return this.parseJsDocDocumentation; } - /** - * Enables or disables the preservation of all whitespace and formatting within a JSDoc - * comment. By default, whitespace is collapsed for all comments except {@literal @license} and - * {@literal @preserve} blocks, - * - *

Setting this option has no effect if {@link #isParseJsDocDocumentation()} - * returns false. - * - * @param preserveJsDocWhitespace - * True to preserve whitespace in text extracted from JSDoc comments. - */ - public void setPreserveJsDocWhitespace(boolean preserveJsDocWhitespace) { - this.preserveJsDocWhitespace = preserveJsDocWhitespace; - } - - /** - * @return Whether to preserve whitespace in all text extracted from JSDoc comments. - */ - public boolean isPreserveJsDocWhitespace() { - return preserveJsDocWhitespace; - } - /** * Skip all passes (other than transpilation, if requested). Don't inject es6_runtime.js * or do any checks/optimizations (this is useful for per-file transpilation). diff --git a/src/com/google/javascript/jscomp/gwt/client/JsfileParser.java b/src/com/google/javascript/jscomp/gwt/client/JsfileParser.java index 9228cecb078..9014de19acc 100644 --- a/src/com/google/javascript/jscomp/gwt/client/JsfileParser.java +++ b/src/com/google/javascript/jscomp/gwt/client/JsfileParser.java @@ -215,10 +215,10 @@ private static FileInfo parse(String code, String filename, @Nullable Reporter r ParserRunner.createConfig( // TODO(sdh): ES6_STRICT, with a non-strict fallback - then give warnings. Config.LanguageMode.ECMASCRIPT6, + Config.JsDocParsing.INCLUDE_DESCRIPTIONS_NO_WHITESPACE, + Config.SourceLocationInformation.PRESERVE, + Config.RunMode.KEEP_GOING, /* extraAnnotationNames */ ImmutableSet.of()); - config.setPreserveDetailedSourceInfo(true); - config.setKeepGoing(true); - config.setParseJsDocDocumentation(true); SourceFile source = SourceFile.fromCode(filename, code); FileInfo info = new FileInfo(errorReporter); diff --git a/src/com/google/javascript/jscomp/parsing/Config.java b/src/com/google/javascript/jscomp/parsing/Config.java index 587fa004fef..591861a191a 100644 --- a/src/com/google/javascript/jscomp/parsing/Config.java +++ b/src/com/google/javascript/jscomp/parsing/Config.java @@ -42,22 +42,34 @@ public enum LanguageMode { /** * Whether to parse the descriptions of JsDoc comments. */ - boolean parseJsDocDocumentation; + public enum JsDocParsing { + TYPES_ONLY, + INCLUDE_DESCRIPTIONS_NO_WHITESPACE, + INCLUDE_DESCRIPTIONS_WITH_WHITESPACE; - /** - * Whether to preserve whitespace when extracting text from JsDoc comments. - */ - boolean preserveJsDocWhitespace; + boolean shouldParseDescriptions() { + return this != TYPES_ONLY; + } + } + final JsDocParsing parseJsDocDocumentation; /** * Whether to keep detailed source location information such as the exact length of every node. */ - boolean preserveDetailedSourceInfo; + public enum SourceLocationInformation { + DISCARD, + PRESERVE, + } + final SourceLocationInformation preserveDetailedSourceInfo; /** * Whether to keep going after encountering a parse error. */ - boolean keepGoing; + public enum RunMode { + STOP_AFTER_ERROR, + KEEP_GOING, + } + final RunMode keepGoing; /** * Recognized JSDoc annotations, mapped from their name to their internal @@ -76,7 +88,26 @@ public enum LanguageMode { final LanguageMode languageMode; Config(Set annotationWhitelist, Set suppressionNames, LanguageMode languageMode) { + this( + annotationWhitelist, + JsDocParsing.TYPES_ONLY, + SourceLocationInformation.DISCARD, + RunMode.STOP_AFTER_ERROR, + suppressionNames, + languageMode); + } + + Config( + Set annotationWhitelist, + JsDocParsing parseJsDocDocumentation, + SourceLocationInformation preserveDetailedSourceInfo, + RunMode keepGoing, + Set suppressionNames, + LanguageMode languageMode) { this.annotationNames = buildAnnotationNames(annotationWhitelist); + this.parseJsDocDocumentation = parseJsDocDocumentation; + this.preserveDetailedSourceInfo = preserveDetailedSourceInfo; + this.keepGoing = keepGoing; this.suppressionNames = suppressionNames; this.languageMode = languageMode; } @@ -100,20 +131,4 @@ private static Map buildAnnotationNames( } return annotationBuilder.build(); } - - public void setPreserveDetailedSourceInfo(boolean preserveDetailedSourceInfo) { - this.preserveDetailedSourceInfo = preserveDetailedSourceInfo; - } - - public void setKeepGoing(boolean keepGoing) { - this.keepGoing = keepGoing; - } - - public void setParseJsDocDocumentation(boolean parseJsDocDocumentation) { - this.parseJsDocDocumentation = parseJsDocDocumentation; - } - - public void setPreserveJsDocWhitespace(boolean preserveJsDocWhitespace) { - this.preserveJsDocWhitespace = preserveJsDocWhitespace; - } } diff --git a/src/com/google/javascript/jscomp/parsing/IRFactory.java b/src/com/google/javascript/jscomp/parsing/IRFactory.java index 74ff36dad20..e16a68e1139 100644 --- a/src/com/google/javascript/jscomp/parsing/IRFactory.java +++ b/src/com/google/javascript/jscomp/parsing/IRFactory.java @@ -281,8 +281,8 @@ private IRFactory(String sourceString, this.currentComment = skipNonJsDoc(nextCommentIter); this.newlines = new ArrayList<>(); this.sourceFile = sourceFile; - this.fileLevelJsDocBuilder = new JSDocInfoBuilder( - config.parseJsDocDocumentation); + this.fileLevelJsDocBuilder = + new JSDocInfoBuilder(config.parseJsDocDocumentation.shouldParseDescriptions()); // Pre-generate all the newlines in the file. for (int charNo = 0; true; charNo++) { @@ -931,13 +931,13 @@ private JSDocInfo parseInlineTypeDoc(Comment node) { // Set the length on the node if we're in IDE mode. void maybeSetLength( Node node, SourcePosition start, SourcePosition end) { - if (config.preserveDetailedSourceInfo) { + if (config.preserveDetailedSourceInfo == Config.SourceLocationInformation.PRESERVE) { node.setLength(end.offset - start.offset); } } void maybeSetLengthFrom(Node node, Node ref) { - if (config.preserveDetailedSourceInfo) { + if (config.preserveDetailedSourceInfo == Config.SourceLocationInformation.PRESERVE) { node.setLength(ref.getLength()); } } @@ -1255,7 +1255,7 @@ Node processFunction(FunctionDeclarationTree functionTree) { if (!isArrow && !isSignature && !bodyNode.isBlock()) { // When in "keep going" mode the parser tries to parse some constructs the // compiler doesn't support, repair it here. - Preconditions.checkState(config.keepGoing); + Preconditions.checkState(config.keepGoing == Config.RunMode.KEEP_GOING); bodyNode = IR.block(); } parseDirectives(bodyNode); diff --git a/src/com/google/javascript/jscomp/parsing/JsDocInfoParser.java b/src/com/google/javascript/jscomp/parsing/JsDocInfoParser.java index 4bbcf63538f..3029cf4bfc4 100644 --- a/src/com/google/javascript/jscomp/parsing/JsDocInfoParser.java +++ b/src/com/google/javascript/jscomp/parsing/JsDocInfoParser.java @@ -156,14 +156,16 @@ private enum State { this.sourceFile = sourceFile; - this.jsdocBuilder = new JSDocInfoBuilder(config.parseJsDocDocumentation); + boolean parseDocumentation = config.parseJsDocDocumentation.shouldParseDescriptions(); + this.jsdocBuilder = new JSDocInfoBuilder(parseDocumentation); if (comment != null) { this.jsdocBuilder.recordOriginalCommentString(comment); this.jsdocBuilder.recordOriginalCommentPosition(commentPosition); } this.annotationNames = config.annotationNames; this.suppressionNames = config.suppressionNames; - this.preserveWhitespace = config.preserveJsDocWhitespace; + this.preserveWhitespace = + config.parseJsDocDocumentation == Config.JsDocParsing.INCLUDE_DESCRIPTIONS_WITH_WHITESPACE; this.errorReporter = errorReporter; this.templateNode = this.createTemplateNode(); diff --git a/src/com/google/javascript/jscomp/parsing/ParserRunner.java b/src/com/google/javascript/jscomp/parsing/ParserRunner.java index a84639e9881..4ba1bfc6297 100644 --- a/src/com/google/javascript/jscomp/parsing/ParserRunner.java +++ b/src/com/google/javascript/jscomp/parsing/ParserRunner.java @@ -19,7 +19,10 @@ import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.javascript.jscomp.parsing.Config.JsDocParsing; import com.google.javascript.jscomp.parsing.Config.LanguageMode; +import com.google.javascript.jscomp.parsing.Config.RunMode; +import com.google.javascript.jscomp.parsing.Config.SourceLocationInformation; import com.google.javascript.jscomp.parsing.parser.FeatureSet; import com.google.javascript.jscomp.parsing.parser.Parser; import com.google.javascript.jscomp.parsing.parser.Parser.Config.Mode; @@ -53,6 +56,21 @@ private ParserRunner() {} public static Config createConfig(LanguageMode languageMode, Set extraAnnotationNames) { + return createConfig( + languageMode, + JsDocParsing.TYPES_ONLY, + SourceLocationInformation.DISCARD, + RunMode.STOP_AFTER_ERROR, + extraAnnotationNames); + } + + public static Config createConfig( + LanguageMode languageMode, + JsDocParsing jsdocParsingMode, + SourceLocationInformation sourceLocationInfo, + RunMode runMode, + Set extraAnnotationNames) { + initResourceConfig(); Set effectiveAnnotationNames; if (extraAnnotationNames == null) { @@ -61,7 +79,13 @@ public static Config createConfig(LanguageMode languageMode, effectiveAnnotationNames = new HashSet<>(annotationNames); effectiveAnnotationNames.addAll(extraAnnotationNames); } - return new Config(effectiveAnnotationNames, suppressionNames, languageMode); + return new Config( + effectiveAnnotationNames, + jsdocParsingMode, + sourceLocationInfo, + runMode, + suppressionNames, + languageMode); } public static Set getReservedVars() { @@ -91,8 +115,8 @@ public static ParseResult parse( ErrorReporter errorReporter) { // TODO(johnlenz): unify "SourceFile", "Es6ErrorReporter" and "Config" SourceFile file = new SourceFile(sourceFile.getName(), sourceString); - Es6ErrorReporter es6ErrorReporter = - new Es6ErrorReporter(errorReporter, config.keepGoing); + boolean keepGoing = config.keepGoing == Config.RunMode.KEEP_GOING; + Es6ErrorReporter es6ErrorReporter = new Es6ErrorReporter(errorReporter, keepGoing); com.google.javascript.jscomp.parsing.parser.Parser.Config es6config = new com.google.javascript.jscomp.parsing.parser.Parser.Config(mode( config.languageMode)); @@ -101,7 +125,7 @@ public static ParseResult parse( Node root = null; List comments = ImmutableList.of(); FeatureSet features = p.getFeatures(); - if (tree != null && (!es6ErrorReporter.hadError() || config.keepGoing)) { + if (tree != null && (!es6ErrorReporter.hadError() || keepGoing)) { IRFactory factory = IRFactory.transformTree(tree, sourceFile, sourceString, config, errorReporter); root = factory.getResultNode(); @@ -109,7 +133,7 @@ public static ParseResult parse( root.setIsSyntheticBlock(true); root.putProp(Node.FEATURE_SET, features); - if (config.preserveDetailedSourceInfo) { + if (config.preserveDetailedSourceInfo == Config.SourceLocationInformation.PRESERVE) { comments = p.getComments(); } } diff --git a/test/com/google/javascript/jscomp/parsing/AttachJsdocsTest.java b/test/com/google/javascript/jscomp/parsing/AttachJsdocsTest.java index fd0232635b3..62821db5c54 100644 --- a/test/com/google/javascript/jscomp/parsing/AttachJsdocsTest.java +++ b/test/com/google/javascript/jscomp/parsing/AttachJsdocsTest.java @@ -788,10 +788,13 @@ public void testInlineInExport() { private Node parse(String source, String... warnings) { TestErrorReporter testErrorReporter = new TestErrorReporter(null, warnings); - Config config = ParserRunner.createConfig(mode, null); - config.setPreserveDetailedSourceInfo(true); - config.setKeepGoing(true); - config.setParseJsDocDocumentation(true); + Config config = + ParserRunner.createConfig( + mode, + Config.JsDocParsing.INCLUDE_DESCRIPTIONS_NO_WHITESPACE, + Config.SourceLocationInformation.PRESERVE, + Config.RunMode.KEEP_GOING, + null); Node script = ParserRunner.parse( new SimpleSourceFile("input", false), source, diff --git a/test/com/google/javascript/jscomp/parsing/JsDocInfoParserTest.java b/test/com/google/javascript/jscomp/parsing/JsDocInfoParserTest.java index 6a75d2127f9..08b60582264 100644 --- a/test/com/google/javascript/jscomp/parsing/JsDocInfoParserTest.java +++ b/test/com/google/javascript/jscomp/parsing/JsDocInfoParserTest.java @@ -22,7 +22,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.javascript.jscomp.SourceFile; +import com.google.javascript.jscomp.parsing.Config.JsDocParsing; import com.google.javascript.jscomp.parsing.Config.LanguageMode; +import com.google.javascript.jscomp.parsing.Config.RunMode; +import com.google.javascript.jscomp.parsing.Config.SourceLocationInformation; import com.google.javascript.jscomp.parsing.ParserRunner.ParseResult; import com.google.javascript.rhino.JSDocInfo; import com.google.javascript.rhino.JSDocInfo.Marker; @@ -4374,10 +4377,13 @@ private void assertContains(Collection collection, T item) { private Node parseFull(String code, String... warnings) { TestErrorReporter testErrorReporter = new TestErrorReporter(null, warnings); Config config = - new Config(extraAnnotations, extraSuppressions, LanguageMode.ECMASCRIPT3); - config.setPreserveDetailedSourceInfo(true); - config.setKeepGoing(true); - config.setParseJsDocDocumentation(true); + new Config( + extraAnnotations, + JsDocParsing.INCLUDE_DESCRIPTIONS_NO_WHITESPACE, + SourceLocationInformation.PRESERVE, + RunMode.KEEP_GOING, + extraSuppressions, + LanguageMode.ECMASCRIPT3); ParseResult result = ParserRunner.parse( new SimpleSourceFile("source", false), code, config, testErrorReporter); @@ -4387,35 +4393,49 @@ private Node parseFull(String code, String... warnings) { } @SuppressWarnings("unused") - private JSDocInfo parseFileOverviewWithoutDoc(String comment, - String... warnings) { - return parse(comment, false, true, false, warnings); + private JSDocInfo parseFileOverviewWithoutDoc(String comment, String... warnings) { + return parse(comment, JsDocParsing.INCLUDE_DESCRIPTIONS_NO_WHITESPACE, warnings); } private JSDocInfo parseFileOverview(String comment, String... warnings) { - return parse(comment, true, true, false, warnings); + return parse(comment, JsDocParsing.INCLUDE_DESCRIPTIONS_NO_WHITESPACE, true, warnings); } private JSDocInfo preserveWhitespaceParse(String comment, String... warnings) { - return parse(comment, true, false, true, warnings); + return parse(comment, JsDocParsing.INCLUDE_DESCRIPTIONS_WITH_WHITESPACE, warnings); } private JSDocInfo parse(String comment, String... warnings) { - return parse(comment, false, false, false, warnings); + return parse(comment, JsDocParsing.TYPES_ONLY, warnings); } private JSDocInfo parse(String comment, boolean parseDocumentation, String... warnings) { - return parse(comment, parseDocumentation, false, false, warnings); + return parse( + comment, + parseDocumentation + ? Config.JsDocParsing.INCLUDE_DESCRIPTIONS_NO_WHITESPACE + : Config.JsDocParsing.TYPES_ONLY, + warnings); } - private JSDocInfo parse(String comment, boolean parseDocumentation, - boolean parseFileOverview, boolean preserveWhitespace, String... warnings) { + private JSDocInfo parse(String comment, JsDocParsing parseDocumentation, String... warnings) { + return parse(comment, parseDocumentation, false, warnings); + } + + private JSDocInfo parse(String comment, JsDocParsing parseDocumentation, + boolean parseFileOverview, String... warnings) { TestErrorReporter errorReporter = new TestErrorReporter(null, warnings); - Config config = new Config(extraAnnotations, extraSuppressions, LanguageMode.ECMASCRIPT3); - config.setParseJsDocDocumentation(parseDocumentation); - config.setPreserveJsDocWhitespace(preserveWhitespace); + Config config = + new Config( + extraAnnotations, + parseDocumentation, + SourceLocationInformation.DISCARD, + RunMode.STOP_AFTER_ERROR, + extraSuppressions, + LanguageMode.ECMASCRIPT3); + StaticSourceFile file = new SimpleSourceFile("testcode", false); JsDocInfoParser jsdocParser = new JsDocInfoParser( diff --git a/test/com/google/javascript/jscomp/parsing/ParserTest.java b/test/com/google/javascript/jscomp/parsing/ParserTest.java index 57774db8af4..fbca6152e85 100644 --- a/test/com/google/javascript/jscomp/parsing/ParserTest.java +++ b/test/com/google/javascript/jscomp/parsing/ParserTest.java @@ -3174,14 +3174,10 @@ private Node regex(String regex) { */ private Node parseError(String source, String... errors) { TestErrorReporter testErrorReporter = new TestErrorReporter(errors, null); - Config config = ParserRunner.createConfig(mode, null); - config.setPreserveDetailedSourceInfo(isIdeMode); - config.setKeepGoing(isIdeMode); - config.setParseJsDocDocumentation(isIdeMode); ParseResult result = ParserRunner.parse( new SimpleSourceFile("input", false), source, - config, + createConfig(), testErrorReporter); Node script = result.ast; @@ -3197,7 +3193,6 @@ private Node parseError(String source, String... errors) { return script; } - /** * Verify that the given code has the given parse warnings. * @return The parse tree. @@ -3205,14 +3200,10 @@ private Node parseError(String source, String... errors) { private Node parseWarning(String string, String... warnings) { TestErrorReporter testErrorReporter = new TestErrorReporter(null, warnings); StaticSourceFile file = new SimpleSourceFile("input", false); - Config config = ParserRunner.createConfig(mode, null); - config.setPreserveDetailedSourceInfo(isIdeMode); - config.setKeepGoing(isIdeMode); - config.setParseJsDocDocumentation(isIdeMode); ParserRunner.ParseResult result = ParserRunner.parse( file, string, - config, + createConfig(), testErrorReporter); Node script = result.ast; @@ -3236,6 +3227,19 @@ private Node parse(String string) { return parseWarning(string); } + private Config createConfig() { + if (isIdeMode) { + return ParserRunner.createConfig( + mode, + Config.JsDocParsing.INCLUDE_DESCRIPTIONS_NO_WHITESPACE, + Config.SourceLocationInformation.PRESERVE, + Config.RunMode.KEEP_GOING, + null); + } else { + return ParserRunner.createConfig(mode, null); + } + } + /** Sets expectedFeatures based on the list of features. */ private void expectFeatures(Feature... features) { expectedFeatures = FeatureSet.ES3;