PsiType (PsiLambdaExpression lambdaExpression, Ref<String> errorMessage, boolean inferParent) { if (lambdaExpression != null) { final PsiType typeTypeByParentCall = getTargetTypeFromParent(lambdaExpression, errorMessage, inferParent); if (typeTypeByParentCall != null) { return LambdaUtil.getFunctionalInterfaceReturnType(lambdaExpression.getGroundTargetType(typeTypeByParentCall)); } //during checked exception constraint processing //we may need to infer types for nested calls to infer unhandled exceptions inside lambda body //at this time, types of interface method parameter types must be already calculated // that's why walkUp in InferenceSessionContainer stops at this point and //that's why we can reuse this type here PsiType cachedLambdaType = ThreadLocalTypes.getElementType(lambdaExpression); if (cachedLambdaType != null) { return LambdaUtil.getFunctionalInterfaceReturnType(lambdaExpression.getGroundTargetType(cachedLambdaType)); } return inferParent || !(PsiUtil.skipParenthesizedExprUp(lambdaExpression.getParent()) instanceof PsiExpressionList) ? LambdaUtil.getFunctionalInterfaceReturnType(lambdaExpression.getFunctionalInterfaceType()) : null; } return null; }