diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt index c58140d0597..83754e3fb17 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt @@ -360,9 +360,10 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M private fun getInternalClassNameForElement(notPositionedElement: PsiElement?, typeMapper: JetTypeMapper, file: KtFile, isInLibrary: Boolean): Collection { val element = getElementToCalculateClassName(notPositionedElement) - when { - element is KtClassOrObject -> return getJvmInternalNameForImpl(typeMapper, element).toSet() - element is KtFunctionLiteral -> { + + when (element) { + is KtClassOrObject -> return getJvmInternalNameForImpl(typeMapper, element).toSet() + is KtFunction -> { val descriptor = InlineUtil.getInlineArgumentDescriptor(element, typeMapper.bindingContext) if (descriptor != null) { val classNamesForParent = getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary) @@ -371,15 +372,18 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M } return classNamesForParent } - else { - val crossInlineParameterUsages = element.containsCrossInlineParameterUsages(typeMapper.bindingContext) - if (crossInlineParameterUsages.isNotEmpty()) { - return classNamesForCrossInlineParameters(crossInlineParameterUsages, typeMapper.bindingContext) - } + } + } - val asmType = CodegenBinding.asmTypeForAnonymousClass(typeMapper.bindingContext, element) - return asmType.internalName.toSet() - } + val crossInlineParameterUsages = element?.containsCrossInlineParameterUsages(typeMapper.bindingContext) + if (crossInlineParameterUsages != null && crossInlineParameterUsages.isNotEmpty()) { + return classNamesForCrossInlineParameters(crossInlineParameterUsages, typeMapper.bindingContext) + } + + when { + element is KtFunctionLiteral -> { + val asmType = CodegenBinding.asmTypeForAnonymousClass(typeMapper.bindingContext, element) + return asmType.internalName.toSet() } element is KtAnonymousInitializer -> { val parent = getElementToCalculateClassName(element.parent) @@ -405,15 +409,6 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M return getJvmInternalNameForPropertyOwner(typeMapper, descriptor).toSet() } element is KtNamedFunction -> { - if (isInlinedLambda(element, typeMapper.bindingContext)) { - return getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary) - } - - val crossInlineParameterUsages = element.containsCrossInlineParameterUsages(typeMapper.bindingContext) - if (crossInlineParameterUsages.isNotEmpty()) { - return classNamesForCrossInlineParameters(crossInlineParameterUsages, typeMapper.bindingContext) - } - val parent = getElementToCalculateClassName(element.parent) val parentInternalName = if (parent is KtClassOrObject) { getJvmInternalNameForImpl(typeMapper, parent) @@ -524,8 +519,8 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M return "$newName$*" } - private fun KtFunction.containsCrossInlineParameterUsages(context: BindingContext): Collection { - fun KtFunction.hasParameterCall(parameter: KtParameter): Boolean { + private fun KtElement.containsCrossInlineParameterUsages(context: BindingContext): Collection { + fun KtElement.hasParameterCall(parameter: KtParameter): Boolean { return ReferencesSearch.search(parameter).any { this.textRange.contains(it.element.textRange) } diff --git a/idea/testData/debugger/tinyApp/outs/crossinlineLiteral.out b/idea/testData/debugger/tinyApp/outs/crossinlineLiteral.out index ed9c88da8a4..a542ae7d73b 100644 --- a/idea/testData/debugger/tinyApp/outs/crossinlineLiteral.out +++ b/idea/testData/debugger/tinyApp/outs/crossinlineLiteral.out @@ -3,37 +3,57 @@ LineBreakpoint created at crossinlineLiteral.kt:17 LineBreakpoint created at crossinlineLiteral.kt:22 LineBreakpoint created at crossinlineLiteral.kt:27 LineBreakpoint created at crossinlineLiteral.kt:32 -LineBreakpoint created at crossinlineLiteral.kt:35 -LineBreakpoint created at crossinlineLiteral.kt:40 -LineBreakpoint created at crossinlineLiteral.kt:48 -LineBreakpoint created at crossinlineLiteral.kt:56 -LineBreakpoint created at crossinlineLiteral.kt:64 -LineBreakpoint created at crossinlineLiteral.kt:70 -LineBreakpoint created at crossinlineLiteral.kt:79 -LineBreakpoint created at crossinlineLiteral.kt:87 +LineBreakpoint created at crossinlineLiteral.kt:37 +LineBreakpoint created at crossinlineLiteral.kt:42 +LineBreakpoint created at crossinlineLiteral.kt:45 +LineBreakpoint created at crossinlineLiteral.kt:50 +LineBreakpoint created at crossinlineLiteral.kt:58 +LineBreakpoint created at crossinlineLiteral.kt:66 +LineBreakpoint created at crossinlineLiteral.kt:74 +LineBreakpoint created at crossinlineLiteral.kt:80 +LineBreakpoint created at crossinlineLiteral.kt:89 LineBreakpoint created at crossinlineLiteral.kt:97 -LineBreakpoint created at crossinlineLiteral.kt:104 -LineBreakpoint created at crossinlineLiteral.kt:114 +LineBreakpoint created at crossinlineLiteral.kt:102 +LineBreakpoint created at crossinlineLiteral.kt:108 +LineBreakpoint created at crossinlineLiteral.kt:120 +LineBreakpoint created at crossinlineLiteral.kt:127 +LineBreakpoint created at crossinlineLiteral.kt:137 !JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! crossinlineLiteral.CrossinlineLiteralKt Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' -crossinlineLiteral.kt:64 +crossinlineLiteral.kt:74 crossinlineLiteral.kt:12 -crossinlineLiteral.kt:70 +crossinlineLiteral.kt:74 crossinlineLiteral.kt:17 -crossinlineLiteral.kt:79 +crossinlineLiteral.kt:80 crossinlineLiteral.kt:22 -crossinlineLiteral.kt:87 +crossinlineLiteral.kt:80 crossinlineLiteral.kt:27 -crossinlineLiteral.kt:97 +crossinlineLiteral.kt:89 crossinlineLiteral.kt:32 -crossinlineLiteral.kt:104 -crossinlineLiteral.kt:35 -crossinlineLiteral.kt:114 -crossinlineLiteral.kt:40 -crossinlineLiteral.kt:87 -crossinlineLiteral.kt:48 -crossinlineLiteral.kt:87 -crossinlineLiteral.kt:56 +crossinlineLiteral.kt:97 +crossinlineLiteral.kt:37 +crossinlineLiteral.kt:102 +crossinlineLiteral.kt:37 +crossinlineLiteral.kt:108 +crossinlineLiteral.kt:37 +crossinlineLiteral.kt:120 +crossinlineLiteral.kt:42 +crossinlineLiteral.kt:127 +crossinlineLiteral.kt:45 +crossinlineLiteral.kt:137 +crossinlineLiteral.kt:50 +crossinlineLiteral.kt:97 +crossinlineLiteral.kt:58 +crossinlineLiteral.kt:102 +crossinlineLiteral.kt:58 +crossinlineLiteral.kt:108 +crossinlineLiteral.kt:58 +crossinlineLiteral.kt:97 +crossinlineLiteral.kt:66 +crossinlineLiteral.kt:102 +crossinlineLiteral.kt:66 +crossinlineLiteral.kt:108 +crossinlineLiteral.kt:66 Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/stepping/custom/crossinlineLiteral.kt b/idea/testData/debugger/tinyApp/src/stepping/custom/crossinlineLiteral.kt index 5b7109b93f0..faf0ed539a4 100644 --- a/idea/testData/debugger/tinyApp/src/stepping/custom/crossinlineLiteral.kt +++ b/idea/testData/debugger/tinyApp/src/stepping/custom/crossinlineLiteral.kt @@ -12,11 +12,21 @@ fun callFromTopLevel() { val a = 1 } + simpleCall(fun(i) { + //Breakpoint! + val a = 1 + }) + lambdaCall { //Breakpoint! val a = 1 } + lambdaCall(fun(i) { + //Breakpoint! + val a = 1 + }) + inlinedLambdaCall { //Breakpoint! val a = 1 @@ -28,12 +38,12 @@ fun callFromTopLevel() { } multipleCrossInline({ - //Breakpoint! - val a = 1 - }, { - //Breakpoint! - val a = 1 - }) + //Breakpoint! + val a = 1 + }, { + //Breakpoint! + val a = 1 + }) lambdaInInlinedLambdaCall { //Breakpoint! @@ -82,13 +92,26 @@ inline fun inlinedLambdaCall(crossinline f: (Int) -> Unit) { inline fun objectCall(crossinline f: (Int) -> Unit) { val a = object { + init { + //Breakpoint! + f(1) + } + fun objFun() { //Breakpoint! f(1) } + + val a: Int + get() { + //Breakpoint! + f(1) + return 1 + } } a.objFun() + a.a } inline fun multipleCrossInline(crossinline f1: (Int) -> Unit, crossinline f2: (Int) -> Unit) { @@ -117,4 +140,4 @@ inline fun lambdaInInlinedLambdaCall(crossinline f: (Int) -> Unit) { } } -// RESUME: 17 \ No newline at end of file +// RESUME: 35 \ No newline at end of file