Fix type renderers for Kotlin (KT-18263, KT-18247)

This commit is contained in:
Yan Zhulanow
2019-04-02 23:39:46 +03:00
parent 15db1c8a8f
commit 4f6c8d2323
@@ -179,7 +179,7 @@ class VariableFinder(private val context: ExecutionContext) {
return when (parameter.kind) { return when (parameter.kind) {
Kind.ORDINARY -> findOrdinary(VariableKind.Ordinary(parameter.name, asmType, isDelegated = false)) Kind.ORDINARY -> findOrdinary(VariableKind.Ordinary(parameter.name, asmType, isDelegated = false))
Kind.DELEGATED -> findOrdinary(VariableKind.Ordinary(parameter.name, asmType, isDelegated = true)) 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.EXTENSION_RECEIVER -> findExtensionThis(VariableKind.ExtensionThis(parameter.name, asmType))
Kind.LOCAL_FUNCTION -> findLocalFunction(VariableKind.LocalFunction(parameter.name, asmType)) Kind.LOCAL_FUNCTION -> findLocalFunction(VariableKind.LocalFunction(parameter.name, asmType))
Kind.DISPATCH_RECEIVER -> findDispatchThis(VariableKind.OuterClassThis(asmType)) Kind.DISPATCH_RECEIVER -> findDispatchThis(VariableKind.OuterClassThis(asmType))
@@ -199,12 +199,12 @@ class VariableFinder(private val context: ExecutionContext) {
findCapturedVariableInReceiver(variables, kind)?.let { return it } findCapturedVariableInReceiver(variables, kind)?.let { return it }
// Recursive search in captured this // Recursive search in captured this
val containingThis = frameProxy.thisObject() ?: return null val containingThis = thisObject() ?: return null
return findCapturedVariable(kind, containingThis) return findCapturedVariable(kind, containingThis)
} }
private fun findFieldVariable(kind: VariableKind.FieldVar): Result? { private fun findFieldVariable(kind: VariableKind.FieldVar): Result? {
val thisObject = frameProxy.thisObject() val thisObject = thisObject()
if (thisObject != null) { if (thisObject != null) {
val field = thisObject.referenceType().fieldByName(kind.fieldName) ?: return null val field = thisObject.referenceType().fieldByName(kind.fieldName) ?: return null
return Result(thisObject.getValue(field)) return Result(thisObject.getValue(field))
@@ -217,19 +217,19 @@ class VariableFinder(private val context: ExecutionContext) {
private fun findLocalFunction(kind: VariableKind.LocalFunction): Result? { private fun findLocalFunction(kind: VariableKind.LocalFunction): Result? {
val variables = frameProxy.safeVisibleVariables() val variables = frameProxy.safeVisibleVariables()
// Local variables direct search, new convention // Local variables direct search, new convention
val newConventionName = AsmUtil.LOCAL_FUNCTION_VARIABLE_PREFIX + kind.name val newConventionName = AsmUtil.LOCAL_FUNCTION_VARIABLE_PREFIX + kind.name
findLocalVariable(variables, kind, newConventionName)?.let { return it } findLocalVariable(variables, kind, newConventionName)?.let { return it }
// Local variables direct search, old convention (before 1.3.30) // Local variables direct search, old convention (before 1.3.30)
findLocalVariable(variables, kind, kind.name + "$")?.let { return it } findLocalVariable(variables, kind, kind.name + "$")?.let { return it }
// Recursive search in local receiver variables // Recursive search in local receiver variables
findCapturedVariableInReceiver(variables, kind)?.let { return it } findCapturedVariableInReceiver(variables, kind)?.let { return it }
// Recursive search in captured this // Recursive search in captured this
val containingThis = frameProxy.thisObject() ?: return null val containingThis = thisObject() ?: return null
return findCapturedVariable(kind, containingThis) return findCapturedVariable(kind, containingThis)
} }
@@ -244,7 +244,7 @@ class VariableFinder(private val context: ExecutionContext) {
findCapturedVariableInReceiver(variables, kind)?.let { return it } findCapturedVariableInReceiver(variables, kind)?.let { return it }
// Recursive search in captured this // Recursive search in captured this
val containingThis = frameProxy.thisObject() val containingThis = thisObject()
if (containingThis != null) { if (containingThis != null) {
findCapturedVariable(kind, containingThis)?.let { return it } findCapturedVariable(kind, containingThis)?.let { return it }
} }
@@ -259,7 +259,7 @@ class VariableFinder(private val context: ExecutionContext) {
} }
private fun findDispatchThis(kind: VariableKind.OuterClassThis): Result? { private fun findDispatchThis(kind: VariableKind.OuterClassThis): Result? {
val containingThis = frameProxy.thisObject() val containingThis = thisObject()
if (containingThis != null) { if (containingThis != null) {
findCapturedVariable(kind, containingThis)?.let { return it } findCapturedVariable(kind, containingThis)?.let { return it }
} }
@@ -307,7 +307,7 @@ class VariableFinder(private val context: ExecutionContext) {
// Recursive search in local receiver variables // Recursive search in local receiver variables
findCapturedVariableInReceiver(variables, kind)?.let { return it } findCapturedVariableInReceiver(variables, kind)?.let { return it }
val containingThis = frameProxy.thisObject() ?: return null val containingThis = thisObject() ?: return null
return findCapturedVariable(kind, containingThis) return findCapturedVariable(kind, containingThis)
} }
@@ -372,7 +372,7 @@ class VariableFinder(private val context: ExecutionContext) {
return null return null
} }
val thisObject = frameProxy.thisObject() ?: return null val thisObject = thisObject() ?: return null
val thisType = thisObject.referenceType() val thisType = thisObject.referenceType()
if (SUSPEND_LAMBDA_CLASSES.none { thisType.isSubtype(it) }) { if (SUSPEND_LAMBDA_CLASSES.none { thisType.isSubtype(it) }) {
@@ -503,4 +503,13 @@ class VariableFinder(private val context: ExecutionContext) {
private fun List<LocalVariableProxyImpl>.namedEntitySequence(): Sequence<NamedEntity> { private fun List<LocalVariableProxyImpl>.namedEntitySequence(): Sequence<NamedEntity> {
return asSequence().map { NamedEntity.of(it, frameProxy) } 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()
}
} }