Fix NoSuchMethodError with Gradle 2.12

#KT-11351 fixed
This commit is contained in:
Alexey Tsvetkov
2016-03-15 14:40:35 +03:00
parent d6c2f77125
commit d1abc87857
@@ -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 <T> Class<T>.constructorOrNull(vararg parameterTypes: Class<*>): Constructor<T>? =
try {
getConstructor(*parameterTypes)
}
catch (e: NoSuchMethodException) {
null
}