Compile against gradleApi()

This commit is contained in:
Sergey Igushkin
2017-10-25 16:18:21 +03:00
parent 72ec55769b
commit d62ced3a82
4 changed files with 113 additions and 15 deletions
@@ -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")
@@ -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<Project> {
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
@@ -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)
/*
@@ -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<Any>::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<Any>::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)
}