From 10666d777d0c9ab9743b08d9d76fd390eecbae39 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 10 Sep 2014 17:17:28 +0400 Subject: [PATCH] Split ModuleSourceInfo into ModuleProductionSourceInfo and ModuleTestSourceInfo --- .../intellij/openapi/roots/annotations.xml | 5 +- .../plugin/caches/resolve/IdeaModuleInfos.kt | 60 ++++++++++----- .../caches/resolve/ModuleDependencyMapper.kt | 2 +- .../plugin/caches/resolve/getModuleInfo.kt | 9 ++- .../caches/resolve/IdeaModuleInfoTest.kt | 76 +++++++++++++------ 5 files changed, 106 insertions(+), 46 deletions(-) diff --git a/annotations/com/intellij/openapi/roots/annotations.xml b/annotations/com/intellij/openapi/roots/annotations.xml index dc5350f7d09..1193afad48a 100644 --- a/annotations/com/intellij/openapi/roots/annotations.xml +++ b/annotations/com/intellij/openapi/roots/annotations.xml @@ -16,7 +16,10 @@ - + + + + { +private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, productionOnly: Boolean): List { + fun Module.toInfos() = if (productionOnly) listOf(productionSourceInfo()) else listOf(testSourceInfo(), productionSourceInfo()) + return when (orderEntry) { is ModuleSourceOrderEntry -> { - listOf(orderEntry.getOwnerModule().toSourceInfo()) + orderEntry.getOwnerModule().toInfos() } is ModuleOrderEntry -> { - emptyOrSingletonList(orderEntry.getModule()?.toSourceInfo()) + orderEntry.getModule()?.toInfos().orEmpty() } is LibraryOrderEntry -> { val library = orderEntry.getLibrary() ?: return listOf() @@ -62,27 +65,42 @@ private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry): Li } } -//TODO: (module refactoring) there should be separate ModuleTestInfo -private data class ModuleSourceInfo(val module: Module) : IdeaModuleInfo() { - override val name = Name.special("") - - override fun contentScope() = GlobalSearchScope.moduleScope(module) - - override fun dependencies(): List { - //NOTE: lib dependencies can be processed several times during recursive traversal - val result = LinkedHashSet() - ModuleRootManager.getInstance(module).orderEntries().compileOnly().recursively().exportedOnly().forEach { - orderEntry -> - result.addAll(orderEntryToModuleInfo(module.getProject(), orderEntry!!)) - true - } - return result.toList() +fun ideaModelDependencies(module: Module, productionOnly: Boolean): List { + //NOTE: lib dependencies can be processed several times during recursive traversal + val result = LinkedHashSet() + val dependencyEnumerator = ModuleRootManager.getInstance(module).orderEntries().compileOnly().recursively().exportedOnly() + if (productionOnly) { + dependencyEnumerator.productionOnly() } + dependencyEnumerator.forEach { + orderEntry -> + result.addAll(orderEntryToModuleInfo(module.getProject(), orderEntry!!, productionOnly)) + true + } + return result.toList() } -private fun Module.toSourceInfo() = ModuleSourceInfo(this) +public data class ModuleProductionSourceInfo(val module: Module) : IdeaModuleInfo() { + override val name = Name.special("") -private data class LibraryInfo(val project: Project, val library: Library) : IdeaModuleInfo() { + override fun contentScope() = module.getModuleScope(false) + + override fun dependencies() = ideaModelDependencies(module, productionOnly = true) +} + +//TODO: (module refactoring) do not create ModuleTestSourceInfo when there are not test roots for module +public data class ModuleTestSourceInfo(val module: Module) : IdeaModuleInfo() { + override val name = Name.special("") + + override fun contentScope() = module.getModuleScope().intersectWith(GlobalSearchScope.notScope(module.getModuleScope(false))) + + override fun dependencies() = ideaModelDependencies(module, productionOnly = false) +} + +public fun Module.productionSourceInfo(): ModuleProductionSourceInfo = ModuleProductionSourceInfo(this) +public fun Module.testSourceInfo(): ModuleTestSourceInfo = ModuleTestSourceInfo(this) + +public data class LibraryInfo(val project: Project, val library: Library) : IdeaModuleInfo() { override val name: Name = Name.special("") override fun contentScope() = LibraryWithoutSourceScope(project, library) diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt index b0a5fdb0c34..53a26ac566b 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt @@ -83,7 +83,7 @@ fun createModuleResolverProvider( private fun collectAllModuleInfosFromIdeaModel(project: Project): List { val ideaModules = ModuleManager.getInstance(project).getModules().toList() - val modulesSourcesInfos = ideaModules.map { it.toSourceInfo() } + val modulesSourcesInfos = ideaModules.flatMap { listOf(it.productionSourceInfo(), it.testSourceInfo()) } //TODO: (module refactoring) include libraries that are not among dependencies of any module val ideaLibraries = ideaModules.flatMap { diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/getModuleInfo.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/getModuleInfo.kt index a324edeb5d8..24d53ed2aa7 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/getModuleInfo.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/getModuleInfo.kt @@ -65,7 +65,14 @@ private fun getModuleInfoByVirtualFile(project: Project, virtualFile: VirtualFil val projectFileIndex = ProjectFileIndex.SERVICE.getInstance(project) val module = projectFileIndex.getModuleForFile(virtualFile) - if (module != null) return module.toSourceInfo() + if (module != null) { + if (projectFileIndex.isInTestSourceContent(virtualFile)) { + return module.testSourceInfo() + } + else { + return module.productionSourceInfo() + } + } val orderEntries = projectFileIndex.getOrderEntriesForFile(virtualFile) diff --git a/idea/tests/org/jetbrains/jet/plugin/caches/resolve/IdeaModuleInfoTest.kt b/idea/tests/org/jetbrains/jet/plugin/caches/resolve/IdeaModuleInfoTest.kt index 294e995cbb5..fcc5c6bce1a 100644 --- a/idea/tests/org/jetbrains/jet/plugin/caches/resolve/IdeaModuleInfoTest.kt +++ b/idea/tests/org/jetbrains/jet/plugin/caches/resolve/IdeaModuleInfoTest.kt @@ -32,8 +32,8 @@ class IdeaModuleInfoTest : ModuleTestCase() { val (a, b) = modules() b.addDependency(a) - b.source.assertDependenciesEqual(b.source, a.source) - assertDoesntContain(a.source.dependencies(), b.source) + b.production.assertDependenciesEqual(b.production, a.production) + assertDoesntContain(a.production.dependencies(), b.production) } fun testCircularDependency() { @@ -42,8 +42,8 @@ class IdeaModuleInfoTest : ModuleTestCase() { b.addDependency(a) a.addDependency(b) - a.source.assertDependenciesEqual(a.source, b.source) - b.source.assertDependenciesEqual(b.source, a.source) + a.production.assertDependenciesEqual(a.production, b.production) + b.production.assertDependenciesEqual(b.production, a.production) } fun testExportedDependency() { @@ -52,9 +52,9 @@ class IdeaModuleInfoTest : ModuleTestCase() { b.addDependency(a, exported = true) c.addDependency(b) - a.source.assertDependenciesEqual(a.source) - b.source.assertDependenciesEqual(b.source, a.source) - c.source.assertDependenciesEqual(c.source, b.source, a.source) + a.production.assertDependenciesEqual(a.production) + b.production.assertDependenciesEqual(b.production, a.production) + c.production.assertDependenciesEqual(c.production, b.production, a.production) } fun testRedundantExportedDependency() { @@ -64,9 +64,9 @@ class IdeaModuleInfoTest : ModuleTestCase() { c.addDependency(a) c.addDependency(b) - a.source.assertDependenciesEqual(a.source) - b.source.assertDependenciesEqual(b.source, a.source) - c.source.assertDependenciesEqual(c.source, a.source, b.source) + a.production.assertDependenciesEqual(a.production) + b.production.assertDependenciesEqual(b.production, a.production) + c.production.assertDependenciesEqual(c.production, a.production, b.production) } fun testCircularExportedDependency() { @@ -76,9 +76,9 @@ class IdeaModuleInfoTest : ModuleTestCase() { c.addDependency(b, exported = true) a.addDependency(c, exported = true) - a.source.assertDependenciesEqual(a.source, c.source, b.source) - b.source.assertDependenciesEqual(b.source, a.source, c.source) - c.source.assertDependenciesEqual(c.source, b.source, a.source) + a.production.assertDependenciesEqual(a.production, c.production, b.production) + b.production.assertDependenciesEqual(b.production, a.production, c.production) + c.production.assertDependenciesEqual(c.production, b.production, a.production) } fun testSimpleLibDependency() { @@ -86,7 +86,7 @@ class IdeaModuleInfoTest : ModuleTestCase() { val lib = projectLibrary() a.addDependency(lib) - a.source.assertDependenciesEqual(a.source, lib.classes) + a.production.assertDependenciesEqual(a.production, lib.classes) } fun testCircularExportedDependencyWithLib() { @@ -103,9 +103,9 @@ class IdeaModuleInfoTest : ModuleTestCase() { b.addDependency(lib) c.addDependency(lib) - a.source.assertDependenciesEqual(a.source, lib.classes, c.source, b.source) - b.source.assertDependenciesEqual(b.source, a.source, c.source, lib.classes) - c.source.assertDependenciesEqual(c.source, b.source, a.source, lib.classes) + a.production.assertDependenciesEqual(a.production, lib.classes, c.production, b.production) + b.production.assertDependenciesEqual(b.production, a.production, c.production, lib.classes) + c.production.assertDependenciesEqual(c.production, b.production, a.production, lib.classes) } fun testSeveralModulesExportLibs() { @@ -119,7 +119,7 @@ class IdeaModuleInfoTest : ModuleTestCase() { c.addDependency(a) c.addDependency(b) - c.source.assertDependenciesEqual(c.source, a.source, lib1.classes, b.source, lib2.classes) + c.production.assertDependenciesEqual(c.production, a.production, lib1.classes, b.production, lib2.classes) } fun testSeveralModulesExportSameLib() { @@ -132,7 +132,7 @@ class IdeaModuleInfoTest : ModuleTestCase() { c.addDependency(a) c.addDependency(b) - c.source.assertDependenciesEqual(c.source, a.source, lib.classes, b.source) + c.production.assertDependenciesEqual(c.production, a.production, lib.classes, b.production) } fun testRuntimeDependency() { @@ -141,7 +141,7 @@ class IdeaModuleInfoTest : ModuleTestCase() { b.addDependency(a, dependencyScope = DependencyScope.RUNTIME) b.addDependency(projectLibrary(), dependencyScope = DependencyScope.RUNTIME) - b.source.assertDependenciesEqual(b.source) + b.production.assertDependenciesEqual(b.production) } fun testProvidedDependency() { @@ -151,7 +151,35 @@ class IdeaModuleInfoTest : ModuleTestCase() { b.addDependency(a, dependencyScope = DependencyScope.PROVIDED) b.addDependency(lib, dependencyScope = DependencyScope.PROVIDED) - b.source.assertDependenciesEqual(b.source, a.source, lib.classes) + b.production.assertDependenciesEqual(b.production, a.production, lib.classes) + } + + fun testSimpleTestDependency() { + val (a, b) = modules() + b.addDependency(a, dependencyScope = DependencyScope.TEST) + + a.production.assertDependenciesEqual(a.production) + a.test.assertDependenciesEqual(a.test, a.production) + b.production.assertDependenciesEqual(b.production) + b.test.assertDependenciesEqual(b.test, b.production, a.test, a.production) + } + + fun testLibTestDependency() { + val a = module("a") + val lib = projectLibrary() + a.addDependency(lib, dependencyScope = DependencyScope.TEST) + + a.production.assertDependenciesEqual(a.production) + a.test.assertDependenciesEqual(a.test, a.production, lib.classes) + } + + fun testExportedTestDependency() { + val (a, b, c) = modules() + b.addDependency(a, exported = true) + c.addDependency(b, dependencyScope = DependencyScope.TEST) + + c.production.assertDependenciesEqual(c.production) + c.test.assertDependenciesEqual(c.test, c.production, b.test, b.production, a.test, a.production) } private fun Module.addDependency( @@ -160,8 +188,12 @@ class IdeaModuleInfoTest : ModuleTestCase() { exported: Boolean = false ) = ModuleRootModificationUtil.addDependency(this, other, dependencyScope, exported) - private val Module.source: ModuleProductionSourceInfo + private val Module.production: ModuleProductionSourceInfo get() = productionSourceInfo() + + private val Module.test: ModuleTestSourceInfo + get() = testSourceInfo() + private val Library.classes: LibraryInfo get() = LibraryInfo(getProject()!!, this)