Skip to content

Commit 92368e6

Browse files
committed
Don't recurse into lambdas etc with new source navigation
1 parent c061f28 commit 92368e6

File tree

2 files changed

+14
-47
lines changed

2 files changed

+14
-47
lines changed

src/main/kotlin/platform/mixin/handlers/injectionPoint/AtResolver.kt

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -222,27 +222,30 @@ class AtResolver(
222222
val bytecodeResults = resolveInstructions()
223223

224224
// Then attempt to find the corresponding source elements using the navigation visitor
225+
val mainTargetElement = targetMethod.findSourceElement(
226+
getTargetClass(target),
227+
at.project,
228+
GlobalSearchScope.allScope(at.project),
229+
canDecompile = true,
230+
)
225231
val targetElements = targetMethod.findBodyElements(
226232
getTargetClass(target),
227233
at.project,
228234
GlobalSearchScope.allScope(at.project),
229-
).ifEmpty {
230-
return listOfNotNull(
231-
targetMethod.findSourceElement(
232-
getTargetClass(target),
233-
at.project,
234-
GlobalSearchScope.allScope(at.project),
235-
canDecompile = true,
236-
)
237-
)
235+
)
236+
if (mainTargetElement == null && targetElements.isEmpty()) {
237+
return emptyList()
238238
}
239239

240-
val targetPsiClass = targetElements.first().parentOfType<PsiClass>() ?: return emptyList()
240+
val targetPsiClass = (mainTargetElement ?: targetElements.first()).parentOfType<PsiClass>()
241+
?: return emptyList()
241242
val targetPsiFile = targetPsiClass.containingFile ?: return emptyList()
242243

243244
val navigationVisitor = injectionPoint.createNavigationVisitor(at, target, targetPsiClass) ?: return emptyList()
244245
navigationVisitor.configureBytecodeTarget(targetClass, targetMethod)
246+
navigationVisitor.visitStart(mainTargetElement ?: targetElements.first())
245247
targetElements.forEach { it.accept(navigationVisitor) }
248+
navigationVisitor.visitEnd(mainTargetElement ?: targetElements.last())
246249

247250
return bytecodeResults.mapNotNull { bytecodeResult ->
248251
val matcher = bytecodeResult.sourceLocationInfo.createMatcher<PsiElement>(targetPsiFile)

src/main/kotlin/platform/mixin/handlers/injectionPoint/InjectionPoint.kt

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,6 @@ abstract class AbstractMethodInjectionPoint : QualifiedInjectionPoint<PsiMethod>
302302

303303
abstract class NavigationVisitor : JavaRecursiveElementVisitor() {
304304
val result = mutableListOf<PsiElement>()
305-
private var hasVisitedAnything = false
306305

307306
protected fun addResult(element: PsiElement) {
308307
result += element
@@ -317,55 +316,20 @@ abstract class NavigationVisitor : JavaRecursiveElementVisitor() {
317316
open fun visitEnd(executableElement: PsiElement) {
318317
}
319318

320-
override fun visitElement(element: PsiElement) {
321-
hasVisitedAnything = true
322-
super.visitElement(element)
323-
}
324-
325319
override fun visitMethod(method: PsiMethod) {
326-
if (!hasVisitedAnything) {
327-
visitStart(method)
328-
super.visitMethod(method)
329-
visitEnd(method)
330-
}
320+
// do not recurse into methods
331321
}
332322

333323
override fun visitAnonymousClass(aClass: PsiAnonymousClass) {
334324
// do not recurse into anonymous classes
335-
if (!hasVisitedAnything) {
336-
visitStart(aClass)
337-
super.visitAnonymousClass(aClass)
338-
visitEnd(aClass)
339-
}
340325
}
341326

342327
override fun visitClass(aClass: PsiClass) {
343328
// do not recurse into inner classes
344-
if (!hasVisitedAnything) {
345-
visitStart(aClass)
346-
super.visitClass(aClass)
347-
visitEnd(aClass)
348-
}
349-
}
350-
351-
override fun visitMethodReferenceExpression(expression: PsiMethodReferenceExpression) {
352-
val hadVisitedAnything = hasVisitedAnything
353-
if (!hadVisitedAnything) {
354-
visitStart(expression)
355-
}
356-
super.visitMethodReferenceExpression(expression)
357-
if (!hadVisitedAnything) {
358-
visitEnd(expression)
359-
}
360329
}
361330

362331
override fun visitLambdaExpression(expression: PsiLambdaExpression) {
363332
// do not recurse into lambda expressions
364-
if (!hasVisitedAnything) {
365-
visitStart(expression)
366-
super.visitLambdaExpression(expression)
367-
visitEnd(expression)
368-
}
369333
}
370334
}
371335

0 commit comments

Comments
 (0)