summaryrefslogtreecommitdiff
path: root/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unused/UnusedPropertyInspection.java
diff options
context:
space:
mode:
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.java59
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;
+ }
};
}
}