static void addCollectConversion( PsiReferenceExpression ref, Collection<ExpectedTypeInfo> expectedTypes, Consumer<LookupElement> consumer) { final PsiExpression qualifier = ref.getQualifierExpression(); PsiType component = qualifier == null ? null : PsiUtil.substituteTypeParameter( qualifier.getType(), JAVA_UTIL_STREAM_STREAM, 0, true); if (component == null) return; JavaPsiFacade facade = JavaPsiFacade.getInstance(ref.getProject()); GlobalSearchScope scope = ref.getResolveScope(); PsiClass list = facade.findClass(JAVA_UTIL_LIST, scope); PsiClass set = facade.findClass(JAVA_UTIL_SET, scope); if (facade.findClass(JAVA_UTIL_STREAM_COLLECTORS, scope) == null || list == null || set == null) return; boolean hasList = false; boolean hasSet = false; for (ExpectedTypeInfo info : expectedTypes) { PsiType type = info.getDefaultType(); PsiClass expectedClass = PsiUtil.resolveClassInClassTypeOnly(type); PsiType expectedComponent = PsiUtil.extractIterableTypeParameter(type, true); if (expectedClass == null || expectedComponent == null || !TypeConversionUtil.isAssignable(expectedComponent, component)) continue; if (!hasList && InheritanceUtil.isInheritorOrSelf(list, expectedClass, true)) { hasList = true; consumer.consume(new MyLookupElement("toList", type)); } if (!hasSet && InheritanceUtil.isInheritorOrSelf(set, expectedClass, true)) { hasSet = true; consumer.consume(new MyLookupElement("toSet", type)); } } }