void (PsiClass aClass, PsiSubstitutor substitutor, boolean qualifyInnerClasses, StringBuilder text) { if (aClass instanceof PsiAnonymousClass) { final PsiClassType baseClassType = ((PsiAnonymousClass)aClass).getBaseClassType(); final PsiClassType.ClassResolveResult baseResolveResult = baseClassType.resolveGenerics(); final PsiClass baseClass = baseResolveResult.getElement(); if (baseClass != null) { buildText(baseClass, substitutor == null ? null : baseResolveResult.getSubstitutor(), qualifyInnerClasses, text); } else { text.append(baseClassType.getCanonicalText()); } return; } if (qualifyInnerClasses) { final PsiElement parent = aClass.getParent(); if (parent instanceof PsiClass && !(parent instanceof PsiAnonymousClass)) { buildText((PsiClass)parent, substitutor, true, text); text.append('.'); } } text.append(aClass.getName()); if (substitutor != null) { final PsiTypeParameter[] parameters = aClass.getTypeParameters(); if (parameters.length > 0) { final int pos = text.length(); text.append('<'); final Map<PsiTypeParameter, PsiType> substitutionMap = substitutor.getSubstitutionMap(); for (int i = 0, length = parameters.length; i < length; i++) { final PsiTypeParameter parameter = parameters[i]; final PsiType parameterType = substitutionMap.get(parameter); if (parameterType == null) { text.setLength(pos); return; } if (i > 0) text.append(','); if (parameterType instanceof PsiClassType classType) { final PsiClassType.ClassResolveResult result = classType.resolveGenerics(); final PsiClass aClass1 = result.getElement(); if (aClass1 != null) { buildText(aClass1, result.getSubstitutor(), qualifyInnerClasses, text); continue; } } text.append(parameterType.getPresentableText()); } text.append('>'); } } }