(minor) Fix source set resources filtering broken by refactoring

Before the last change in this logic, the resources filtering used
the original Kotlin source directories, not those with Java filtered
out.

Make sure that the Java source directories that are added to the Kotlin
source set are excluded from the resources, and all the related
configuration works lazily, i.e. supports source sets modification
after configuration took place.
This commit is contained in:
Sergey Igushkin
2018-08-17 03:22:30 +03:00
parent d1a5794d36
commit 6af6834966
2 changed files with 46 additions and 8 deletions
@@ -292,4 +292,38 @@ class NewMultiplatformIT : BaseGradleIT() {
assertSuccessful()
}
}
@Test
fun testResourceFilteringAndSourceTrackingWithJava() = with(Project("simpleProject")) {
setupWorkingDir()
gradleBuildScript().appendText(
"\n" + """
// Test 1 -- check that Kotlin sources are correctly filtered out of resources, even those added late at configuration time:
sourceSets.main.resources.srcDir('src/main/kotlin')
sourceSets.main.resources.srcDir('src/foo/kotlin')
kotlin.target.compilations.main.source(kotlin.sourceSets.create('foo'))
// Test 2 -- check that Java sources from the Kotlin source directories are correctly tracked under `allJava` in the source set:
sourceSets.main.allJava.files.each { println "allJava:${'$'}{it.name}" }
""".trimIndent()
)
listOf("src/foo/kotlin/foo.kt", "src/main/resources/foo.txt", "src/foo/kotlin/foo.java").forEach { path ->
projectDir.resolve(path).apply { parentFile.mkdirs(); writeText("foo") }
}
build("processResources") {
assertSuccessful()
// Test 1 (see above)
assertTasksExecuted(":processResources")
assertFileExists("build/resources/main/foo.txt")
assertNoSuchFile("build/resources/main/helloWorld.kt")
assertNoSuchFile("build/resources/main/foo.kt")
// Test 2 (see above)
assertContains("allJava:Greeter.java")
assertContains("allJava:HelloWorld.java")
assertContains("allJava:foo.java")
}
}
}
@@ -37,7 +37,6 @@ import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.utils.*
import java.io.File
import java.net.URL
import java.util.*
import java.util.concurrent.Callable
import java.util.jar.Manifest
@@ -116,15 +115,20 @@ internal abstract class KotlinJavaSourceSetProcessor<T : AbstractKotlinCompile<*
if (javaSourceSet == null)
return
val kotlinDirSets = kotlinCompilation.kotlinSourceSets.map(KotlinSourceSet::kotlin)
val kotlinDirSets = kotlinCompilation.kotlinSourceSets
// Try to avoid duplicate Java sources in allSource:
val kotlinSrcDirsToAdd = kotlinDirSets.map { filterOutJavaSrcDirsIfPossible(it) }
// run lazily to support changing kotlinSourceSets after plugin is applied
val kotlinSrcDirsToAdd = Callable {
// Try to avoid duplicate Java sources in allSource:
kotlinDirSets.map { filterOutJavaSrcDirsIfPossible(it.kotlin) }
}
kotlinSrcDirsToAdd.forEach { kotlinSrcDirs ->
javaSourceSet.allJava.srcDirs(kotlinSrcDirs)
javaSourceSet.allSource.srcDirs(kotlinSrcDirs)
javaSourceSet.resources.filter.exclude { it.file in kotlinSrcDirs }
javaSourceSet.allJava.srcDirs(kotlinSrcDirsToAdd)
javaSourceSet.allSource.srcDirs(kotlinSrcDirsToAdd)
javaSourceSet.resources.filter.exclude { fileTreeElement ->
val file = fileTreeElement.file
kotlinDirSets.any { file in it.kotlin }
}
}