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
This commit is contained in:
Ilya Gorbunov
2018-11-13 18:49:51 +03:00
parent e409007749
commit 290efe3749
@@ -139,15 +139,11 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension()
} else listOf(ideModule) } else listOf(ideModule)
for (currentModuleNode in moduleNodesToProcess) { for (currentModuleNode in moduleNodesToProcess) {
val toProcess = LinkedList<DataNode<out ModuleData>>() val toProcess = ArrayDeque<DataNode<out ModuleData>>().apply { add(currentModuleNode) }
val processed = HashSet<DataNode<out ModuleData>>() val discovered = HashSet<DataNode<out ModuleData>>().apply { add(currentModuleNode) }
toProcess.add(currentModuleNode)
while (toProcess.isNotEmpty()) { while (toProcess.isNotEmpty()) {
val moduleNode = toProcess.pollLast() val moduleNode = toProcess.pollLast()
if (processed.contains(moduleNode)) continue
processed.add(moduleNode)
val moduleNodeForGradleModel = if (useModulePerSourceSet()) { val moduleNodeForGradleModel = if (useModulePerSourceSet()) {
ExternalSystemApiUtil.findParent(moduleNode, ProjectKeys.MODULE) ExternalSystemApiUtil.findParent(moduleNode, ProjectKeys.MODULE)
@@ -181,7 +177,8 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension()
} }
val dependencies = if (useModulePerSourceSet()) moduleNode.getDependencies(ideProject) else getDependencyModules(ideModule, gradleModule.project) 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)
} }
} }
} }