User: joe Date: 21 Sep 23 15:39 Revision: e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935 Summary: Re-add prefix and suffix support TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=8736&personal=false Index: src/main/kotlin/translations/identification/LiteralTranslationIdentifier.kt =================================================================== --- src/main/kotlin/translations/identification/LiteralTranslationIdentifier.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/identification/LiteralTranslationIdentifier.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -29,10 +29,12 @@ if (element.value is String) { val result = identify(element.project, element, statement, element) return result?.copy( - key = result.key.replace( + key = result.key.copy( + infix = result.key.infix.replace( - CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED, - "", - ), + CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED, + "", + ), + ), ) } return null Index: src/main/kotlin/translations/identification/ReferenceTranslationIdentifier.kt =================================================================== --- src/main/kotlin/translations/identification/ReferenceTranslationIdentifier.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/identification/ReferenceTranslationIdentifier.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -47,10 +47,12 @@ val result = identify(element.project, element, statement, referenceElement) return result?.copy( - key = result.key.replace( + key = result.key.copy( + infix = result.key.infix.replace( - CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED, - "", - ), + CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED, + "", + ), + ), ) } } Index: src/main/kotlin/translations/identification/TranslationIdentifier.kt =================================================================== --- src/main/kotlin/translations/identification/TranslationIdentifier.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/identification/TranslationIdentifier.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -71,7 +71,7 @@ foldingElement, function.matchedIndex, referenceElement, - translationKey, + TranslationInstance.Key(translationKey), formatted, if (superfluousParams >= 0) FormattingError.SUPERFLUOUS else null, superfluousParams, @@ -81,7 +81,7 @@ foldingElement, function.matchedIndex, referenceElement, - translationKey, + TranslationInstance.Key(translationKey), translation, FormattingError.MISSING, ) @@ -91,7 +91,7 @@ null, function.matchedIndex, referenceElement, - translationKey, + TranslationInstance.Key(translationKey), null, ) } Index: src/main/kotlin/translations/identification/TranslationInstance.kt =================================================================== --- src/main/kotlin/translations/identification/TranslationInstance.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/identification/TranslationInstance.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -28,11 +28,17 @@ val foldingElement: PsiElement?, val foldStart: Int, val referenceElement: PsiElement?, - val key: String, + val key: Key, val text: String?, val formattingError: FormattingError? = null, val superfluousVarargStart: Int = -1, ) { + data class Key(val prefix: String, val infix: String, val suffix: String) { + constructor(infix: String) : this("", infix, "") + + val full = (prefix + infix + suffix).trim() + } + companion object { enum class FormattingError { MISSING, SUPERFLUOUS Index: src/main/kotlin/translations/inspections/ChangeTranslationQuickFix.kt =================================================================== --- src/main/kotlin/translations/inspections/ChangeTranslationQuickFix.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/inspections/ChangeTranslationQuickFix.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -43,7 +43,7 @@ val key = LiteralTranslationIdentifier().identify(literal)?.key ?: return val popup = ChooseByNamePopup.createPopup( project, - TranslationGotoModel(project), + TranslationGotoModel(project, key.prefix, key.suffix), null, ) popup.invoke( @@ -51,9 +51,13 @@ override fun elementChosen(element: Any) { val selectedKey = (element as PsiNamedElement).name ?: return literal.containingFile.runWriteAction { + val insertion = selectedKey.substring( + key.prefix.length, + selectedKey.length - key.suffix.length, + ) literal.replace( JavaPsiFacade.getInstance(project).elementFactory.createExpressionFromText( - "\"$selectedKey\"", + "\"$insertion\"", literal.context, ), ) Index: src/main/kotlin/translations/inspections/NoTranslationInspection.kt =================================================================== --- src/main/kotlin/translations/inspections/NoTranslationInspection.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/inspections/NoTranslationInspection.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -63,7 +63,9 @@ override fun applyFix(project: Project, descriptor: ProblemDescriptor) { try { val literal = descriptor.psiElement as PsiLiteralExpression - val key = literal.value as String + val translation = LiteralTranslationIdentifier().identify(literal) + val literalValue = literal.value as String + val key = translation?.key?.copy(infix = literalValue)?.full ?: literalValue val result = Messages.showInputDialog( "Enter default value for \"$key\":", "Create Translation", Index: src/main/kotlin/translations/reference/TranslationGotoModel.kt =================================================================== --- src/main/kotlin/translations/reference/TranslationGotoModel.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/reference/TranslationGotoModel.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -32,7 +32,7 @@ import com.intellij.util.indexing.FindSymbolParameters import java.util.TreeSet -class TranslationGotoModel(project: Project) : +class TranslationGotoModel(project: Project, private val prefix: String, private val suffix: String) : ContributorsBasedGotoByModel( project, arrayOf( @@ -54,7 +54,12 @@ val result = TreeSet { o1, o2 -> (o1 as PsiNamedElement).name?.compareTo((o2 as PsiNamedElement).name ?: return@TreeSet -1) ?: -1 } - result.addAll(superResult.map { it as PsiNamedElement },) + result.addAll( + superResult.map { it as PsiNamedElement }.filter { + val key = it.name ?: return@filter false + key.startsWith(prefix) && key.endsWith(suffix) + }, + ) return result.toArray() } Index: src/main/kotlin/translations/reference/TranslationReference.kt =================================================================== --- src/main/kotlin/translations/reference/TranslationReference.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/reference/TranslationReference.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -23,6 +23,7 @@ import com.demonwav.mcdev.asset.PlatformAssets import com.demonwav.mcdev.translations.TranslationConstants import com.demonwav.mcdev.translations.TranslationFiles +import com.demonwav.mcdev.translations.identification.TranslationInstance import com.demonwav.mcdev.translations.index.TranslationIndex import com.demonwav.mcdev.translations.index.TranslationInverseIndex import com.demonwav.mcdev.translations.lang.gen.psi.LangEntry @@ -43,7 +44,7 @@ class TranslationReference( element: PsiElement, textRange: TextRange, - val key: String, + val key: TranslationInstance.Key, private val renameHandler: (element: PsiElement, range: TextRange, newName: String) -> PsiElement = { elem, range, newName -> ElementManipulators.getManipulator(elem).handleContentChange(elem, range, newName)!! @@ -52,7 +53,7 @@ override fun multiResolve(incompleteCode: Boolean): Array { val project = myElement.project val entries = TranslationInverseIndex.findElements( - key, + key.full, GlobalSearchScope.allScope(project), TranslationConstants.DEFAULT_LOCALE, ) @@ -62,11 +63,13 @@ override fun getVariants(): Array { val project = myElement.project val defaultTranslations = TranslationIndex.getAllDefaultTranslations(project) + val pattern = Regex("${Regex.escape(key.prefix)}(.*?)${Regex.escape(key.suffix)}") return defaultTranslations .filter { it.key.isNotEmpty() } - .map { entry -> + .mapNotNull { entry -> pattern.matchEntire(entry.key)?.let { entry to it } } + .map { (entry, match) -> LookupElementBuilder - .create(entry.key) + .create(if (match.groups.size <= 1) entry.key else match.groupValues[1]) .withIcon(PlatformAssets.MINECRAFT_ICON) .withTypeText(TranslationConstants.DEFAULT_LOCALE) .withPresentableText(entry.key) @@ -84,7 +87,7 @@ return false } - return (element is LangEntry && element.key == key) || - (element is JsonProperty && element.name == key) + return (element is LangEntry && element.key == key.full) || + (element is JsonProperty && element.name == key.full) } } Index: src/main/kotlin/translations/reference/TranslationReferenceSearch.kt =================================================================== --- src/main/kotlin/translations/reference/TranslationReferenceSearch.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/reference/TranslationReferenceSearch.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -73,7 +73,7 @@ val highlighted = it.file?.findElementAt(it.rangeInElement!!.startOffset) val ref = highlighted?.parent?.references ?.find { ref -> ref is TranslationReference } as TranslationReference? - if (ref?.key == key) { + if (ref?.key?.full == key) { consumer.process(ref) } } Index: src/main/kotlin/translations/reference/contributors.kt =================================================================== --- src/main/kotlin/translations/reference/contributors.kt (revision c6097666812cd0ccffaad06843b1d1b1cd493ac0) +++ src/main/kotlin/translations/reference/contributors.kt (revision e3ecfb7c02a91253fed8e1baeb2ee50ad62dc935) @@ -22,6 +22,7 @@ import com.demonwav.mcdev.translations.TranslationFiles import com.demonwav.mcdev.translations.identification.TranslationIdentifier +import com.demonwav.mcdev.translations.identification.TranslationInstance import com.demonwav.mcdev.translations.lang.gen.psi.LangEntry import com.demonwav.mcdev.translations.lang.gen.psi.LangTypes import com.intellij.json.JsonElementTypes @@ -85,7 +86,7 @@ TranslationReference( element, nameTextRange.shiftRight(1).grown(-2), - entry.name, + TranslationInstance.Key("", entry.name, ""), ) { elem, _, newName -> (elem as JsonProperty).setName(newName) }, @@ -110,7 +111,7 @@ TranslationReference( element, TextRange(0, entry.key.length), - entry.key, + TranslationInstance.Key("", entry.key, ""), ), ) }