ThreeState (PsiExpression expression, PsiType formalType, PsiMethod method) { if (expression instanceof PsiFunctionalExpression) { final PsiClass targetTypeParameter = PsiUtil.resolveClassInClassTypeOnly(formalType); if (targetTypeParameter instanceof PsiTypeParameter && method.equals(((PsiTypeParameter)targetTypeParameter).getOwner())) { return ThreeState.YES; } final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(formalType); if (interfaceMethod == null) { return ThreeState.NO; } if (expression instanceof PsiLambdaExpression && ((PsiLambdaExpression)expression).getParameterList().getParametersCount() != interfaceMethod.getParameterList().getParametersCount()) { return ThreeState.NO; } if (!((PsiFunctionalExpression)expression).isPotentiallyCompatible(formalType)) { return ThreeState.UNSURE; } } else if (expression instanceof PsiParenthesizedExpression) { return isPotentialCompatible(((PsiParenthesizedExpression)expression).getExpression(), formalType, method); } else if (expression instanceof PsiConditionalExpression) { ThreeState thenCompatible = isPotentialCompatible(((PsiConditionalExpression)expression).getThenExpression(), formalType, method); ThreeState elseCompatible = isPotentialCompatible(((PsiConditionalExpression)expression).getElseExpression(), formalType, method); if (thenCompatible == ThreeState.NO || elseCompatible == ThreeState.NO) { return ThreeState.NO; } if (thenCompatible == ThreeState.UNSURE || elseCompatible == ThreeState.UNSURE) { return ThreeState.UNSURE; } } else if (expression instanceof PsiSwitchExpression) { Set<ThreeState> states = PsiUtil.getSwitchResultExpressions((PsiSwitchExpression)expression).stream().map(expr -> isPotentialCompatible(expr, formalType, method)).collect(Collectors.toSet()); if (states.contains(ThreeState.NO)) return ThreeState.NO; if (states.contains(ThreeState.UNSURE)) return ThreeState.UNSURE; } return ThreeState.YES; }