aboutsummaryrefslogtreecommitdiff
path: root/gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2025-03-18 13:24:57 +0100
committerLinnea Gräf <nea@nea.moe>2025-03-18 13:24:57 +0100
commit5e0940a9691f373a6fda16b19e4d15724324829b (patch)
tree709ea68ba3fcabb4e5ca59385975e491daff41aa /gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations
parent771fd47da4ed55b69755c83fdc515057766b4053 (diff)
downloadmcautotranslations-master.tar.gz
mcautotranslations-master.tar.bz2
mcautotranslations-master.zip
feat: Problem reporting for duplicate keysHEADmaster
Diffstat (limited to 'gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations')
-rw-r--r--gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MCAutoTranslationsGradlePlugin.kt5
-rw-r--r--gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MergeTranslations.kt44
2 files changed, 44 insertions, 5 deletions
diff --git a/gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MCAutoTranslationsGradlePlugin.kt b/gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MCAutoTranslationsGradlePlugin.kt
index 60079f0..1a9d36c 100644
--- a/gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MCAutoTranslationsGradlePlugin.kt
+++ b/gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MCAutoTranslationsGradlePlugin.kt
@@ -2,6 +2,7 @@ package moe.nea.mcautotranslations.gradle
import moe.nea.mcautotranslation.`gradle-plugin`.BuildConfig
import org.gradle.api.Project
+import org.gradle.api.problems.ProblemGroup
import org.gradle.api.provider.Provider
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin
@@ -9,6 +10,10 @@ import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
class MCAutoTranslationsGradlePlugin : KotlinCompilerPluginSupportPlugin {
+ companion object {
+ val PROBLEM_GROUP = ProblemGroup.create("mc-auto-translations", "MC Auto Translations")
+ }
+
override fun apply(target: Project) {
println("Applying plugin to project")
target.extensions.create("mcAutoTranslations", MCAutoTranslationsExtension::class.java, target)
diff --git a/gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MergeTranslations.kt b/gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MergeTranslations.kt
index c69ee85..82d64b0 100644
--- a/gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MergeTranslations.kt
+++ b/gradle-plugin/src/main/kotlin/moe/nea/mcautotranslations/gradle/MergeTranslations.kt
@@ -7,6 +7,10 @@ import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.RegularFile
import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.problems.ProblemGroup
+import org.gradle.api.problems.ProblemId
+import org.gradle.api.problems.Problems
+import org.gradle.api.problems.Severity
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
@@ -19,6 +23,7 @@ import org.gradle.work.InputChanges
import org.objectweb.asm.ClassReader
import java.io.File
import java.util.TreeMap
+import javax.inject.Inject
abstract class CollectTranslations : DefaultTask() {
@get:InputFiles
@@ -36,6 +41,9 @@ abstract class CollectTranslations : DefaultTask() {
@get:OutputFile
abstract val outputFile: RegularFileProperty
+ @get:Inject
+ abstract val problems: Problems
+
init {
cacheFile.convention(project.layout.buildDirectory.file("mergeTranslations/incremental/${this.name}.json"))
// TODO: should this second convention be changed?
@@ -57,6 +65,10 @@ abstract class CollectTranslations : DefaultTask() {
companion object {
val gson = Gson()
+ val PROBLEM_DUPLICATE_TRANSLATION = ProblemId.create(
+ "merge-translations/duplicate-translation",
+ "Duplicate Translation",
+ MCAutoTranslationsGradlePlugin.PROBLEM_GROUP)
val mapType: TypeToken<TreeMap<String, String>> = object : TypeToken<TreeMap<String, String>>() {}
}
@@ -101,14 +113,36 @@ abstract class CollectTranslations : DefaultTask() {
}
private fun toKVMap(translations: Translations): TreeMap<String, String> {
- return (translations.baseTranslation.values.asSequence()
- + translations.inlineTranslations.values.asSequence())
- .fold(TreeMap()) { acc, x ->
- acc.putAll(x) // TODO: warn on duplicate properties (possibly with error enum configuration)
- acc
+ val acc = TreeMap<String, TranslationWithProvenance>()
+ for ((source, map) in (translations.baseTranslation.asSequence() + translations.inlineTranslations.asSequence())) {
+ for ((key, value) in map) {
+ val provenatedValue = TranslationWithProvenance(source, value)
+ val existing = acc[key]
+ if (existing != null)
+ warnForDuplicate(key, provenatedValue, existing)
+ acc[key] = provenatedValue
}
+ }
+ return acc.mapValuesTo(TreeMap()) { it.value.value }
+ }
+
+ fun warnForDuplicate(
+ key: String,
+ left: TranslationWithProvenance,
+ right: TranslationWithProvenance
+ ) {
+ problems.reporter.report(PROBLEM_DUPLICATE_TRANSLATION) {
+ it.severity(Severity.WARNING)
+ it.fileLocation(left.source)
+ it.fileLocation(right.source)
+ it.solution("Try creating a helper method that is used by both code paths.")
+ it.solution("Alternatively try changing the name of one of the translations.")
+ it.details("The translation key $key is specified by both ${left.source} (as \"${left.value}\") and by ${right.source} (as \"${right.value}\"). Only one location may specify a translation.")
+ }
}
+ data class TranslationWithProvenance(val source: String, val value: String)
+
private fun parseClassAnnotations(file: File): TreeMap<String, String> {
val map = TreeMap<String, String>()
kotlin.runCatching {