From bd2a8d62302d4b25998437f4c895b0a9deec1ef4 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 24 Jun 2010 20:04:10 +0400 Subject: [PATCH] replace all inheritors with static imports: optimization --- ...placeImplementsWithStaticImportAction.java | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/actions/ReplaceImplementsWithStaticImportAction.java b/java/java-impl/src/com/intellij/codeInspection/actions/ReplaceImplementsWithStaticImportAction.java index 680ed0a1afb7..ebddef797957 100644 --- a/java/java-impl/src/com/intellij/codeInspection/actions/ReplaceImplementsWithStaticImportAction.java +++ b/java/java-impl/src/com/intellij/codeInspection/actions/ReplaceImplementsWithStaticImportAction.java @@ -31,6 +31,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.DirectClassInheritorsSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; @@ -137,25 +138,31 @@ public class ReplaceImplementsWithStaticImportAction extends PsiElementBaseInten if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { public void run() { final ProgressIndicator progressIndicator = ProgressManager.getInstance().getProgressIndicator(); - for (PsiField field : targetClass.getAllFields()) { - final String fieldName = field.getName(); - if (progressIndicator != null) { - progressIndicator.setText2(fieldName); - } - for (PsiReference reference : ReferencesSearch.search(field)) { - final PsiFile psiFile = reference.getElement().getContainingFile(); - if (psiFile instanceof PsiJavaFile) { - Map> references = refs.get(psiFile); - if (references == null) { - references = new HashMap>(); - refs.put(psiFile, references); + for (PsiClass psiClass : ClassInheritorsSearch.search(targetClass)) { + final PsiFile psiFile = psiClass.getContainingFile(); + if (psiFile instanceof PsiJavaFile) { + for (PsiField field : targetClass.getAllFields()) { + final String fieldName = field.getName(); + if (progressIndicator != null) { + progressIndicator.setText2(fieldName); } - Set fieldsRefs = references.get(field); - if (fieldsRefs == null) { - fieldsRefs = new HashSet(); - references.put(field, fieldsRefs); + for (PsiReference reference : ReferencesSearch.search(field, new LocalSearchScope(psiClass))) { + if (reference == null) { + continue; + } + + Map> references = refs.get(psiFile); + if (references == null) { + references = new HashMap>(); + refs.put(psiFile, references); + } + Set fieldsRefs = references.get(field); + if (fieldsRefs == null) { + fieldsRefs = new HashSet(); + references.put(field, fieldsRefs); + } + fieldsRefs.add(reference); } - fieldsRefs.add(reference); } } } @@ -182,22 +189,25 @@ public class ReplaceImplementsWithStaticImportAction extends PsiElementBaseInten ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { + for (PsiJavaCodeReferenceElement referenceElement : refs2Unimplement) { + referenceElement.delete(); + } + for (PsiFile psiFile : refs.keySet()) { final Map> map = refs.get(psiFile); for (PsiField psiField : map.keySet()) { final PsiClass containingClass = psiField.getContainingClass(); final String fieldName = psiField.getName(); for (PsiReference reference : map.get(psiField)) { - ((PsiReferenceExpressionImpl)reference) - .bindToElementViaStaticImport(containingClass, fieldName, ((PsiJavaFile)psiFile).getImportList()); + if (reference instanceof PsiReferenceExpressionImpl) { + ((PsiReferenceExpressionImpl)reference).bindToElementViaStaticImport(containingClass, fieldName, ((PsiJavaFile)psiFile).getImportList()); + } else { + reference.bindToElement(psiField); + } } } } - for (PsiJavaCodeReferenceElement referenceElement : refs2Unimplement) { - referenceElement.delete(); - } - for (PsiFile psiFile : refs.keySet()) { JavaCodeStyleManager.getInstance(project).optimizeImports(psiFile); }