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 a20b10700e3..f24962e85aa 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt @@ -420,6 +420,153 @@ class HierarchicalMultiplatformProjectImportingTest : MultiplePluginVersionGradl module("my-app.submodule.jsTest") { targetPlatform(js) } } } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testOrphanSourceSet() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + val native = NativePlatforms.unspecifiedNativePlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.commonMain") { + // must not be (jvm, js, native) + targetPlatform(jvm, js) + } + + module("my-app.orphan") { + targetPlatform(jvm, js) + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testSourceSetIncludedIntoCompilationDirectly() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + val native = NativePlatforms.unspecifiedNativePlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.commonMain") { + targetPlatform(jvm, js) // must not be (jvm, js, native) + } + + module("my-app.includedIntoJvm") { + targetPlatform(jvm) // ! + } + + module("my-app.includedIntoJvmAndJs") { + targetPlatform(jvm, js) // ! + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testDefaultSourceSetDependsOnDefaultSourceSet() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + val native = NativePlatforms.unspecifiedNativePlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.commonMain") { + targetPlatform(jvm, js) // must not be (jvm, js, native) + } + + module("my-app.intermediateBetweenJsAndCommon") { + targetPlatform(jvm, js) // must not be (jvm, js, native) + } + + module("my-app.jsMain") { + targetPlatform(js) // must not be (jvm, js) + } + + module("my-app.jvmMain") { + targetPlatform(jvm) + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testDefaultSourceSetIncludedIntoAnotherCompilationDirectly() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.jvmMain") { + targetPlatform(jvm) // must not be (jvm, js) + } + + module("my-app.jsMain") { + targetPlatform(js) + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testSourceSetsWithDependsOnButNotIncludedIntoCompilation() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + val native = NativePlatforms.unspecifiedNativePlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + + // (jvm, js, native) is highly undesirable + module("my-app.danglingOnJvm") { + targetPlatform(jvm, js) + } + + module("my-app.commonMain") { + targetPlatform(jvm, js) + } + + module("my-app.danglingOnCommon") { + targetPlatform(jvm, js) + } + + module("my-app.danglingOnJvmAndJs") { + targetPlatform(jvm, js) + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testCustomAddToCompilationPlusDependsOn() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.includedIntoJvm") { + targetPlatform(jvm) // ! + } + + module("my-app.pseudoOrphan") { + targetPlatform(jvm) // ! + } + } + } + private fun checkProjectStructure( exhaustiveModuleList: Boolean = true, exhaustiveSourceSourceRootList: Boolean = true, diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/build.gradle.kts new file mode 100644 index 00000000000..2cebce79ba2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/build.gradle.kts @@ -0,0 +1,32 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val pseudoOrphan by creating { + } + + val includedIntoJvm by creating { + dependsOn(pseudoOrphan) + } + + jvm().compilations["main"].source(includedIntoJvm) + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/build.gradle.kts new file mode 100644 index 00000000000..e01f85d5474 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/build.gradle.kts @@ -0,0 +1,37 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val commonMain by getting {} + + val intermediateBetweenJsAndCommon by creating { + dependsOn(commonMain) + } + + val jsMain by getting { + dependsOn(intermediateBetweenJsAndCommon) + } + + val jvmMain by getting { + dependsOn(jsMain) + } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/build.gradle.kts new file mode 100644 index 00000000000..f452654fefc --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/build.gradle.kts @@ -0,0 +1,27 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val jvmMain by getting { } + + js().compilations["main"].source(jvmMain) + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/build.gradle.kts new file mode 100644 index 00000000000..8f5506d42fe --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/build.gradle.kts @@ -0,0 +1,25 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val orphan by creating { } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/build.gradle.kts new file mode 100644 index 00000000000..27d155e7460 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/build.gradle.kts @@ -0,0 +1,31 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val includedIntoJvm by creating { } + val includedIntoJvmAndJs by creating { } + + jvm().compilations["main"].source(includedIntoJvm) + + jvm().compilations["main"].source(includedIntoJvmAndJs) + js().compilations["main"].source(includedIntoJvmAndJs) + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/build.gradle.kts new file mode 100644 index 00000000000..1c7a16755bc --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/build.gradle.kts @@ -0,0 +1,40 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val commonMain by getting { } + val jvmMain by getting { } + val jsMain by getting { } + + val danglingOnJvm by creating { + dependsOn(jvmMain) + } + + val danglingOnCommon by creating { + dependsOn(commonMain) + } + + val danglingOnJvmAndJs by creating { + dependsOn(jvmMain) + dependsOn(jsMain) + } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file