diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt index fc0738c55f8..d7ed6f1c362 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt @@ -159,12 +159,15 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { } } // create 'fake' dependency artifact files and put them into dependency substitution map - mppArtifacts.forEach { (k, v) -> - artifactToDependency[k]?.forEach { externalDependency -> - for ((index, module) in v.withIndex()) { - val fakeArtifact = "$k-MPP-$index" - configArtifacts[fakeArtifact] = module - externalDependency.addDependencyArtifactInternal(File(fakeArtifact)) + mppArtifacts.forEach { (filePath, moduleIds) -> + moduleIds.firstOrNull()?.also { configArtifacts[filePath] = it } + artifactToDependency[filePath]?.forEach { externalDependency -> + for ((index, module) in moduleIds.withIndex()) { + if (index != 0) { + val fakeArtifact = "$filePath-MPP-$index" + configArtifacts[fakeArtifact] = module + externalDependency.addDependencyArtifactInternal(File(fakeArtifact)) + } } } } @@ -235,7 +238,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { mppModel.targets.filter { it.jar != null && it.jar!!.archiveFile != null }.forEach { target -> val path = toCanonicalPath(target.jar!!.archiveFile!!.absolutePath) val currentModules = userData[path] ?: ArrayList().apply { userData[path] = this } - //TODO possibly add support of test modules + // Test modules should not be added. Otherwise we could get dependnecy of java.mail on jvmTest val allSourceSets = target.compilations.filter { !it.isTestModule }.flatMap { it.sourceSets }.toSet() val availableViaDependsOn = allSourceSets.flatMap { it.dependsOnSourceSets }.toSet() allSourceSets.filter { !availableViaDependsOn.contains(it.name) }.forEach { sourceSet -> diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt index a1501077731..e8881b54a4c 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt @@ -578,6 +578,125 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin } } + /** + * Test case for issue https://youtrack.jetbrains.com/issue/KT-29757 + */ + @Test + fun testJavaTransitiveOnMPP() { + configureByFiles() + importProject(true) + + checkProjectStructure(true, false, true) { + module("project") {} + module("project.jvm") {} + module("project.jvm.main") { + moduleDependency("project.mpp-base.jvmMain", DependencyScope.COMPILE) + moduleDependency("project.mpp.jvmMain", DependencyScope.COMPILE) + } + module("project.jvm.test") { + moduleDependency("project.jvm.main", DependencyScope.COMPILE) + moduleDependency("project.mpp-base.jvmMain", DependencyScope.COMPILE) + moduleDependency("project.mpp.jvmMain", DependencyScope.COMPILE) + } + module("project.mpp") {} + module("project.mpp.commonMain") { + moduleDependency("project.mpp-base.commonMain", DependencyScope.COMPILE) + } + module("project.mpp.commonTest") { + moduleDependency("project.mpp-base.commonMain", DependencyScope.TEST) + moduleDependency("project.mpp.commonMain", DependencyScope.TEST) + } + module("project.mpp.jvmMain") { + moduleDependency("project.mpp.commonMain", DependencyScope.COMPILE) + moduleDependency("project.mpp-base.commonMain", DependencyScope.COMPILE) + moduleDependency("project.mpp-base.jvmMain", DependencyScope.COMPILE) + } + module("project.mpp.jvmTest") { + moduleDependency("project.mpp.commonMain", DependencyScope.TEST) + moduleDependency("project.mpp.commonTest", DependencyScope.TEST, true) + moduleDependency("project.mpp-base.commonMain", DependencyScope.TEST) + moduleDependency("project.mpp-base.jvmMain", DependencyScope.TEST) + moduleDependency("project.mpp.jvmMain", DependencyScope.TEST) + } + + module("project.mpp-base") {} + module("project.mpp-base.commonMain") {} + module("project.mpp-base.commonTest") { + moduleDependency("project.mpp-base.commonMain", DependencyScope.TEST) + } + module("project.mpp-base.jvmMain") { + moduleDependency("project.mpp-base.commonMain", DependencyScope.COMPILE) + } + module("project.mpp-base.jvmTest") { + moduleDependency("project.mpp-base.commonMain", DependencyScope.TEST) + moduleDependency("project.mpp-base.jvmMain", DependencyScope.TEST) + moduleDependency("project.mpp-base.commonTest", DependencyScope.TEST, true) + } + } + } + + /** + * Test case for issue https://youtrack.jetbrains.com/issue/KT-28822 + */ + @Test + fun testImportBeforeBuild() { + configureByFiles() + importProject(true) + + checkProjectStructure(true, false, true) { + module("mpp-jardep") {} + module("mpp-jardep.java-project") {} + module("mpp-jardep.java-project.main") { + moduleDependency("mpp-jardep.library1.jvmMain", DependencyScope.COMPILE) + moduleDependency("mpp-jardep.library2.jvmMain", DependencyScope.COMPILE) + + } + module("mpp-jardep.java-project.test") { + moduleDependency("mpp-jardep.java-project.main", DependencyScope.COMPILE) + moduleDependency("mpp-jardep.library1.jvmMain", DependencyScope.COMPILE) + moduleDependency("mpp-jardep.library2.jvmMain", DependencyScope.COMPILE) + + } + + module("mpp-jardep.library1") {} + module("mpp-jardep.library1.commonMain") {} + module("mpp-jardep.library1.commonTest") { + moduleDependency("mpp-jardep.library1.commonMain", DependencyScope.TEST) + + } + module("mpp-jardep.library1.jvmMain") { + moduleDependency("mpp-jardep.library1.commonMain", DependencyScope.COMPILE) + + } + module("mpp-jardep.library1.jvmTest") { + moduleDependency("mpp-jardep.library1.commonMain", DependencyScope.TEST) + moduleDependency("mpp-jardep.library1.commonTest", DependencyScope.TEST, true) + moduleDependency("mpp-jardep.library1.jvmMain", DependencyScope.TEST) + } + + module("mpp-jardep.library2") {} + module("mpp-jardep.library2.commonMain") {} + module("mpp-jardep.library2.commonTest") { + moduleDependency("mpp-jardep.library2.commonMain", DependencyScope.TEST) + + } + module("mpp-jardep.library2.jvmMain") { + moduleDependency("mpp-jardep.library1.commonMain", DependencyScope.COMPILE) + moduleDependency("mpp-jardep.library1.jvmMain", DependencyScope.COMPILE) + moduleDependency("mpp-jardep.library2.commonMain", DependencyScope.COMPILE) + + } + module("mpp-jardep.library2.jvmTest") { + moduleDependency("mpp-jardep.library1.commonMain", DependencyScope.TEST) + moduleDependency("mpp-jardep.library1.jvmMain", DependencyScope.TEST) + moduleDependency("mpp-jardep.library2.commonMain", DependencyScope.TEST) + moduleDependency("mpp-jardep.library2.commonTest", DependencyScope.TEST, true) + moduleDependency("mpp-jardep.library2.jvmMain", DependencyScope.TEST) + } + } + } + + @Test fun testProductionOnTestFlag() { configureByFiles() diff --git a/idea/testData/gradle/newMultiplatformImport/importBeforeBuild/build.gradle b/idea/testData/gradle/newMultiplatformImport/importBeforeBuild/build.gradle new file mode 100644 index 00000000000..a389ec507eb --- /dev/null +++ b/idea/testData/gradle/newMultiplatformImport/importBeforeBuild/build.gradle @@ -0,0 +1,40 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.3.41' apply false +} + +allprojects { + repositories { + mavenLocal() + jcenter() + maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' } + } +} + +project('library1') { + apply plugin: 'kotlin-multiplatform' + + kotlin { targets { fromPreset(presets.jvm, 'jvm') } } +} +project('library2') { + apply plugin: 'kotlin-multiplatform' + + kotlin { + targets { fromPreset(presets.jvm, 'jvm') } + + sourceSets { + jvmMain { + dependencies { + implementation project(':library1') + } + } + } + } +} +project('java-project') { + apply plugin: 'java' + + dependencies { + implementation project(':library1') + implementation project(':library2') + } +} diff --git a/idea/testData/gradle/newMultiplatformImport/importBeforeBuild/settings.gradle b/idea/testData/gradle/newMultiplatformImport/importBeforeBuild/settings.gradle new file mode 100644 index 00000000000..5bcf91a125a --- /dev/null +++ b/idea/testData/gradle/newMultiplatformImport/importBeforeBuild/settings.gradle @@ -0,0 +1,5 @@ +rootProject.name = 'mpp-jardep' + +include "java-project" +include "library1" +include "library2" diff --git a/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/build.gradle b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/build.gradle new file mode 100644 index 00000000000..af5e845cac5 --- /dev/null +++ b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/build.gradle @@ -0,0 +1,20 @@ +buildscript { + ext.kotlin_version = '1.3.41' + + repositories { + mavenLocal() + jcenter() + maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' } + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +subprojects { + repositories { + mavenLocal() + jcenter() + maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/jvm/build.gradle b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/jvm/build.gradle new file mode 100644 index 00000000000..56ca1f7cd8e --- /dev/null +++ b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/jvm/build.gradle @@ -0,0 +1,5 @@ +apply plugin: 'kotlin-platform-jvm' + +dependencies { + compile project(':mpp') +} \ No newline at end of file diff --git a/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/mpp-base/build.gradle b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/mpp-base/build.gradle new file mode 100644 index 00000000000..8de86c05103 --- /dev/null +++ b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/mpp-base/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'kotlin-multiplatform' +apply plugin: 'maven-publish' + +kotlin { + jvm() + + sourceSets { + commonMain { + } + + jvmMain { + } + } +} + +version = "0.1.0-${System.currentTimeMillis()}" \ No newline at end of file diff --git a/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/mpp/build.gradle b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/mpp/build.gradle new file mode 100644 index 00000000000..3d2619f807b --- /dev/null +++ b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/mpp/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'kotlin-multiplatform' +apply plugin: 'maven-publish' + +kotlin { + jvm() + + sourceSets { + commonMain { + dependencies { + api project(':mpp-base') + } + } + + jvmMain { + } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/settings.gradle b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/settings.gradle new file mode 100644 index 00000000000..276eef5a015 --- /dev/null +++ b/idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/settings.gradle @@ -0,0 +1,6 @@ + +include('mpp-base') +include('mpp') +include('jvm') + +enableFeaturePreview('STABLE_PUBLISHING') \ No newline at end of file