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.DebugProcessImpl
import com.intellij.debugger.engine.NamedMethodFilter import com.intellij.debugger.engine.NamedMethodFilter
import com.intellij.util.Range import com.intellij.util.Range
import com.intellij.util.SofterReference
import com.sun.jdi.Location import com.sun.jdi.Location
import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.* 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.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.idea.core.getDirectlyOverriddenDeclarations import org.jetbrains.kotlin.idea.core.getDirectlyOverriddenDeclarations
import org.jetbrains.kotlin.idea.util.application.runReadAction 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 import org.jetbrains.kotlin.resolve.DescriptorUtils
class KotlinBasicStepMethodFilter( class KotlinBasicStepMethodFilter(
private val targetDescriptor: CallableMemberDescriptor, targetDescriptor: CallableMemberDescriptor,
private val myCallingExpressionLines: Range<Int> private val myCallingExpressionLines: Range<Int>
) : NamedMethodFilter { ) : NamedMethodFilter {
private val myTargetMethodName = when (targetDescriptor) { private val myTargetMethodName: String = when (targetDescriptor) {
is ClassDescriptor, is ConstructorDescriptor -> "<init>" is ClassDescriptor, is ConstructorDescriptor -> "<init>"
is PropertyAccessorDescriptor -> JvmAbi.getterName(targetDescriptor.correspondingProperty.name.asString()) is PropertyAccessorDescriptor -> JvmAbi.getterName(targetDescriptor.correspondingProperty.name.asString())
else -> targetDescriptor.name.asString() else -> targetDescriptor.name.asString()
} }
private val _targetDescriptor = SofterReference(targetDescriptor)
override fun getCallingExpressionLines() = myCallingExpressionLines override fun getCallingExpressionLines() = myCallingExpressionLines
override fun getMethodName() = myTargetMethodName override fun getMethodName() = myTargetMethodName
override fun locationMatches(process: DebugProcessImpl, location: Location): Boolean { override fun locationMatches(process: DebugProcessImpl, location: Location): Boolean {
val targetDescriptor = _targetDescriptor.get() ?: return true
val method = location.method() val method = location.method()
if (myTargetMethodName != method.name()) return false if (myTargetMethodName != method.name()) return false