void (final CompletionParameters parameters, PrefixMatcher matcher, final Consumer<? super LookupElement> consumer) { final PsiElement place = parameters.getPosition(); final GrExpression expression = PsiTreeUtil.getParentOfType(place, GrExpression.class); if (expression == null) return; GrExpression placeToInferType = expression; if (expression.getParent() instanceof GrApplicationStatement && expression.getParent().getParent() instanceof GrAssignmentExpression) { placeToInferType = (GrExpression)expression.getParent(); } for (PsiType type : GroovyExpectedTypesProvider.getDefaultExpectedTypes(placeToInferType)) { if (type instanceof PsiArrayType) { final PsiType _type = GenericsUtil.eliminateWildcards(type); final PsiTypeLookupItem item = PsiTypeLookupItem.createLookupItem(_type, place, PsiTypeLookupItem.isDiamond(_type), ChooseTypeExpression.IMPORT_FIXER).setShowPackage(); if (item.getObject() instanceof PsiClass) { item.setInsertHandler(new InsertHandler<>() { @Override public void handleInsert(@NotNull InsertionContext context, @NotNull LookupElement item) { GroovyCompletionUtil.addImportForItem(context.getFile(), context.getStartOffset(), item); } }); } consumer.consume(item); } } final List<PsiClassType> expectedClassTypes = new SmartList<>(); for (PsiType psiType : GroovyExpectedTypesProvider.getDefaultExpectedTypes(placeToInferType)) { if (psiType instanceof PsiClassType) { PsiType type = GenericsUtil.eliminateWildcards(JavaCompletionUtil.originalize(psiType)); final PsiClassType classType = (PsiClassType)type; if (classType.resolve() != null) { expectedClassTypes.add(classType); } } } final PsiType diamond = inferDiamond(place); JavaInheritorsGetter.processInheritors(parameters, expectedClassTypes, matcher, type -> { final LookupElement element = addExpectedType(type, place, parameters, diamond); if (element != null) { consumer.consume(element); } }); }