-
Notifications
You must be signed in to change notification settings - Fork 645
/
ApolloCheckDuplicatesTask.kt
51 lines (43 loc) · 1.7 KB
/
ApolloCheckDuplicatesTask.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.apollographql.apollo3.gradle.internal
import com.apollographql.apollo3.compiler.ApolloMetadata
import com.apollographql.apollo3.compiler.codegen.ResolverKey
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
@CacheableTask
abstract class ApolloCheckDuplicatesTask : DefaultTask() {
@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
abstract val metadataFiles: ConfigurableFileCollection
@get:OutputFile
abstract val outputFile: RegularFileProperty
@TaskAction
fun taskAction() {
val metadataList = metadataFiles.files.mapNotNull {
ApolloMetadata.readFrom(it)
}
val duplicates = metadataList.flatMap { metadata ->
metadata.compilerMetadata.resolverInfo.entries.map { it.key to metadata.moduleName }
}
.groupBy { it.first }
.values
.filter { it.size > 1 }
if (duplicates.isNotEmpty()) {
val duplicateMessage = duplicates.joinToString(separator = "\n") { list: List<Pair<ResolverKey, String>> ->
"duplicate Type '${list.first().first}' generated in modules: ${list.joinToString(",") { it.second }}"
}
val recommendationMessage = "Use 'alwaysGenerateTypesMatching' in a parent module to generate the type only once"
error("$duplicateMessage\n$recommendationMessage")
}
outputFile.asFile.get().run {
parentFile.mkdirs()
writeText("No duplicate found.")
}
}
}