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
This commit is contained in:
Andrey Uskov
2019-07-24 17:49:08 +03:00
parent 0b8ad5c6c0
commit 91365d9fad
9 changed files with 238 additions and 7 deletions
@@ -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<String>().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 ->
@@ -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()
@@ -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')
}
}
@@ -0,0 +1,5 @@
rootProject.name = 'mpp-jardep'
include "java-project"
include "library1"
include "library2"
@@ -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' }
}
}
@@ -0,0 +1,5 @@
apply plugin: 'kotlin-platform-jvm'
dependencies {
compile project(':mpp')
}
@@ -0,0 +1,16 @@
apply plugin: 'kotlin-multiplatform'
apply plugin: 'maven-publish'
kotlin {
jvm()
sourceSets {
commonMain {
}
jvmMain {
}
}
}
version = "0.1.0-${System.currentTimeMillis()}"
@@ -0,0 +1,17 @@
apply plugin: 'kotlin-multiplatform'
apply plugin: 'maven-publish'
kotlin {
jvm()
sourceSets {
commonMain {
dependencies {
api project(':mpp-base')
}
}
jvmMain {
}
}
}
@@ -0,0 +1,6 @@
include('mpp-base')
include('mpp')
include('jvm')
enableFeaturePreview('STABLE_PUBLISHING')