156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/* 256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Copyright (C) 2010 Google Inc. 356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * you may not use this file except in compliance with the License. 656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * You may obtain a copy of the License at 756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * http://www.apache.org/licenses/LICENSE-2.0 956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 1056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Unless required by applicable law or agreed to in writing, software 1156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * distributed under the License is distributed on an "AS IS" BASIS, 1256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * See the License for the specific language governing permissions and 1456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * limitations under the License. 1556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 1656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpackage com.google.clearsilver.jsilver.compiler; 1856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport static com.google.clearsilver.jsilver.compiler.JavaExpression.BooleanLiteralExpression; 2056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport static com.google.clearsilver.jsilver.compiler.JavaExpression.callOn; 2156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport static com.google.clearsilver.jsilver.compiler.JavaExpression.string; 2256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.analysis.DepthFirstAdapter; 2356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AAddExpression; 2456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AAndExpression; 2556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ADecimalExpression; 2656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ADescendVariable; 2756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ADivideExpression; 2856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AEqExpression; 2956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AExistsExpression; 3056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AFunctionExpression; 3156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AGtExpression; 3256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AGteExpression; 3356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AHexExpression; 3456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ALtExpression; 3556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ALteExpression; 3656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AModuloExpression; 3756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AMultiplyExpression; 3856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ANameVariable; 3956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ANeExpression; 4056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ANegativeExpression; 4156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ANotExpression; 4256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ANumericAddExpression; 4356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ANumericEqExpression; 4456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ANumericExpression; 4556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ANumericNeExpression; 4656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AOrExpression; 4756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AStringExpression; 4856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ASubtractExpression; 4956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AVariableExpression; 5056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.PExpression; 5156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 5256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.LinkedList; 5356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 5456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/** 5556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Generates a JavaExpression to determine whether a given CS expression should be escaped before 5656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * displaying. If propagateEscapeStatus is enabled, string and numeric literals are not escaped, nor 5756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * is the output of an escaping function. If not, any expression that contains an escaping function 5856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * is not escaped. This maintains compatibility with the way ClearSilver works. 5956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 6056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpublic class EscapingEvaluator extends DepthFirstAdapter { 6156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 6256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private JavaExpression currentEscapingExpression; 6356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private boolean propagateEscapeStatus; 6456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private final VariableTranslator variableTranslator; 6556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 6656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public EscapingEvaluator(VariableTranslator variableTranslator) { 6756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson super(); 6856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.variableTranslator = variableTranslator; 6956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 7056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 7156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 7256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Returns a JavaExpression that can be used to decide whether a given variable should be escaped. 7356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 7456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @param expression variable expression to be evaluated. 7556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @param propagateEscapeStatus Whether to propagate the variable's escape status. 7656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 7756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @return Returns a {@code JavaExpression} representing a boolean expression that evaluates to 7856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * {@code true} if {@code expression} should be exempted from escaping and {@code false} 7956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * otherwise. 8056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 8156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public JavaExpression computeIfExemptFromEscaping(PExpression expression, 8256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson boolean propagateEscapeStatus) { 8356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (propagateEscapeStatus) { 8456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return computeForPropagateStatus(expression); 8556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 8656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return computeEscaping(expression, propagateEscapeStatus); 8756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 8856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 8956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private JavaExpression computeForPropagateStatus(PExpression expression) { 9056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // This function generates a boolean expression that evaluates to true 9156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // if the input should be exempt from escaping. As this should only be 9256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // called when PropagateStatus is enabled we must check EscapeMode as 9356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // well as isPartiallyEscaped. 9456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // The interpreter mode equivalent of this boolean expression would be : 9556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // ((value.getEscapeMode() != EscapeMode.ESCAPE_NONE) || value.isPartiallyEscaped()) 9656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 9756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression escapeMode = computeEscaping(expression, true); 9856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression partiallyEscaped = computeEscaping(expression, false); 9956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression escapeModeCheck = 10156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression.infix(JavaExpression.Type.BOOLEAN, "!=", escapeMode, JavaExpression 10256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson .symbol("EscapeMode.ESCAPE_NONE")); 10356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return JavaExpression.infix(JavaExpression.Type.BOOLEAN, "||", escapeModeCheck, 10556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson partiallyEscaped); 10656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 10756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 10956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Compute the escaping applied to the given expression. Uses {@code propagateEscapeStatus} to 11056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * determine how to treat constants, and whether escaping is required on a part of the expression 11156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * or the whole expression. 11256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 11356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public JavaExpression computeEscaping(PExpression expression, boolean propagateEscapeStatus) { 11456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson try { 11556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson assert currentEscapingExpression == null : "Not reentrant"; 11656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.propagateEscapeStatus = propagateEscapeStatus; 11756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson expression.apply(this); 11856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson assert currentEscapingExpression != null : "No escaping calculated"; 11956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return currentEscapingExpression; 12056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } finally { 12156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson currentEscapingExpression = null; 12256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 12556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private void setEscaping(JavaExpression escaping) { 12656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson currentEscapingExpression = escaping; 12756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 12956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 13056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * String concatenation. Do not escape the combined string, if either of the halves has been 13156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * escaped. 13256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 13356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 13456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAAddExpression(AAddExpression node) { 13556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson node.getLeft().apply(this); 13656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression left = currentEscapingExpression; 13756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson node.getRight().apply(this); 13856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression right = currentEscapingExpression; 13956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 14056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setEscaping(or(left, right)); 14156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 14256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 14356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 14456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Process AST node for a function (e.g. dosomething(...)). 14556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 14656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 14756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAFunctionExpression(AFunctionExpression node) { 14856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson LinkedList<PExpression> argsList = node.getArgs(); 14956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson PExpression[] args = argsList.toArray(new PExpression[argsList.size()]); 15056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 15156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // Because the function name may have dots in, the parser would have broken 15256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // it into a little node tree which we need to walk to reconstruct the 15356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // full name. 15456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson final StringBuilder fullFunctionName = new StringBuilder(); 15556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson node.getName().apply(new DepthFirstAdapter() { 15656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 15756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 15856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseANameVariable(ANameVariable node11) { 15956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson fullFunctionName.append(node11.getWord().getText()); 16056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 16156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 16256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 16356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseADescendVariable(ADescendVariable node12) { 16456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson node12.getParent().apply(this); 16556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson fullFunctionName.append('.'); 16656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson node12.getChild().apply(this); 16756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 16856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson }); 16956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 17056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setEscaping(function(fullFunctionName.toString(), args)); 17156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 17256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 17356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 17456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Do not escape the output of a function if either the function is an escaping function, or any 17556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * of its parameters have been escaped. 17656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 17756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private JavaExpression function(String name, PExpression... csExpressions) { 17856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (propagateEscapeStatus) { 17956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // context.isEscapingFunction("name") ? EscapeMode.ESCAPE_IS_CONSTANT : EscapeMode.ESCAPE_NONE 18056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return JavaExpression.inlineIf(JavaExpression.Type.UNKNOWN, callOn( 18156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression.Type.BOOLEAN, TemplateTranslator.CONTEXT, "isEscapingFunction", 18256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson string(name)), JavaExpression.symbol("EscapeMode.ESCAPE_IS_CONSTANT"), JavaExpression 18356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson .symbol("EscapeMode.ESCAPE_NONE")); 18456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 18556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression finalExpression = BooleanLiteralExpression.FALSE; 18656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson for (int i = 0; i < csExpressions.length; i++) { 18756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // Will put result in currentEscapingExpression. 18856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson csExpressions[i].apply(this); 18956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson finalExpression = or(finalExpression, currentEscapingExpression); 19056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 19156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression funcExpr = 19256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson callOn(JavaExpression.Type.BOOLEAN, TemplateTranslator.CONTEXT, "isEscapingFunction", 19356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson string(name)); 19456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return or(finalExpression, funcExpr); 19556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 19656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 19756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /* 19856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * This function tries to optimize the output expression where possible: instead of 19956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * "(false || context.isEscapingFunction())" it returns "context.isEscapingFunction()". 20056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 20156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private JavaExpression or(JavaExpression first, JavaExpression second) { 20256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (propagateEscapeStatus) { 20356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return JavaExpression.callOn(JavaExpression.symbol("EscapeMode"), "combineModes", first, 20456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson second); 20556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 20656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 20756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (first instanceof BooleanLiteralExpression) { 20856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson BooleanLiteralExpression expr = (BooleanLiteralExpression) first; 20956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (expr.getValue()) { 21056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return expr; 21156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } else { 21256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return second; 21356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 21456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 21556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (second instanceof BooleanLiteralExpression) { 21656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson BooleanLiteralExpression expr = (BooleanLiteralExpression) second; 21756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (expr.getValue()) { 21856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return expr; 21956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } else { 22056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return first; 22156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 22256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 22356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return JavaExpression.infix(JavaExpression.Type.BOOLEAN, "||", first, second); 22456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 22556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 22656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /* 22756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * All the following operators have no effect on escaping, so just default to 'false'. 22856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 22956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 23056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 23156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Process AST node for a variable (e.g. a.b.c). 23256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 23356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 23456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAVariableExpression(AVariableExpression node) { 23556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (propagateEscapeStatus) { 23656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JavaExpression varName = variableTranslator.translate(node.getVariable()); 23756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setEscaping(callOn(TemplateTranslator.DATA_CONTEXT, "findVariableEscapeMode", varName)); 23856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } else { 23956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 24056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 24156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 24256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 24356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private void setDefaultEscaping() { 24456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (propagateEscapeStatus) { 24556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setEscaping(JavaExpression.symbol("EscapeMode.ESCAPE_IS_CONSTANT")); 24656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } else { 24756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setEscaping(BooleanLiteralExpression.FALSE); 24856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 24956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 25056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 25156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 25256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Process AST node for a string (e.g. "hello"). 25356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 25456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 25556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAStringExpression(AStringExpression node) { 25656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 25756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 25856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 25956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 26056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Process AST node for a decimal integer (e.g. 123). 26156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 26256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 26356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseADecimalExpression(ADecimalExpression node) { 26456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 26556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 26656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 26756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 26856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Process AST node for a hex integer (e.g. 0x1AB). 26956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 27056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 27156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAHexExpression(AHexExpression node) { 27256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 27356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 27456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 27556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 27656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseANumericExpression(ANumericExpression node) { 27756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 27856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 27956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 28056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 28156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseANotExpression(ANotExpression node) { 28256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 28356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 28456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 28556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 28656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAExistsExpression(AExistsExpression node) { 28756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 28856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 28956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 29056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 29156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAEqExpression(AEqExpression node) { 29256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 29356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 29456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 29556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 29656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseANumericEqExpression(ANumericEqExpression node) { 29756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 29856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 29956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 30056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 30156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseANeExpression(ANeExpression node) { 30256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 30356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 30456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 30556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 30656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseANumericNeExpression(ANumericNeExpression node) { 30756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 30856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 30956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 31056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 31156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseALtExpression(ALtExpression node) { 31256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 31356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 31456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 31556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 31656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAGtExpression(AGtExpression node) { 31756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 31856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 31956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 32056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 32156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseALteExpression(ALteExpression node) { 32256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 32356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 32456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 32556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 32656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAGteExpression(AGteExpression node) { 32756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 32856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 32956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 33056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 33156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAAndExpression(AAndExpression node) { 33256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 33356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 33456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 33556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 33656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAOrExpression(AOrExpression node) { 33756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 33856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 33956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 34056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 34156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseANumericAddExpression(ANumericAddExpression node) { 34256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 34356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 34456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 34556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 34656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseASubtractExpression(ASubtractExpression node) { 34756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 34856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 34956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 35056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 35156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAMultiplyExpression(AMultiplyExpression node) { 35256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 35356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 35456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 35556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 35656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseADivideExpression(ADivideExpression node) { 35756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 35856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 35956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 36056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 36156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAModuloExpression(AModuloExpression node) { 36256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 36356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 36456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 36556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 36656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseANegativeExpression(ANegativeExpression node) { 36756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson setDefaultEscaping(); 36856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 36956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 37056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson} 371