From 382b5c50d732c28efc2327cb9595cf492f8ccb5b Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 5 Aug 2016 17:13:00 +0200 Subject: [PATCH] fun expr search: don't hold methods in memory for more time than needed --- .../JavaFunctionalExpressionSearcher.java | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 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 b26a56b696a4..89da61c79150 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 @@ -168,16 +168,20 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase getCandidateOffsets(SamDescriptor descriptor, MultiMap queries) { - MultiMap result = MultiMap.create(); + private static MultiMap getCandidateOffsets(SamDescriptor descriptor, MultiMap queries, Set likelyFiles) { + MultiMap result = MultiMap.createLinked(); + MultiMap unlikely = MultiMap.createLinked(); for (Location location : queries.keySet()) { MultiMap offsets = getOffsetsForLocation(descriptor, location, queries.get(location)); - result.putAllValues(offsets); + for (VirtualFile file : offsets.keySet()) { + (likelyFiles.contains(file) ? result : unlikely).putValues(file, offsets.get(file)); + } if (LOG.isDebugEnabled()) { logIfLarge(offsets, location); } } + result.putAllValues(unlikely); if (LOG.isDebugEnabled()) { LOG.debug("checking " + result.values().size() + " fun-expressions in " + result.keySet().size() + " files"); } @@ -397,10 +401,11 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase consumer, Set highLevelModules) { + @NotNull + private MultiMap getOffsets(Set highLevelModules) { GlobalSearchScope visibleFromCandidates = ReadAction.compute( () -> samClass.isValid() ? combineResolveScopes(highLevelModules, samClass) : null); - if (visibleFromCandidates == null) return true; + if (visibleFromCandidates == null) return MultiMap.empty(); Set usedMethodNames = collectMethodNamesCalledWithFunExpressions(this); Set exactTypeMethods = getMethodsWithParameterType(usedMethodNames, useScope.intersectWith(visibleFromCandidates), getClassName()); @@ -408,21 +413,11 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase queries = collectQueryKeys(this, ContainerUtil.concat(exactTypeMethods, genericMethods)); - return processLikelyFirst(getMostLikelyFiles(exactTypeMethods), consumer, queries); + return getCandidateOffsets(this, queries, getMostLikelyFiles(exactTypeMethods)); } - private boolean processLikelyFirst(Set likelyFiles, - @NotNull Processor consumer, - MultiMap queries) { - MultiMap file2Offsets = getCandidateOffsets(this, queries); - for (VirtualFile file : likelyFiles) { - Collection offsets = file2Offsets.remove(file); - if (offsets != null && !processFile(consumer, samClass, file, offsets)) { - return false; - } - } - - for (Map.Entry> entry : file2Offsets.entrySet()) { + private boolean search(@NotNull Processor consumer, Set highLevelModules) { + for (Map.Entry> entry : getOffsets(highLevelModules).entrySet()) { if (!processFile(consumer, samClass, entry.getKey(), entry.getValue())) { return false; }