From 613bd53b5c576c06a1b56f100669f0fd2faa82d0 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 16 Jun 2011 16:57:00 +0400 Subject: [PATCH] look for usages in text files --- .../daemon/impl/PostHighlightingPass.java | 16 ++++++-------- ...edNonPrivateMembersReferencedFromText.java | 3 +++ .../daemon/LightAdvHighlightingTest.java | 22 +++++++++++++++++++ .../find/findUsages/FindUsagesManager.java | 19 ++++++++++++++++ 4 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnusedNonPrivateMembersReferencedFromText.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java index 92f29a352ce0..82e434ef37bc 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java @@ -41,6 +41,9 @@ import com.intellij.codeInspection.unusedImport.UnusedImportLocalInspection; import com.intellij.codeInspection.unusedParameters.UnusedParametersInspection; import com.intellij.codeInspection.unusedSymbol.UnusedSymbolLocalInspection; import com.intellij.codeInspection.util.SpecialAnnotationsUtil; +import com.intellij.find.FindManager; +import com.intellij.find.findUsages.FindUsagesManager; +import com.intellij.find.impl.FindManagerImpl; import com.intellij.lang.Language; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.application.ApplicationManager; @@ -68,14 +71,11 @@ import com.intellij.psi.jsp.JspSpiUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiSearchHelper; import com.intellij.psi.search.SearchScope; -import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.OverridingMethodsSearch; -import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.search.searches.SuperMethodsSearch; import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiUtilBase; import com.intellij.util.Processor; -import com.intellij.util.Query; import gnu.trove.THashSet; import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.NotNull; @@ -549,15 +549,13 @@ public class PostHighlightingPass extends TextEditorHighlightingPass { } if (!canbeReferencedViaWeirdNames(member)) return true; } + FindUsagesManager findUsagesManager = ((FindManagerImpl)FindManager.getInstance(myProject)).getFindUsagesManager(); + boolean used = findUsagesManager.isUsed(member, scope); - Query query = member instanceof PsiMethod - ? MethodReferencesSearch.search((PsiMethod)member, scope, true) - : ReferencesSearch.search(member, scope, true); - final PsiReference first = query.findFirst(); - if (first == null && member instanceof PsiEnumConstant) { + if (!used && member instanceof PsiEnumConstant) { return checkEnumValuesUsages(member, progress); } - return first == null; + return !used; } private boolean checkEnumValuesUsages(PsiMember member, ProgressIndicator progress) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnusedNonPrivateMembersReferencedFromText.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnusedNonPrivateMembersReferencedFromText.java new file mode 100644 index 000000000000..15c0b2a20d13 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnusedNonPrivateMembersReferencedFromText.java @@ -0,0 +1,3 @@ +public class XXX { +} + diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java index c2d1e3ecd8b4..54c864042769 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java @@ -1,6 +1,7 @@ package com.intellij.codeInsight.daemon; import com.intellij.ExtensionPoints; +import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.accessStaticViaInstance.AccessStaticViaInstance; import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection; @@ -23,6 +24,7 @@ import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.roots.LanguageLevelProjectExtension; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.xml.XmlAttribute; @@ -239,6 +241,26 @@ public class LightAdvHighlightingTest extends LightDaemonAnalyzerTestCase { point.unregisterExtension(extension); } } + public void testUnusedNonPrivateMembersReferencedFromText() throws Exception { + UnusedDeclarationInspection deadCodeInspection = new UnusedDeclarationInspection(); + enableInspectionTool(deadCodeInspection); + + doTest(true, false); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + PsiFile txt = myFile.getParent().createFile("x.txt"); + try { + VfsUtil.saveText(txt.getVirtualFile(), "XXX"); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + }); + + List infos = filter(doHighlighting(), HighlightSeverity.WARNING); + assertEmpty(infos); + } public void testNamesHighlighting() throws Exception { LanguageLevelProjectExtension.getInstance(getJavaFacade().getProject()).setLanguageLevel(LanguageLevel.JDK_1_5); diff --git a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java index 612beaa15a70..ccb65b9cbfef 100644 --- a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java +++ b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java @@ -72,6 +72,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; public class FindUsagesManager implements JDOMExternalizable { @@ -310,6 +311,24 @@ public class FindUsagesManager implements JDOMExternalizable { return findUsagesOptions.searchScope; } + public boolean isUsed(@NotNull PsiElement element, @NotNull SearchScope scope) { + FindUsagesHandler handler = getFindUsagesHandler(element, false); + if (handler == null) return false; + final UsageInfoToUsageConverter.TargetElementsDescriptor descriptor = + new UsageInfoToUsageConverter.TargetElementsDescriptor(handler.getPrimaryElements(), handler.getSecondaryElements()); + FindUsagesOptions findUsagesOptions = handler.getFindUsagesOptions(); + findUsagesOptions.searchScope = scope; + UsageSearcher usageSearcher = createUsageSearcher(descriptor, handler, findUsagesOptions, null); + final AtomicBoolean used = new AtomicBoolean(); + usageSearcher.generate(new Processor() { + public boolean process(final Usage usage) { + used.set(true); + return false; + } + }); + return used.get(); + } + // return null on failure or cancel @Nullable public UsageViewPresentation processUsages(FindUsagesHandler handler, @NotNull final Processor processor) {