From 4f6c8d232367806b986e8be1830034d4adc68464 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 2 Apr 2019 23:39:46 +0300 Subject: [PATCH] Fix type renderers for Kotlin (KT-18263, KT-18247) --- .../evaluate/variables/VariableFinder.kt | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/variables/VariableFinder.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/variables/VariableFinder.kt index f38acbc27db..07b8e3823c5 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/variables/VariableFinder.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/variables/VariableFinder.kt @@ -179,7 +179,7 @@ class VariableFinder(private val context: ExecutionContext) { return when (parameter.kind) { Kind.ORDINARY -> findOrdinary(VariableKind.Ordinary(parameter.name, asmType, isDelegated = false)) Kind.DELEGATED -> findOrdinary(VariableKind.Ordinary(parameter.name, asmType, isDelegated = true)) - Kind.FAKE_JAVA_OUTER_CLASS -> frameProxy.thisObject()?.let { Result(it) } + Kind.FAKE_JAVA_OUTER_CLASS -> thisObject()?.let { Result(it) } Kind.EXTENSION_RECEIVER -> findExtensionThis(VariableKind.ExtensionThis(parameter.name, asmType)) Kind.LOCAL_FUNCTION -> findLocalFunction(VariableKind.LocalFunction(parameter.name, asmType)) Kind.DISPATCH_RECEIVER -> findDispatchThis(VariableKind.OuterClassThis(asmType)) @@ -199,12 +199,12 @@ class VariableFinder(private val context: ExecutionContext) { findCapturedVariableInReceiver(variables, kind)?.let { return it } // Recursive search in captured this - val containingThis = frameProxy.thisObject() ?: return null + val containingThis = thisObject() ?: return null return findCapturedVariable(kind, containingThis) } private fun findFieldVariable(kind: VariableKind.FieldVar): Result? { - val thisObject = frameProxy.thisObject() + val thisObject = thisObject() if (thisObject != null) { val field = thisObject.referenceType().fieldByName(kind.fieldName) ?: return null return Result(thisObject.getValue(field)) @@ -217,19 +217,19 @@ class VariableFinder(private val context: ExecutionContext) { private fun findLocalFunction(kind: VariableKind.LocalFunction): Result? { val variables = frameProxy.safeVisibleVariables() - + // Local variables – direct search, new convention val newConventionName = AsmUtil.LOCAL_FUNCTION_VARIABLE_PREFIX + kind.name findLocalVariable(variables, kind, newConventionName)?.let { return it } // Local variables – direct search, old convention (before 1.3.30) findLocalVariable(variables, kind, kind.name + "$")?.let { return it } - + // Recursive search in local receiver variables findCapturedVariableInReceiver(variables, kind)?.let { return it } // Recursive search in captured this - val containingThis = frameProxy.thisObject() ?: return null + val containingThis = thisObject() ?: return null return findCapturedVariable(kind, containingThis) } @@ -244,7 +244,7 @@ class VariableFinder(private val context: ExecutionContext) { findCapturedVariableInReceiver(variables, kind)?.let { return it } // Recursive search in captured this - val containingThis = frameProxy.thisObject() + val containingThis = thisObject() if (containingThis != null) { findCapturedVariable(kind, containingThis)?.let { return it } } @@ -259,7 +259,7 @@ class VariableFinder(private val context: ExecutionContext) { } private fun findDispatchThis(kind: VariableKind.OuterClassThis): Result? { - val containingThis = frameProxy.thisObject() + val containingThis = thisObject() if (containingThis != null) { findCapturedVariable(kind, containingThis)?.let { return it } } @@ -307,7 +307,7 @@ class VariableFinder(private val context: ExecutionContext) { // Recursive search in local receiver variables findCapturedVariableInReceiver(variables, kind)?.let { return it } - val containingThis = frameProxy.thisObject() ?: return null + val containingThis = thisObject() ?: return null return findCapturedVariable(kind, containingThis) } @@ -372,7 +372,7 @@ class VariableFinder(private val context: ExecutionContext) { return null } - val thisObject = frameProxy.thisObject() ?: return null + val thisObject = thisObject() ?: return null val thisType = thisObject.referenceType() if (SUSPEND_LAMBDA_CLASSES.none { thisType.isSubtype(it) }) { @@ -503,4 +503,13 @@ class VariableFinder(private val context: ExecutionContext) { private fun List.namedEntitySequence(): Sequence { return asSequence().map { NamedEntity.of(it, frameProxy) } } + + private fun thisObject(): ObjectReference? { + val thisObjectFromEvaluation = context.evaluationContext.computeThisObject() as? ObjectReference + if (thisObjectFromEvaluation != null) { + return thisObjectFromEvaluation + } + + return frameProxy.thisObject() + } } \ No newline at end of file