diff options
Diffstat (limited to 'plugins/properties/properties-psi-impl/src/com')
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()}; } |