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
42 changes: 18 additions & 24 deletions src/main/kotlin/platform/mixin/reference/AbstractMethodReference.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import com.demonwav.mcdev.platform.mixin.util.MemberInfo
import com.demonwav.mcdev.platform.mixin.util.bytecode
import com.demonwav.mcdev.platform.mixin.util.findMethods
import com.demonwav.mcdev.platform.mixin.util.findOrConstructSourceMethod
import com.demonwav.mcdev.platform.mixin.util.findSourceElement
import com.demonwav.mcdev.platform.mixin.util.findUpstreamMixin
import com.demonwav.mcdev.platform.mixin.util.mixinTargets
import com.demonwav.mcdev.util.MemberReference
Expand Down Expand Up @@ -116,6 +115,10 @@ abstract class AbstractMethodReference : PolyReferenceResolver(), MixinReference
}

fun resolve(context: PsiElement): Sequence<ClassAndMethodNode>? {
return resolveWithSelectors(context)?.map { it.second }
}

private fun resolveWithSelectors(context: PsiElement): Sequence<Pair<MixinSelector, ClassAndMethodNode>>? {
val allowStatic = context.parentOfType<PsiMethod>()?.hasModifierProperty(PsiModifier.STATIC) ?: true
val targets = getTargets(context) ?: return null
val targetedMethods = when (context) {
Expand All @@ -124,30 +127,20 @@ abstract class AbstractMethodReference : PolyReferenceResolver(), MixinReference
}
val selectors = targetedMethods.mapNotNull { parseSelector(it, context) }

return resolve(targets, selectors, allowStatic)
}

private fun resolve(
targets: Collection<ClassNode>,
selectors: List<MixinSelector>,
allowStatic: Boolean,
): Sequence<ClassAndMethodNode> {
return targets.asSequence()
.flatMap { target ->
selectors.asSequence().map { it.getCustomOwner(target) to it }
}
.groupBy({ it.first }, { it.second })
.asSequence()
.flatMap { (target, selectors) ->
target.findMethods(selectors, allowStatic)
.map { ClassAndMethodNode(target, it) }
return targets.asSequence().flatMap { target ->
selectors.asSequence().flatMap { selector ->
val owner = selector.getCustomOwner(target)
owner.findMethods(listOf(selector), allowStatic)
.map { selector to ClassAndMethodNode(owner, it) }
}
}
}

fun resolveForNavigation(context: PsiElement): Array<PsiElement>? {
return resolve(context)?.mapNotNull {
it.method.findSourceElement(
it.clazz,
return resolveWithSelectors(context)?.mapNotNull { (selector, target) ->
selector.findSourceMethod(
target.clazz,
target.method,
context.project,
scope = context.resolveScope,
canDecompile = true,
Expand All @@ -156,9 +149,10 @@ abstract class AbstractMethodReference : PolyReferenceResolver(), MixinReference
}

override fun resolveReference(context: PsiElement): Array<ResolveResult> {
return resolve(context)?.mapNotNull {
it.method.findSourceElement(
it.clazz,
return resolveWithSelectors(context)?.mapNotNull { (selector, target) ->
selector.findSourceMethod(
target.clazz,
target.method,
context.project,
scope = context.resolveScope,
canDecompile = false,
Expand Down
13 changes: 12 additions & 1 deletion src/main/kotlin/platform/mixin/reference/MixinSelectors.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import com.demonwav.mcdev.platform.mixin.util.MemberInfo
import com.demonwav.mcdev.platform.mixin.util.MixinConstants
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.DESC
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.SLICE
import com.demonwav.mcdev.platform.mixin.util.findSourceElement
import com.demonwav.mcdev.platform.mixin.util.mixinTargets
import com.demonwav.mcdev.util.MemberMatcher
import com.demonwav.mcdev.util.Quantifier
Expand All @@ -42,11 +43,11 @@ import com.demonwav.mcdev.util.resolveTypeArray
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiAnnotation
import com.intellij.psi.PsiCallExpression
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiLiteral
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiModifierList
Expand All @@ -61,6 +62,8 @@ import com.intellij.psi.util.InheritanceUtil
import com.intellij.psi.util.PsiModificationTracker
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.util.parentOfType
import org.objectweb.asm.tree.ClassNode
import org.objectweb.asm.tree.MethodNode
import java.util.Locale
import java.util.regex.PatternSyntaxException
import org.objectweb.asm.Type
Expand Down Expand Up @@ -98,6 +101,14 @@ interface MixinSelector : MemberMatcher {
val next: MixinSelector? get() = null

fun withQuantifier(quantifier: Quantifier): MixinSelector

fun findSourceMethod(
owner: ClassNode,
method: MethodNode,
project: Project,
scope: GlobalSearchScope,
canDecompile: Boolean,
): PsiElement? = method.findSourceElement(owner, project, scope, canDecompile)
}

class MixinMemberParser : MixinSelectorParser {
Expand Down
Loading