Skip to content

Commit 6fd6210

Browse files
committed
Complete INVOKE, INVOKE_ASSIGN, FIELD to target = "", and CONSTANT to args = ""
1 parent 7b7c035 commit 6fd6210

File tree

4 files changed

+34
-0
lines changed

4 files changed

+34
-0
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.demonwav.mcdev.util.createLiteralExpression
2626
import com.demonwav.mcdev.util.descriptor
2727
import com.demonwav.mcdev.util.ifNotBlank
2828
import com.intellij.codeInsight.lookup.LookupElementBuilder
29+
import com.intellij.openapi.editor.Editor
2930
import com.intellij.openapi.project.Project
3031
import com.intellij.psi.CommonClassNames
3132
import com.intellij.psi.JavaPsiFacade
@@ -38,6 +39,7 @@ import com.intellij.psi.PsiClassObjectAccessExpression
3839
import com.intellij.psi.PsiElement
3940
import com.intellij.psi.PsiExpression
4041
import com.intellij.psi.PsiForeachStatement
42+
import com.intellij.psi.PsiLiteral
4143
import com.intellij.psi.PsiLiteralExpression
4244
import com.intellij.psi.PsiSwitchLabelStatementBase
4345
import com.intellij.psi.util.PsiUtil
@@ -55,6 +57,10 @@ import org.objectweb.asm.tree.MethodNode
5557
import org.objectweb.asm.tree.TypeInsnNode
5658

5759
class ConstantInjectionPoint : InjectionPoint<PsiElement>() {
60+
override fun onCompleted(editor: Editor, reference: PsiLiteral) {
61+
completeExtraStringAtAttribute(editor, reference, "args")
62+
}
63+
5864
fun getConstantInfo(at: PsiAnnotation): ConstantInfo? {
5965
val args = AtResolver.getArgs(at)
6066
val nullValue = args["nullValue"]?.let(java.lang.Boolean::parseBoolean) ?: false

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@ import com.demonwav.mcdev.util.constantValue
2929
import com.demonwav.mcdev.util.getQualifiedMemberReference
3030
import com.intellij.codeInsight.completion.JavaLookupElementBuilder
3131
import com.intellij.codeInsight.lookup.LookupElementBuilder
32+
import com.intellij.openapi.editor.Editor
3233
import com.intellij.openapi.project.Project
3334
import com.intellij.psi.PsiAnnotation
3435
import com.intellij.psi.PsiArrayAccessExpression
3536
import com.intellij.psi.PsiClass
3637
import com.intellij.psi.PsiField
38+
import com.intellij.psi.PsiLiteral
3739
import com.intellij.psi.PsiMethodReferenceExpression
3840
import com.intellij.psi.PsiModifier
3941
import com.intellij.psi.PsiReferenceExpression
@@ -50,6 +52,10 @@ class FieldInjectionPoint : QualifiedInjectionPoint<PsiField>() {
5052
private val VALID_OPCODES = setOf(Opcodes.GETFIELD, Opcodes.GETSTATIC, Opcodes.PUTFIELD, Opcodes.PUTSTATIC)
5153
}
5254

55+
override fun onCompleted(editor: Editor, reference: PsiLiteral) {
56+
completeExtraStringAtAttribute(editor, reference, "target")
57+
}
58+
5359
private fun getArrayAccessType(args: Map<String, String>): ArrayAccessType? {
5460
return when (args["array"]) {
5561
"length" -> ArrayAccessType.LENGTH

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.demonwav.mcdev.platform.mixin.util.fakeResolve
2727
import com.demonwav.mcdev.platform.mixin.util.findOrConstructSourceMethod
2828
import com.demonwav.mcdev.util.constantStringValue
2929
import com.demonwav.mcdev.util.constantValue
30+
import com.demonwav.mcdev.util.createLiteralExpression
3031
import com.demonwav.mcdev.util.equivalentTo
3132
import com.demonwav.mcdev.util.findAnnotations
3233
import com.demonwav.mcdev.util.fullQualifiedName
@@ -55,6 +56,7 @@ import com.intellij.psi.PsiMethod
5556
import com.intellij.psi.PsiMethodReferenceExpression
5657
import com.intellij.psi.PsiReferenceExpression
5758
import com.intellij.psi.PsiSubstitutor
59+
import com.intellij.psi.codeStyle.CodeStyleManager
5860
import com.intellij.psi.util.PsiUtil
5961
import com.intellij.psi.util.parentOfType
6062
import com.intellij.serviceContainer.BaseKeyedLazyInstance
@@ -81,6 +83,20 @@ abstract class InjectionPoint<T : PsiElement> {
8183
open fun onCompleted(editor: Editor, reference: PsiLiteral) {
8284
}
8385

86+
protected fun completeExtraStringAtAttribute(editor: Editor, reference: PsiLiteral, attributeName: String) {
87+
val at = reference.parentOfType<PsiAnnotation>() ?: return
88+
if (at.findDeclaredAttributeValue(attributeName) != null) {
89+
return
90+
}
91+
at.setDeclaredAttributeValue(
92+
attributeName,
93+
JavaPsiFacade.getElementFactory(reference.project).createLiteralExpression("")
94+
)
95+
val formattedAt = CodeStyleManager.getInstance(reference.project).reformat(at) as PsiAnnotation
96+
val targetElement = formattedAt.findDeclaredAttributeValue(attributeName) ?: return
97+
editor.caretModel.moveToOffset(targetElement.textRange.startOffset + 1)
98+
}
99+
84100
abstract fun createNavigationVisitor(
85101
at: PsiAnnotation,
86102
target: MixinSelector?,

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

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

2323
import com.demonwav.mcdev.platform.mixin.reference.MixinSelector
2424
import com.demonwav.mcdev.util.MemberReference
25+
import com.intellij.openapi.editor.Editor
2526
import com.intellij.openapi.project.Project
2627
import com.intellij.psi.CommonClassNames
2728
import com.intellij.psi.JavaPsiFacade
@@ -30,6 +31,7 @@ import com.intellij.psi.PsiClass
3031
import com.intellij.psi.PsiClassType
3132
import com.intellij.psi.PsiElement
3233
import com.intellij.psi.PsiForeachStatement
34+
import com.intellij.psi.PsiLiteral
3335
import com.intellij.psi.PsiMethod
3436
import com.intellij.psi.PsiMethodCallExpression
3537
import com.intellij.psi.PsiNewExpression
@@ -38,6 +40,10 @@ import org.objectweb.asm.tree.MethodInsnNode
3840
import org.objectweb.asm.tree.MethodNode
3941

4042
abstract class AbstractInvokeInjectionPoint(private val assign: Boolean) : AbstractMethodInjectionPoint() {
43+
override fun onCompleted(editor: Editor, reference: PsiLiteral) {
44+
completeExtraStringAtAttribute(editor, reference, "target")
45+
}
46+
4147
override fun createNavigationVisitor(
4248
at: PsiAnnotation,
4349
target: MixinSelector?,

0 commit comments

Comments
 (0)