PsiType (@NotNull PsiType type, @Nullable PsiModifierList modifierList) { if (modifierList != null) { PsiAnnotation[] annotations = modifierList.getAnnotations(); if (annotations.length > 0) { if (type instanceof PsiArrayType) { Stack<PsiArrayType> types = new Stack<>(); do { types.push((PsiArrayType)type); type = ((PsiArrayType)type).getComponentType(); } while (type instanceof PsiArrayType); type = annotate(type, modifierList, annotations); while (!types.isEmpty()) { PsiArrayType t = types.pop(); type = t instanceof PsiEllipsisType ? new PsiEllipsisType(type, t.getAnnotations()) : new PsiArrayType(type, t.getAnnotations()); } return type; } else if (type instanceof PsiDisjunctionType) { List<PsiType> components = new ArrayList<>(((PsiDisjunctionType)type).getDisjunctions()); components.set(0, annotate(components.get(0), modifierList, annotations)); return ((PsiDisjunctionType)type).newDisjunctionType(components); } else { return annotate(type, modifierList, annotations); } } } return type; }