Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,30 +1,44 @@
package seskar.gradle.plugin

import org.gradle.api.Task
import org.gradle.api.file.Directory
import org.gradle.api.provider.Provider
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.internal.provider.ProviderInternal
import org.jetbrains.kotlin.gradle.tasks.IncrementalSyncTask
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract

private val ORIGINAL_FILE_FILTERS: List<String> =
GenerationOptions.entries
.map { "**/*${it.originalSuffix}" }

internal fun IncrementalSyncTask.excludeOriginalSources() {
from.setFrom(from.from.map(::withDirectoryFilter))
from.setFrom(
from.from.transformDirectories {
it.asFileTree.matching {
exclude(ORIGINAL_FILE_FILTERS)
}
}
)
}

private fun Task.withDirectoryFilter(
source: Any,
): Any {
if (source !is Provider<*>)
return source
private inline fun <R> Iterable<R>.transformDirectories(
crossinline transform: (Directory) -> R,
): List<R> =
flatMap {
if (!isDirectoryProvider(it))
return@flatMap listOf(it)

return source.map { value ->
if (value !is Directory)
return@map value
@Suppress("UNCHECKED_CAST")
it.map { dir -> transform(dir) } as Iterable<R>
}

project.fileTree(value) {
exclude(ORIGINAL_FILE_FILTERS)
}
@OptIn(ExperimentalContracts::class)
private fun isDirectoryProvider(
source: Any?,
): Boolean {
contract {
returns(true) implies (source is DirectoryProperty)
}

return source is ProviderInternal<*> && source.type == Directory::class.java
}