Skip to content

Commit 7cf78f3

Browse files
committed
Some improvements in inlay hint placement
1 parent 3c9719e commit 7cf78f3

16 files changed

+101
-23
lines changed

src/main/kotlin/platform/mixin/handlers/InjectAnnotationHandler.kt

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,7 @@ class InjectAnnotationHandler : InjectorAnnotationHandler() {
161161
context: MixinAnnotationHandler.TargetInlayContext
162162
): MixinAnnotationHandler.TargetInlayProperties? {
163163
val inlayProps = super.createTargetInlay(context) ?: return null
164-
val at = context.annotation.findAttributeValue("at")?.findAnnotations()?.getOrNull(context.navigationIndex)
165-
?: return null
166-
return moveInlayAcrossNonSideEffectCodeToPrettierSpot(context, AtResolver.getShift(at) > 0, inlayProps)
164+
return moveInlayAcrossNonSideEffectCodeToPrettierSpot(context, this, inlayProps)
167165
}
168166

169167
companion object {
@@ -173,18 +171,21 @@ class InjectAnnotationHandler : InjectorAnnotationHandler() {
173171
*/
174172
fun moveInlayAcrossNonSideEffectCodeToPrettierSpot(
175173
context: MixinAnnotationHandler.TargetInlayContext,
176-
isAfter: Boolean,
174+
handler: InjectorAnnotationHandler,
177175
inlayProps: MixinAnnotationHandler.TargetInlayProperties
178176
): MixinAnnotationHandler.TargetInlayProperties {
179-
val targetElement = context.targetElement
180-
181-
if (
182-
inlayProps.placement != MixinAnnotationHandler.TargetInlayPlacement.BEFORE &&
183-
inlayProps.placement != MixinAnnotationHandler.TargetInlayPlacement.AFTER
184-
) {
177+
if (inlayProps.placement != MixinAnnotationHandler.TargetInlayPlacement.SURROUND) {
185178
return inlayProps
186179
}
187180

181+
val targetElement = context.targetElement
182+
183+
val at = context.annotation.findAttributeValue(handler.getAtKey(context.annotation))
184+
?.findAnnotations()
185+
?.getOrNull(context.navigationIndex)
186+
?: return inlayProps
187+
val isAfter = AtResolver.getInjectionPoint(at)?.isInjectingAfter(at) ?: return inlayProps
188+
188189
val controlFlowBlock = McdevDfaUtil.getControlFlowContext(targetElement) ?: return inlayProps
189190
val project = controlFlowBlock.project
190191
val controlFlow = ControlFlowFactory.getInstance(project)

src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@ import com.demonwav.mcdev.platform.mixin.reference.isMiscDynamicSelector
3030
import com.demonwav.mcdev.platform.mixin.reference.parseMixinSelector
3131
import com.demonwav.mcdev.platform.mixin.util.ClassAndMethodNode
3232
import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember
33+
import com.demonwav.mcdev.platform.mixin.util.MixinConstants
3334
import com.demonwav.mcdev.platform.mixin.util.MixinTargetMember
3435
import com.demonwav.mcdev.platform.mixin.util.getGenericParameterTypes
3536
import com.demonwav.mcdev.platform.mixin.util.hasAccess
3637
import com.demonwav.mcdev.platform.mixin.util.mixinTargets
3738
import com.demonwav.mcdev.util.Parameter
3839
import com.demonwav.mcdev.util.cached
3940
import com.demonwav.mcdev.util.computeStringArray
41+
import com.demonwav.mcdev.util.constantValue
4042
import com.demonwav.mcdev.util.findAnnotations
4143
import com.demonwav.mcdev.util.findContainingClass
4244
import com.demonwav.mcdev.util.ifNullOrEmpty
@@ -181,6 +183,12 @@ abstract class InjectorAnnotationHandler : MixinAnnotationHandler {
181183
return AtResolver.getInjectionPoint(at)?.createTargetInlay(at, context)
182184
}
183185

186+
protected open val defaultOrder = MixinConstants.InjectorOrder.DEFAULT
187+
188+
fun getOrder(annotation: PsiAnnotation): Long {
189+
return (annotation.findAttributeValue("order")?.constantValue as? Int)?.toLong() ?: defaultOrder
190+
}
191+
184192
open val allowCoerce = false
185193

186194
override val isEntryPoint = true

src/main/kotlin/platform/mixin/handlers/MixinAnnotationHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ interface MixinAnnotationHandler {
105105
)
106106

107107
enum class TargetInlayPlacement {
108-
BEFORE, AFTER, END_OF_LINE, PREVIOUS_LINE, NEXT_LINE
108+
BEFORE, AFTER, END_OF_LINE, PREVIOUS_LINE, NEXT_LINE, SURROUND
109109
}
110110

111111
companion object {

src/main/kotlin/platform/mixin/handlers/ModifyConstantHandler.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.ConstantInjecti
2424
import com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.InjectionPoint
2525
import com.demonwav.mcdev.platform.mixin.inspection.injector.MethodSignature
2626
import com.demonwav.mcdev.platform.mixin.inspection.injector.ParameterGroup
27+
import com.demonwav.mcdev.platform.mixin.util.MixinConstants
2728
import com.demonwav.mcdev.util.findAnnotations
2829
import com.intellij.psi.PsiAnnotation
2930
import com.intellij.psi.PsiManager
@@ -79,7 +80,7 @@ class ModifyConstantHandler : InjectorAnnotationHandler() {
7980
annotation: PsiAnnotation,
8081
targetClass: ClassNode,
8182
targetMethod: MethodNode,
82-
): List<MethodSignature>? {
83+
): List<MethodSignature> {
8384
val constantInfos = getConstantInfos(annotation)
8485
if (constantInfos == null) {
8586
val method = annotation.parentOfType<PsiMethod>()
@@ -133,5 +134,7 @@ class ModifyConstantHandler : InjectorAnnotationHandler() {
133134
return insn.opcode in allowedOpcodes
134135
}
135136

137+
override val defaultOrder = MixinConstants.InjectorOrder.REDIRECT
138+
136139
override val mixinExtrasExpressionContextType = ExpressionContext.Type.MODIFY_CONSTANT
137140
}

src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,12 @@ class ModifyVariableHandler : InjectorAnnotationHandler() {
8787
return result
8888
}
8989

90+
override fun createTargetInlay(
91+
context: MixinAnnotationHandler.TargetInlayContext
92+
): MixinAnnotationHandler.TargetInlayProperties? {
93+
val inlayProps = super.createTargetInlay(context) ?: return null
94+
return InjectAnnotationHandler.moveInlayAcrossNonSideEffectCodeToPrettierSpot(context, this, inlayProps)
95+
}
96+
9097
override val mixinExtrasExpressionContextType = ExpressionContext.Type.MODIFY_VARIABLE
9198
}

src/main/kotlin/platform/mixin/handlers/RedirectInjectorHandler.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.demonwav.mcdev.platform.mixin.inspection.injector.ParameterGroup
2626
import com.demonwav.mcdev.platform.mixin.util.AsmDfaUtil
2727
import com.demonwav.mcdev.platform.mixin.util.FieldTargetMember
2828
import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember
29+
import com.demonwav.mcdev.platform.mixin.util.MixinConstants
2930
import com.demonwav.mcdev.platform.mixin.util.getGenericSignature
3031
import com.demonwav.mcdev.platform.mixin.util.getGenericType
3132
import com.demonwav.mcdev.platform.mixin.util.toPsiType
@@ -104,6 +105,8 @@ class RedirectInjectorHandler : InjectorAnnotationHandler() {
104105
}
105106
}
106107

108+
override val defaultOrder = MixinConstants.InjectorOrder.REDIRECT
109+
107110
override val allowCoerce = true
108111

109112
override val mixinExtrasExpressionContextType = ExpressionContext.Type.REDIRECT

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ class HeadInjectionPoint : InjectionPoint<PsiElement>() {
6767
return null
6868
}
6969

70+
override fun isInjectingAfter(at: PsiAnnotation) = true
71+
7072
override fun createTargetInlay(
7173
at: PsiAnnotation,
7274
context: MixinAnnotationHandler.TargetInlayContext,

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@ abstract class InjectionPoint<T : PsiElement> {
109109

110110
open fun isShiftDiscouraged(shift: Int): Boolean = shift != 0
111111

112+
/**
113+
* If an injection point is injecting after, rather than before, then injections targeting the same instruction are
114+
* sorted in the opposite order by priority when displayed to the user. This is because even though the order the
115+
* injections are applied is the same, repeatedly injecting at start of a list results in the opposite order than
116+
* repeatedly injecting at the end of a list.
117+
*/
118+
open fun isInjectingAfter(at: PsiAnnotation) = AtResolver.getShift(at) > 0
119+
112120
abstract fun createNavigationVisitor(
113121
at: PsiAnnotation,
114122
target: MixinSelector?,
@@ -232,20 +240,15 @@ abstract class InjectionPoint<T : PsiElement> {
232240
context: MixinAnnotationHandler.TargetInlayContext,
233241
): MixinAnnotationHandler.TargetInlayProperties? {
234242
val injectorAnnotation = AtResolver.findInjectorAnnotation(at) ?: return null
235-
val qName = injectorAnnotation.qualifiedName ?: return null
236-
val handler = MixinAnnotationHandler.forMixinAnnotation(qName, injectorAnnotation.project) ?: return null
243+
val handler = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation) ?: return null
237244
val inlayProps = MixinTargetElementsInlayHintsProvider.createDefaultTargetInlay(handler, context)
238245
?: return null
239246

240247
if (inlayProps.placement != MixinAnnotationHandler.TargetInlayPlacement.BEFORE) {
241248
return inlayProps
242249
}
243250

244-
if (AtResolver.getShift(at) > 0) {
245-
return inlayProps.copy(placement = MixinAnnotationHandler.TargetInlayPlacement.AFTER)
246-
}
247-
248-
return inlayProps
251+
return inlayProps.copy(placement = MixinAnnotationHandler.TargetInlayPlacement.SURROUND)
249252
}
250253
}
251254

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ abstract class AbstractInvokeInjectionPoint(private val assign: Boolean) : Abstr
6262
return true
6363
}
6464

65+
override fun isInjectingAfter(at: PsiAnnotation): Boolean {
66+
return if (assign) {
67+
AtResolver.getShift(at) >= 0
68+
} else {
69+
AtResolver.getShift(at) > 0
70+
}
71+
}
72+
6573
override fun createNavigationVisitor(
6674
at: PsiAnnotation,
6775
target: MixinSelector?,

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ abstract class AbstractLoadInjectionPoint(private val store: Boolean) : Injectio
8585
return true
8686
}
8787

88+
override fun isInjectingAfter(at: PsiAnnotation): Boolean {
89+
return if (store) {
90+
AtResolver.getShift(at) >= 0
91+
} else {
92+
AtResolver.getShift(at) > 0
93+
}
94+
}
95+
8896
override fun createNavigationVisitor(
8997
at: PsiAnnotation,
9098
target: MixinSelector?,

0 commit comments

Comments
 (0)