/** * Returns the lowest {@link LanguageMode} that supports the specified feature. */ public static LanguageMode minimumRequiredFor(FeatureSet.Feature feature) { // relies on the LanguageMode enums being in the right order for (LanguageMode mode : LanguageMode.values()) { if (mode.featureSet.has(feature)) { return mode; } } throw new IllegalStateException("No input language mode supports feature: " + feature); }
boolean isSupportedForInputLanguageMode(Feature feature) { return config.languageMode().featureSet.has(feature); }
@Override protected List<PassFactory> getWhitespaceOnlyPasses() { List<PassFactory> passes = new ArrayList<>(); if (options.processCommonJSModules) { passes.add(rewriteCommonJsModules); } else if (options.getLanguageIn().toFeatureSet().has(FeatureSet.Feature.MODULES)) { passes.add(rewriteScriptsToEs6Modules); } if (options.wrapGoogModulesForWhitespaceOnly) { passes.add(whitespaceWrapGoogModules); } return passes; }
/** * Determines whether the given name can appear on the right side of the dot operator. Many * properties (like reserved words) cannot, in ES3. */ static boolean isValidPropertyName(FeatureSet mode, String name) { if (isValidSimpleName(name)) { return true; } else { return mode.has(Feature.KEYWORDS_AS_PROPERTIES) && TokenStream.isKeyword(name); } }
@Override public ImmutableMap<String, String> getLoadFlags() { if (loadFlags == null) { Map<String, String> loadFlagsBuilder = new TreeMap<>(); loadFlagsBuilder.putAll(delegate.getLoadFlags()); FeatureSet features = ast.getFeatures(compiler); if (features.has(Feature.MODULES)) { String previousModule = loadFlagsBuilder.get("module"); if (previousModule != null && !previousModule.equals("es6")) { compiler.report(JSError.make(ModuleLoader.MODULE_CONFLICT, getName())); } loadFlagsBuilder.put("module", "es6"); } String version = features.version(); if (!version.equals("es3")) { loadFlagsBuilder.put("lang", version); } loadFlags = ImmutableMap.copyOf(loadFlagsBuilder); // Don't preserve the full AST longer than necessary. It can consume a lot of memory. ast = null; } return loadFlags; }
private void validateFeature(Feature feature, Node n) { if (!n.isFromExterns() && !compiler.getFeatureSet().has(feature)) { // Skip this check for externs because we don't need to complete transpilation on externs, // and currently only transpile externs so that we can typecheck ES6+ features in externs. violation("AST should not contain " + feature, n); } // Note: currentScript may be null if someone called validateStatement or validateExpression if (!isScriptFeatureValidationEnabled || currentScript == null) { return; } FeatureSet scriptFeatures = NodeUtil.getFeatureSetOfScript(currentScript); if (scriptFeatures == null || !NodeUtil.getFeatureSetOfScript(currentScript).has(feature)) { violation("SCRIPT node should be marked as containing feature " + feature, currentScript); } } }
passes.add(gatherModuleMetadataPass); if (options.getLanguageIn().toFeatureSet().has(FeatureSet.Feature.MODULES)) { passes.add(rewriteGoogJsImports); switch (options.getEs6ModuleTranspilation()) {
} else if (options.getLanguageIn().toFeatureSet().has(FeatureSet.Feature.MODULES)) { checks.add(rewriteScriptsToEs6Modules); if (options.getLanguageIn().toFeatureSet().has(FeatureSet.Feature.MODULES)) { checks.add(rewriteGoogJsImports); TranspilationPasses.addEs6ModulePass(checks, preprocessorSymbolTableFactory);
Node processAstRoot(ProgramTree rootNode) { Node scriptNode = newNode(Token.SCRIPT); for (ParseTree child : rootNode.sourceElements) { scriptNode.addChildToBack(transform(child)); } parseDirectives(scriptNode); boolean isGoogModule = isGoogModuleFile(scriptNode); if (isGoogModule || features.has(Feature.MODULES)) { Node moduleNode = newNode(Token.MODULE_BODY); setSourceInfo(moduleNode, rootNode); moduleNode.addChildrenToBack(scriptNode.removeChildren()); scriptNode.addChildToBack(moduleNode); if (isGoogModule) { scriptNode.putBooleanProp(Node.GOOG_MODULE, true); } else { scriptNode.putBooleanProp(Node.ES6_MODULE, true); } } return scriptNode; }
if (options.getLanguageIn().toFeatureSet().has(FeatureSet.Feature.MODULES) || options.processCommonJSModules) { options.getLanguageIn().toFeatureSet().has(Feature.MODULES), options.processCommonJSModules); } else if (options.needsTranspilationFrom(FeatureSet.ES6_MODULES) || options.processCommonJSModules) { if (options.getLanguageIn().toFeatureSet().has(Feature.MODULES)) { parsePotentialModules(moduleGraph.getAllInputs());