User: rednesto Date: 06 Jul 24 09:37 Revision: caca374c623d9f3315f3c9f9fc3e40597c40b28f Summary: Fix #2325 Make lang annotator fixes bulk compatible TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=9360&personal=false Index: src/main/kotlin/translations/intentions/RemoveDuplicatesIntention.kt =================================================================== --- src/main/kotlin/translations/intentions/RemoveDuplicatesIntention.kt (revision f798d6d3544971f546cb1d13231edc021b74bf89) +++ src/main/kotlin/translations/intentions/RemoveDuplicatesIntention.kt (revision caca374c623d9f3315f3c9f9fc3e40597c40b28f) @@ -23,24 +23,32 @@ import com.demonwav.mcdev.translations.Translation import com.demonwav.mcdev.translations.TranslationFiles import com.demonwav.mcdev.translations.index.TranslationInverseIndex -import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction +import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile import com.intellij.psi.search.GlobalSearchScope -class RemoveDuplicatesIntention(private val translation: Translation) : PsiElementBaseIntentionAction() { +class RemoveDuplicatesIntention( + private val translation: Translation, + element: PsiElement +) : LocalQuickFixAndIntentionActionOnPsiElement(element) { override fun getText() = "Remove duplicates (keep this translation)" override fun getFamilyName() = "Minecraft localization" - override fun isAvailable(project: Project, editor: Editor?, element: PsiElement) = true - - override fun invoke(project: Project, editor: Editor?, element: PsiElement) { - val keep = TranslationFiles.seekTranslation(element) ?: return + override fun invoke( + project: Project, + file: PsiFile, + editor: Editor?, + startElement: PsiElement, + endElement: PsiElement + ) { + val keep = TranslationFiles.seekTranslation(startElement) ?: return val entries = TranslationInverseIndex.findElements( translation.key, - GlobalSearchScope.fileScope(element.containingFile), + GlobalSearchScope.fileScope(file), ) for (other in entries) { if (other !== keep) { Index: src/main/kotlin/translations/intentions/RemoveUnmatchedEntryIntention.kt =================================================================== --- src/main/kotlin/translations/intentions/RemoveUnmatchedEntryIntention.kt (revision f798d6d3544971f546cb1d13231edc021b74bf89) +++ src/main/kotlin/translations/intentions/RemoveUnmatchedEntryIntention.kt (revision caca374c623d9f3315f3c9f9fc3e40597c40b28f) @@ -21,21 +21,24 @@ package com.demonwav.mcdev.translations.intentions import com.demonwav.mcdev.translations.TranslationFiles -import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction +import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement -import com.intellij.util.IncorrectOperationException +import com.intellij.psi.PsiFile -class RemoveUnmatchedEntryIntention : PsiElementBaseIntentionAction() { +class RemoveUnmatchedEntryIntention(element: PsiElement) : LocalQuickFixAndIntentionActionOnPsiElement(element) { override fun getText() = "Remove translation" - override fun isAvailable(project: Project, editor: Editor, element: PsiElement) = true - override fun getFamilyName() = "Minecraft" - @Throws(IncorrectOperationException::class) - override fun invoke(project: Project, editor: Editor, element: PsiElement) { - TranslationFiles.remove(TranslationFiles.seekTranslation(element) ?: return) + override fun invoke( + project: Project, + file: PsiFile, + editor: Editor?, + startElement: PsiElement, + endElement: PsiElement + ) { + TranslationFiles.remove(TranslationFiles.seekTranslation(startElement) ?: return) } } Index: src/main/kotlin/translations/intentions/TranslationFileAnnotator.kt =================================================================== --- src/main/kotlin/translations/intentions/TranslationFileAnnotator.kt (revision f798d6d3544971f546cb1d13231edc021b74bf89) +++ src/main/kotlin/translations/intentions/TranslationFileAnnotator.kt (revision caca374c623d9f3315f3c9f9fc3e40597c40b28f) @@ -49,7 +49,7 @@ if (translation.key != translation.trimmedKey) { annotations.newAnnotation(HighlightSeverity.WARNING, "Translation key contains whitespace at start or end.") .range(element) - .newFix(TrimKeyIntention()).registerFix() + .newFix(TrimKeyIntention(element)).universal().registerFix() .create() } } @@ -58,7 +58,7 @@ val count = TranslationIndex.getTranslations(element.containingFile).count { it.key == translation.key } if (count > 1) { annotations.newAnnotation(HighlightSeverity.WARNING, "Duplicate translation keys \"${translation.key}\".") - .newFix(RemoveDuplicatesIntention(translation)).registerFix() + .newFix(RemoveDuplicatesIntention(translation, element)).universal().registerFix() .create() } } @@ -71,7 +71,7 @@ } val warningText = "Translation key not included in default localization file." annotations.newAnnotation(HighlightSeverity.WARNING, warningText) - .newFix(RemoveUnmatchedEntryIntention()).registerFix() + .newFix(RemoveUnmatchedEntryIntention(element)).universal().registerFix() .create() } } Index: src/main/kotlin/translations/intentions/TrimKeyIntention.kt =================================================================== --- src/main/kotlin/translations/intentions/TrimKeyIntention.kt (revision f798d6d3544971f546cb1d13231edc021b74bf89) +++ src/main/kotlin/translations/intentions/TrimKeyIntention.kt (revision caca374c623d9f3315f3c9f9fc3e40597c40b28f) @@ -22,28 +22,39 @@ import com.demonwav.mcdev.translations.TranslationFiles import com.intellij.codeInsight.FileModificationService -import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction +import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement -import com.intellij.util.IncorrectOperationException +import com.intellij.psi.PsiFile -class TrimKeyIntention : PsiElementBaseIntentionAction() { +class TrimKeyIntention(element: PsiElement) : LocalQuickFixAndIntentionActionOnPsiElement(element) { override fun getText() = "Trim translation key" override fun getFamilyName() = "Minecraft" - override fun isAvailable(project: Project, editor: Editor, element: PsiElement): Boolean { + override fun isAvailable( + project: Project, + file: PsiFile, + editor: Editor?, + startElement: PsiElement, + endElement: PsiElement + ): Boolean { val translation = TranslationFiles.toTranslation( - TranslationFiles.seekTranslation(element) ?: return false, + TranslationFiles.seekTranslation(startElement) ?: return false, ) ?: return false return translation.key != translation.trimmedKey } - @Throws(IncorrectOperationException::class) - override fun invoke(project: Project, editor: Editor, element: PsiElement) { - val entry = TranslationFiles.seekTranslation(element) ?: return + override fun invoke( + project: Project, + file: PsiFile, + editor: Editor?, + startElement: PsiElement, + endElement: PsiElement + ) { + val entry = TranslationFiles.seekTranslation(startElement) ?: return if (!FileModificationService.getInstance().preparePsiElementForWrite(entry)) { return }