Store descriptor via soft reference to avoid holding project from debugger

This commit is contained in:
Nikolay Krasko
2017-09-07 16:03:00 +03:00
parent 2877314313
commit eb7a984843
@@ -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<Int>
) : NamedMethodFilter {
private val myTargetMethodName = when (targetDescriptor) {
private val myTargetMethodName: String = when (targetDescriptor) {
is ClassDescriptor, is ConstructorDescriptor -> "<init>"
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