private static void processImplicitSpread(@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)));
        }
      }
    }
  }
private static void processImplicitSpread(@NotNull PsiType type,
                                            @NotNull Consumer<LookupElement> consumer,
                                            @NotNull PrefixMatcher matcher,
                                            @NotNull HashSet<@NotNull LookupElement> addedElements)