summaryrefslogtreecommitdiff
path: root/plugins/properties/properties-psi-impl/src
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/properties/properties-psi-impl/src')
-rw-r--r--plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unused/UnusedPropertyInspection.java59
-rw-r--r--plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesImplUtil.java11
-rw-r--r--plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleEditorViewElement.java2
-rw-r--r--plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleFileStructureViewElement.java3
-rw-r--r--plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundlePropertyStructureViewElement.java3
-rw-r--r--plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesFileStructureViewElement.java3
-rw-r--r--plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesPrefixGroup.java6
-rw-r--r--plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesStructureViewElement.java3
8 files changed, 61 insertions, 29 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;
+ }
};
}
}
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesImplUtil.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesImplUtil.java
index 5908219098b7..b29fc4f78141 100644
--- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesImplUtil.java
+++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesImplUtil.java
@@ -28,13 +28,14 @@ import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
-import com.intellij.util.ArrayUtil;
-import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.indexing.FileBasedIndex;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
/**
* @author Konstantin Bulenkov
@@ -64,7 +65,7 @@ public class PropertiesImplUtil extends PropertiesUtil {
if (baseName.equals(getBaseName(psiFile))) {
final PropertiesFile propertiesFile = getPropertiesFile(psiFile);
if (propertiesFile != null) {
- if (defaultPropertiesFile == null || defaultPropertiesFile.getName().compareTo(propertiesFile.getName()) < 0) {
+ if (defaultPropertiesFile == null || defaultPropertiesFile.getName().compareTo(propertiesFile.getName()) > 0) {
defaultPropertiesFile = propertiesFile;
}
}
@@ -91,7 +92,7 @@ public class PropertiesImplUtil extends PropertiesUtil {
}
@NotNull
- public static List<IProperty> findPropertiesByKey(final Project project, final String key) {
+ public static List<IProperty> findPropertiesByKey(@NotNull final Project project, @NotNull final String key) {
final GlobalSearchScope scope = GlobalSearchScope.allScope(project);
final ArrayList<IProperty> properties =
new ArrayList<IProperty>(PropertyKeyIndex.getInstance().get(key, project, scope));
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleEditorViewElement.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleEditorViewElement.java
index 00c21d8d3811..58932d1fd4c5 100644
--- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleEditorViewElement.java
+++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleEditorViewElement.java
@@ -25,6 +25,6 @@ import org.jetbrains.annotations.NotNull;
*/
public interface ResourceBundleEditorViewElement {
- PsiElement[] getPsiElements(@NotNull Project project);
+ PsiElement[] getPsiElements();
}
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleFileStructureViewElement.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleFileStructureViewElement.java
index 25220d35311a..ee3e22b7079d 100644
--- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleFileStructureViewElement.java
+++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundleFileStructureViewElement.java
@@ -25,7 +25,6 @@ import com.intellij.lang.properties.IProperty;
import com.intellij.lang.properties.ResourceBundle;
import com.intellij.lang.properties.psi.PropertiesFile;
import com.intellij.navigation.ItemPresentation;
-import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
@@ -88,7 +87,7 @@ public class ResourceBundleFileStructureViewElement implements StructureViewTree
}
@Override
- public PsiElement[] getPsiElements(@NotNull Project project) {
+ public PsiElement[] getPsiElements() {
final List<PropertiesFile> propertiesFiles = getValue().getPropertiesFiles();
return ContainerUtil.map2Array(propertiesFiles, new PsiElement[propertiesFiles.size()], new Function<PropertiesFile, PsiElement>() {
@Override
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundlePropertyStructureViewElement.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundlePropertyStructureViewElement.java
index 8b387e802597..ed660536d052 100644
--- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundlePropertyStructureViewElement.java
+++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/editor/ResourceBundlePropertyStructureViewElement.java
@@ -29,7 +29,6 @@ import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.markup.TextAttributes;
-import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
@@ -61,7 +60,7 @@ public class ResourceBundlePropertyStructureViewElement implements StructureView
}
@Override
- public PsiElement[] getPsiElements(final @NotNull Project project) {
+ public PsiElement[] getPsiElements() {
return new PsiElement[] {getProperty().getPsiElement()};
}
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesFileStructureViewElement.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesFileStructureViewElement.java
index 432739c9df96..2e6c87b9d7a3 100644
--- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesFileStructureViewElement.java
+++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesFileStructureViewElement.java
@@ -22,7 +22,6 @@ import com.intellij.lang.properties.editor.ResourceBundleEditorViewElement;
import com.intellij.lang.properties.psi.Property;
import com.intellij.lang.properties.psi.impl.PropertiesFileImpl;
import com.intellij.navigation.ItemPresentation;
-import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
@@ -52,7 +51,7 @@ public class PropertiesFileStructureViewElement extends PsiTreeElementBase<Prope
}
@Override
- public PsiElement[] getPsiElements(@NotNull Project project) {
+ public PsiElement[] getPsiElements() {
return new PsiElement[] {getValue()};
}
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesPrefixGroup.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesPrefixGroup.java
index 8aedbcbbd85d..61b3c0202619 100644
--- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesPrefixGroup.java
+++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesPrefixGroup.java
@@ -22,11 +22,9 @@ import com.intellij.lang.properties.IProperty;
import com.intellij.lang.properties.editor.ResourceBundleEditorViewElement;
import com.intellij.lang.properties.editor.ResourceBundlePropertyStructureViewElement;
import com.intellij.navigation.ItemPresentation;
-import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
-import com.intellij.util.Function;
import com.intellij.util.NullableFunction;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -137,7 +135,7 @@ public class PropertiesPrefixGroup implements Group, ResourceBundleEditorViewEle
}
@Override
- public PsiElement[] getPsiElements(final @NotNull Project project) {
+ public PsiElement[] getPsiElements() {
final List<PsiElement> elements = ContainerUtil.mapNotNull(getChildren(), new NullableFunction<TreeElement, PsiElement>() {
@Nullable
@Override
@@ -148,7 +146,7 @@ public class PropertiesPrefixGroup implements Group, ResourceBundleEditorViewEle
return property.getPsiElement();
}
else if (treeElement instanceof ResourceBundlePropertyStructureViewElement) {
- return ((ResourceBundlePropertyStructureViewElement)treeElement).getPsiElements(project)[0];
+ return ((ResourceBundlePropertyStructureViewElement)treeElement).getPsiElements()[0];
}
return null;
}
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesStructureViewElement.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesStructureViewElement.java
index 2af033735706..d73fd376782d 100644
--- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesStructureViewElement.java
+++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/structureView/PropertiesStructureViewElement.java
@@ -19,7 +19,6 @@ import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.lang.properties.editor.ResourceBundleEditorViewElement;
import com.intellij.lang.properties.psi.Property;
import com.intellij.navigation.ItemPresentation;
-import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
@@ -58,7 +57,7 @@ public class PropertiesStructureViewElement implements StructureViewTreeElement,
}
@Override
- public PsiElement[] getPsiElements(@NotNull Project project) {
+ public PsiElement[] getPsiElements() {
return new PsiElement[] {getValue()};
}