ReductionSystem (final Set<PsiElement> victims) { final PsiSearchHelper helper = PsiSearchHelper.getInstance(myManager.getProject()); ReductionSystem system = new ReductionSystem(myProject, victims, myTypes, myTypeVariableFactory, mySettings); for (final PsiElement element : victims) { if (element instanceof PsiParameter && ((PsiParameter)element).getDeclarationScope() instanceof PsiMethod || element instanceof PsiMethod) { verifyMethod(element, victims, helper); } } for (final PsiElement element : victims) { PsiType definedType; if (element instanceof PsiParameter && ((PsiParameter)element).getDeclarationScope() instanceof PsiMethod) { final PsiParameter p = myParameters.get(element); if (p != null) { setType(element, definedType = defineType(p)); } else { continue; } } else if (element instanceof PsiMethod) { final PsiMethod m = myMethods.get(element); if (m != null) { system.addSubtypeConstraint(defineType(element), definedType = defineType(m)); } else { continue; } } else { definedType = defineType(element); } addBoundConstraints(system, definedType, element); } for (final PsiElement element : victims) { if (element instanceof PsiParameter) { final PsiElement scope = ((PsiParameter)element).getDeclarationScope(); if (scope instanceof PsiMethod) { final PsiParameter p = myParameters.get(element); if (p == null) continue; } /*else if (scope instanceof PsiForeachStatement) { addForEachConstraint(system, (PsiForeachStatement)scope); }*/ else if (element instanceof PsiMethod) { final PsiMethod m = myMethods.get(element); if (m == null) continue; } } else if (element instanceof PsiMethod) { final PsiMethod m = myMethods.get(element); if (m == null) continue; } addUsage(system, element); if (!(element instanceof PsiExpression)) { for (PsiReference ref : ReferencesSearch.search(element, getScope(helper, element), true)) { addUsage(system, ref.getElement()); } } } return system; }