in src/main/java/org/apache/commons/jexl3/internal/Debugger.java [1020:1084]
protected Object visit(final ASTJexlScript node, final Object arg) {
if (outputPragmas) {
writePragmas(builder, node.getPragmas());
}
Object data = arg;
boolean named = false;
// if lambda, produce parameters
if (node instanceof ASTJexlLambda) {
final ASTJexlLambda lambda = (ASTJexlLambda) node;
final JexlNode parent = node.jjtGetParent();
// use lambda syntax if not assigned
final boolean expr = isLambdaExpr(lambda);
named = node.jjtGetChild(0) instanceof ASTVar;
final boolean assigned = parent instanceof ASTAssignment || named;
if (assigned && !expr) {
builder.append("function");
if (named) {
final ASTVar avar = (ASTVar) node.jjtGetChild(0);
builder.append(' ');
builder.append(avar.getName());
}
}
builder.append('(');
final String[] params = lambda.getParameters();
if (params != null) {
final Scope scope = lambda.getScope();
final LexicalScope lexicalScope = lambda.getLexicalScope();
for (int p = 0; p < params.length; ++p) {
if (p > 0) {
builder.append(", ");
}
final String param = params[p];
final int symbol = scope.getSymbol(param);
if (lexicalScope.isConstant(symbol)) {
builder.append("const ");
} else if (scope.isLexical(symbol)) {
builder.append("let ");
}
builder.append(visitParameter(param, data));
}
}
builder.append(')');
if (assigned && !expr) {
// block follows
builder.append(' ');
} else {
builder.append(arrow);
// add a space if lambda expr otherwise block follows
if (expr) {
builder.append(' ');
}
}
}
// no parameters or done with them
final int num = node.jjtGetNumChildren();
if (num == 1 && !(node instanceof ASTJexlLambda)) {
data = accept(node.jjtGetChild(0), data);
} else {
for (int i = named? 1 : 0; i < num; ++i) {
final JexlNode child = node.jjtGetChild(i);
acceptStatement(child, data);
}
}
return data;
}