From d62ced3a82f9a3e8d5f2fca4fb493597a993abcc Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Wed, 25 Oct 2017 16:18:21 +0300 Subject: [PATCH] Compile against gradleApi() --- .../tools/kotlin-gradle-plugin/build.gradle | 4 +- .../kotlin/gradle/plugin/KotlinJsDcePlugin.kt | 9 +- .../kotlin/gradle/plugin/KotlinPlugin.kt | 19 ++-- .../kotlin/gradle/utils/compatibiltiy.kt | 96 +++++++++++++++++++ 4 files changed, 113 insertions(+), 15 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt diff --git a/libraries/tools/kotlin-gradle-plugin/build.gradle b/libraries/tools/kotlin-gradle-plugin/build.gradle index c032278b720..c55dcf5e9f8 100644 --- a/libraries/tools/kotlin-gradle-plugin/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin/build.gradle @@ -40,8 +40,8 @@ dependencies { compileOnly project(':kotlin-annotation-processing-gradle') compileOnly 'com.android.tools.build:gradle:2.0.0' - compileOnly 'org.codehaus.groovy:groovy-all:2.3.9' - compileOnly 'org.jetbrains.kotlin:gradle-api:2.2' + compileOnly 'org.codehaus.groovy:groovy-all:2.4.11' + compileOnly gradleApi() runtime project(path: ':kotlin-compiler-embeddable', configuration: "runtimeJar") runtime project(path: ':kotlin-annotation-processing-gradle', configuration: "runtimeJar") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt index d3355bd3700..8c30d5ff958 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt @@ -18,6 +18,9 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.Task +import org.gradle.api.file.FileTree +import org.gradle.api.internal.file.UnionFileCollection import org.gradle.api.internal.file.UnionFileTree import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.tasks.SourceSet @@ -39,15 +42,15 @@ class KotlinJsDcePlugin : Plugin { val dceTaskName = sourceSet.getTaskName(DCE_TASK_PREFIX, TASK_SUFFIX) val dceTask = project.tasks.create(dceTaskName, KotlinJsDce::class.java).also { it.dependsOn(kotlinTask) - project.tasks.findByName("build").dependsOn(it) + project.tasks.findByName("build")!!.dependsOn(it) } project.afterEvaluate { val outputDir = File(File(project.buildDir, DEFAULT_OUT_DIR), sourceSet.name) - val configuration = project.configurations.findByName(sourceSet.compileConfigurationName) + val configuration = project.configurations.findByName(sourceSet.compileConfigurationName)!! val dceInputTrees = listOf(project.fileTree(kotlinTask.outputFile)) + configuration.map { project.fileTree(it) } - val dceInputFiles = UnionFileTree("dce-input", dceInputTrees) + val dceInputFiles = dceInputTrees.reduce { acc: FileTree, tree -> acc + tree } with (dceTask) { classpath = sourceSet.compileClasspath 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 76989f36f21..aed088411bb 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 @@ -4,6 +4,9 @@ import com.android.build.gradle.BaseExtension import com.android.build.gradle.BasePlugin import com.android.build.gradle.api.AndroidSourceSet import com.android.builder.model.SourceProvider +import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.util.text.StringUtil.compareVersionNumbers +import com.intellij.util.ReflectionUtil import groovy.lang.Closure import org.gradle.api.* import org.gradle.api.artifacts.Configuration @@ -22,15 +25,11 @@ import org.gradle.api.tasks.SourceSetOutput import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.api.tasks.compile.JavaCompile import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments -import com.intellij.openapi.util.io.FileUtil -import com.intellij.openapi.util.text.StringUtil.compareVersionNumbers -import com.intellij.util.ReflectionUtil import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl import org.jetbrains.kotlin.gradle.internal.* import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.getKaptGeneratedClassesDir import org.jetbrains.kotlin.gradle.tasks.* -import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion -import org.jetbrains.kotlin.gradle.utils.checkedReflection +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation import java.io.File import java.net.URL @@ -285,7 +284,7 @@ internal class Kotlin2JsSourceSetProcessor( tasksProvider.createKotlinJSTask(project, taskName, sourceSet.name) override fun doTargetSpecificProcessing() { - project.tasks.findByName(sourceSet.classesTaskName).dependsOn(kotlinTask) + project.tasks.findByName(sourceSet.classesTaskName)!!.dependsOn(kotlinTask) kotlinTask.source(kotlinSourceSet.kotlin) createCleanSourceMapTask() @@ -310,7 +309,7 @@ internal class Kotlin2JsSourceSetProcessor( kotlinTask.destinationDir = outputDir if (!isSeparateClassesDirSupported) { - sourceSet.output.setClassesDir(kotlinTask.destinationDir) + sourceSet.output.setClassesDirCompatible(kotlinTask.destinationDir) } appliedPlugins @@ -352,7 +351,7 @@ internal class KotlinCommonSourceSetProcessor( val appliedPlugins = subpluginEnvironment.addSubpluginOptions( project, kotlinTask, kotlinTask, null, null, sourceSet) - project.tasks.findByName(sourceSet.classesTaskName).dependsOn(kotlinTask) + project.tasks.findByName(sourceSet.classesTaskName)!!.dependsOn(kotlinTask) // can be missing (e.g. in case of tests) project.tasks.findByName(sourceSet.jarTaskName)?.dependsOn(kotlinTask) val javaTask = project.tasks.findByName(sourceSet.compileJavaTaskName) @@ -677,9 +676,9 @@ internal fun configureJavaTask(kotlinTask: KotlinCompile, javaTask: AbstractComp } // Make Gradle check if the javaTask is up-to-date based on the Kotlin classes - javaTask.inputs.dir(kotlinTask.destinationDir) + javaTask.inputsCompatible.dirCompatible(kotlinTask.destinationDir) // Also, use kapt1 annotations file for up-to-date check since annotation processing is done with javac - kotlinTask.kaptOptions.annotationsFile?.let { javaTask.inputs.file(it) } + kotlinTask.kaptOptions.annotationsFile?.let { javaTask.inputsCompatible.fileCompatible(it) } javaTask.dependsOn(kotlinTask) /* diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt new file mode 100644 index 00000000000..7d704c25873 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt @@ -0,0 +1,96 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.gradle.utils + +import org.gradle.api.Task +import org.gradle.api.tasks.SourceSetOutput +import org.gradle.api.tasks.TaskInputs +import org.gradle.api.tasks.TaskOutputs + +internal val Task.inputsCompatible: TaskInputs get() = inputs + +internal val Task.outputsCompatible: TaskOutputs get() = outputs + +private val filesMethod by lazy { + TaskInputs::class.java.methods.first { + it.name == "files" && it.parameterTypes.contentEquals(arrayOf(Array::class.java)) + } +} + +internal fun TaskInputs.filesCompatible(vararg files: Any) { + filesMethod(this, files) +} + +private val propertyMethod by lazy { + TaskInputs::class.java.methods.first { + it.name == "property" && it.parameterTypes.contentEquals(arrayOf(String::class.java, Any::class.java)) + } +} + +internal fun TaskInputs.propertyCompatible(name: String, value: Any) { + propertyMethod(this, name, value) +} + +private val outputsDirMethod by lazy { + TaskOutputs::class.java.methods.first { + it.name == "dir" && it.parameterTypes.contentEquals(arrayOf(Any::class.java)) + } +} + +internal fun TaskOutputs.dirCompatible(value: Any) { + outputsDirMethod(this, value) +} + +private val outputsFilesMethod by lazy { + TaskOutputs::class.java.methods.first { + it.name == "files" && it.parameterTypes.contentEquals(arrayOf(Array::class.java)) + } +} + +internal fun TaskOutputs.filesCompatible(vararg value: Any) { + outputsFilesMethod(this, value) +} + +private val fileMethod by lazy { + TaskInputs::class.java.methods.first { + it.name == "file" && it.parameterTypes.contentEquals(arrayOf(Any::class.java)) + } +} + +internal fun TaskInputs.fileCompatible(filePath: Any) { + fileMethod(this, filePath) +} + +private val inputsDirMethod by lazy { + TaskInputs::class.java.methods.first { + it.name == "dir" && it.parameterTypes.contentEquals(arrayOf(Any::class.java)) + } +} + +internal fun TaskInputs.dirCompatible(dirPath: Any) { + inputsDirMethod(this, dirPath) +} + +private val setClassesDirMethod by lazy { + SourceSetOutput::class.java.methods.first { + it.name == "setClassesDir" && it.parameterTypes.contentEquals(arrayOf(Any::class.java)) + } +} + +internal fun SourceSetOutput.setClassesDirCompatible(dirPath: Any) { + setClassesDirMethod(this, dirPath) +} \ No newline at end of file