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 f3cf54df5083..d2482955e8a1 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 @@ -43,10 +43,7 @@ import com.intellij.util.containers.HashSet; import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.annotations.NotNull; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.*; import static com.intellij.util.containers.ContainerUtil.*; import static com.intellij.util.containers.ContainerUtilRt.newHashSet; @@ -111,15 +108,18 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase> holders = new LinkedHashMap>(); + //functional expressions checker: number and type of parameters at call site should correspond to candidate method currently check + final SuitableFilesProcessor processor = new SuitableFilesProcessor(holders, expectedFunExprParamsCount, parametersCount, varArgs, parameters); + fileBasedIndex.processValues(JavaFunctionalExpressionIndex.JAVA_FUNCTIONAL_EXPRESSION_INDEX_ID, psiMethod.getName(), null, processor, useScope.intersectWith(methodUseScope)); + for (Map.Entry> entry : holders.entrySet()) { + for (JavaFunctionalExpressionIndex.IndexHolder holder : entry.getValue()) { + if (processor.canBeFunctional(holder)) { + filesToProcess.add(entry.getKey()); + break; + } + } + } } }); } @@ -343,18 +343,18 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase> { - private final LinkedHashSet myFilesToProcess; + private final Map> myHolders; private final int myExpectedFunExprParamsCount; private final int myParametersCount; private final boolean myVarArgs; private final PsiParameter[] myParameters; - public SuitableFilesProcessor(LinkedHashSet filesToProcess, + public SuitableFilesProcessor(Map> holders, int expectedFunExprParamsCount, int parametersCount, boolean varArgs, PsiParameter[] parameters) { - myFilesToProcess = filesToProcess; + myHolders = holders; myExpectedFunExprParamsCount = expectedFunExprParamsCount; myParametersCount = parametersCount; myVarArgs = varArgs; @@ -363,6 +363,7 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase holders) { + Set savedHolders = myHolders.get(file); for (JavaFunctionalExpressionIndex.IndexHolder holder : holders) { final int lambdaParamsNumber = holder.getLambdaParamsNumber(); if (lambdaParamsNumber == myExpectedFunExprParamsCount || lambdaParamsNumber == -1) { @@ -373,8 +374,12 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase(); + myHolders.put(file, savedHolders); + } + savedHolders.add(holder); break; } }