PsiType[] (final boolean areTypesDirected) { final ArrayList<ExpectedTypeInfo[]> expectedTypesFromAll = new ArrayList<>(); for (PsiExpression occurrence : myOccurrences) { final ExpectedTypeInfo[] expectedTypes = ExpectedTypesProvider.getExpectedTypes(occurrence, false, myOccurrenceClassProvider, isUsedAfter()); if (expectedTypes.length > 0) { expectedTypesFromAll.add(expectedTypes); } } final ArrayList<PsiType> allowedTypes = new ArrayList<>(); CommonJavaRefactoringUtil.processSuperTypes(getDefaultType(), new CommonJavaRefactoringUtil.SuperTypeVisitor() { @Override public void visitType(PsiType aType) { checkIfAllowed(aType); } @Override public void visitClass(PsiClass aClass) { checkIfAllowed(myFactory.createType(aClass)); } private void checkIfAllowed(PsiType type) { NextInfo: for (ExpectedTypeInfo[] expectedTypes : expectedTypesFromAll) { for (final ExpectedTypeInfo info : expectedTypes) { if (ExpectedTypeUtil.matches(type, info)) continue NextInfo; } return; } allowedTypes.add(type); } }); for (ExpectedTypeInfo[] typeInfos : expectedTypesFromAll) { collectAllSameShapedTypes(typeInfos, allowedTypes); } final ArrayList<PsiType> result = normalizeTypeList(allowedTypes); if (!areTypesDirected) { Collections.reverse(result); } return result.toArray(PsiType.createArray(result.size())); }