boolean (Consumer<? super LookupElement> result, PsiElement context, PsiTypeParameterListOwner paramOwner, int index) { PsiExpression expression = PsiTreeUtil.getContextOfType(context, PsiExpression.class, true); ExpectedTypeInfo[] types = ExpectedTypesProvider.getExpectedTypes(expression, true, false, false); if (expression == null || types.length == 0) return false; for (ExpectedTypeInfo info : types) { PsiType type = info.getType(); if (type instanceof PsiClassType && !type.equals(expression.getType())) { JBIterable<PsiTypeParameter> remainingParams = JBIterable.of(paramOwner.getTypeParameters()).skip(index); List<PsiType> expectedArgs = CodeInsightUtil.getExpectedTypeArgs(context, paramOwner, remainingParams, (PsiClassType)type); createLookupItems(result, context, info, expectedArgs, paramOwner); } } return true; }