/** * Runs middleend passes on the given Soy tree. * * @param soyTree The Soy tree to run middleend passes on. * @param doEnforceSyntaxVersionV2 Whether to enforce SyntaxVersion.V2. * @throws SoySyntaxException If a syntax error is found. * @throws SoyAutoescapeException If there is a problem determining the context for an {@code * autoescape="contextual"} template or one of its callers. */ private void runMiddleendPasses(SoyFileSetNode soyTree, boolean doEnforceSyntaxVersionV2) throws SoySyntaxException { // If diallowing external calls, perform the check. if (generalOptions.allowExternalCalls() == Boolean.FALSE) { (new AssertNoExternalCallsVisitor()).exec(soyTree); } // Handle CSS commands (if not backend-specific) and substitute compile-time globals. (new HandleCssCommandVisitor(generalOptions.getCssHandlingScheme())).exec(soyTree); if (generalOptions.getCompileTimeGlobals() != null) { (new SubstituteGlobalsVisitor(generalOptions.getCompileTimeGlobals(), false)).exec(soyTree); } // Soy version 1 allowed calling functions that are not backed by any SoyFunction definition. checkFunctionCallsVisitor.setAllowExternallyDefinedFunctions(!doEnforceSyntaxVersionV2); checkFunctionCallsVisitor.exec(soyTree); // Run contextual escaping after CSS has been done, but before the autoescape visitor adds // |escapeHtml directives. The contextual directive filterHtmlIdent serves the same purpose // in some places, but with runtime guarantees. doContextualEscaping(soyTree); performAutoescapeVisitor.exec(soyTree); // Attempt to simplify the tree. (new ChangeCallsToPassAllDataVisitor()).exec(soyTree); simplifyVisitor.exec(soyTree); }
/** * Compiles this Soy file set into a Java object (type {@code SoyTofu}) capable of rendering the * compiled templates. * * @param tofuOptions The compilation options for the Tofu backend. * @return The resulting {@code SoyTofu} object. * @throws SoySyntaxException If a syntax error is found. */ public SoyTofu compileToTofu(SoyTofuOptions tofuOptions) throws SoySyntaxException { // Defensive copy of options. (Doesn't matter now, but might forget later when it matters.) tofuOptions = tofuOptions.clone(); // TODO: Allow binding a SoyTofu instance to volatile inputs. SoyFileSetNode soyTree = (new SoyFileSetParser(soyFileSuppliers)).parse(); runMiddleendPasses(soyTree, true); // If allowExternalCalls is not explicitly set, then disallow by default for Tofu backend. if (generalOptions.allowExternalCalls() == null) { // TODO: Enable this check when all Google internal projects are compliant. // (new AssertNoExternalCallsVisitor()).exec(soyTree); } // Note: Globals should have been substituted already. The pass below is just a check. (new SubstituteGlobalsVisitor(generalOptions.getCompileTimeGlobals(), true)).exec(soyTree); // Clear the SoyDoc strings because they use unnecessary memory. (new ClearSoyDocStringsVisitor()).exec(soyTree); return baseTofuFactory.create(soyTree, tofuOptions.useCaching()); }