diff options
Diffstat (limited to 'plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unused/UnusedPropertyInspection.java')
-rw-r--r-- | plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unused/UnusedPropertyInspection.java | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unused/UnusedPropertyInspection.java b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unused/UnusedPropertyInspection.java index 53e241ef24bd..603833887b38 100644 --- a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unused/UnusedPropertyInspection.java +++ b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unused/UnusedPropertyInspection.java @@ -20,9 +20,7 @@ import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.lang.ASTNode; -import com.intellij.lang.properties.PropertiesBundle; -import com.intellij.lang.properties.PropertiesQuickFixFactory; -import com.intellij.lang.properties.PropertySuppressableInspectionBase; +import com.intellij.lang.properties.*; import com.intellij.lang.properties.findUsages.PropertySearcher; import com.intellij.lang.properties.psi.Property; import com.intellij.openapi.extensions.Extensions; @@ -30,6 +28,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiFile; @@ -39,6 +38,10 @@ import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.FilteringIterator; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Set; /** * @author cdr @@ -56,18 +59,44 @@ public class UnusedPropertyInspection extends PropertySuppressableInspectionBase return "UnusedProperty"; } + @Nullable + private static GlobalSearchScope getWidestUseScope(@Nullable String key, @NotNull Project project, @NotNull Module ownModule) { + if (key == null) return null; + + Set<Module> modules = ContainerUtil.newLinkedHashSet(); + for (IProperty property : PropertiesImplUtil.findPropertiesByKey(project, key)) { + Module module = ModuleUtilCore.findModuleForPsiElement(property.getPsiElement()); + if (module == null) { + return GlobalSearchScope.allScope(project); + } + if (module != ownModule) { + modules.add(module); + } + } + if (modules.isEmpty()) return null; + + List<Module> list = ContainerUtil.newArrayList(modules); + GlobalSearchScope result = GlobalSearchScope.moduleWithDependentsScope(list.get(0)); + for (int i = 1; i < list.size(); i++) { + result = result.uniteWith(GlobalSearchScope.moduleWithDependentsScope(list.get(i))); + } + return result; + } + @NotNull @Override public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly, @NotNull final LocalInspectionToolSession session) { final PsiFile file = session.getFile(); - Module module = ModuleUtilCore.findModuleForPsiElement(file); + final Module module = ModuleUtilCore.findModuleForPsiElement(file); if (module == null) return super.buildVisitor(holder, isOnTheFly, session); + + final GlobalSearchScope ownUseScope = GlobalSearchScope.moduleWithDependentsScope(module); + Object[] extensions = Extensions.getExtensions("com.intellij.referencesSearch"); final PropertySearcher searcher = (PropertySearcher)ContainerUtil.find(extensions, new FilteringIterator.InstanceOf<PropertySearcher>(PropertySearcher.class)); - final GlobalSearchScope searchScope = GlobalSearchScope.moduleWithDependentsScope(module); final PsiSearchHelper searchHelper = PsiSearchHelper.SERVICE.getInstance(file.getProject()); return new PsiElementVisitor() { @Override @@ -90,13 +119,10 @@ public class UnusedPropertyInspection extends PropertySuppressableInspectionBase if (name == null) return; } - PsiSearchHelper.SearchCostResult cheapEnough = searchHelper.isCheapEnoughToSearch(name, searchScope, file, original); - if (cheapEnough == PsiSearchHelper.SearchCostResult.TOO_MANY_OCCURRENCES) return; + if (mayHaveUsages(property, original, name, ownUseScope)) return; - if (cheapEnough != PsiSearchHelper.SearchCostResult.ZERO_OCCURRENCES && - ReferencesSearch.search(property, searchScope, false).findFirst() != null) { - return; - } + final GlobalSearchScope widerScope = getWidestUseScope(property.getKey(), element.getProject(), module); + if (widerScope != null && mayHaveUsages(property, original, name, widerScope)) return; final ASTNode propertyNode = property.getNode(); assert propertyNode != null; @@ -108,6 +134,17 @@ public class UnusedPropertyInspection extends PropertySuppressableInspectionBase LocalQuickFix fix = PropertiesQuickFixFactory.getInstance().createRemovePropertyLocalFix(); holder.registerProblem(key, description, ProblemHighlightType.LIKE_UNUSED_SYMBOL, fix); } + + private boolean mayHaveUsages(Property property, ProgressIndicator original, String name, GlobalSearchScope searchScope) { + PsiSearchHelper.SearchCostResult cheapEnough = searchHelper.isCheapEnoughToSearch(name, searchScope, file, original); + if (cheapEnough == PsiSearchHelper.SearchCostResult.TOO_MANY_OCCURRENCES) return true; + + if (cheapEnough != PsiSearchHelper.SearchCostResult.ZERO_OCCURRENCES && + ReferencesSearch.search(property, searchScope, false).findFirst() != null) { + return true; + } + return false; + } }; } } |