Add property for precise version of Java tracking in Gradle IC

The flag name is kotlin.incremental.usePreciseJavaTracking
By default precise version is disabled

 #KT-17621 Fixed
This commit is contained in:
Denis Zharkov
2017-12-04 15:05:58 +03:00
parent a978c6be35
commit a079b92ea0
12 changed files with 231 additions and 63 deletions
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.gradle
import org.gradle.api.logging.LogLevel
import com.intellij.openapi.util.io.FileUtil
import org.gradle.api.logging.LogLevel
import org.jetbrains.kotlin.gradle.util.*
import org.junit.After
import org.junit.AfterClass
@@ -146,7 +146,9 @@ abstract class BaseGradleIT {
val debug: Boolean = false,
val freeCommandLineArgs: List<String> = emptyList(),
val kotlinVersion: String = KOTLIN_VERSION,
val kotlinDaemonDebugPort: Int? = null)
val kotlinDaemonDebugPort: Int? = null,
val usePreciseJavaTracking: Boolean? = null
)
open inner class Project(
val projectName: String,
@@ -441,6 +443,7 @@ abstract class BaseGradleIT {
add("-Pkotlin_version=" + options.kotlinVersion)
options.incremental?.let { add("-Pkotlin.incremental=$it") }
options.usePreciseJavaTracking?.let { add("-Pkotlin.incremental.usePreciseJavaTracking=$it") }
options.androidGradlePluginVersion?.let { add("-Pandroid_tools_version=$it")}
if (options.debug) {
add("-Dorg.gradle.debug=true")
@@ -486,4 +489,4 @@ abstract class BaseGradleIT {
}
private fun String.normalizePath() = replace("\\", "/")
}
}
@@ -88,44 +88,6 @@ open class A {
}
}
@Test
fun testModifyJavaInLib() {
val project = Project("incrementalMultiproject", GRADLE_VERSION)
project.build("build") {
assertSuccessful()
}
val javaClassJava = project.projectDir.getFileByName("JavaClass.java")
javaClassJava.modify { it.replace("String getString", "Object getString") }
project.build("build") {
assertSuccessful()
val affectedSources = project.projectDir.getFilesByNames("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
val relativePaths = project.relativize(affectedSources)
assertCompiledKotlinSources(relativePaths, weakTesting = false)
}
}
@Test
fun testModifyTrackedJavaClassInLib() {
val project = Project("incrementalMultiproject", GRADLE_VERSION)
project.build("build") {
assertSuccessful()
}
val javaClassJava = project.projectDir.getFileByName("TrackedJavaClass.java")
javaClassJava.modify { it.replace("String getString", "Object getString") }
project.build("build") {
assertSuccessful()
val affectedSources = project.projectDir.getFilesByNames(
"TrackedJavaClassChild.kt", "useTrackedJavaClass.kt", "useTrackedJavaClassSameModule.kt"
)
val relativePaths = project.relativize(affectedSources)
assertCompiledKotlinSources(relativePaths, weakTesting = false)
}
}
@Test
fun testCleanBuildLib() {
val project = Project("incrementalMultiproject", GRADLE_VERSION)
@@ -231,4 +193,89 @@ open class A {
assertCompiledKotlinSources(project.relativize(affectedSources), weakTesting = false)
}
}
}
}
class IncrementalJavaChangeDefaultIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = null) {
@Test
override fun testModifySignatureTrackedJavaInLib() {
doTest(trackedJavaClass, changeSignature,
expectedAffectedSources = listOf(
"TrackedJavaClassChild.kt", "useTrackedJavaClass.kt", "useTrackedJavaClassFooMethodUsage.kt",
"useTrackedJavaClassSameModule.kt"))
}
@Test
override fun testModifyBodyTrackedJavaInLib() {
doTest(trackedJavaClass, changeBody,
expectedAffectedSources = listOf(
"TrackedJavaClassChild.kt", "useTrackedJavaClass.kt", "useTrackedJavaClassFooMethodUsage.kt",
"useTrackedJavaClassSameModule.kt"
))
}
}
class IncrementalJavaChangePreciseIT : IncrementalCompilationJavaChangesBase(usePreciseJavaTracking = true) {
@Test
override fun testModifySignatureTrackedJavaInLib() {
doTest(trackedJavaClass, changeSignature, expectedAffectedSources = listOf("TrackedJavaClassChild.kt", "useTrackedJavaClass.kt"))
}
@Test
override fun testModifyBodyTrackedJavaInLib() {
doTest(trackedJavaClass, changeBody, expectedAffectedSources = listOf())
}
}
abstract class IncrementalCompilationJavaChangesBase(val usePreciseJavaTracking: Boolean?) : BaseGradleIT() {
companion object {
protected val GRADLE_VERSION = "2.10"
}
override fun defaultBuildOptions(): BuildOptions =
super.defaultBuildOptions().copy(withDaemon = true, incremental = true)
protected val trackedJavaClass = "TrackedJavaClass.java"
private val javaClass = "JavaClass.java"
protected val changeBody: (String)->String = { it.replace("Hello, World!", "Hello, World!!!!") }
protected val changeSignature: (String)->String = { it.replace("String getString", "Object getString") }
@Test
fun testModifySignatureJavaInLib() {
doTest(javaClass, changeBody,
expectedAffectedSources = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
)
}
@Test
fun testModifyBodyJavaInLib() {
doTest(javaClass, changeBody,
expectedAffectedSources = listOf("JavaClassChild.kt", "useJavaClass.kt", "useJavaClassFooMethodUsage.kt")
)
}
abstract fun testModifySignatureTrackedJavaInLib()
abstract fun testModifyBodyTrackedJavaInLib()
protected fun doTest(
fileToModify: String,
transformFile: (String)->String,
expectedAffectedSources: Collection<String>
) {
val project = Project("incrementalMultiproject", GRADLE_VERSION)
val options = defaultBuildOptions().copy(usePreciseJavaTracking = usePreciseJavaTracking)
project.build("build", options = options) {
assertSuccessful()
}
val javaClassJava = project.projectDir.getFileByName(fileToModify)
javaClassJava.modify(transformFile)
project.build("build", options = options) {
assertSuccessful()
val affectedSources = project.projectDir.getFilesByNames(*expectedAffectedSources.toTypedArray())
val relativePaths = project.relativize(affectedSources)
assertCompiledKotlinSources(relativePaths, weakTesting = false)
}
}
}
@@ -1,5 +1,5 @@
package bar
private fun useTrackedJavaClass() {
TrackedJavaClass().getString()
TrackedJavaClass().foo()
}
@@ -38,5 +38,6 @@ internal class GradleIncrementalCompilerEnvironment(
val artifactDifferenceRegistryProvider: ArtifactDifferenceRegistryProvider? = null,
val artifactFile: File? = null,
val buildHistoryFile: File? = null,
val friendBuildHistoryFile: File? = null
) : GradleCompilerEnvironment(compilerClasspath, messageCollector, outputItemsCollector, compilerArgs)
val friendBuildHistoryFile: File? = null,
val usePreciseJavaTracking: Boolean = false
) : GradleCompilerEnvironment(compilerClasspath, messageCollector, outputItemsCollector, compilerArgs)
@@ -257,7 +257,8 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil
compilerMode = CompilerMode.INCREMENTAL_COMPILER,
targetPlatform = targetPlatform,
resultDifferenceFile = environment.buildHistoryFile,
friendDifferenceFile = environment.friendBuildHistoryFile
friendDifferenceFile = environment.friendBuildHistoryFile,
usePreciseJavaTracking = environment.usePreciseJavaTracking
)
log.info("Options for KOTLIN DAEMON: $compilationOptions")
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.util.*
import kotlin.reflect.KMutableProperty1
fun mapKotlinTaskProperties(project: Project, task: AbstractKotlinCompile<*>) {
PropertiesProvider(project).apply {
@@ -30,6 +29,9 @@ fun mapKotlinTaskProperties(project: Project, task: AbstractKotlinCompile<*>) {
if (task is KotlinCompile) {
incrementalJvm?.let { task.incremental = it }
usePreciseJavaTracking?.let {
task.usePreciseJavaTracking = it
}
}
if (task is Kotlin2JsCompile) {
@@ -62,6 +64,9 @@ internal class PropertiesProvider(private val project: Project) {
val incrementalMultiplatform: Boolean?
get() = booleanProperty("kotlin.incremental.multiplatform")
val usePreciseJavaTracking: Boolean?
get() = booleanProperty("kotlin.incremental.usePreciseJavaTracking")
private fun booleanProperty(propName: String): Boolean? =
property(propName)?.toBoolean()
@@ -72,4 +77,4 @@ internal class PropertiesProvider(private val project: Project) {
else {
localProperties.getProperty(propName)
}
}
}
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.logging.Logger
import org.gradle.api.plugins.BasePluginConvention
import org.gradle.api.tasks.Input
@@ -250,6 +249,13 @@ open class KotlinCompile : AbstractKotlinCompile<K2JVMCompilerArguments>(), Kotl
internal var artifactDifferenceRegistryProvider: ArtifactDifferenceRegistryProvider? = null
internal var artifactFile: File? = null
@get:Input
var usePreciseJavaTracking: Boolean = false
set(value) {
field = value
logger.kotlinDebug { "Set $this.usePreciseJavaTracking=$value" }
}
init {
incremental = true
}
@@ -314,7 +320,9 @@ open class KotlinCompile : AbstractKotlinCompile<K2JVMCompilerArguments>(), Kotl
artifactDifferenceRegistryProvider,
artifactFile = artifactFile,
buildHistoryFile = buildHistoryFile,
friendBuildHistoryFile = friendTask?.buildHistoryFile)
friendBuildHistoryFile = friendTask?.buildHistoryFile,
usePreciseJavaTracking = usePreciseJavaTracking
)
}
}