Search in sources :

Example 1 with Node

use of org.drools.javaparser.ast.Node in project drools by kiegroup.

the class ExpressionTyper method flattenScope.

private static List<Node> flattenScope(Expression expressionWithScope) {
    List<Node> res = new ArrayList<>();
    if (expressionWithScope instanceof FieldAccessExpr) {
        FieldAccessExpr fieldAccessExpr = (FieldAccessExpr) expressionWithScope;
        res.addAll(flattenScope(fieldAccessExpr.getScope()));
        res.add(fieldAccessExpr.getName());
    } else if (expressionWithScope instanceof MethodCallExpr) {
        MethodCallExpr methodCallExpr = (MethodCallExpr) expressionWithScope;
        if (methodCallExpr.getScope().isPresent()) {
            res.addAll(flattenScope(methodCallExpr.getScope().get()));
        }
        res.add(methodCallExpr.setScope(null));
    } else if (expressionWithScope instanceof InlineCastExpr && ((InlineCastExpr) expressionWithScope).getExpression() instanceof FieldAccessExpr) {
        InlineCastExpr inlineCastExpr = (InlineCastExpr) expressionWithScope;
        Expression internalScope = ((FieldAccessExpr) inlineCastExpr.getExpression()).getScope();
        res.addAll(flattenScope((internalScope)));
        res.add(expressionWithScope);
    } else {
        res.add(expressionWithScope);
    }
    return res;
}
Also used : Expression(org.drools.javaparser.ast.expr.Expression) TypedExpression(org.drools.modelcompiler.builder.generator.TypedExpression) Node(org.drools.javaparser.ast.Node) ArrayList(java.util.ArrayList) InlineCastExpr(org.drools.javaparser.ast.drlx.expr.InlineCastExpr) NullSafeFieldAccessExpr(org.drools.javaparser.ast.drlx.expr.NullSafeFieldAccessExpr) FieldAccessExpr(org.drools.javaparser.ast.expr.FieldAccessExpr) DrlxParseUtil.nameExprToMethodCallExpr(org.drools.modelcompiler.builder.generator.DrlxParseUtil.nameExprToMethodCallExpr) MethodCallExpr(org.drools.javaparser.ast.expr.MethodCallExpr)

Example 2 with Node

use of org.drools.javaparser.ast.Node in project drools by kiegroup.

the class AccumulateVisitorPatternDSL method addBindAsLastChainCall.

private void addBindAsLastChainCall(MethodCallExpr newBindingExpression, MethodCallExpr pattern) {
    final Expression newScope = (Expression) pattern.getParentNode().orElse(pattern);
    final Optional<Node> optParent = newScope.getParentNode();
    newBindingExpression.setScope(newScope);
    optParent.ifPresent(parent -> parent.replace(newScope, newBindingExpression));
}
Also used : Expression(org.drools.javaparser.ast.expr.Expression) Node(org.drools.javaparser.ast.Node)

Example 3 with Node

use of org.drools.javaparser.ast.Node in project drools by kiegroup.

the class DrlxParseUtil method removeRootNode.

public static RemoveRootNodeResult removeRootNode(Expression expr) {
    Optional<Expression> rootNode = findRootNodeViaScope(expr);
    if (rootNode.isPresent()) {
        Expression root = rootNode.get();
        Optional<Node> parent = root.getParentNode();
        parent.ifPresent(p -> p.remove(root));
        return new RemoveRootNodeResult(rootNode, (Expression) parent.orElse(expr));
    }
    return new RemoveRootNodeResult(rootNode, expr);
}
Also used : Expression(org.drools.javaparser.ast.expr.Expression) DrlxExpression(org.drools.javaparser.ast.drlx.expr.DrlxExpression) Node(org.drools.javaparser.ast.Node)

Example 4 with Node

use of org.drools.javaparser.ast.Node in project drools by kiegroup.

the class ExpressionTyper method nameExpr.

