From e0ebf2482b9fc89da36fd62253737cad56c2987e Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 2 Aug 2016 20:59:03 +0300 Subject: [PATCH] Configure KotlinCompile.destinationDir before evaluation Previously it was possible to refer to destinationDir in gradle scripts (evaluation phase), so in order to preserve compatibility destinationDir should be configured before evaluation. This does not affect android plugin because in this case kotlin tasks were created after evaluation anyway, so it was not possible to refer to destinationDir during evaluation anyway. --- .../kotlin/gradle/plugin/KotlinPlugin.kt | 12 ++++++--- .../gradle/BasicKotlinGradlePluginIT.kt | 8 ++++++ .../build.gradle | 25 +++++++++++++++++++ .../src/main/kotlin/foo/Greeter.kt | 6 +++++ .../src/test/kotlin/foo/GreeterTest.kt | 11 ++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/src/main/kotlin/foo/Greeter.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/src/test/kotlin/foo/GreeterTest.kt 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 6a69e0e8e30..61fad82b9fd 100644 --- 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 @@ -65,6 +65,7 @@ abstract class KotlinSourceSetProcessor( protected val kotlinDirSet: SourceDirectorySet? = createKotlinDirSet() protected val kotlinTask: T = createKotlinCompileTask() protected val kotlinTaskName: String by lazy { kotlinTask.name } + protected abstract val defaultKotlinDestinationDir: File public fun run() { if (kotlinSourceSet == null || kotlinDirSet == null) { @@ -106,6 +107,7 @@ abstract class KotlinSourceSetProcessor( kotlinCompile.description = taskDescription kotlinCompile.extensions.extraProperties.set("defaultModuleName", "${project.name}-$name") kotlinCompile.mapClasspath { sourceSet.compileClasspath } + kotlinCompile.destinationDir = defaultKotlinDestinationDir return kotlinCompile } @@ -129,6 +131,9 @@ class Kotlin2JvmSourceSetProcessor( private var cachedKotlinAnnotationProcessingDep: String? = null } + override val defaultKotlinDestinationDir: File + get() = File(project.buildDir, "kotlin-classes/$sourceSetName") + override fun doCreateTask(project: Project, taskName: String): KotlinCompile = tasksProvider.createKotlinJVMTask(project, taskName) @@ -144,8 +149,6 @@ class Kotlin2JvmSourceSetProcessor( project.afterEvaluate { project -> if (project != null) { - kotlinTask.destinationDir = File(project.buildDir, "kotlin-classes/$sourceSetName") - val subpluginEnvironment = loadSubplugins(project) subpluginEnvironment.addSubpluginArguments(project, kotlinTask) @@ -189,12 +192,13 @@ class Kotlin2JsSourceSetProcessor( taskDescription = "Compiles the kotlin sources in $sourceSet to JavaScript.", compileTaskNameSuffix = "kotlin2Js" ) { + override val defaultKotlinDestinationDir: File + get() = File(project.buildDir, "kotlin2js/${sourceSetName}") val copyKotlinJsTaskName = sourceSet.getTaskName("copy", "kotlinJs") val clean = project.tasks.findByName("clean") val build = project.tasks.findByName("build") - val defaultKotlinDestinationDir = File(project.buildDir, "kotlin2js/${sourceSetName}") private fun kotlinTaskDestinationDir(): File? = kotlinTask.destinationDir private fun kotlinJsDestinationDir(): File? = (kotlinTask.property("outputFile") as String).let { File(it) }.let { if (it.isDirectory) it else it.parentFile } @@ -209,7 +213,6 @@ class Kotlin2JsSourceSetProcessor( tasksProvider.createKotlinJSTask(project, taskName) override fun doTargetSpecificProcessing() { - kotlinTask.destinationDir = defaultKotlinDestinationDir build?.dependsOn(kotlinTaskName) clean?.dependsOn("clean" + kotlinTaskName.capitalize()) kotlinTask.source(kotlinDirSet) @@ -349,6 +352,7 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand } val kotlinTaskName = "compile${variantDataName.capitalize()}Kotlin" + // todo: Investigate possibility of creating and configuring kotlinTask before evaluation val kotlinTask = tasksProvider.createKotlinJVMTask(project, kotlinTaskName) kotlinTask.extensions.extraProperties.set("defaultModuleName", "${project.name}-$kotlinTaskName") diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BasicKotlinGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BasicKotlinGradlePluginIT.kt index 8c426438a0f..62320074cee 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BasicKotlinGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BasicKotlinGradlePluginIT.kt @@ -138,4 +138,12 @@ class SimpleKotlinGradleIT : BaseGradleIT() { assertContains(":compileKotlin UP-TO-DATE") } } + + @Test + fun testDestinationDirReferencedDuringEvaluation() { + Project("destinationDirReferencedDuringEvaluation", GRADLE_VERSION).build("build") { + assertSuccessful() + assertContains("GreeterTest PASSED") + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/build.gradle new file mode 100644 index 00000000000..a9891e37511 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/build.gradle @@ -0,0 +1,25 @@ +buildscript { + ext.kotlin_verion = '1.1-SNAPSHOT' + repositories { + maven { url 'file://' + pathToKotlinPlugin } + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_verion" + } +} + +apply plugin: "java" +apply plugin: "kotlin" + +repositories { + maven { url 'file://' + pathToKotlinPlugin } + mavenCentral() +} + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_verion" + testCompile 'junit:junit:4.12' +} + +// important to test that destinationDir is configured before evaluation +test.testClassesDir = project.tasks.compileTestKotlin.destinationDir diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/src/main/kotlin/foo/Greeter.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/src/main/kotlin/foo/Greeter.kt new file mode 100644 index 00000000000..6cd329fadbd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/src/main/kotlin/foo/Greeter.kt @@ -0,0 +1,6 @@ +package foo + +class Greeter(private val name: String) { + val greeting: String + get() = "Hello $name!" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/src/test/kotlin/foo/GreeterTest.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/src/test/kotlin/foo/GreeterTest.kt new file mode 100644 index 00000000000..3c53985d23f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/src/test/kotlin/foo/GreeterTest.kt @@ -0,0 +1,11 @@ +package foo + +import org.junit.Test +import org.junit.Assert + +class GreeterTest { + @Test + fun testHelloWorld() { + Assert.assertEquals("Hello World!", Greeter("World").greeting) + } +} \ No newline at end of file