User: joe Date: 20 Aug 25 12:40 Revision: a7ca328baac4cc7a697133d668971e5b076354e4 Summary: Prefer completion strings derived from the bytecode over reconstructed source code. Fixes #2515 TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=10145&personal=false Index: src/main/kotlin/platform/mixin/handlers/injectionPoint/FieldInjectionPoint.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/injectionPoint/FieldInjectionPoint.kt (revision 9cf229cc9313e7d0428c801b92dae70cd5f5ff24) +++ src/main/kotlin/platform/mixin/handlers/injectionPoint/FieldInjectionPoint.kt (revision a7ca328baac4cc7a697133d668971e5b076354e4) @@ -21,12 +21,10 @@ package com.demonwav.mcdev.platform.mixin.handlers.injectionPoint import com.demonwav.mcdev.platform.mixin.reference.MixinSelector -import com.demonwav.mcdev.platform.mixin.reference.toMixinString import com.demonwav.mcdev.platform.mixin.util.fakeResolve import com.demonwav.mcdev.platform.mixin.util.findOrConstructSourceField import com.demonwav.mcdev.util.MemberReference import com.demonwav.mcdev.util.constantValue -import com.demonwav.mcdev.util.getQualifiedMemberReference import com.intellij.codeInsight.completion.JavaLookupElementBuilder import com.intellij.codeInsight.lookup.LookupElementBuilder import com.intellij.openapi.editor.Editor @@ -107,10 +105,11 @@ return target?.let { MyCollectVisitor(mode, at.project, it, opcode, arrayAccess, fuzz) } } - override fun createLookup(targetClass: ClassNode, m: PsiField, owner: String): LookupElementBuilder { + override fun createLookup(targetClass: ClassNode, m: PsiField, insn: AbstractInsnNode): LookupElementBuilder { + insn as FieldInsnNode return JavaLookupElementBuilder.forField( m, - m.getQualifiedMemberReference(owner).toMixinString(), + "L${insn.owner};.${insn.name}:${insn.desc}", null, ) .setBoldIfInClass(m, targetClass) Index: src/main/kotlin/platform/mixin/handlers/injectionPoint/InjectionPoint.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/injectionPoint/InjectionPoint.kt (revision 9cf229cc9313e7d0428c801b92dae70cd5f5ff24) +++ src/main/kotlin/platform/mixin/handlers/injectionPoint/InjectionPoint.kt (revision a7ca328baac4cc7a697133d668971e5b076354e4) @@ -21,7 +21,6 @@ package com.demonwav.mcdev.platform.mixin.handlers.injectionPoint import com.demonwav.mcdev.platform.mixin.reference.MixinSelector -import com.demonwav.mcdev.platform.mixin.reference.toMixinString import com.demonwav.mcdev.platform.mixin.util.InjectionPointSpecifier import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.SLICE import com.demonwav.mcdev.platform.mixin.util.SourceCodeLocationInfo @@ -32,7 +31,6 @@ import com.demonwav.mcdev.util.createLiteralExpression import com.demonwav.mcdev.util.findAnnotations import com.demonwav.mcdev.util.fullQualifiedName -import com.demonwav.mcdev.util.getQualifiedMemberReference import com.demonwav.mcdev.util.internalName import com.demonwav.mcdev.util.memoized import com.demonwav.mcdev.util.realName @@ -262,7 +260,7 @@ final override fun usesMemberReference() = true - protected abstract fun createLookup(targetClass: ClassNode, m: T, owner: String): LookupElementBuilder + protected abstract fun createLookup(targetClass: ClassNode, m: T, insn: AbstractInsnNode): LookupElementBuilder protected open fun getInternalName(m: T): String { return m.realName ?: m.name!! @@ -273,7 +271,7 @@ result: CollectVisitor.Result, ): LookupElementBuilder { return qualifyLookup( - createLookup(targetClass, result.target, result.qualifier ?: targetClass.name), + createLookup(targetClass, result.target, result.originalInsn), targetClass, result.target, ) @@ -296,10 +294,11 @@ abstract class AbstractMethodInjectionPoint : QualifiedInjectionPoint() { - override fun createLookup(targetClass: ClassNode, m: PsiMethod, owner: String): LookupElementBuilder { + override fun createLookup(targetClass: ClassNode, m: PsiMethod, insn: AbstractInsnNode): LookupElementBuilder { + insn as MethodInsnNode return JavaLookupElementBuilder.forMethod( m, - m.getQualifiedMemberReference(owner).toMixinString(), + "L${insn.owner};${insn.name}${insn.desc}", PsiSubstitutor.EMPTY, null, ) Index: src/main/kotlin/platform/mixin/handlers/injectionPoint/NewInsnInjectionPoint.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/injectionPoint/NewInsnInjectionPoint.kt (revision 9cf229cc9313e7d0428c801b92dae70cd5f5ff24) +++ src/main/kotlin/platform/mixin/handlers/injectionPoint/NewInsnInjectionPoint.kt (revision a7ca328baac4cc7a697133d668971e5b076354e4) @@ -27,10 +27,8 @@ import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.AT import com.demonwav.mcdev.platform.mixin.util.findClassNodeByPsiClass import com.demonwav.mcdev.platform.mixin.util.findMethod -import com.demonwav.mcdev.platform.mixin.util.shortName import com.demonwav.mcdev.util.MemberReference import com.demonwav.mcdev.util.constantStringValue -import com.demonwav.mcdev.util.descriptor import com.demonwav.mcdev.util.fullQualifiedName import com.demonwav.mcdev.util.internalName import com.demonwav.mcdev.util.shortName @@ -110,18 +108,19 @@ } override fun createLookup(targetClass: ClassNode, result: CollectVisitor.Result): LookupElementBuilder? { + val newInsn = result.originalInsn as? TypeInsnNode ?: return null + val methodInsn = findInitCall(newInsn) ?: return null when (val target = result.target) { is PsiClass -> { return JavaLookupElementBuilder.forClass(target, target.internalName) .withPresentableText(target.shortName ?: return null) } is PsiMethod -> { - val ownerName = result.qualifier?.substringAfterLast('.')?.replace('$', '.') ?: targetClass.shortName - val descriptorArgs = target.descriptor?.dropLast(1) ?: return null - val qualifierInternalName = result.qualifier?.replace('.', '/') + val ownerName = methodInsn.owner.substringAfterLast('/').replace('$', '.') + val descriptorArgs = methodInsn.desc.dropLast(1) return JavaLookupElementBuilder.forMethod( target, - "${descriptorArgs}L$qualifierInternalName;", + "${descriptorArgs}L${methodInsn.owner};", PsiSubstitutor.EMPTY, null, )