private Optional<TypedExpressionCursor> nameExpr(Expression drlxExpr, NameExpr firstNode, boolean isInLineCast, Class<?> originalTypeCursor) {
    Optional<TypedExpressionCursor> teCursor;
    String firstName = firstNode.getName().getIdentifier();
    Optional<DeclarationSpec> declarationById = ruleContext.getDeclarationById(firstName);
    if (declarationById.isPresent()) {
        // do NOT append any reactOnProperties.
        // because reactOnProperties is referring only to the properties of the type of the pattern, not other declarations properites.
        context.addUsedDeclarations(firstName);
        final Class<?> typeCursor;
        if (!isInLineCast) {
            typeCursor = declarationById.get().getDeclarationClass();
        } else {
            typeCursor = originalTypeCursor;
        }
        teCursor = of(new TypedExpressionCursor(new NameExpr(firstName), typeCursor));
    } else if (packageModel.getGlobals().containsKey(firstName)) {
        context.addUsedDeclarations(firstName);
        return of(new TypedExpressionCursor(new NameExpr(firstName), packageModel.getGlobals().get(firstName)));
    } else {
        final Class<?> typeCursor;
        // In OOPath a declaration is based on a position rather than a name.
        // Only an OOPath chunk can have a backreference expression
        Optional<DeclarationSpec> backReference = Optional.empty();
        if (firstNode.getBackReferencesCount() > 0) {
            List<DeclarationSpec> ooPathDeclarations = ruleContext.getOOPathDeclarations();
            DeclarationSpec backReferenceDeclaration = ooPathDeclarations.get(ooPathDeclarations.size() - 1 - firstNode.getBackReferencesCount());
            typeCursor = backReferenceDeclaration.getDeclarationClass();
            backReference = of(backReferenceDeclaration);
            context.addUsedDeclarations(backReferenceDeclaration.getBindingId());
        } else {
            typeCursor = originalTypeCursor;
        }
        Method firstAccessor = ClassUtils.getAccessor((!isInLineCast) ? typeCursor : patternType, firstName);
        if (firstAccessor != null) {
            // Hack to review - if a property is upper case it's probably not a react on property
            if (!"".equals(firstName) && Character.isLowerCase(firstName.charAt(0))) {
                context.addReactOnProperties(firstName);
            }
            final Class<?> typeOfFirstAccessor;
            if (!isInLineCast) {
                typeOfFirstAccessor = firstAccessor.getReturnType();
            } else {
                typeOfFirstAccessor = typeCursor;
            }
            NameExpr thisAccessor = new NameExpr("_this");
            final NameExpr scope = backReference.map(d -> new NameExpr(d.getBindingId())).orElse(thisAccessor);
            teCursor = of(new TypedExpressionCursor(new MethodCallExpr(scope, firstAccessor.getName()), typeOfFirstAccessor));
        } else {
            try {
                Class<?> resolvedType = ruleContext.getTypeResolver().resolveType(firstName);
                return of(new TypedExpressionCursor(null, resolvedType));
            } catch (ClassNotFoundException e) {
            // ignore
            }
            final Optional<Node> rootNode = findRootNodeViaParent(drlxExpr);
            rootNode.ifPresent(n -> {
                // In the error messages HalfBinary are transformed to Binary
                Node withHalfBinaryReplaced = replaceAllHalfBinaryChildren(n);
                ruleContext.addCompilationError(new ParseExpressionErrorResult((Expression) withHalfBinaryReplaced));
            });
            teCursor = Optional.empty();
        }
    }
    return teCursor;
}
Also used : ArrayInitializerExpr(org.drools.javaparser.ast.expr.ArrayInitializerExpr) Expression(org.drools.javaparser.ast.expr.Expression) DrlxParseUtil.findRootNodeViaParent(org.drools.modelcompiler.builder.generator.DrlxParseUtil.findRootNodeViaParent) ThisExpr(org.drools.javaparser.ast.expr.ThisExpr) DrlxParseUtil.prepend(org.drools.modelcompiler.builder.generator.DrlxParseUtil.prepend) DeclarationSpec(org.drools.modelcompiler.builder.generator.DeclarationSpec) DrlxParseUtil.getClassFromType(org.drools.modelcompiler.builder.generator.DrlxParseUtil.getClassFromType) LiteralExpr(org.drools.javaparser.ast.expr.LiteralExpr) TemporalOperatorSpec(org.drools.modelcompiler.builder.generator.operatorspec.TemporalOperatorSpec) Optional.of(java.util.Optional.of) JavaParser(org.drools.javaparser.JavaParser) LoggerFactory(org.slf4j.LoggerFactory) BinaryExpr(org.drools.javaparser.ast.expr.BinaryExpr) ClassUtils.getter2property(org.drools.core.util.ClassUtils.getter2property) ParseExpressionErrorResult(org.drools.modelcompiler.builder.errors.ParseExpressionErrorResult) CustomOperatorSpec(org.drools.modelcompiler.builder.generator.operatorspec.CustomOperatorSpec) ClassUtil(org.drools.modelcompiler.util.ClassUtil) NullSafeFieldAccessExpr(org.drools.javaparser.ast.drlx.expr.NullSafeFieldAccessExpr) FieldAccessExpr(org.drools.javaparser.ast.expr.FieldAccessExpr) PrintUtil.toDrlx(org.drools.javaparser.printer.PrintUtil.toDrlx) DrlxParseUtil.getClassFromContext(org.drools.modelcompiler.builder.generator.DrlxParseUtil.getClassFromContext) OperatorSpec(org.drools.modelcompiler.builder.generator.operatorspec.OperatorSpec) Method(java.lang.reflect.Method) PackageModel(org.drools.modelcompiler.builder.PackageModel) ArrayCreationExpr(org.drools.javaparser.ast.expr.ArrayCreationExpr) InstanceOfExpr(org.drools.javaparser.ast.expr.InstanceOfExpr) DrlxParseUtil.getExpressionType(org.drools.modelcompiler.builder.generator.DrlxParseUtil.getExpressionType) PointFreeExpr(org.drools.javaparser.ast.drlx.expr.PointFreeExpr) HalfPointFreeExpr(org.drools.javaparser.ast.drlx.expr.HalfPointFreeExpr) NameExpr(org.drools.javaparser.ast.expr.NameExpr) UnaryExpr(org.drools.javaparser.ast.expr.UnaryExpr) List(java.util.List) TypedExpression(org.drools.modelcompiler.builder.generator.TypedExpression) DrlxParseUtil.nameExprToMethodCallExpr(org.drools.modelcompiler.builder.generator.DrlxParseUtil.nameExprToMethodCallExpr) Optional(java.util.Optional) DrlxParseUtil.replaceAllHalfBinaryChildren(org.drools.modelcompiler.builder.generator.DrlxParseUtil.replaceAllHalfBinaryChildren) CastExpr(org.drools.javaparser.ast.expr.CastExpr) NullLiteralExpr(org.drools.javaparser.ast.expr.NullLiteralExpr) ArrayList(java.util.ArrayList) HalfBinaryExpr(org.drools.javaparser.ast.drlx.expr.HalfBinaryExpr) InlineCastExpr(org.drools.javaparser.ast.drlx.expr.InlineCastExpr) MethodCallExpr(org.drools.javaparser.ast.expr.MethodCallExpr) DrlxParseUtil.getLiteralExpressionType(org.drools.modelcompiler.builder.generator.DrlxParseUtil.getLiteralExpressionType) EnclosedExpr(org.drools.javaparser.ast.expr.EnclosedExpr) Logger(org.slf4j.Logger) ClassUtils(org.drools.core.util.ClassUtils) ReferenceType(org.drools.javaparser.ast.type.ReferenceType) PrintUtil(org.drools.javaparser.printer.PrintUtil) StringLiteralExpr(org.drools.javaparser.ast.expr.StringLiteralExpr) Type(org.drools.javaparser.ast.type.Type) RuleContext(org.drools.modelcompiler.builder.generator.RuleContext) NodeList(org.drools.javaparser.ast.NodeList) DrlxParseUtil.trasformHalfBinaryToBinary(org.drools.modelcompiler.builder.generator.DrlxParseUtil.trasformHalfBinaryToBinary) ModelGenerator(org.drools.modelcompiler.builder.generator.ModelGenerator) SimpleName(org.drools.javaparser.ast.expr.SimpleName) Node(org.drools.javaparser.ast.Node) Optional(java.util.Optional) Node(org.drools.javaparser.ast.Node) NameExpr(org.drools.javaparser.ast.expr.NameExpr) Method(java.lang.reflect.Method) ParseExpressionErrorResult(org.drools.modelcompiler.builder.errors.ParseExpressionErrorResult) DeclarationSpec(org.drools.modelcompiler.builder.generator.DeclarationSpec) List(java.util.List) ArrayList(java.util.ArrayList) NodeList(org.drools.javaparser.ast.NodeList) DrlxParseUtil.nameExprToMethodCallExpr(org.drools.modelcompiler.builder.generator.DrlxParseUtil.nameExprToMethodCallExpr) MethodCallExpr(org.drools.javaparser.ast.expr.MethodCallExpr)

