From 7e6527ca65909e9301331f395959f5b2addda3d3 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Thu, 10 Jan 2019 23:37:29 +0300 Subject: [PATCH] Properly setup localToProject attribute in jvmWithJava (KT-29035) A dependency on a multiplatform module with a jvmWithJava target failed to resolve because the 'apiElements' and 'runtimeElements' configurations didn't have the attribute 'localToProject' set to 'public'. Those configurations need to have have the attribute set as per the fix of KT-28795, but it doesn't happen. Issue #KT-29035 Fixed --- .../kotlin/gradle/VariantAwareDependenciesIT.kt | 6 ++++++ .../app/build.gradle | 15 +++++++++++++++ .../app/src/main/java/B.kt | 8 ++++++++ .../build.gradle | 16 ++++++++++++++++ .../lib/build.gradle | 14 ++++++++++++++ .../lib/src/commonMain/kotlin/AExpected.kt | 3 +++ .../lib/src/main/java/A.java | 5 +++++ .../lib/src/main/java/A.kt | 3 +++ .../settings.gradle | 1 + .../plugin/android/Android25ProjectHandler.kt | 2 +- .../kotlin/gradle/plugin/KotlinPlugin.kt | 4 ++-- .../gradle/plugin/KotlinTargetConfigurator.kt | 9 +++++---- .../gradle/plugin/mpp/kotlinTargetPresets.kt | 5 ----- 13 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/app/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/app/src/main/java/B.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/commonMain/kotlin/AExpected.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/main/java/A.java create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/main/java/A.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesIT.kt index 64076a2c43f..0af158c6300 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesIT.kt @@ -229,6 +229,12 @@ class VariantAwareDependenciesIT : BaseGradleIT() { testResolveAllConfigurations("sample-lib") } + @Test + fun testJvmWithJavaProjectCanBeResolvedInAllConfigurations() = + with(Project("new-mpp-jvm-with-java-multi-module", GradleVersionRequired.AtLeast("4.7"))) { + testResolveAllConfigurations("app") + } + @Test fun testConfigurationsWithNoExplicitUsageResolveRuntime() = // Starting with Gradle 5.0, plain Maven dependencies are represented as two variants, and resolving them to the API one leads diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/app/build.gradle new file mode 100644 index 00000000000..2782d9efa63 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/app/build.gradle @@ -0,0 +1,15 @@ +apply plugin: 'kotlin-multiplatform' + +kotlin { + sourceSets { + commonMain.dependencies { + api project(':lib') + api kotlin('stdlib-common') + } + } + targetFromPreset(presets.jvmWithJava, 'jvm') { + compilations.main.defaultSourceSet.dependencies { + api kotlin('stdlib') + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/app/src/main/java/B.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/app/src/main/java/B.kt new file mode 100644 index 00000000000..5df814851bf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/app/src/main/java/B.kt @@ -0,0 +1,8 @@ +package com.exmaple.app + +import com.example.lib.* + +fun main() { + println(A()) + println(hello()) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/build.gradle new file mode 100644 index 00000000000..5c3a6c8ce59 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/build.gradle @@ -0,0 +1,16 @@ +buildscript { + repositories { + mavenLocal() + jcenter() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + mavenLocal() + jcenter() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/build.gradle new file mode 100644 index 00000000000..23bc5f852d3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/build.gradle @@ -0,0 +1,14 @@ +apply plugin: 'kotlin-multiplatform' + +kotlin { + sourceSets { + commonMain.dependencies { + api kotlin('stdlib-common') + } + } + targetFromPreset(presets.jvmWithJava, 'jvm') { + compilations.main.defaultSourceSet.dependencies { + api kotlin('stdlib') + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/commonMain/kotlin/AExpected.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/commonMain/kotlin/AExpected.kt new file mode 100644 index 00000000000..013ac81a272 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/commonMain/kotlin/AExpected.kt @@ -0,0 +1,3 @@ +package com.example.lib + +expect fun hello(): String \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/main/java/A.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/main/java/A.java new file mode 100644 index 00000000000..d5fb8ac3582 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/main/java/A.java @@ -0,0 +1,5 @@ +package com.example.lib; + +public class A { + String hello = AKt.hello(); +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/main/java/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/main/java/A.kt new file mode 100644 index 00000000000..3e1e9e9dad1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/lib/src/main/java/A.kt @@ -0,0 +1,3 @@ +package com.example.lib + +actual fun hello(): String = "Hello, JVM!" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/settings.gradle new file mode 100644 index 00000000000..421e7f78bb0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-jvm-with-java-multi-module/settings.gradle @@ -0,0 +1 @@ +include 'lib', 'app' \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt index ac330fde923..3194401fe83 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt @@ -125,7 +125,7 @@ class Android25ProjectHandler(kotlinConfigurationTools: KotlinConfigurationTools override fun setUpDependencyResolution(variant: BaseVariant, compilation: KotlinJvmAndroidCompilation) { val project = compilation.target.project - AbstractKotlinTargetConfigurator.defineConfigurationsForCompilation(compilation, compilation.target, project.configurations) + AbstractKotlinTargetConfigurator.defineConfigurationsForCompilation(compilation) compilation.compileDependencyFiles = variant.compileConfiguration.apply { usesPlatformOf(compilation.target) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 2b74b13a0ce..69913d487e5 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -382,7 +382,6 @@ internal abstract class AbstractKotlinPlugin( { compilation -> buildSourceSetProcessor(project, compilation, kotlinPluginVersion) } ) - configureAttributes(target) configureProjectGlobalSettings(project, kotlinPluginVersion) registry.register(KotlinModelBuilder(kotlinPluginVersion, null)) } @@ -399,6 +398,7 @@ internal abstract class AbstractKotlinPlugin( ) { setUpJavaSourceSets(target) configureSourceSetDefaults(target, buildSourceSetProcessor) + configureAttributes(target) } private fun configureClassInspectionForIC(project: Project) { @@ -476,7 +476,7 @@ internal abstract class AbstractKotlinPlugin( // Setup the consuming configurations: project.dependencies.attributesSchema.attribute(KotlinPlatformType.attribute) kotlinTarget.compilations.all { compilation -> - AbstractKotlinTargetConfigurator.defineConfigurationsForCompilation(compilation, kotlinTarget, project.configurations) + AbstractKotlinTargetConfigurator.defineConfigurationsForCompilation(compilation) } project.configurations.getByName("default").apply { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index 38dafc86b54..9a7af32165c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -99,7 +99,7 @@ abstract class AbstractKotlinTargetConfigurator val project = target.project target.compilations.all { compilation -> - defineConfigurationsForCompilation(compilation, target, project.configurations) + defineConfigurationsForCompilation(compilation) if (createDefaultSourceSets) { project.kotlinExtension.sourceSets.maybeCreate(compilation.defaultSourceSetName).also { sourceSet -> @@ -233,10 +233,11 @@ abstract class AbstractKotlinTargetConfigurator const val testTaskNameSuffix = "test" fun defineConfigurationsForCompilation( - compilation: KotlinCompilation<*>, - target: KotlinTarget, - configurations: ConfigurationContainer + compilation: KotlinCompilation<*> ) { + val target = compilation.target + val configurations = target.project.configurations + val compileConfiguration = configurations.maybeCreate(compilation.deprecatedCompileConfigurationName).apply { setupAsLocalTargetSpecificConfigurationIfSupported(target) isVisible = false diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt index 2f5d2e97158..b8bd27083f1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt @@ -215,11 +215,6 @@ class KotlinJvmWithJavaTargetPreset( Kotlin2JvmSourceSetProcessor(project, KotlinTasksProvider(name), compilation, kotlinPluginVersion) } - target.compilations.all { compilation -> - // Set up dependency resolution using platforms: - AbstractKotlinTargetConfigurator.defineConfigurationsForCompilation(compilation, target, project.configurations) - } - target.compilations.getByName("test").run { val main = target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME)