ChainSearchTarget (PsiClassType classType) { PsiClass resolvedClass = PsiUtil.resolveClassInClassTypeOnly(classType); if (resolvedClass == null) return null; byte iteratorKind = SignatureData.ZERO_DIM; String iteratorClass = getIteratorKind(resolvedClass); if (iteratorClass != null) { resolvedClass = PsiUtil.resolveClassInClassTypeOnly(PsiUtil.substituteTypeParameter(classType, iteratorClass, 0, false)); if (resolvedClass == null) return null; iteratorKind = SignatureData.ITERATOR_ONE_DIM; } if (resolvedClass.hasTypeParameters() || resolvedClass instanceof PsiTypeParameter || AnnotationUtil.isAnnotated(resolvedClass, CommonClassNames.JAVA_LANG_FUNCTIONAL_INTERFACE, CHECK_EXTERNAL)) { return null; } String packageName = JavaHierarchyUtil.getPackageName(resolvedClass); if (packageName == null || EXCLUDED_PACKAGES.contains(packageName)) { return null; } String classQName = resolvedClass.getQualifiedName(); if (classQName == null) { return null; } return new ChainSearchTarget(classQName, new byte[] {iteratorKind}, classType); }