Aggregations

Node (org.drools.javaparser.ast.Node)4 Expression (org.drools.javaparser.ast.expr.Expression)4 ArrayList (java.util.ArrayList)2 InlineCastExpr (org.drools.javaparser.ast.drlx.expr.InlineCastExpr)2 NullSafeFieldAccessExpr (org.drools.javaparser.ast.drlx.expr.NullSafeFieldAccessExpr)2 FieldAccessExpr (org.drools.javaparser.ast.expr.FieldAccessExpr)2 MethodCallExpr (org.drools.javaparser.ast.expr.MethodCallExpr)2 Method (java.lang.reflect.Method)1 List (java.util.List)1 Optional (java.util.Optional)1 Optional.of (java.util.Optional.of)1 ClassUtils (org.drools.core.util.ClassUtils)1 ClassUtils.getter2property (org.drools.core.util.ClassUtils.getter2property)1 JavaParser (org.drools.javaparser.JavaParser)1 NodeList (org.drools.javaparser.ast.NodeList)1 DrlxExpression (org.drools.javaparser.ast.drlx.expr.DrlxExpression)1 HalfBinaryExpr (org.drools.javaparser.ast.drlx.expr.HalfBinaryExpr)1 HalfPointFreeExpr (org.drools.javaparser.ast.drlx.expr.HalfPointFreeExpr)1 PointFreeExpr (org.drools.javaparser.ast.drlx.expr.PointFreeExpr)1 ArrayCreationExpr (org.drools.javaparser.ast.expr.ArrayCreationExpr)1