Skip to content
Open
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 @@ -29,6 +29,7 @@ import com.intellij.codeInsight.completion.JavaLookupElementBuilder
import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiAnnotation
import com.intellij.psi.PsiArrayAccessExpression
import com.intellij.psi.PsiClass
Expand All @@ -37,6 +38,7 @@ import com.intellij.psi.PsiLiteral
import com.intellij.psi.PsiMethodReferenceExpression
import com.intellij.psi.PsiModifier
import com.intellij.psi.PsiReferenceExpression
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.PsiUtil
import com.intellij.util.ArrayUtilRt
import org.objectweb.asm.Opcodes
Expand Down Expand Up @@ -87,7 +89,13 @@ class FieldInjectionPoint : QualifiedInjectionPoint<PsiField>() {
?.takeIf { it in Const.VALID_OPCODES } ?: -1
val args = AtResolver.getArgs(at)
val arrayAccess = getArrayAccessType(args)
return target?.let { MyNavigationVisitor(targetClass, it, opcode, arrayAccess) }
val ownerOrTarget = target?.owner?.let { ownerName ->
JavaPsiFacade.getInstance(targetClass.project).findClass(
ownerName.replace('/', '.'),
GlobalSearchScope.allScope(targetClass.project)
)
} ?: targetClass
return target?.let { MyNavigationVisitor(ownerOrTarget, it, opcode, arrayAccess) }
}

override fun doCreateCollectVisitor(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import com.intellij.psi.PsiAnnotation
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiExpression
import com.intellij.psi.PsiModifierList
import com.intellij.psi.PsiStatement
import org.objectweb.asm.tree.ClassNode
import org.objectweb.asm.tree.MethodNode
Expand Down Expand Up @@ -72,6 +73,9 @@ class HeadInjectionPoint : InjectionPoint<PsiElement>() {
private class MyNavigationVisitor : NavigationVisitor() {
private var firstStatement = true

override fun visitAnnotation(annotation: PsiAnnotation) {
}

override fun visitStatement(statement: PsiStatement) {
if (firstStatement) {
firstStatement = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,14 @@ import com.demonwav.mcdev.util.MemberReference
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.CommonClassNames
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiAnnotation
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiLiteral
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiMethodCallExpression
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.util.ArrayUtilRt
import org.objectweb.asm.Opcodes
import org.objectweb.asm.tree.ClassNode
Expand Down Expand Up @@ -91,7 +93,13 @@ class InvokeAssignInjectionPoint : AbstractMethodInjectionPoint() {
target: MixinSelector?,
targetClass: PsiClass,
): NavigationVisitor? {
return target?.let { MyNavigationVisitor(targetClass, it) }
val ownerOrTarget = target?.owner?.let { ownerName ->
JavaPsiFacade.getInstance(targetClass.project).findClass(
ownerName.replace('/', '.'),
GlobalSearchScope.allScope(targetClass.project)
)
} ?: targetClass
return target?.let { MyNavigationVisitor(ownerOrTarget, it) }
}

override fun doCreateCollectVisitor(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import com.intellij.psi.PsiLiteral
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiMethodCallExpression
import com.intellij.psi.PsiNewExpression
import com.intellij.psi.search.GlobalSearchScope
import org.objectweb.asm.tree.ClassNode
import org.objectweb.asm.tree.MethodInsnNode
import org.objectweb.asm.tree.MethodNode
Expand All @@ -54,7 +55,14 @@ class InvokeInjectionPoint : AbstractMethodInjectionPoint() {
target: MixinSelector?,
targetClass: PsiClass,
): NavigationVisitor? {
return target?.let { MyNavigationVisitor(targetClass, it) }
if (target == null) return null
val ownerOrTarget = target.owner?.let { ownerName ->
JavaPsiFacade.getInstance(targetClass.project).findClass(
ownerName.replace('/', '.'),
GlobalSearchScope.allScope(targetClass.project)
)
} ?: targetClass
return MyNavigationVisitor(ownerOrTarget, target)
}

override fun doCreateCollectVisitor(
Expand Down
3 changes: 2 additions & 1 deletion src/main/kotlin/platform/mixin/util/AsmUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,8 @@ fun ClassNode.findSourceClass(project: Project, scope: GlobalSearchScope, canDec
}
}
if (canDecompile) {
((stubFile as? PsiCompiledFile)?.decompiledPsiFile as? PsiJavaFile)?.classes?.firstOrNull()
val javaFile = (stubFile as? PsiCompiledFile)?.decompiledPsiFile as? PsiJavaFile ?: stubFile as? PsiJavaFile
javaFile?.classes?.firstOrNull()
} else {
stubClass
}
Expand Down
Loading