Debugger: Support Kotlin variables for inlined lambdas inside inline functions (KT-31418)

This commit is contained in:
Yan Zhulanow
2019-05-22 17:27:23 +09:00
parent afa0bec6f6
commit b4f515a436
8 changed files with 63 additions and 15 deletions
@@ -58,7 +58,7 @@ fun isInsideInlineArgument(
val lambdaClassName = asmTypeForAnonymousClass(bindingContext, inlineArgument)
.internalName.substringAfterLast("/")
variableName == "-$functionName-$lambdaClassName"
dropInlineSuffix(variableName) == "-$functionName-$lambdaClassName"
} else {
// For Kotlin up to 1.3.10
lambdaOrdinalByLocalVariable(variableName) == lambdaOrdinal
@@ -100,6 +100,7 @@ private fun Location.visibleVariables(debugProcess: DebugProcessImpl): List<Loca
return stackFrame.visibleVariables()
}
// For Kotlin up to 1.3.10
private fun lambdaOrdinalByLocalVariable(name: String): Int {
try {
val nameWithoutPrefix = name.removePrefix(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_ARGUMENT)
@@ -110,6 +111,7 @@ private fun lambdaOrdinalByLocalVariable(name: String): Int {
}
}
// For Kotlin up to 1.3.10
private fun functionNameByLocalVariable(name: String): String {
val nameWithoutPrefix = name.removePrefix(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_ARGUMENT)
return nameWithoutPrefix.substringAfterLast("$", "unknown")
@@ -129,7 +129,7 @@ class KotlinStackFrame(frame: StackFrameProxyImpl) : JavaStackFrame(StackFrameDe
val inlineDepth = getInlineDepth(variables)
val declarationSiteThis = variables.firstOrNull { v ->
val name = v.name()
name.endsWith(INLINE_FUN_VAR_SUFFIX) && name.dropInlineSuffix() == AsmUtil.INLINE_DECLARATION_SITE_THIS
name.endsWith(INLINE_FUN_VAR_SUFFIX) && dropInlineSuffix(name) == AsmUtil.INLINE_DECLARATION_SITE_THIS
}
if (inlineDepth > 0 && declarationSiteThis != null) {
@@ -282,7 +282,7 @@ class KotlinStackFrame(frame: StackFrameProxyImpl) : JavaStackFrame(StackFrameDe
}
private fun LocalVariableProxyImpl.remapThisVariableIfNeeded(customName: String? = null): LocalVariableProxyImpl {
val name = this.name().dropInlineSuffix()
val name = dropInlineSuffix(this.name())
@Suppress("ConvertToStringTemplate")
return when {
@@ -326,15 +326,6 @@ class KotlinStackFrame(frame: StackFrameProxyImpl) : JavaStackFrame(StackFrameDe
return label
}
private fun String.dropInlineSuffix(): String {
val depth = getInlineDepth(this)
if (depth == 0) {
return this
}
return dropLast(depth * INLINE_FUN_VAR_SUFFIX.length)
}
private fun LocalVariableProxyImpl.clone(name: String, label: String?): LocalVariableProxyImpl {
return object : LocalVariableProxyImpl(frame, variable), ThisLocalVariable {
override fun name() = name