Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
package com.demonwav.mcdev.platform.mixin.completion

import com.demonwav.mcdev.platform.mixin.reference.MixinReferences
import com.demonwav.mcdev.platform.mixin.handlers.ShadowTargetResolver
import com.demonwav.mcdev.platform.mixin.util.findShadowTargets
import com.demonwav.mcdev.platform.mixin.util.isMixin
import com.demonwav.mcdev.util.constantStringValue
Expand Down Expand Up @@ -124,7 +125,9 @@ class MixinCompletionContributor : CompletionContributor() {
}

// Process methods and fields from target class
val elements = findShadowTargets(psiClass, start, superMixin != null)
val extensionTargets = ShadowTargetResolver.EP_NAME.extensionList.asSequence()
.flatMap { it.findCompletionTargets(start) }
val elements = (findShadowTargets(psiClass, start, superMixin != null) + extensionTargets)
.filter {
val name = it.name
StringUtil.isJavaIdentifier(name) && prefixMatcher.prefixMatches(name)
Expand Down
6 changes: 5 additions & 1 deletion src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class ShadowHandler : MixinMemberAnnotationHandler {
if (hasAliases(annotation)) return emptyList()
val member = annotation.parentOfType<PsiMember>() ?: return emptyList()
val name = getEffectiveName(annotation, member) ?: return emptyList()
return when (member) {
val targetMembers = when (member) {
is PsiMethod -> listOfNotNull(
targetClass.findMethod(MemberReference(name, member.descriptor))
?.let { MethodTargetMember(targetClass, it) },
Expand All @@ -59,6 +59,10 @@ class ShadowHandler : MixinMemberAnnotationHandler {
)
else -> emptyList()
}
if (targetMembers.isNotEmpty()) return targetMembers
return ShadowTargetResolver.EP_NAME.extensionList.flatMap {
it.resolveTarget(annotation, targetClass, member, name)
}
}

override fun isUnresolved(annotation: PsiAnnotation, targetClass: ClassNode): InsnResolutionInfo.Failure? {
Expand Down
44 changes: 44 additions & 0 deletions src/main/kotlin/platform/mixin/handlers/ShadowTargetResolver.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Minecraft Development for IntelliJ
*
* https://mcdev.io/
*
* Copyright (C) 2026 minecraft-dev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, version 3.0 only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package com.demonwav.mcdev.platform.mixin.handlers

import com.demonwav.mcdev.platform.mixin.util.MixinTargetMember
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.psi.PsiAnnotation
import com.intellij.psi.PsiMember
import com.intellij.psi.PsiClass
import org.objectweb.asm.tree.ClassNode

/** Supplies shadow targets contributed by other transformations of the same target class. */
interface ShadowTargetResolver {
fun resolveTarget(
shadow: PsiAnnotation,
targetClass: ClassNode,
member: PsiMember,
effectiveName: String,
): List<MixinTargetMember>

fun findCompletionTargets(mixinClass: PsiClass): Sequence<MixinTargetMember> = emptySequence()

companion object {
val EP_NAME = ExtensionPointName.create<ShadowTargetResolver>("com.demonwav.minecraft-dev.shadowTargetResolver")
}
}
2 changes: 2 additions & 0 deletions src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@
<extensionPoint name="mixinAnnotationHandler" beanClass="com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandlerInfo" dynamic="true">
<with attribute="implementation" implements="com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler"/>
</extensionPoint>
<extensionPoint name="shadowTargetResolver"
interface="com.demonwav.mcdev.platform.mixin.handlers.ShadowTargetResolver" dynamic="true"/>
<extensionPoint name="injectionPoint"
beanClass="com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.InjectionPointInfo"
dynamic="true">
Expand Down
Loading