User: llamalad7 Date: 02 Apr 26 19:00 Revision: a3426c1d38d8afea19cdf7433fece0f682091aa2 Summary: Feature/enum extensions (#2602) * 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. * New: Support Enum extensions. TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10463&personal=false Index: src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt (revision a04d5960eba2c737d92c6a751d0b66edfa9dca3c) +++ src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt (revision a3426c1d38d8afea19cdf7433fece0f682091aa2) @@ -48,7 +48,7 @@ override fun resolveTarget(annotation: PsiAnnotation, targetClass: ClassNode): List { if (hasAliases(annotation)) return emptyList() val member = annotation.parentOfType() ?: return emptyList() - val name = stripPrefix(annotation, member) ?: return emptyList() + val name = getEffectiveName(annotation, member) ?: return emptyList() return when (member) { is PsiMethod -> listOfNotNull( targetClass.findMethod(MemberReference(name, member.descriptor)) @@ -75,7 +75,7 @@ is PsiField -> "field" else -> return null } - return "Unresolved $type ${member.name} in target class" + return "Unresolved $type ${getEffectiveName(annotation, member)} in target class" } fun findFirstShadowTargetForNavigation(member: PsiMember): SmartPsiElementPointer? { @@ -94,7 +94,10 @@ private fun hasAliases(shadow: PsiAnnotation) = shadow.findDeclaredAttributeValue("aliases").isNotEmpty() - private fun stripPrefix(shadow: PsiAnnotation, member: PsiMember): String? { + private fun getEffectiveName(shadow: PsiAnnotation, member: PsiMember): String? { + if (member is PsiMethod && member.isConstructor) { + return "" + } // Strip prefix val prefix = shadow.findDeclaredAttributeValue("prefix")?.constantStringValue ?: MixinConstants.DEFAULT_SHADOW_PREFIX Index: src/main/kotlin/platform/mixin/inspection/MixinClassTypeInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/MixinClassTypeInspection.kt (revision a04d5960eba2c737d92c6a751d0b66edfa9dca3c) +++ src/main/kotlin/platform/mixin/inspection/MixinClassTypeInspection.kt (revision a3426c1d38d8afea19cdf7433fece0f682091aa2) @@ -22,6 +22,7 @@ import com.demonwav.mcdev.platform.mixin.util.hasAccess import com.demonwav.mcdev.platform.mixin.util.isAccessorMixin +import com.demonwav.mcdev.platform.mixin.util.isFabricMixin import com.demonwav.mcdev.platform.mixin.util.isMixin import com.demonwav.mcdev.platform.mixin.util.mixinTargets import com.intellij.codeInspection.LocalQuickFix @@ -68,7 +69,7 @@ } } - if (mixinClass.isEnum) { + if (mixinClass.isEnum && !mixinClass.isFabricMixin) { holder.registerProblem(problemElement, "Mixins cannot be enums", *fixes.toTypedArray()) return } Index: src/main/kotlin/platform/mixin/inspection/StaticMemberInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/StaticMemberInspection.kt (revision a04d5960eba2c737d92c6a751d0b66edfa9dca3c) +++ src/main/kotlin/platform/mixin/inspection/StaticMemberInspection.kt (revision a3426c1d38d8afea19cdf7433fece0f682091aa2) @@ -30,6 +30,7 @@ import com.intellij.codeInspection.ProblemsHolder import com.intellij.psi.JavaElementVisitor import com.intellij.psi.PsiElementVisitor +import com.intellij.psi.PsiEnumConstant import com.intellij.psi.PsiField import com.intellij.psi.PsiMember import com.intellij.psi.PsiMethod @@ -71,7 +72,7 @@ private fun isProblematic(member: PsiMember): Boolean { val containingClass = member.containingClass ?: return false - if (!containingClass.isMixin) { + if (!containingClass.isMixin || member is PsiEnumConstant) { return false } Index: src/main/kotlin/platform/mixin/inspection/addedMembers/MissingUniqueAnnotationInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/addedMembers/MissingUniqueAnnotationInspection.kt (revision a04d5960eba2c737d92c6a751d0b66edfa9dca3c) +++ src/main/kotlin/platform/mixin/inspection/addedMembers/MissingUniqueAnnotationInspection.kt (revision a3426c1d38d8afea19cdf7433fece0f682091aa2) @@ -24,6 +24,7 @@ import com.intellij.codeInsight.intention.AddAnnotationModCommandAction import com.intellij.codeInspection.LocalQuickFix import com.intellij.codeInspection.ProblemsHolder +import com.intellij.psi.PsiEnumConstant import com.intellij.psi.PsiField import com.intellij.psi.PsiMethod @@ -31,6 +32,9 @@ override fun getStaticDescription() = "Reports missing @Unique annotations" override fun visitAddedField(holder: ProblemsHolder, field: PsiField) { + if (field is PsiEnumConstant) { + return + } if (!field.hasAnnotation(MixinConstants.Annotations.UNIQUE)) { holder.registerProblem( field.nameIdentifier, Index: src/main/kotlin/util/bytecode-utils.kt =================================================================== --- src/main/kotlin/util/bytecode-utils.kt (revision a04d5960eba2c737d92c6a751d0b66edfa9dca3c) +++ src/main/kotlin/util/bytecode-utils.kt (revision a3426c1d38d8afea19cdf7433fece0f682091aa2) @@ -172,11 +172,14 @@ builder.append('(') if (isConstructor) { containingClass?.let { containingClass -> - if (containingClass.hasModifierProperty(PsiModifier.STATIC)) return@let + if (containingClass.isEnum) { + builder.append("Ljava/lang/String;I") + } else if (!containingClass.hasModifierProperty(PsiModifier.STATIC)) { - val outerClass = containingClass.containingClass - outerClass?.type()?.appendDescriptor(builder) - } - } + val outerClass = containingClass.containingClass + outerClass?.type()?.appendDescriptor(builder) + } + } + } for (parameter in parameterList.parameters) { parameter.type.appendDescriptor(builder) }