in src/main/java/org/apache/commons/jexl3/parser/JexlParser.java [687:719]
protected void jjtreeCloseNodeScope(final JexlNode node) {
if (node instanceof ASTAmbiguous) {
throwAmbiguousException(node);
}
if (node instanceof ASTJexlScript) {
if (node instanceof ASTJexlLambda && !getFeatures().supportsLambda()) {
throwFeatureException(JexlFeatures.LAMBDA, node.jexlInfo());
}
final ASTJexlScript script = (ASTJexlScript) node;
// reaccess in case local variables have been declared
if (script.getScope() != scope) {
script.setScope(scope);
}
} else if (ASSIGN_NODES.contains(node.getClass())) {
final JexlNode lv = node.jjtGetChild(0);
if (!lv.isLeftValue()) {
JexlInfo xinfo = lv.jexlInfo();
xinfo = info.at(xinfo.getLine(), xinfo.getColumn());
final String msg = readSourceLine(source, xinfo.getLine());
throw new JexlException.Assignment(xinfo, msg).clean();
}
if (lv instanceof ASTIdentifier && !(lv instanceof ASTVar)) {
final ASTIdentifier varName = (ASTIdentifier) lv;
if (isConstant(varName.getSymbol())) { // if constant, fail...
JexlInfo xinfo = lv.jexlInfo();
xinfo = info.at(xinfo.getLine(), xinfo.getColumn());
throw new JexlException.Assignment(xinfo, varName.getName()).clean();
}
}
}
// heavy check
featureController.controlNode(node);
}