Skip to content

Commit a7ca328

Browse files
committed
Prefer completion strings derived from the bytecode over reconstructed source code. Fixes #2515
1 parent 9cf229c commit a7ca328

File tree

3 files changed

+13
-16
lines changed

3 files changed

+13
-16
lines changed

src/main/kotlin/platform/mixin/handlers/injectionPoint/FieldInjectionPoint.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,10 @@
2121
package com.demonwav.mcdev.platform.mixin.handlers.injectionPoint
2222

2323
import com.demonwav.mcdev.platform.mixin.reference.MixinSelector
24-
import com.demonwav.mcdev.platform.mixin.reference.toMixinString
2524
import com.demonwav.mcdev.platform.mixin.util.fakeResolve
2625
import com.demonwav.mcdev.platform.mixin.util.findOrConstructSourceField
2726
import com.demonwav.mcdev.util.MemberReference
2827
import com.demonwav.mcdev.util.constantValue
29-
import com.demonwav.mcdev.util.getQualifiedMemberReference
3028
import com.intellij.codeInsight.completion.JavaLookupElementBuilder
3129
import com.intellij.codeInsight.lookup.LookupElementBuilder
3230
import com.intellij.openapi.editor.Editor
@@ -107,10 +105,11 @@ class FieldInjectionPoint : QualifiedInjectionPoint<PsiField>() {
107105
return target?.let { MyCollectVisitor(mode, at.project, it, opcode, arrayAccess, fuzz) }
108106
}
109107

110-
override fun createLookup(targetClass: ClassNode, m: PsiField, owner: String): LookupElementBuilder {
108+
override fun createLookup(targetClass: ClassNode, m: PsiField, insn: AbstractInsnNode): LookupElementBuilder {
109+
insn as FieldInsnNode
111110
return JavaLookupElementBuilder.forField(
112111
m,
113-
m.getQualifiedMemberReference(owner).toMixinString(),
112+
"L${insn.owner};.${insn.name}:${insn.desc}",
114113
null,
115114
)
116115
.setBoldIfInClass(m, targetClass)

src/main/kotlin/platform/mixin/handlers/injectionPoint/InjectionPoint.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
package com.demonwav.mcdev.platform.mixin.handlers.injectionPoint
2222

2323
import com.demonwav.mcdev.platform.mixin.reference.MixinSelector
24-
import com.demonwav.mcdev.platform.mixin.reference.toMixinString
2524
import com.demonwav.mcdev.platform.mixin.util.InjectionPointSpecifier
2625
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.SLICE
2726
import com.demonwav.mcdev.platform.mixin.util.SourceCodeLocationInfo
@@ -32,7 +31,6 @@ import com.demonwav.mcdev.util.constantValue
3231
import com.demonwav.mcdev.util.createLiteralExpression
3332
import com.demonwav.mcdev.util.findAnnotations
3433
import com.demonwav.mcdev.util.fullQualifiedName
35-
import com.demonwav.mcdev.util.getQualifiedMemberReference
3634
import com.demonwav.mcdev.util.internalName
3735
import com.demonwav.mcdev.util.memoized
3836
import com.demonwav.mcdev.util.realName
@@ -262,7 +260,7 @@ abstract class QualifiedInjectionPoint<T : PsiMember> : InjectionPoint<T>() {
262260

263261
final override fun usesMemberReference() = true
264262

265-
protected abstract fun createLookup(targetClass: ClassNode, m: T, owner: String): LookupElementBuilder
263+
protected abstract fun createLookup(targetClass: ClassNode, m: T, insn: AbstractInsnNode): LookupElementBuilder
266264

267265
protected open fun getInternalName(m: T): String {
268266
return m.realName ?: m.name!!
@@ -273,7 +271,7 @@ abstract class QualifiedInjectionPoint<T : PsiMember> : InjectionPoint<T>() {
273271
result: CollectVisitor.Result<T>,
274272
): LookupElementBuilder {
275273
return qualifyLookup(
276-
createLookup(targetClass, result.target, result.qualifier ?: targetClass.name),
274+
createLookup(targetClass, result.target, result.originalInsn),
277275
targetClass,
278276
result.target,
279277
)
@@ -296,10 +294,11 @@ abstract class QualifiedInjectionPoint<T : PsiMember> : InjectionPoint<T>() {
296294

297295
abstract class AbstractMethodInjectionPoint : QualifiedInjectionPoint<PsiMethod>() {
298296

299-
override fun createLookup(targetClass: ClassNode, m: PsiMethod, owner: String): LookupElementBuilder {
297+
override fun createLookup(targetClass: ClassNode, m: PsiMethod, insn: AbstractInsnNode): LookupElementBuilder {
298+
insn as MethodInsnNode
300299
return JavaLookupElementBuilder.forMethod(
301300
m,
302-
m.getQualifiedMemberReference(owner).toMixinString(),
301+
"L${insn.owner};${insn.name}${insn.desc}",
303302
PsiSubstitutor.EMPTY,
304303
null,
305304
)

src/main/kotlin/platform/mixin/handlers/injectionPoint/NewInsnInjectionPoint.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@ import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember
2727
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.AT
2828
import com.demonwav.mcdev.platform.mixin.util.findClassNodeByPsiClass
2929
import com.demonwav.mcdev.platform.mixin.util.findMethod
30-
import com.demonwav.mcdev.platform.mixin.util.shortName
3130
import com.demonwav.mcdev.util.MemberReference
3231
import com.demonwav.mcdev.util.constantStringValue
33-
import com.demonwav.mcdev.util.descriptor
3432
import com.demonwav.mcdev.util.fullQualifiedName
3533
import com.demonwav.mcdev.util.internalName
3634
import com.demonwav.mcdev.util.shortName
@@ -110,18 +108,19 @@ class NewInsnInjectionPoint : InjectionPoint<PsiMember>() {
110108
}
111109

112110
override fun createLookup(targetClass: ClassNode, result: CollectVisitor.Result<PsiMember>): LookupElementBuilder? {
111+
val newInsn = result.originalInsn as? TypeInsnNode ?: return null
112+
val methodInsn = findInitCall(newInsn) ?: return null
113113
when (val target = result.target) {
114114
is PsiClass -> {
115115
return JavaLookupElementBuilder.forClass(target, target.internalName)
116116
.withPresentableText(target.shortName ?: return null)
117117
}
118118
is PsiMethod -> {
119-
val ownerName = result.qualifier?.substringAfterLast('.')?.replace('$', '.') ?: targetClass.shortName
120-
val descriptorArgs = target.descriptor?.dropLast(1) ?: return null
121-
val qualifierInternalName = result.qualifier?.replace('.', '/')
119+
val ownerName = methodInsn.owner.substringAfterLast('/').replace('$', '.')
120+
val descriptorArgs = methodInsn.desc.dropLast(1)
122121
return JavaLookupElementBuilder.forMethod(
123122
target,
124-
"${descriptorArgs}L$qualifierInternalName;",
123+
"${descriptorArgs}L${methodInsn.owner};",
125124
PsiSubstitutor.EMPTY,
126125
null,
127126
)

0 commit comments

Comments
 (0)