diff options
Diffstat (limited to 'java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java')
-rw-r--r-- | java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java | 125 |
1 files changed, 70 insertions, 55 deletions
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java index 2ee2cc2d8123..e7da21e37b51 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java @@ -27,6 +27,7 @@ import com.intellij.psi.search.searches.FunctionalExpressionSearch; import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; import org.jetbrains.annotations.NotNull; @@ -36,15 +37,15 @@ import java.util.Collection; public class JavaFunctionalExpressionSearcher implements QueryExecutor<PsiFunctionalExpression, FunctionalExpressionSearch.SearchParameters> { @Override - public boolean execute(final @NotNull FunctionalExpressionSearch.SearchParameters queryParameters, - final @NotNull Processor<PsiFunctionalExpression> consumer) { + public boolean execute(@NotNull final FunctionalExpressionSearch.SearchParameters queryParameters, + @NotNull final Processor<PsiFunctionalExpression> consumer) { final PsiClass aClass = queryParameters.getElementToSearch(); - if (!ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { + if (ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { @Override public Boolean compute() { - return LambdaUtil.isFunctionalClass(aClass); + return !LambdaUtil.isFunctionalClass(aClass) || !PsiUtil.isLanguageLevel8OrHigher(aClass); } - }) || !PsiUtil.isLanguageLevel8OrHigher(aClass)) { + })) { return true; } return collectFunctionalExpressions(aClass, ApplicationManager.getApplication().runReadAction(new Computable<SearchScope>() { @@ -64,8 +65,13 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor<PsiFuncti return aClass.getUseScope(); } }); - final SearchScope useScope = searchScope.intersectWith(classScope); - final Project project = aClass.getProject(); + final SearchScope useScope = ApplicationManager.getApplication().runReadAction(new Computable<SearchScope>() { + @Override + public SearchScope compute() { + return searchScope.intersectWith(classScope); + } + }); + final Project project = PsiUtilCore.getProjectInReadAction(aClass); final GlobalSearchScope scope = useScope instanceof GlobalSearchScope ? (GlobalSearchScope)useScope : new EverythingGlobalScope(project); final Collection<PsiMethod> lambdaCandidates = ApplicationManager.getApplication().runReadAction(new Computable<Collection<PsiMethod>>() { @Override @@ -76,16 +82,16 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor<PsiFuncti } }); for (PsiMethod psiMethod : lambdaCandidates) { - for (PsiReference ref : MethodReferencesSearch.search(psiMethod, scope, false)) { - final PsiElement refElement = ref.getElement(); - if (refElement != null) { - final PsiElement candidateElement = refElement.getParent(); - if (candidateElement instanceof PsiCallExpression) { - final PsiExpressionList argumentList = ((PsiCallExpression)candidateElement).getArgumentList(); - if (argumentList != null) { - final Boolean accepted = ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { - @Override - public Boolean compute() { + for (final PsiReference ref : MethodReferencesSearch.search(psiMethod, scope, false)) { + boolean accepted = ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { + @Override + public Boolean compute() { + final PsiElement refElement = ref.getElement(); + if (refElement != null) { + final PsiElement candidateElement = refElement.getParent(); + if (candidateElement instanceof PsiCallExpression) { + final PsiExpressionList argumentList = ((PsiCallExpression)candidateElement).getArgumentList(); + if (argumentList != null) { final PsiExpression[] args = argumentList.getExpressions(); for (PsiExpression arg : args) { if (arg instanceof PsiFunctionalExpression) { @@ -96,57 +102,66 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor<PsiFuncti } } } - return true; } - }); - if (!accepted) return false; + } } + return true; } - } + }); + if (!accepted) return false; } } - for (PsiReference reference : ReferencesSearch.search(aClass, scope)) { - final PsiElement element = reference.getElement(); - if (element != null) { - final PsiElement parent = element.getParent(); - if (parent instanceof PsiTypeElement) { - final PsiElement gParent = parent.getParent(); - if (gParent instanceof PsiVariable) { - final PsiExpression initializer = PsiUtil.skipParenthesizedExprDown(((PsiVariable)gParent).getInitializer()); - if (initializer instanceof PsiFunctionalExpression) { - if (!consumer.process((PsiFunctionalExpression)initializer)) return false; - } - for (PsiReference varRef : ReferencesSearch.search(parent, scope)) { - final PsiElement varElement = varRef.getElement(); - if (varElement != null) { - final PsiElement varElementParent = varElement.getParent(); - if (varElementParent instanceof PsiAssignmentExpression && - ((PsiAssignmentExpression)varElementParent).getLExpression() == varElement) { - final PsiExpression rExpression = PsiUtil.skipParenthesizedExprDown(((PsiAssignmentExpression)varElementParent).getRExpression()); - if (rExpression instanceof PsiFunctionalExpression) { - if (!consumer.process((PsiFunctionalExpression)rExpression)) return false; + for (final PsiReference reference : ReferencesSearch.search(aClass, scope)) { + boolean accepted = ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { + @Override + public Boolean compute() { + final PsiElement element = reference.getElement(); + if (element != null) { + final PsiElement parent = element.getParent(); + if (parent instanceof PsiTypeElement) { + final PsiElement gParent = parent.getParent(); + if (gParent instanceof PsiVariable) { + final PsiExpression initializer = PsiUtil.skipParenthesizedExprDown(((PsiVariable)gParent).getInitializer()); + if (initializer instanceof PsiFunctionalExpression) { + if (!consumer.process((PsiFunctionalExpression)initializer)) return false; + } + for (PsiReference varRef : ReferencesSearch.search(parent, scope)) { + final PsiElement varElement = varRef.getElement(); + if (varElement != null) { + final PsiElement varElementParent = varElement.getParent(); + if (varElementParent instanceof PsiAssignmentExpression && + ((PsiAssignmentExpression)varElementParent).getLExpression() == varElement) { + final PsiExpression rExpression = PsiUtil.skipParenthesizedExprDown(((PsiAssignmentExpression)varElementParent).getRExpression()); + if (rExpression instanceof PsiFunctionalExpression) { + if (!consumer.process((PsiFunctionalExpression)rExpression)) return false; + } + } } } - } - } - } else if (gParent instanceof PsiMethod) { - final PsiReturnStatement[] returnStatements = ApplicationManager.getApplication().runReadAction( - new Computable<PsiReturnStatement[]>() { - @Override - public PsiReturnStatement[] compute() { - return PsiUtil.findReturnStatements((PsiMethod)gParent); + } else if (gParent instanceof PsiMethod) { + final PsiReturnStatement[] returnStatements = ApplicationManager.getApplication().runReadAction( + new Computable<PsiReturnStatement[]>() { + @Override + public PsiReturnStatement[] compute() { + return PsiUtil.findReturnStatements((PsiMethod)gParent); + } + }); + for (PsiReturnStatement returnStatement : returnStatements) { + final PsiExpression returnValue = returnStatement.getReturnValue(); + if (returnValue instanceof PsiFunctionalExpression) { + if (!consumer.process((PsiFunctionalExpression)returnValue)) return false; + } } - }); - for (PsiReturnStatement returnStatement : returnStatements) { - final PsiExpression returnValue = returnStatement.getReturnValue(); - if (returnValue instanceof PsiFunctionalExpression) { - if (!consumer.process((PsiFunctionalExpression)returnValue)) return false; } } } + + return true; } - } + }); + if (!accepted) return false; + } return true; } |