diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSet.kt index e57146f9f8f..a98470307d0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSet.kt @@ -1,10 +1,11 @@ package org.jetbrains.kotlin.gradle.internal -import org.gradle.api.file.SourceDirectorySet import groovy.lang.Closure -import org.gradle.api.internal.file.FileResolver +import org.gradle.api.file.SourceDirectorySet import org.gradle.api.internal.file.DefaultSourceDirectorySet +import org.gradle.api.internal.file.FileResolver import org.gradle.util.ConfigureUtil +import java.lang.reflect.Constructor interface KotlinSourceSet { @@ -16,7 +17,7 @@ interface KotlinSourceSet { open class KotlinSourceSetImpl(displayName: String?, resolver: FileResolver?): KotlinSourceSet { - private val kotlin: DefaultSourceDirectorySet = DefaultSourceDirectorySet(displayName + " Kotlin source", resolver) + private val kotlin: DefaultSourceDirectorySet = createDefaultSourceDirectorySet(displayName + " Kotlin source", resolver) init { kotlin.filter?.include("**/*.java", "**/*.kt") @@ -31,3 +32,27 @@ open class KotlinSourceSetImpl(displayName: String?, resolver: FileResolver?): K return this } } + +private fun createDefaultSourceDirectorySet(name: String?, resolver: FileResolver?): DefaultSourceDirectorySet { + val klass = DefaultSourceDirectorySet::class.java + val defaultConstructor = klass.constructorOrNull(String::class.java, FileResolver::class.java) + + if (defaultConstructor != null) { + return defaultConstructor.newInstance(name, resolver) + } + + // TODO: we can move to 2.12 after AS 2 release and + // use fallback strategy instead (try to make call, catch NoSuchMethodException, use reflection to access old API) + val directoryFileTreeFactoryClass = Class.forName("org.gradle.api.internal.file.collections.DirectoryFileTreeFactory") + val defaultFileTreeFactoryClass = Class.forName("org.gradle.api.internal.file.collections.DefaultDirectoryFileTreeFactory") + val alternativeConstructor = klass.getConstructor(String::class.java, FileResolver::class.java, directoryFileTreeFactoryClass) + return alternativeConstructor.newInstance(name, resolver, defaultFileTreeFactoryClass.getConstructor().newInstance()) +} + +private fun Class.constructorOrNull(vararg parameterTypes: Class<*>): Constructor? = + try { + getConstructor(*parameterTypes) + } + catch (e: NoSuchMethodException) { + null + }