use of org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode in project sling by apache.
the class ExpressionReducer method evaluate.
@Override
public EvalResult evaluate(RuntimeCall runtimeCall) {
List<ExpressionNode> nodes = new ArrayList<>();
for (ExpressionNode node : runtimeCall.getArguments()) {
EvalResult result = eval(node);
nodes.add(result.getNode());
}
return EvalResult.nonConstant(new RuntimeCall(runtimeCall.getFunctionName(), nodes));
}
use of org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode in project sling by apache.
the class ExpressionReducer method evaluate.
@Override
public EvalResult evaluate(MapLiteral mapLiteral) {
HashMap<String, EvalResult> results = new HashMap<>();
boolean isConstant = true;
for (Map.Entry<String, ExpressionNode> entry : mapLiteral.getMap().entrySet()) {
EvalResult result = eval(entry.getValue());
results.put(entry.getKey(), result);
isConstant = isConstant && result.isConstant();
}
if (isConstant) {
HashMap<String, Object> map = new HashMap<>();
for (Map.Entry<String, EvalResult> entry : results.entrySet()) {
map.put(entry.getKey(), entry.getValue().getValue());
}
return EvalResult.constant(map);
} else {
HashMap<String, ExpressionNode> literal = new HashMap<>();
for (Map.Entry<String, EvalResult> entry : results.entrySet()) {
literal.put(entry.getKey(), entry.getValue().getNode());
}
return EvalResult.nonConstant(new MapLiteral(literal));
}
}
use of org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode in project sling by apache.
the class MarkupHandler method emitSingleFragment.
private void emitSingleFragment(String name, Interpolation interpolation, char quoteChar, PluginInvoke invoke) {
//raw expression
Expression valueExpression = expressionWrapper.transform(interpolation, null, ExpressionContext.ATTRIBUTE);
//holds the raw attribute value
String attrValue = symbolGenerator.next("attrValue");
//holds the escaped attribute value
String attrContent = symbolGenerator.next("attrContent");
// holds the comparison (attrValue == true)
String isTrueVar = symbolGenerator.next("isTrueAttr");
String shouldDisplayAttr = symbolGenerator.next("shouldDisplayAttr");
MarkupContext markupContext = getAttributeMarkupContext(name);
boolean alreadyEscaped = false;
if (valueExpression.getRoot() instanceof RuntimeCall) {
RuntimeCall rc = (RuntimeCall) valueExpression.getRoot();
if (RuntimeFunction.XSS.equals(rc.getFunctionName())) {
alreadyEscaped = true;
}
}
ExpressionNode node = valueExpression.getRoot();
//attrContent = <expr>
stream.write(new VariableBinding.Start(attrValue, node));
if (!alreadyEscaped) {
Expression contentExpression = valueExpression.withNode(new Identifier(attrValue));
stream.write(new VariableBinding.Start(attrContent, adjustContext(compilerContext, contentExpression, markupContext, ExpressionContext.ATTRIBUTE).getRoot()));
stream.write(new VariableBinding.Start(shouldDisplayAttr, new BinaryOperation(BinaryOperator.OR, new Identifier(attrContent), new BinaryOperation(BinaryOperator.EQ, new StringConstant("false"), new Identifier(attrValue)))));
} else {
stream.write(new VariableBinding.Start(shouldDisplayAttr, new BinaryOperation(BinaryOperator.OR, new Identifier(attrValue), new BinaryOperation(BinaryOperator.EQ, new StringConstant("false"), new Identifier(attrValue)))));
}
// if (attrContent)
stream.write(new Conditional.Start(shouldDisplayAttr, true));
//write("attrName");
emitAttributeStart(name);
invoke.beforeAttributeValue(stream, name, node);
stream.write(new //isTrueAttr = (attrValue == true)
VariableBinding.Start(//isTrueAttr = (attrValue == true)
isTrueVar, new BinaryOperation(BinaryOperator.EQ, new Identifier(attrValue), BooleanConstant.TRUE)));
//if (!isTrueAttr)
stream.write(new Conditional.Start(isTrueVar, false));
// write("='");
emitAttributeValueStart(quoteChar);
if (!alreadyEscaped) {
//write(attrContent)
stream.write(new OutputVariable(attrContent));
} else {
// write(attrValue)
stream.write(new OutputVariable(attrValue));
}
//write("'");
emitAttributeEnd(quoteChar);
//end if isTrueAttr
stream.write(Conditional.END);
//end scope for isTrueAttr
stream.write(VariableBinding.END);
invoke.afterAttributeValue(stream, name);
//end if attrContent
stream.write(Conditional.END);
//end scope for attrContent
stream.write(VariableBinding.END);
if (!alreadyEscaped) {
stream.write(VariableBinding.END);
}
//end scope for attrValue
stream.write(VariableBinding.END);
}
use of org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode in project sling by apache.
the class ExpressionTranslator method visit.
@Override
public void visit(ArrayLiteral arrayLiteral) {
source.startExpression().startArray();
boolean needsComma = false;
for (ExpressionNode node : arrayLiteral.getItems()) {
if (needsComma) {
source.separateArgument();
}
visit(node);
needsComma = true;
}
source.endArray().endExpression();
}
use of org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode in project sling by apache.
the class GenHelper method listCoercion.
public static void listCoercion(JavaSource source, ExpressionTranslator visitor, TypedNode typedNode) {
ExpressionNode node = typedNode.getNode();
if (node instanceof Identifier) {
//using list coercion caching optimization
VariableDescriptor descriptor = visitor.getAnalyzer().descriptor(((Identifier) node).getName());
String listCoercionVar = descriptor.requireListCoercion();
source.startExpression().append(listCoercionVar).equality().nullLiteral().conditional().startExpression().append(listCoercionVar).assign().objectModel().startCall(SourceGenConstants.ROM_TO_COLLECTION, true);
node.accept(visitor);
source.endCall().endExpression().conditionalBranchSep().append(listCoercionVar).endExpression();
} else {
source.objectModel().startCall(SourceGenConstants.ROM_TO_COLLECTION, true);
typedNode.getNode().accept(visitor);
source.endCall();
}
}
Aggregations