use of com.github.javaparser.ast.nodeTypes.NodeWithTraversableScope in project drools by kiegroup.
the class DrlxParseUtil method findRootNodeViaScopeRec.
private static RemoveRootNodeResult findRootNodeViaScopeRec(Expression expr, LinkedList<Expression> acc) {
if (expr.isArrayAccessExpr()) {
throw new RuntimeException("This doesn't work on arrayAccessExpr convert them to a method call");
}
if (expr instanceof EnclosedExpr) {
return findRootNodeViaScopeRec(expr.asEnclosedExpr().getInner(), acc);
} else if (expr instanceof CastExpr) {
return findRootNodeViaScopeRec(expr.asCastExpr().getExpression(), acc);
} else if (expr instanceof ThisExpr) {
return new RemoveRootNodeResult(Optional.of(expr), expr, expr);
} else if (expr instanceof NodeWithTraversableScope) {
final NodeWithTraversableScope exprWithScope = (NodeWithTraversableScope) expr;
return exprWithScope.traverseScope().flatMap((Expression scope) -> {
if (isDslTopLevelNamespace(scope)) {
return empty();
}
Expression sanitizedExpr = DrlxParseUtil.transformDrlNameExprToNameExpr(expr);
acc.addLast(sanitizedExpr.clone());
return of(findRootNodeViaScopeRec(scope, acc));
}).orElse(new RemoveRootNodeResult(Optional.of(expr), expr, acc.isEmpty() ? expr : acc.getLast()));
} else if (expr instanceof NameExpr) {
if (!acc.isEmpty() && acc.getLast() instanceof NodeWithOptionalScope<?>) {
((NodeWithOptionalScope<?>) acc.getLast()).setScope(null);
for (ListIterator<Expression> iterator = acc.listIterator(); iterator.hasNext(); ) {
Expression e = iterator.next();
if (e instanceof NodeWithOptionalScope) {
NodeWithOptionalScope<?> node = (NodeWithOptionalScope<?>) e;
if (iterator.hasNext()) {
node.setScope(acc.get(iterator.nextIndex()));
}
}
}
return new RemoveRootNodeResult(Optional.of(expr), acc.getFirst(), acc.getLast());
} else {
return new RemoveRootNodeResult(Optional.of(expr), expr, expr);
}
}
return new RemoveRootNodeResult(empty(), expr, expr);
}
Aggregations