look for usages in text files

This commit is contained in:
Alexey Kudravtsev
2011-06-16 17:00:53 +04:00
parent 337501774e
commit 613bd53b5c
4 changed files with 51 additions and 9 deletions
@@ -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<PsiReference> 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) {
@@ -0,0 +1,3 @@
public class <warning descr="Class 'XXX' is never used">XXX</warning> {
}
@@ -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<HighlightInfo> infos = filter(doHighlighting(), HighlightSeverity.WARNING);
assertEmpty(infos);
}
public void testNamesHighlighting() throws Exception {
LanguageLevelProjectExtension.getInstance(getJavaFacade().getProject()).setLanguageLevel(LanguageLevel.JDK_1_5);
@@ -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<Usage>() {
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<Usage> processor) {