From eb7a984843651e555fca2a797cf21b8d02d25aa9 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 7 Sep 2017 16:03:00 +0300 Subject: [PATCH] Store descriptor via soft reference to avoid holding project from debugger --- .../debugger/stepping/KotlinBasicStepMethodFilter.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinBasicStepMethodFilter.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinBasicStepMethodFilter.kt index 6ed96a32b4d..dc551bb2578 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinBasicStepMethodFilter.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinBasicStepMethodFilter.kt @@ -19,11 +19,11 @@ package org.jetbrains.kotlin.idea.debugger.stepping import com.intellij.debugger.engine.DebugProcessImpl import com.intellij.debugger.engine.NamedMethodFilter import com.intellij.util.Range +import com.intellij.util.SofterReference import com.sun.jdi.Location import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.* -import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.core.getDirectlyOverriddenDeclarations import org.jetbrains.kotlin.idea.util.application.runReadAction @@ -35,20 +35,24 @@ import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypesAndPredicate import org.jetbrains.kotlin.resolve.DescriptorUtils class KotlinBasicStepMethodFilter( - private val targetDescriptor: CallableMemberDescriptor, + targetDescriptor: CallableMemberDescriptor, private val myCallingExpressionLines: Range ) : NamedMethodFilter { - private val myTargetMethodName = when (targetDescriptor) { + private val myTargetMethodName: String = when (targetDescriptor) { is ClassDescriptor, is ConstructorDescriptor -> "" is PropertyAccessorDescriptor -> JvmAbi.getterName(targetDescriptor.correspondingProperty.name.asString()) else -> targetDescriptor.name.asString() } + private val _targetDescriptor = SofterReference(targetDescriptor) + override fun getCallingExpressionLines() = myCallingExpressionLines override fun getMethodName() = myTargetMethodName override fun locationMatches(process: DebugProcessImpl, location: Location): Boolean { + val targetDescriptor = _targetDescriptor.get() ?: return true + val method = location.method() if (myTargetMethodName != method.name()) return false