From 290efe374954be801e1a32189c45ed8ce9ed433c Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Tue, 13 Nov 2018 18:49:51 +0300 Subject: [PATCH] BFS improvement in Gradle importer Avoid queuing duplicate dependencies and excessive `contains` checks by tracking discovered modules instead of processed. Use ArrayDeque instead of LinkedList --- .../KotlinGradleProjectResolverExtension.kt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt index b4d428ecd9d..da7f9706331 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt @@ -139,15 +139,11 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() } else listOf(ideModule) for (currentModuleNode in moduleNodesToProcess) { - val toProcess = LinkedList>() - val processed = HashSet>() - toProcess.add(currentModuleNode) + val toProcess = ArrayDeque>().apply { add(currentModuleNode) } + val discovered = HashSet>().apply { add(currentModuleNode) } while (toProcess.isNotEmpty()) { val moduleNode = toProcess.pollLast() - if (processed.contains(moduleNode)) continue - - processed.add(moduleNode) val moduleNodeForGradleModel = if (useModulePerSourceSet()) { ExternalSystemApiUtil.findParent(moduleNode, ProjectKeys.MODULE) @@ -181,7 +177,8 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() } val dependencies = if (useModulePerSourceSet()) moduleNode.getDependencies(ideProject) else getDependencyModules(ideModule, gradleModule.project) - dependencies.filterTo(toProcess) { it !in processed } + // queue only those dependencies that haven't been discovered earlier + dependencies.filterTo(toProcess, discovered::add) } } }