Store descriptor via soft reference to avoid holding project from debugger
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user