diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt index df52b27ebaa..3f0b6cd8876 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt @@ -5,7 +5,15 @@ package org.jetbrains.kotlin.gradle +import com.intellij.openapi.roots.DependencyScope +import org.jetbrains.jps.model.java.JavaResourceRootType +import org.jetbrains.jps.model.java.JavaSourceRootType +import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.idea.codeInsight.gradle.MultiplePluginVersionGradleImportingTestCase +import org.jetbrains.kotlin.platform.js.JsPlatform +import org.jetbrains.kotlin.platform.js.JsPlatforms +import org.jetbrains.kotlin.platform.jvm.JvmPlatforms +import org.jetbrains.kotlin.platform.konan.KonanPlatforms import org.junit.After import org.junit.Before import org.junit.Test @@ -46,6 +54,179 @@ class HierarchicalMultiplatformProjectImportingTest : MultiplePluginVersionGradl } } + @Test + fun testImportIntermediateModules() { + configureByFiles() + importProject() + + checkProjectStructure { + module("my-app") + module("project.my-app.commonMain") { + isHMPP(true) + targetPlatform(JsPlatforms.defaultJsPlatform, JvmPlatforms.jvm16, KonanPlatforms.defaultKonanPlatform) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.COMPILE) + sourceFolder("src/commonMain/kotlin", SourceKotlinRootType) + sourceFolder("src/commonMain/resources", ResourceKotlinRootType) + } + + module("project.my-app.commonTest") { + isHMPP(true) + targetPlatform(JsPlatforms.defaultJsPlatform, JvmPlatforms.jvm16, KonanPlatforms.defaultKonanPlatform) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-annotations-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-common:1.3.50-dev-1383", DependencyScope.TEST) + moduleDependency("project.my-app.commonMain", DependencyScope.TEST) + sourceFolder("src/commonTest/kotlin", TestSourceKotlinRootType) + sourceFolder("src/commonTest/resources", TestResourceKotlinRootType) + } + + module("project.my-app.jsMain") { + isHMPP(true) + targetPlatform(JsPlatforms.defaultJsPlatform) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.COMPILE) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-js:1.3.50-dev-1383", DependencyScope.COMPILE) + moduleDependency("project.my-app.commonMain", DependencyScope.COMPILE) + moduleDependency("project.my-app.jvmAndJsMain", DependencyScope.COMPILE) + moduleDependency("project.my-app.linuxAndJsMain", DependencyScope.COMPILE) + sourceFolder("src/jsMain/kotlin", SourceKotlinRootType) + sourceFolder("src/jsMain/resources", ResourceKotlinRootType) + } + + module("project.my-app.jsTest") { + isHMPP(true) + targetPlatform(JsPlatforms.defaultJsPlatform) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-js:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-annotations-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-js:1.3.50-dev-1383", DependencyScope.TEST) + moduleDependency("project.my-app.commonMain", DependencyScope.TEST) + moduleDependency("project.my-app.commonTest", DependencyScope.TEST) + moduleDependency("project.my-app.jsMain", DependencyScope.TEST) + moduleDependency("project.my-app.jvmAndJsMain", DependencyScope.TEST) + moduleDependency("project.my-app.jvmAndJsTest", DependencyScope.TEST) + moduleDependency("project.my-app.linuxAndJsMain", DependencyScope.TEST) + moduleDependency("project.my-app.linuxAndJsTest", DependencyScope.TEST) + sourceFolder("src/jsTest/kotlin", TestSourceKotlinRootType) + sourceFolder("src/jsTest/resources", TestResourceKotlinRootType) + } + + module("project.my-app.jvmAndJsMain") { + isHMPP(true) + targetPlatform(JsPlatforms.defaultJsPlatform, JvmPlatforms.jvm16) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.COMPILE) + moduleDependency("project.my-app.commonMain", DependencyScope.COMPILE) + sourceFolder("src/jvmAndJsMain/kotlin", SourceKotlinRootType) + sourceFolder("src/jvmAndJsMain/resources", ResourceKotlinRootType) + } + + module("project.my-app.jvmAndJsTest") { + isHMPP(true) + targetPlatform(JsPlatforms.defaultJsPlatform, JvmPlatforms.jvm16) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-annotations-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-common:1.3.50-dev-1383", DependencyScope.TEST) + moduleDependency("project.my-app.commonMain", DependencyScope.TEST) + moduleDependency("project.my-app.commonTest", DependencyScope.TEST) + moduleDependency("project.my-app.jvmAndJsMain", DependencyScope.TEST) + sourceFolder("src/jvmAndJsTest/kotlin", TestSourceKotlinRootType) + sourceFolder("src/jvmAndJsTest/resources", TestResourceKotlinRootType) + } + + module("project.my-app.jvmMain") { + isHMPP(true) + targetPlatform(JvmPlatforms.jvm16) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.COMPILE) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.3.50-dev-1383", DependencyScope.COMPILE) + libraryDependency("Gradle: org.jetbrains:annotations:13.0", DependencyScope.COMPILE) + moduleDependency("project.my-app.commonMain", DependencyScope.COMPILE) + moduleDependency("project.my-app.jvmAndJsMain", DependencyScope.COMPILE) + sourceFolder("src/jvmMain/kotlin", JavaSourceRootType.SOURCE) + sourceFolder("src/jvmMain/resources", JavaResourceRootType.RESOURCE) + } + + module("project.my-app.jvmTest") { + isHMPP(true) + targetPlatform(JvmPlatforms.jvm16) + libraryDependency("Gradle: junit:junit:4.12", DependencyScope.TEST) + libraryDependency("Gradle: org.hamcrest:hamcrest-core:1.3", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-annotations-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-junit:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains:annotations:13.0", DependencyScope.TEST) + moduleDependency("project.my-app.commonMain", DependencyScope.TEST) + moduleDependency("project.my-app.commonTest", DependencyScope.TEST) + moduleDependency("project.my-app.jvmAndJsMain", DependencyScope.TEST) + moduleDependency("project.my-app.jvmAndJsTest", DependencyScope.TEST) + moduleDependency("project.my-app.jvmMain", DependencyScope.TEST) + sourceFolder("src/jvmTest/kotlin", JavaSourceRootType.TEST_SOURCE) + sourceFolder("src/jvmTest/resources", JavaResourceRootType.TEST_RESOURCE) + } + + module("project.my-app.linuxAndJsMain") { + isHMPP(true) + targetPlatform(JsPlatforms.defaultJsPlatform, KonanPlatforms.defaultKonanPlatform) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.COMPILE) + moduleDependency("project.my-app.commonMain", DependencyScope.COMPILE) + sourceFolder("src/linuxAndJsMain/kotlin", SourceKotlinRootType) + sourceFolder("src/linuxAndJsMain/resources", ResourceKotlinRootType) + } + + module("project.my-app.linuxAndJsTest") { + isHMPP(true) + targetPlatform(JsPlatforms.defaultJsPlatform, KonanPlatforms.defaultKonanPlatform) + sourceFolder("src/linuxAndJsTest/kotlin", TestSourceKotlinRootType) + sourceFolder("src/linuxAndJsTest/resources", TestResourceKotlinRootType) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-annotations-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-common:1.3.50-dev-1383", DependencyScope.TEST) + moduleDependency("project.my-app.commonMain", DependencyScope.TEST) + moduleDependency("project.my-app.commonTest", DependencyScope.TEST) + moduleDependency("project.my-app.linuxAndJsMain", DependencyScope.TEST) + } + + module("project.my-app.linuxX64Main") { + isHMPP(true) + targetPlatform(KonanPlatforms.defaultKonanPlatform) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.COMPILE) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - builtin [linux_x64]", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - iconv [linux_x64]", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - linux [linux_x64]", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - posix [linux_x64]", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - stdlib", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - zlib [linux_x64]", DependencyScope.PROVIDED) + moduleDependency("project.my-app.commonMain", DependencyScope.COMPILE) + moduleDependency("project.my-app.linuxAndJsMain", DependencyScope.COMPILE) + sourceFolder("src/linuxX64Main/kotlin", SourceKotlinRootType) + sourceFolder("src/linuxX64Main/resources", ResourceKotlinRootType) + } + + module("project.my-app.linuxX64Test") { + isHMPP(true) + targetPlatform(KonanPlatforms.defaultKonanPlatform) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-annotations-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-test-common:1.3.50-dev-1383", DependencyScope.TEST) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - builtin [linux_x64]", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - iconv [linux_x64]", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - linux [linux_x64]", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - posix [linux_x64]", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - stdlib", DependencyScope.PROVIDED) + libraryDependency("Kotlin/Native 1.3.50-dev-1383 - zlib [linux_x64]", DependencyScope.PROVIDED) + moduleDependency("project.my-app.commonMain", DependencyScope.TEST) + moduleDependency("project.my-app.commonTest", DependencyScope.TEST) + moduleDependency("project.my-app.linuxAndJsMain", DependencyScope.TEST) + moduleDependency("project.my-app.linuxAndJsTest", DependencyScope.TEST) + moduleDependency("project.my-app.linuxX64Main", DependencyScope.TEST) + sourceFolder("src/linuxX64Test/kotlin", TestSourceKotlinRootType) + sourceFolder("src/linuxX64Test/resources", TestResourceKotlinRootType) + } + } + } + private fun checkProjectStructure( exhaustiveModuleList: Boolean = true, exhaustiveSourceSourceRootList: Boolean = true, @@ -58,7 +239,8 @@ class HierarchicalMultiplatformProjectImportingTest : MultiplePluginVersionGradl exhaustiveModuleList, exhaustiveSourceSourceRootList, exhaustiveDependencyList, - body) + body + ) } override fun importProject() { diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt index 291a2569067..7652a678df4 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.idea.project.isHMPPEnabled import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.platform +import org.jetbrains.kotlin.platform.SimplePlatform import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.presentableDescription @@ -111,6 +112,25 @@ class ModuleInfo( } } + fun targetPlatform(vararg platforms: TargetPlatform) { + val expected = platforms.flatMap { it.componentPlatforms }.toSet() + val actual = module.platform?.componentPlatforms + + if (actual == null) { + projectInfo.messageCollector.report("Module '${module.name}': actual target platform is null") + return + } + + val notFound = expected.subtract(actual) + if (notFound.isNotEmpty()) { + projectInfo.messageCollector.report("Module '${module.name}': not found target platforms: " + notFound.joinToString(",")) + } + val notExpected = actual.subtract(expected) + if (notExpected.isNotEmpty()) { + projectInfo.messageCollector.report("Module '${module.name}': found unexpected target platforms: " + notExpected.joinToString(",")) + } + } + fun apiVersion(version: String) { val actualVersion = module.languageVersionSettings.apiVersion.versionString if (actualVersion != version) { diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/importIntermediateModules/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/importIntermediateModules/build.gradle.kts new file mode 100644 index 00000000000..1079f152cd5 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/importIntermediateModules/build.gradle.kts @@ -0,0 +1,88 @@ +plugins { + // TODO parametrization + kotlin("multiplatform").version("1.3.50-dev-1383") +} + +repositories { + maven("https://kotlin.bintray.com/kotlin-dev") + jcenter() +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + linuxX64() + + sourceSets { + val commonMain by getting { + dependencies { + implementation(kotlin("stdlib-common")) + } + } + + val commonTest by getting { + dependencies { + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + } + } + + val jvmAndJsMain by creating { + dependsOn(commonMain) + } + + val jvmAndJsTest by creating { + dependsOn(commonTest) + } + + val linuxAndJsMain by creating { + dependsOn(commonMain) + } + + val linuxAndJsTest by creating { + dependsOn(commonTest) + } + + jvm().compilations["main"].defaultSourceSet { + dependsOn(jvmAndJsMain) + dependencies { + implementation(kotlin("stdlib")) + } + } + + jvm().compilations["test"].defaultSourceSet { + dependsOn(jvmAndJsTest) + dependencies { + implementation(kotlin("test-junit")) + } + } + + js().compilations["main"].defaultSourceSet { + dependsOn(jvmAndJsMain) + dependsOn(linuxAndJsMain) + dependencies { + implementation(kotlin("stdlib-js")) + } + } + + js().compilations["test"].defaultSourceSet { + dependsOn(jvmAndJsTest) + dependsOn(linuxAndJsTest) + dependencies { + implementation(kotlin("test-js")) + } + } + + linuxX64().compilations["main"].defaultSourceSet { + dependsOn(linuxAndJsMain) + } + + linuxX64().compilations["test"].defaultSourceSet { + dependsOn(linuxAndJsTest) + } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/importIntermediateModules/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/importIntermediateModules/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/importIntermediateModules/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/importIntermediateModules/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/importIntermediateModules/settings.gradle.kts new file mode 100644 index 00000000000..53bf7c7541d --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/importIntermediateModules/settings.gradle.kts @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + maven("https://dl.bintray.com/kotlin/kotlin-dev") + gradlePluginPortal() + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file