boolean (PsiType leftType, @Nullable PsiMethod method) { if (leftType instanceof PsiIntersectionType) { for (PsiType conjunctType : ((PsiIntersectionType)leftType).getConjuncts()) { if (isAcceptable(conjunctType)) return true; } return false; } final PsiExpressionList argsList = PsiTreeUtil.getParentOfType(this, PsiExpressionList.class); if (MethodCandidateInfo.isOverloadCheck(argsList) && method != null) { if (hasFormalParameterTypes() && !InferenceSession.isPertinentToApplicability(this, method)) { return true; } if (LambdaUtil.isPotentiallyCompatibleWithTypeParameter(this, argsList, method)) { return true; } } leftType = getGroundTargetType(leftType); if (!isPotentiallyCompatible(leftType)) { return false; } if (MethodCandidateInfo.isOverloadCheck(argsList) && !hasFormalParameterTypes()) { return true; } final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(leftType); final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(resolveResult); if (interfaceMethod == null) return false; if (interfaceMethod.hasTypeParameters()) return false; final PsiSubstitutor substitutor = LambdaUtil.getSubstitutor(interfaceMethod, resolveResult); if (hasFormalParameterTypes()) { final PsiParameter[] lambdaParameters = getParameterList().getParameters(); final PsiType[] parameterTypes = interfaceMethod.getSignature(substitutor).getParameterTypes(); for (int lambdaParamIdx = 0, length = lambdaParameters.length; lambdaParamIdx < length; lambdaParamIdx++) { PsiParameter parameter = lambdaParameters[lambdaParamIdx]; final PsiTypeElement typeElement = parameter.getTypeElement(); if (typeElement != null) { final PsiType lambdaFormalType = toArray(parameter.getType()); final PsiType methodParameterType = toArray(parameterTypes[lambdaParamIdx]); if (!lambdaFormalType.equals(methodParameterType)) { return false; } } } } PsiType methodReturnType = interfaceMethod.getReturnType(); if (methodReturnType != null && !PsiTypes.voidType().equals(methodReturnType)) { return LambdaUtil.performWithTargetType(this, leftType, () -> LambdaUtil.checkReturnTypeCompatible(this, substitutor.substitute(methodReturnType)) == null); } return true; }