public Object visit(ASTAssignment node, Object data) {
// left contains the reference to assign to
int register = -1;
JexlNode left = node.jjtGetChild(0);
if (left instanceof ASTIdentifier) {
ASTIdentifier var = (ASTIdentifier) left;
register = var.getRegister();
if (register < 0) {
throw new JexlException(left, "unknown variable " + left.image);
}
} else if (!(left instanceof ASTReference)) {
throw new JexlException(left, "illegal assignment form 0");
}
// right is the value expression to assign
Object right = node.jjtGetChild(1).jjtAccept(this, data);
// determine initial object & property:
JexlNode objectNode = null;
Object object = register >= 0 ? registers[register] : null;
JexlNode propertyNode = null;
Object property = null;
boolean isVariable = true;
int v = 0;
StringBuilder variableName = null;
// 1: follow children till penultimate, resolve dot/array
int last = left.jjtGetNumChildren() - 1;
// check we are not assigning a register itself
boolean isRegister = last < 0 && register >= 0;
// start at 1 if register
for (int c = register >= 0 ? 1 : 0; c < last; ++c) {
objectNode = left.jjtGetChild(c);
// evaluate the property within the object
object = objectNode.jjtAccept(this, object);
if (object != null) {
continue;
}
isVariable &= objectNode instanceof ASTIdentifier
|| (objectNode instanceof ASTNumberLiteral && ((ASTNumberLiteral) objectNode).isInteger());
// if we get null back as a result, check for an ant variable
if (isVariable) {
if (v == 0) {
variableName = new StringBuilder(left.jjtGetChild(0).image);
v = 1;
}
for (; v <= c; ++v) {
variableName.append('.');
variableName.append(left.jjtGetChild(v).image);
}
object = context.get(variableName.toString());
// disallow mixing ant & bean with same root; avoid ambiguity
if (object != null) {
isVariable = false;
}
} else {
throw new JexlException(objectNode, "illegal assignment form");
}
}
// 2: last objectNode will perform assignement in all cases
propertyNode = isRegister ? null : left.jjtGetChild(last);
boolean antVar = false;
if (propertyNode instanceof ASTIdentifier) {
ASTIdentifier identifier = (ASTIdentifier) propertyNode;
register = identifier.getRegister();
if (register >= 0) {
isRegister = true;
} else {
property = identifier.image;
antVar = true;