Search in sources :

Example 1 with RecursiveLighterASTNodeWalkingVisitor

use of com.intellij.psi.impl.source.tree.RecursiveLighterASTNodeWalkingVisitor in project intellij-community by JetBrains.

the class JavaFunctionalExpressionIndex method calcReturnType.

private static FunctionalExpressionKey.CoarseType calcReturnType(final LighterAST tree, LighterASTNode funExpr) {
    if (funExpr.getTokenType() == METHOD_REF_EXPRESSION)
        return FunctionalExpressionKey.CoarseType.UNKNOWN;
    LighterASTNode block = LightTreeUtil.firstChildOfType(tree, funExpr, CODE_BLOCK);
    if (block == null) {
        LighterASTNode expr = findExpressionChild(funExpr, tree);
        return isBooleanExpression(tree, expr) ? FunctionalExpressionKey.CoarseType.BOOLEAN : FunctionalExpressionKey.CoarseType.UNKNOWN;
    }
    final Ref<Boolean> returnsSomething = Ref.create(null);
    final AtomicBoolean isBoolean = new AtomicBoolean();
    final AtomicBoolean hasStatements = new AtomicBoolean();
    new RecursiveLighterASTNodeWalkingVisitor(tree) {

        @Override
        public void visitNode(@NotNull LighterASTNode element) {
            IElementType type = element.getTokenType();
            if (type == LAMBDA_EXPRESSION || ElementType.MEMBER_BIT_SET.contains(type)) {
                return;
            }
            if (type == RETURN_STATEMENT) {
                LighterASTNode expr = findExpressionChild(element, tree);
                returnsSomething.set(expr != null);
                if (isBooleanExpression(tree, expr)) {
                    isBoolean.set(true);
                }
                return;
            }
            if (type == EXPRESSION_STATEMENT) {
                hasStatements.set(true);
            }
            super.visitNode(element);
        }
    }.visitNode(block);
    if (isBoolean.get()) {
        return FunctionalExpressionKey.CoarseType.BOOLEAN;
    }
    if (returnsSomething.isNull()) {
        return hasStatements.get() ? FunctionalExpressionKey.CoarseType.VOID : FunctionalExpressionKey.CoarseType.UNKNOWN;
    }
    return returnsSomething.get() ? FunctionalExpressionKey.CoarseType.NON_VOID : FunctionalExpressionKey.CoarseType.VOID;
}
Also used : IElementType(com.intellij.psi.tree.IElementType) LighterASTNode(com.intellij.lang.LighterASTNode) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) RecursiveLighterASTNodeWalkingVisitor(com.intellij.psi.impl.source.tree.RecursiveLighterASTNodeWalkingVisitor)

Aggregations

LighterASTNode (com.intellij.lang.LighterASTNode)1 RecursiveLighterASTNodeWalkingVisitor (com.intellij.psi.impl.source.tree.RecursiveLighterASTNodeWalkingVisitor)1 IElementType (com.intellij.psi.tree.IElementType)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1