void (final Project project, final Set<? extends PsiMember> members, final AnalysisScope scope, boolean silent) { final Map<PsiMember, List<Match>> duplicates = new HashMap<>(); final int fileCount = scope.getFileCount(); final ProgressIndicator progressIndicator = ProgressManager.getInstance().getProgressIndicator(); if (progressIndicator != null) { progressIndicator.setIndeterminate(false); } final Map<PsiMember, Set<Module>> memberWithModulesMap = new HashMap<>(); for (final PsiMember member : members) { final Module module = ReadAction.compute(() -> ModuleUtilCore.findModuleForPsiElement(member)); if (module != null) { final HashSet<Module> dependencies = new HashSet<>(); ApplicationManager.getApplication().runReadAction(() -> ModuleUtilCore.collectModulesDependsOn(module, dependencies)); memberWithModulesMap.put(member, dependencies); } } scope.accept(new PsiRecursiveElementVisitor() { private int myFileCount; @Override public void visitFile(@NotNull final PsiFile file) { if (progressIndicator != null){ if (progressIndicator.isCanceled()) return; progressIndicator.setFraction(((double)myFileCount++)/fileCount); final VirtualFile virtualFile = file.getVirtualFile(); if (virtualFile != null) { progressIndicator.setText2(ProjectUtil.calcRelativeToProjectPath(virtualFile, project)); } } final Module targetModule = ModuleUtilCore.findModuleForPsiElement(file); if (targetModule == null) return; for (Map.Entry<PsiMember, Set<Module>> entry : memberWithModulesMap.entrySet()) { final Set<Module> dependencies = entry.getValue(); if (dependencies == null || !dependencies.contains(targetModule)) continue; final PsiMember method = entry.getKey(); final List<Match> matchList = hasDuplicates(file, method); for (Iterator<Match> iterator = matchList.iterator(); iterator.hasNext(); ) { Match match = iterator.next(); final PsiElement matchStart = match.getMatchStart(); final PsiElement matchEnd = match.getMatchEnd(); for (PsiMember psiMember : members) { if (PsiTreeUtil.isAncestor(psiMember, matchStart, false) || PsiTreeUtil.isAncestor(psiMember, matchEnd, false)) { iterator.remove(); break; } } if (method instanceof PsiMethod && ((PsiMethod)method).findDeepestSuperMethods().length > 0 && MethodDuplicatesMatchProvider.isEssentialStaticContextAbsent(match, (PsiMethod)method)) { iterator.remove(); } } if (!matchList.isEmpty()) { duplicates.computeIfAbsent(method, __ -> new ArrayList<>()).addAll(matchList); } } } }); if (duplicates.isEmpty()) { if (!silent) { final Runnable nothingFoundRunnable = () -> { final String message = JavaRefactoringBundle.message("idea.has.not.found.any.code.that.can.be.replaced.with.method.call", ApplicationNamesInfo.getInstance().getProductName()); Messages.showInfoMessage(project, message, getRefactoringName()); }; if (ApplicationManager.getApplication().isUnitTestMode()) { nothingFoundRunnable.run(); } else { ApplicationManager.getApplication().invokeLater(nothingFoundRunnable, project.getDisposed()); } } } else { replaceDuplicate(project, duplicates, members); } }