From d189b84fb06d1d4d1fc2d2269591cc82a64df972 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 30 May 2012 13:28:01 +0400 Subject: [PATCH] find duplicates: respect module dependencies during search --- .../duplicates/MethodDuplicatesHandler.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesHandler.java b/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesHandler.java index bce5e22041b5..9e08036aacb9 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesHandler.java @@ -34,13 +34,17 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectUtil; +import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.WindowManager; import com.intellij.psi.*; import com.intellij.psi.impl.source.PostprocessReformattingAspect; +import com.intellij.psi.impl.source.resolve.JavaResolveUtil; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringBundle; @@ -132,6 +136,21 @@ public class MethodDuplicatesHandler implements RefactoringActionHandler { if (progressIndicator != null) { progressIndicator.setIndeterminate(false); } + + final Map> memberWithModulesMap = new HashMap>(); + for (PsiMember member : members) { + final Module module = ModuleUtil.findModuleForPsiElement(member); + if (module != null) { + final HashSet dependencies = new HashSet(); + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + ModuleUtil.collectModulesDependsOn(module, dependencies); + } + }); + memberWithModulesMap.put(member, dependencies); + } + } + scope.accept(new PsiRecursiveElementVisitor() { private int myFileCount = 0; @Override public void visitFile(final PsiFile file) { @@ -143,7 +162,13 @@ public class MethodDuplicatesHandler implements RefactoringActionHandler { progressIndicator.setText2(ProjectUtil.calcRelativeToProjectPath(virtualFile, project)); } } - for (PsiMember method : members) { + final Module targetModule = ModuleUtil.findModuleForPsiElement(file); + if (targetModule == null) return; + for (Map.Entry> entry : memberWithModulesMap.entrySet()) { + final Set dependencies = entry.getValue(); + if (dependencies == null || !dependencies.contains(targetModule)) continue; + + final PsiMember method = entry.getKey(); final List matchList = hasDuplicates(file, method); for (Iterator iterator = matchList.iterator(); iterator.hasNext(); ) { Match match = iterator.next();