void (@NotNull CompletionParameters parameters, boolean addInheritors, PrefixMatcher matcher, Consumer<? super LookupElement> result) { if (!PsiUtil.isLanguageLevel8OrHigher(parameters.getOriginalFile()) || !isLambdaContext(parameters.getPosition())) return; ExpectedTypeInfo[] expectedTypes = JavaSmartCompletionContributor.getExpectedTypes(parameters); for (ExpectedTypeInfo expectedType : expectedTypes) { final PsiType defaultType = expectedType.getDefaultType(); if (LambdaUtil.isFunctionalType(defaultType)) { final PsiType functionalInterfaceType = FunctionalInterfaceParameterizationUtil.getGroundTargetType(defaultType); final PsiMethod functionalInterfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(functionalInterfaceType); if (functionalInterfaceMethod != null) { PsiParameter[] params = PsiParameter.EMPTY_ARRAY; final PsiElement originalPosition = parameters.getPosition(); final PsiSubstitutor substitutor = LambdaUtil.getSubstitutor(functionalInterfaceMethod, PsiUtil.resolveGenericsClassInType(functionalInterfaceType)); if (!functionalInterfaceMethod.hasTypeParameters()) { params = functionalInterfaceMethod.getParameterList().getParameters(); final Project project = functionalInterfaceMethod.getProject(); final JVMElementFactory jvmElementFactory = JVMElementFactories.getFactory(originalPosition.getLanguage(), project); final JavaCodeStyleManager javaCodeStyleManager = JavaCodeStyleManager.getInstance(project); if (jvmElementFactory != null) { params = GenerateMembersUtil.overriddenParameters(params, jvmElementFactory, javaCodeStyleManager, substitutor, originalPosition); } String paramsString = params.length == 1 ? getParamName(params[0], originalPosition) : "(" + StringUtil.join(params, parameter -> getParamName(parameter, originalPosition), ",") + ")"; final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); PsiLambdaExpression lambdaExpression = (PsiLambdaExpression)JavaPsiFacade.getElementFactory(project) .createExpressionFromText(paramsString + " -> {}", null); lambdaExpression = (PsiLambdaExpression)codeStyleManager.reformat(lambdaExpression); paramsString = lambdaExpression.getParameterList().getText(); final LookupElementBuilder builder = LookupElementBuilder.create(functionalInterfaceMethod, paramsString + " -> ") .withPresentableText(paramsString + " -> {}") .withTypeText(functionalInterfaceType.getPresentableText()) .withIcon(AllIcons.Nodes.Lambda); builder.putUserData(LAMBDA_ITEM, true); result.consume(builder.withAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE)); } PsiType expectedReturnType = substitutor.substitute(functionalInterfaceMethod.getReturnType()); if (expectedReturnType != null) { MethodReferenceCompletion completion = new MethodReferenceCompletion(addInheritors, parameters, matcher, functionalInterfaceType, params, originalPosition, substitutor, expectedReturnType); completion.suggestMethodReferences(element -> { Object object = element.getObject(); element.putUserData(METHOD_REF_PREFERRED, object instanceof PsiMethod && completion.hasExactReturnType((PsiMethod)object)); result.consume(parameters.getCompletionType() == CompletionType.SMART ? JavaSmartCompletionContributor.decorate(element, Arrays.asList(expectedTypes)) : element); } ); } } } } }