Configuration: Include test roots of dependent modules to the module scope

#KT-23914 Fixed
This commit is contained in:
Alexey Sedunov
2018-07-10 18:20:37 +03:00
parent 04500914f3
commit d586a84f31
9 changed files with 83 additions and 0 deletions
@@ -216,6 +216,7 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension()
val moduleDependencyData = ModuleDependencyData(ideModule.data, targetModule.data)
moduleDependencyData.scope = DependencyScope.COMPILE
moduleDependencyData.isExported = false
moduleDependencyData.isProductionOnTestDependency = targetModule.sourceSetName == "test"
ideModule.createChild(ProjectKeys.MODULE_DEPENDENCY, moduleDependencyData)
}
@@ -19,11 +19,14 @@ package org.jetbrains.kotlin.gradle
import com.intellij.openapi.roots.DependencyScope
import com.intellij.openapi.roots.LibraryOrderEntry
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.ModuleOrderEntryImpl
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.PathUtil
import junit.framework.TestCase
import org.jetbrains.kotlin.idea.codeInsight.gradle.GradleImportingTestCase
import org.jetbrains.kotlin.idea.codeInsight.gradle.facetSettings
import org.jetbrains.kotlin.idea.facet.KotlinFacet
import org.jetbrains.kotlin.idea.util.rootManager
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.junit.Test
@@ -34,9 +37,25 @@ class MultiplatformProjectImportingTest : GradleImportingTestCase() {
.filterIsInstance<LibraryOrderEntry>()
.flatMap { it.getUrls(OrderRootType.CLASSES).map { it.replace(projectPath, "") } }
private fun assertProductionOnTestDependency(moduleName: String, depModuleName: String, expected: Boolean) {
val depOrderEntry = getModule(moduleName)
.rootManager
.orderEntries
.filterIsInstance<ModuleOrderEntryImpl>()
.first { it.moduleName == depModuleName }
assert(depOrderEntry.isProductionOnTestDependency == expected)
}
private fun assertFileInModuleScope(file: VirtualFile, moduleName: String) {
assert(getModule(moduleName).getModuleWithDependenciesAndLibrariesScope(true).contains(file))
}
@Test
fun testPlatformToCommonDependency() {
createProjectSubFile("settings.gradle", "include ':common', ':jvm', ':js'")
val commonTestFile = createProjectSubFile("common/src/test/kotlin/test.kt", "")
createProjectSubFile("jvm/src/test/kotlin/test.kt", "")
createProjectSubFile("js/src/test/kotlin/test.kt", "")
val kotlinVersion = "1.1.0"
@@ -75,10 +94,19 @@ class MultiplatformProjectImportingTest : GradleImportingTestCase() {
)
importProject()
assertModuleModuleDepScope("jvm_main", "common_main", DependencyScope.COMPILE)
assertModuleModuleDepScope("jvm_test", "common_test", DependencyScope.COMPILE)
assertModuleModuleDepScope("js_main", "common_main", DependencyScope.COMPILE)
assertModuleModuleDepScope("js_test", "common_test", DependencyScope.COMPILE)
assertProductionOnTestDependency("jvm_main", "common_main", false)
assertProductionOnTestDependency("jvm_test", "common_test", true)
assertProductionOnTestDependency("js_main", "common_main", false)
assertProductionOnTestDependency("js_test", "common_test", true)
assertFileInModuleScope(commonTestFile, "jvm_test")
assertFileInModuleScope(commonTestFile, "js_test")
}
@Test
+2
View File
@@ -838,6 +838,8 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
<project.converterProvider implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmSourceRootConverterProvider"/>
<orderEnumerationHandlerFactory implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmOrderEnumerationHandler$Factory"/>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.FoldInitializerAndIfToElvisIntention</className>
<category>Kotlin</category>
+2
View File
@@ -835,6 +835,8 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
<project.converterProvider implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmSourceRootConverterProvider"/>
<orderEnumerationHandlerFactory implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmOrderEnumerationHandler$Factory"/>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.FoldInitializerAndIfToElvisIntention</className>
<category>Kotlin</category>
+2
View File
@@ -838,6 +838,8 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
<project.converterProvider implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmSourceRootConverterProvider"/>
<orderEnumerationHandlerFactory implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmOrderEnumerationHandler$Factory"/>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.FoldInitializerAndIfToElvisIntention</className>
<category>Kotlin</category>
+2
View File
@@ -839,6 +839,8 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
<project.converterProvider implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmSourceRootConverterProvider"/>
<orderEnumerationHandlerFactory implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmOrderEnumerationHandler$Factory"/>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.FoldInitializerAndIfToElvisIntention</className>
<category>Kotlin</category>
+2
View File
@@ -838,6 +838,8 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
<project.converterProvider implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmSourceRootConverterProvider"/>
<orderEnumerationHandlerFactory implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmOrderEnumerationHandler$Factory"/>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.FoldInitializerAndIfToElvisIntention</className>
<category>Kotlin</category>
+2
View File
@@ -838,6 +838,8 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
<project.converterProvider implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmSourceRootConverterProvider"/>
<orderEnumerationHandlerFactory implementation="org.jetbrains.kotlin.idea.roots.KotlinNonJvmOrderEnumerationHandler$Factory"/>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.FoldInitializerAndIfToElvisIntention</className>
<category>Kotlin</category>
@@ -0,0 +1,42 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.roots
import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.ModuleRootModel
import com.intellij.openapi.roots.OrderEnumerationHandler
import com.intellij.openapi.roots.OrderRootType
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
import org.jetbrains.kotlin.config.KotlinResourceRootType
import org.jetbrains.kotlin.config.KotlinSourceRootType
object KotlinNonJvmOrderEnumerationHandler : OrderEnumerationHandler() {
class Factory : OrderEnumerationHandler.Factory() {
override fun isApplicable(module: Module) = true
override fun createHandler(module: Module) = KotlinNonJvmOrderEnumerationHandler
}
private val kotlinTestSourceRootTypes: Set<JpsModuleSourceRootType<*>> =
setOf(KotlinSourceRootType.TestSource, KotlinResourceRootType.TestResource)
override fun addCustomModuleRoots(
type: OrderRootType,
rootModel: ModuleRootModel,
result: MutableCollection<String>,
includeProduction: Boolean,
includeTests: Boolean
): Boolean {
if (type == OrderRootType.SOURCES) {
if (includeProduction) {
rootModel.getSourceRoots(includeTests).mapTo(result) { it.url }
} else {
rootModel.getSourceRoots(kotlinTestSourceRootTypes).mapTo(result) { it.url }
}
return true
}
return false
}
}