Filter out non-Java files from kapt inputs

#KT-23878 fixed
This commit is contained in:
Alexey Tsvetkov
2018-05-04 23:06:43 +03:00
parent 5f3c57e69a
commit c026c7f24b
2 changed files with 39 additions and 25 deletions
@@ -9,7 +9,23 @@ import org.junit.Test
class KaptIncrementalNoStubsIT : KaptIncrementalBaseIT(shouldUseStubs = false) class KaptIncrementalNoStubsIT : KaptIncrementalBaseIT(shouldUseStubs = false)
class KaptIncrementalWithStubsIT : KaptIncrementalBaseIT(shouldUseStubs = true) class KaptIncrementalWithStubsIT : KaptIncrementalBaseIT(shouldUseStubs = true)
class Kapt3Incremental : KaptIncrementalBaseIT(shouldUseStubs = false, useKapt3 = true) class Kapt3Incremental : KaptIncrementalBaseIT(shouldUseStubs = false, useKapt3 = true) {
@Test
fun testAddNewLine() {
val project = Project("simple", directoryPrefix = "kapt2")
project.build("clean", "build") {
assertSuccessful()
}
project.projectFile("test.kt").modify { "\n$it" }
project.build("build") {
assertSuccessful()
assertTasksExecuted(":kaptGenerateStubsKotlin", ":compileJava", ":compileKotlin")
assertTasksUpToDate(":kaptKotlin")
}
}
}
abstract class KaptIncrementalBaseIT(val shouldUseStubs: Boolean, val useKapt3: Boolean = false) : BaseGradleIT() { abstract class KaptIncrementalBaseIT(val shouldUseStubs: Boolean, val useKapt3: Boolean = false) : BaseGradleIT() {
init { init {
@@ -277,10 +293,7 @@ abstract class KaptIncrementalBaseIT(val shouldUseStubs: Boolean, val useKapt3:
private fun CompiledProject.assertKapt3FullyExecuted() { private fun CompiledProject.assertKapt3FullyExecuted() {
if (useKapt3) { if (useKapt3) {
assertNotContains( assertTasksExecuted(":kaptKotlin", ":kaptGenerateStubsKotlin")
":kaptKotlin UP-TO-DATE",
":kaptGenerateStubsKotlin UP-TO-DATE"
)
} }
} }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment
import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner
import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl
import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.incremental.isJavaFile
import java.io.File import java.io.File
@CacheableTask @CacheableTask
@@ -36,11 +37,6 @@ open class KaptTask : ConventionTask(), CompilerArgumentAwareWithInput<K2JVMComp
@get:Internal @get:Internal
internal lateinit var stubsDir: File internal lateinit var stubsDir: File
private fun isInsideDestinationDirs(file: File): Boolean {
return FileUtil.isAncestor(destinationDir, file, /* strict = */ false)
|| FileUtil.isAncestor(classesDir, file, /* strict = */ false)
}
@get:Classpath @get:InputFiles @get:Classpath @get:InputFiles
val kaptClasspath: FileCollection val kaptClasspath: FileCollection
get() = project.files(*kaptClasspathConfigurations.toTypedArray()) get() = project.files(*kaptClasspathConfigurations.toTypedArray())
@@ -87,25 +83,29 @@ open class KaptTask : ConventionTask(), CompilerArgumentAwareWithInput<K2JVMComp
internal val pluginClasspath get() = pluginOptions.classpath internal val pluginClasspath get() = pluginOptions.classpath
@get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE)
val source: FileCollection val source: Collection<File>
get() { get() {
val sourcesFromKotlinTask = kotlinCompileTask.source val result = HashSet<File>()
.filter { it.extension == "java" && !isInsideDestinationDirs(it) } for (root in javaSourceRoots) {
root.walk().filterTo(result) { it.isJavaFile() }
val stubSources = project.fileTree(stubsDir) }
return sourcesFromKotlinTask + stubSources return result
} }
private val javaSourceRoots: Set<File>
get() = (kotlinCompileTask.sourceRootsContainer.sourceRoots + stubsDir)
.filterTo(HashSet(), ::isRootAllowed)
private fun isRootAllowed(file: File): Boolean =
!FileUtil.isAncestor(destinationDir, file, /* strict = */ false) &&
!FileUtil.isAncestor(classesDir, file, /* strict = */ false)
@TaskAction @TaskAction
fun compile() { fun compile() {
/** Delete everything inside generated sources and classes output directory /** Delete everything inside generated sources and classes output directory
* (annotation processing is not incremental) */ * (annotation processing is not incremental) */
clearOutputDirectories() clearOutputDirectories()
val sourceRootsFromKotlin = kotlinCompileTask.sourceRootsContainer.sourceRoots
val rawSourceRoots = FilteringSourceRootsContainer(sourceRootsFromKotlin, { !isInsideDestinationDirs(it) })
val sourceRoots = SourceRoots.ForJvm.create(kotlinCompileTask.source, rawSourceRoots)
val args = prepareCompilerArguments() val args = prepareCompilerArguments()
val messageCollector = GradleMessageCollector(logger) val messageCollector = GradleMessageCollector(logger)
@@ -117,11 +117,12 @@ open class KaptTask : ConventionTask(), CompilerArgumentAwareWithInput<K2JVMComp
val compilerRunner = GradleCompilerRunner(project) val compilerRunner = GradleCompilerRunner(project)
val exitCode = compilerRunner.runJvmCompiler( val exitCode = compilerRunner.runJvmCompiler(
sourceRoots.kotlinSourceFiles, sourcesToCompile = emptyList(),
sourceRoots.javaSourceRoots, javaSourceRoots = javaSourceRoots,
kotlinCompileTask.javaPackagePrefix, javaPackagePrefix = kotlinCompileTask.javaPackagePrefix,
args, args = args,
environment) environment = environment
)
throwGradleExceptionIfError(exitCode) throwGradleExceptionIfError(exitCode)
} }