void (@NotNull PsiType type, @NotNull Consumer<LookupElement> consumer, @NotNull PrefixMatcher matcher, @NotNull HashSet<@NotNull LookupElement> addedElements) { var componentPair = PsiUtil.getComponentForSpreadWithDot(type); if (componentPair == null) { return; } PsiType deepComponentType = componentPair.first; int depth = componentPair.second; if (!(deepComponentType instanceof PsiClassType)) { return; } var resolveResult = ((PsiClassType)deepComponentType).resolveGenerics(); PsiClass resolvedClass = resolveResult.getElement(); if (resolvedClass == null) { return; } Set<String> existingIdentifiers = addedElements.stream().map(element -> element.getLookupString()).collect(Collectors.toSet()); for (var method : resolvedClass.getAllMethods()) { if (GroovyPropertyUtils.isSimplePropertyGetter(method)) { var lookupElement = CompleteReferenceExpression.createPropertyLookupElement(method, resolveResult.getSubstitutor(), matcher); if (lookupElement != null && !existingIdentifiers.contains(lookupElement.getLookupString())) { PsiType methodReturnType = resolveResult.getSubstitutor().substitute(method.getReturnType()); String returnTypeRepresentation = methodReturnType == null ? "?" : TypeUtils.box(methodReturnType, method).getPresentableText(); consumer.consume(lookupElement.withTypeText(StringUtil.repeat("ArrayList<", depth) + returnTypeRepresentation + StringUtil.repeat(">", depth))); } } } }