From 91365d9fadb743f0eccab2e39120e041963c82b4 Mon Sep 17 00:00:00 2001 From: Andrey Uskov Date: Wed, 24 Jul 2019 17:49:08 +0300 Subject: [PATCH] Fix import library dependencies when transitive MPP are involved Fix import dependencies of java modules on MPP modules when project was not build before import. Unresolved jar dependencies are not created any more on import of MPP project. #KT-28822 Fixed #KT-29757 Fixed --- .../KotlinMPPGradleProjectResolver.kt | 17 +-- .../NewMultiplatformProjectImportingTest.kt | 119 ++++++++++++++++++ .../importBeforeBuild/build.gradle | 40 ++++++ .../importBeforeBuild/settings.gradle | 5 + .../javaTransitiveOnMPP/build.gradle | 20 +++ .../javaTransitiveOnMPP/jvm/build.gradle | 5 + .../javaTransitiveOnMPP/mpp-base/build.gradle | 16 +++ .../javaTransitiveOnMPP/mpp/build.gradle | 17 +++ .../javaTransitiveOnMPP/settings.gradle | 6 + 9 files changed, 238 insertions(+), 7 deletions(-) create mode 100644 idea/testData/gradle/newMultiplatformImport/importBeforeBuild/build.gradle create mode 100644 idea/testData/gradle/newMultiplatformImport/importBeforeBuild/settings.gradle create mode 100644 idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/build.gradle create mode 100644 idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/jvm/build.gradle create mode 100644 idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/mpp-base/build.gradle create mode 100644 idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/mpp/build.gradle create mode 100644 idea/testData/gradle/newMultiplatformImport/javaTransitiveOnMPP/settings.gradle 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