Skip to content

Commit 012a6d4

Browse files
committed
New: Support @Shadow constructors.
Will be introduced in FabricMixin along with enum extensions. We don't need to bother checking whether the feature is supported on the current Mixin, because the user will already get a compile error about Shadow not being applicable to constructors.
1 parent 95c8829 commit 012a6d4

2 files changed

Lines changed: 13 additions & 6 deletions

File tree

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class ShadowHandler : MixinMemberAnnotationHandler {
4848
override fun resolveTarget(annotation: PsiAnnotation, targetClass: ClassNode): List<MixinTargetMember> {
4949
if (hasAliases(annotation)) return emptyList()
5050
val member = annotation.parentOfType<PsiMember>() ?: return emptyList()
51-
val name = stripPrefix(annotation, member) ?: return emptyList()
51+
val name = getEffectiveName(annotation, member) ?: return emptyList()
5252
return when (member) {
5353
is PsiMethod -> listOfNotNull(
5454
targetClass.findMethod(MemberReference(name, member.descriptor))
@@ -75,7 +75,7 @@ class ShadowHandler : MixinMemberAnnotationHandler {
7575
is PsiField -> "field"
7676
else -> return null
7777
}
78-
return "Unresolved $type ${member.name} in target class"
78+
return "Unresolved $type ${getEffectiveName(annotation, member)} in target class"
7979
}
8080

8181
fun findFirstShadowTargetForNavigation(member: PsiMember): SmartPsiElementPointer<PsiElement>? {
@@ -94,7 +94,10 @@ class ShadowHandler : MixinMemberAnnotationHandler {
9494

9595
private fun hasAliases(shadow: PsiAnnotation) = shadow.findDeclaredAttributeValue("aliases").isNotEmpty()
9696

97-
private fun stripPrefix(shadow: PsiAnnotation, member: PsiMember): String? {
97+
private fun getEffectiveName(shadow: PsiAnnotation, member: PsiMember): String? {
98+
if (member is PsiMethod && member.isConstructor) {
99+
return "<init>"
100+
}
98101
// Strip prefix
99102
val prefix = shadow.findDeclaredAttributeValue("prefix")?.constantStringValue
100103
?: MixinConstants.DEFAULT_SHADOW_PREFIX

src/main/kotlin/util/bytecode-utils.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,13 @@ private fun PsiMethod.appendDescriptor(builder: StringBuilder): StringBuilder {
172172
builder.append('(')
173173
if (isConstructor) {
174174
containingClass?.let { containingClass ->
175-
if (containingClass.hasModifierProperty(PsiModifier.STATIC)) return@let
176-
val outerClass = containingClass.containingClass
177-
outerClass?.type()?.appendDescriptor(builder)
175+
if (!containingClass.hasModifierProperty(PsiModifier.STATIC)) {
176+
val outerClass = containingClass.containingClass
177+
outerClass?.type()?.appendDescriptor(builder)
178+
}
179+
if (containingClass.isEnum) {
180+
builder.append("Ljava/lang/String;I")
181+
}
178182
}
179183
}
180184
for (parameter in parameterList.parameters) {

0 commit comments

Comments
 (0)