List<String> (PsiType type) { final String annotationString = getAnnotationString(type); final String dimensions; if (type instanceof PsiArrayType) { if (!needsArrayType) return Collections.emptyList(); dimensions = StringUtil.repeat("[]", type.getArrayDimensions()); type = type.getDeepComponentType(); } else { dimensions = ""; } final List<String> result = new SmartList<>(); if (type instanceof PsiClassType classType) { final PsiClassType.ClassResolveResult resolveResult = classType.resolveGenerics(); final PsiClass aClass = resolveResult.getElement(); final StringBuilder typeText = new StringBuilder(); if (aClass != null) { final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); buildText(aClass, substitutor, true, typeText); typeText.append(dimensions); final String typeString = annotationString + typeText; if (needsTypeParameters) { result.add(typeString); // unqualified with type parameters if present } addWithoutTypeParameters(typeString, dimensions, result); if (typeText.indexOf(".") >= 0) { // inner class qualified with outer class (we currently support one level) typeText.setLength(0); buildText(aClass, substitutor, false, typeText); typeText.append(dimensions); final String outerClassQualified = annotationString + typeText; if (needsTypeParameters) { result.add(outerClassQualified); // inner class without enclosing class qualifier with type parameters if present } addWithoutTypeParameters(outerClassQualified, dimensions, result); } if (!needsFullyQualified) { return result; } } } final String fullyQualified = annotationString + type.getCanonicalText() + dimensions; if (needsTypeParameters) { result.add(fullyQualified); // fully qualified if possible with type parameters if present } addWithoutTypeParameters(fullyQualified, dimensions, result); return result; }