aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2016-02-14 18:26:40 -0800
committerBen Gruver <bgruv@google.com>2016-02-20 12:00:05 -0800
commit4b337cc04dac48290bf7949e0b0d1a38a076dfe7 (patch)
treef9bf79f957ea80e09c0094fcd9a803baf79b1a60
parentf16ea398a1df52e3bb6afbbb274c66e23412ae58 (diff)
downloadsmali-4b337cc04dac48290bf7949e0b0d1a38a076dfe7.tar.gz
Allow local search scopes when searching class usages
-rw-r--r--smalidea/src/main/java/org/jf/smalidea/findUsages/SmaliClassReferenceSearcher.java43
-rw-r--r--smalidea/src/test/java/org/jf/smalidea/findUsages/HighlightLocalClassUsagesTest.java78
2 files changed, 107 insertions, 14 deletions
diff --git a/smalidea/src/main/java/org/jf/smalidea/findUsages/SmaliClassReferenceSearcher.java b/smalidea/src/main/java/org/jf/smalidea/findUsages/SmaliClassReferenceSearcher.java
index ba13eb63..4642d749 100644
--- a/smalidea/src/main/java/org/jf/smalidea/findUsages/SmaliClassReferenceSearcher.java
+++ b/smalidea/src/main/java/org/jf/smalidea/findUsages/SmaliClassReferenceSearcher.java
@@ -78,18 +78,11 @@ public class SmaliClassReferenceSearcher extends QueryExecutorBase<PsiReference,
}
});
- // TODO: is it possible to get a LocalSearchScope here? If so, how to handle it?
- if (!(querySearchScope instanceof GlobalSearchScope)) {
- assert false;
- return;
- }
-
- PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(element.getProject());
- // TODO: limit search scope to only smali files. See, e.g. AnnotatedPackagesSearcher.PackageInfoFilesOnly
- helper.processAllFilesWithWord(smaliType, (GlobalSearchScope)querySearchScope,
- new Processor<PsiFile>() {
+ if (querySearchScope instanceof LocalSearchScope) {
+ for (final PsiElement scopeElement : ((LocalSearchScope)querySearchScope).getScope()) {
+ ApplicationManager.getApplication().runReadAction(new Runnable() {
@Override
- public boolean process(PsiFile file) {
+ public void run() {
LowLevelSearchUtil.processElementsContainingWordInElement(
new TextOccurenceProcessor() {
@Override public boolean execute(
@@ -97,9 +90,31 @@ public class SmaliClassReferenceSearcher extends QueryExecutorBase<PsiReference,
return processor.processTextOccurrence(element, offsetInElement, consumer);
}
},
- file, stringSearcher, true, new EmptyProgressIndicator());
- return true;
+ scopeElement, stringSearcher, true, new EmptyProgressIndicator());
}
- }, true);
+ });
+ }
+ } else if (querySearchScope instanceof GlobalSearchScope) {
+ PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(element.getProject());
+ // TODO: limit search scope to only smali files. See, e.g. AnnotatedPackagesSearcher.PackageInfoFilesOnly
+ helper.processAllFilesWithWord(smaliType, (GlobalSearchScope)querySearchScope,
+ new Processor<PsiFile>() {
+ @Override
+ public boolean process(PsiFile file) {
+ LowLevelSearchUtil.processElementsContainingWordInElement(
+ new TextOccurenceProcessor() {
+ @Override public boolean execute(
+ @NotNull PsiElement element, int offsetInElement) {
+ return processor.processTextOccurrence(element, offsetInElement, consumer);
+ }
+ },
+ file, stringSearcher, true, new EmptyProgressIndicator());
+ return true;
+ }
+ }, true);
+ } else {
+ assert false;
+ return;
+ }
}
}
diff --git a/smalidea/src/test/java/org/jf/smalidea/findUsages/HighlightLocalClassUsagesTest.java b/smalidea/src/test/java/org/jf/smalidea/findUsages/HighlightLocalClassUsagesTest.java
new file mode 100644
index 00000000..ffec82cd
--- /dev/null
+++ b/smalidea/src/test/java/org/jf/smalidea/findUsages/HighlightLocalClassUsagesTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smalidea.findUsages;
+
+import com.google.common.collect.Lists;
+import com.intellij.codeInsight.TargetElementUtilBase;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiReference;
+import com.intellij.psi.search.LocalSearchScope;
+import com.intellij.psi.search.searches.ReferencesSearch;
+import com.intellij.testFramework.PsiTestCase;
+import org.junit.Assert;
+
+import java.util.List;
+
+public class HighlightLocalClassUsagesTest extends PsiTestCase {
+ public void testHighlightLocalClassUsage() throws Exception {
+ String fileText = "" +
+ ".class public Lbl<ref>arg; .super Ljava/lang/Object;\n" +
+ ".method public doSomething()V\n" +
+ " .registers 1\n" +
+ " new-instance v0, Lbl<ref>arg;\n" +
+ " invoke-direct {v0}, Lblah;-><init>()V\n" +
+ " return-void\n" +
+ ".end method";
+
+ PsiFile file = createFile("blarg.smali", fileText.replace("<ref>", ""));
+ PsiElement target;
+
+ int refIndex = fileText.indexOf("<ref>");
+ PsiReference reference = file.findReferenceAt(refIndex);
+ if (reference != null) {
+ target = reference.resolve();
+ } else {
+ target = TargetElementUtilBase.getInstance().getNamedElement(
+ file.findElementAt(refIndex), 0);
+ }
+
+ final LocalSearchScope scope = new LocalSearchScope(file);
+
+ List<PsiReference> refs = Lists.newArrayList(ReferencesSearch.search(target, scope).findAll());
+ Assert.assertEquals(2, refs.size());
+
+ Assert.assertEquals(file.findElementAt(refIndex).getTextOffset(), refs.get(0).getElement().getTextOffset());
+ Assert.assertEquals(file.findElementAt(fileText.replaceFirst("<ref>", "").indexOf("<ref>")).getTextOffset(),
+ refs.get(1).getElement().getTextOffset());
+ }
+}