diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt index dfb5a5014b1..c6c4071fab0 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt @@ -47,7 +47,7 @@ enum class KotlinPlatformType: Named, Serializable { fun setupAttributesMatchingStrategy(attributesSchema: AttributesSchema) { attributesSchema.attribute(KotlinPlatformType.attribute).run { - if (isGradleVersionAtLeast(4, 0)) { + if (isGradleAtLeast(4, 0)) { compatibilityRules.add(CompatibilityRule::class.java) disambiguationRules.add(DisambiguationRule::class.java) } @@ -56,5 +56,5 @@ enum class KotlinPlatformType: Named, Serializable { } } -private fun isGradleVersionAtLeast(major: Int, minor: Int) = +private fun isGradleAtLeast(major: Int, minor: Int) = GradleVersion.current() >= GradleVersion.version("$major.$minor") \ No newline at end of file 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 b68fd895584..1a0e749ba4a 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 @@ -5,10 +5,12 @@ package org.jetbrains.kotlin.gradle.plugin.mpp +import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.repositories.IvyArtifactRepository import org.gradle.api.artifacts.repositories.IvyPatternRepositoryLayout +import org.gradle.api.artifacts.repositories.RepositoryLayout import org.gradle.api.internal.file.FileResolver import org.gradle.api.plugins.JavaPlugin import org.gradle.internal.reflect.Instantiator @@ -23,6 +25,7 @@ import org.jetbrains.kotlin.gradle.plugin.sources.applyLanguageSettingsToKotlinT import org.jetbrains.kotlin.gradle.tasks.AndroidTasksProvider import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader +import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.konan.KonanVersion import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget @@ -280,7 +283,16 @@ class KotlinNativeTargetPreset( this.repositories.ivy { repo -> repo.name = KOTLIN_NATIVE_FAKE_REPO_NAME repo.setUrl("file://$konanHome/klib") - repo.layout("pattern") { + + fun IvyArtifactRepository.layoutCompatible(configureAction: (RepositoryLayout) -> Unit) = + if (isGradleVersionAtLeast(5, 0)) { + val patternLayoutFunction = javaClass.getMethod("patternLayout", Action::class.java) + patternLayoutFunction(repo, Action { configureAction(it) }) + } else { + layout("pattern", configureAction) + } + + repo.layoutCompatible { val layout = it as IvyPatternRepositoryLayout layout.artifact("common/[artifact]") layout.artifact("platform/[classifier]/[artifact]") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt index e81b6b5d3c0..6510f3c4a3c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultKotlinDependencyHandler +import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import java.lang.reflect.Constructor import java.util.* @@ -53,7 +54,7 @@ class DefaultKotlinSourceSet( override val runtimeOnlyMetadataConfigurationName: String get() = lowerCamelCaseName(runtimeOnlyConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX) - override val kotlin: SourceDirectorySet = createDefaultSourceDirectorySet(name + " Kotlin source", fileResolver).apply { + override val kotlin: SourceDirectorySet = createDefaultSourceDirectorySet(project, "$name Kotlin source", fileResolver).apply { filter.include("**/*.java") filter.include("**/*.kt") filter.include("**/*.kts") @@ -61,7 +62,7 @@ class DefaultKotlinSourceSet( override val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder() - override val resources: SourceDirectorySet = createDefaultSourceDirectorySet(displayName + " resources", fileResolver) + override val resources: SourceDirectorySet = createDefaultSourceDirectorySet(project, "$name resources", fileResolver) override fun kotlin(configureClosure: Closure): SourceDirectorySet = kotlin.apply { ConfigureUtil.configure(configureClosure, this) } @@ -137,20 +138,26 @@ internal fun KotlinSourceSet.disambiguateName(simpleName: String): String { return lowerCamelCaseName(*nameParts.toTypedArray()) } -private val createDefaultSourceDirectorySet: (name: String?, resolver: FileResolver?) -> SourceDirectorySet = run { +private fun createDefaultSourceDirectorySet(project: Project, name: String?, resolver: FileResolver?): SourceDirectorySet { + if (isGradleVersionAtLeast(5, 0)) { + val objects = project.objects + val sourceDirectorySetMethod = objects.javaClass.methods.single { it.name == "sourceDirectorySet" && it.parameterCount == 2 } + return sourceDirectorySetMethod(objects, name, name) as SourceDirectorySet + } + val klass = DefaultSourceDirectorySet::class.java val defaultConstructor = klass.constructorOrNull(String::class.java, FileResolver::class.java) - if (defaultConstructor != null && defaultConstructor.getAnnotation(java.lang.Deprecated::class.java) == null) { + return if (defaultConstructor != null && defaultConstructor.getAnnotation(java.lang.Deprecated::class.java) == null) { // TODO: drop when gradle < 2.12 are obsolete - { name, resolver -> defaultConstructor.newInstance(name, resolver) } + defaultConstructor.newInstance(name, resolver) } else { val directoryFileTreeFactoryClass = Class.forName("org.gradle.api.internal.file.collections.DirectoryFileTreeFactory") val alternativeConstructor = klass.getConstructor(String::class.java, FileResolver::class.java, directoryFileTreeFactoryClass) val defaultFileTreeFactoryClass = Class.forName("org.gradle.api.internal.file.collections.DefaultDirectoryFileTreeFactory") val defaultFileTreeFactory = defaultFileTreeFactoryClass.getConstructor().newInstance() - return@run { name, resolver -> alternativeConstructor.newInstance(name, resolver, defaultFileTreeFactory) } + alternativeConstructor.newInstance(name, resolver, defaultFileTreeFactory) } }