PsiSubstitutor (@NotNull PsiSubstitutor substitutor1, @NotNull PsiSubstitutor substitutor2) { if (substitutor1 == PsiSubstitutor.EMPTY) return substitutor2; Set<PsiTypeParameter> parameters1 = substitutor1.getSubstitutionMap().keySet(); final PsiTypeParameter[] typeParameters = parameters1.toArray(PsiTypeParameter.EMPTY_ARRAY); for (PsiTypeParameter typeParameter : typeParameters) { final PsiType type = substitutor1.substitute(typeParameter); PsiType otherSubstituted; if (type instanceof PsiClassType) { final PsiClass resolved = ((PsiClassType)type).resolve(); otherSubstituted = resolved instanceof PsiTypeParameter ? substitutor2.substitute((PsiTypeParameter)resolved) : substitutor2.substitute(type); } else { otherSubstituted = substitutor2.substitute(type); } substitutor1 = substitutor1.put(typeParameter, otherSubstituted); } return substitutor1; }