From 480dc2ef2b20ecfcd6a2a148148621f8147723f1 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 15 Jun 2010 16:56:28 +0400 Subject: [PATCH] allow reentrant ReferencesSearch & MethodReferencesSearch --- .../psi/impl/search/MethodUsagesSearcher.java | 16 +++++++------- .../searches/MethodReferencesSearch.java | 6 +++++- .../impl/search/CachesBasedRefSearcher.java | 21 +++++++++---------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/search/MethodUsagesSearcher.java b/java/java-impl/src/com/intellij/psi/impl/search/MethodUsagesSearcher.java index d972dc8aaf2c..61cf065ab86f 100644 --- a/java/java-impl/src/com/intellij/psi/impl/search/MethodUsagesSearcher.java +++ b/java/java-impl/src/com/intellij/psi/impl/search/MethodUsagesSearcher.java @@ -16,10 +16,9 @@ import org.jetbrains.annotations.NotNull; * @author max */ public class MethodUsagesSearcher extends SearchRequestor implements QueryExecutor { - private static final ThreadLocal ourProcessing = new ThreadLocal(); public boolean execute(final MethodReferencesSearch.SearchParameters p, final Processor consumer) { - if (ourProcessing.get() != null) { + if (p instanceof MySearchParameters) { return true; } @@ -48,13 +47,7 @@ public class MethodUsagesSearcher extends SearchRequestor implements QueryExecut contributeSearchTargets(method, options, collector, strictSignatureSearch); collector.searchCustom(new Processor>() { public boolean process(Processor processor) { - ourProcessing.set(true); - try { - return MethodReferencesSearch.search(method, options.searchScope, strictSignatureSearch).forEach(processor); - } - finally { - ourProcessing.set(null); - } + return MethodReferencesSearch.search(new MySearchParameters(method, options, strictSignatureSearch)).forEach(processor); } }); } @@ -105,4 +98,9 @@ public class MethodUsagesSearcher extends SearchRequestor implements QueryExecut collector.searchWord(textToSearch, restrictedByAccess, searchContext, true, new MethodTextOccurenceProcessor(aClass, strictSignatureSearch, methods)); } + private static class MySearchParameters extends MethodReferencesSearch.SearchParameters { + public MySearchParameters(PsiMethod method, FindUsagesOptions options, boolean strictSignatureSearch) { + super(method, options.searchScope, strictSignatureSearch); + } + } } diff --git a/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java b/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java index c66605b7da69..060dd0ffae5f 100644 --- a/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java +++ b/java/openapi/src/com/intellij/psi/search/searches/MethodReferencesSearch.java @@ -55,8 +55,12 @@ public class MethodReferencesSearch extends ExtensibleQueryFactory search(final PsiMethod method, SearchScope scope, final boolean strictSignatureSearch) { + return search(new SearchParameters(method, scope, strictSignatureSearch)); + } + + public static Query search(final SearchParameters parameters) { //noinspection unchecked - return INSTANCE.createUniqueResultsQuery(new SearchParameters(method, scope, strictSignatureSearch), TObjectHashingStrategy.CANONICAL, ReferenceDescriptor.MAPPER); + return INSTANCE.createUniqueResultsQuery(parameters, TObjectHashingStrategy.CANONICAL, ReferenceDescriptor.MAPPER); } public static Query search(final PsiMethod method, final boolean strictSignatureSearch) { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/CachesBasedRefSearcher.java b/platform/lang-impl/src/com/intellij/psi/impl/search/CachesBasedRefSearcher.java index 0c488928610b..b0ed2764706c 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/CachesBasedRefSearcher.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/CachesBasedRefSearcher.java @@ -25,10 +25,9 @@ import org.jetbrains.annotations.NotNull; * @author max */ public class CachesBasedRefSearcher extends SearchRequestor implements QueryExecutor { - private static final ThreadLocal ourProcessing = new ThreadLocal(); public boolean execute(final ReferencesSearch.SearchParameters p, final Processor consumer) { - if (ourProcessing.get() != null) { + if (p instanceof MySearchParameters) { return true; } @@ -48,20 +47,14 @@ public class CachesBasedRefSearcher extends SearchRequestor implements QueryExec @Override public void contributeRequests(@NotNull final PsiElement refElement, - @NotNull FindUsagesOptions options, - @NotNull SearchRequestCollector collector) { + @NotNull FindUsagesOptions options, + @NotNull SearchRequestCollector collector) { final boolean ignoreAccessScope = false; final SearchScope scope = options.searchScope; contributeSearchTargets(refElement, options, collector, ignoreAccessScope, scope); collector.searchCustom(new Processor>() { public boolean process(Processor consumer) { - ourProcessing.set(true); - try { - return ReferencesSearch.search(refElement, scope, ignoreAccessScope).forEach(consumer); - } - finally { - ourProcessing.set(null); - } + return ReferencesSearch.search(new MySearchParameters(refElement, scope, ignoreAccessScope)).forEach(consumer); } }); } @@ -100,4 +93,10 @@ public class CachesBasedRefSearcher extends SearchRequestor implements QueryExec collector.searchWord(text, searchScope, refElement.getLanguage().isCaseSensitive(), refElement); } } + + private static class MySearchParameters extends ReferencesSearch.SearchParameters { + public MySearchParameters(PsiElement refElement, SearchScope scope, boolean ignoreAccessScope) { + super(refElement, scope, ignoreAccessScope); + } + } }