Skip to content

Commit ad9303b

Browse files
Support breakpoints in anonymous objects with usages of cross inline argument
1 parent 754b02a commit ad9303b

File tree

3 files changed

+90
-52
lines changed

3 files changed

+90
-52
lines changed

idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -360,9 +360,10 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M
360360

361361
private fun getInternalClassNameForElement(notPositionedElement: PsiElement?, typeMapper: JetTypeMapper, file: KtFile, isInLibrary: Boolean): Collection<String> {
362362
val element = getElementToCalculateClassName(notPositionedElement)
363-
when {
364-
element is KtClassOrObject -> return getJvmInternalNameForImpl(typeMapper, element).toSet()
365-
element is KtFunctionLiteral -> {
363+
364+
when (element) {
365+
is KtClassOrObject -> return getJvmInternalNameForImpl(typeMapper, element).toSet()
366+
is KtFunction -> {
366367
val descriptor = InlineUtil.getInlineArgumentDescriptor(element, typeMapper.bindingContext)
367368
if (descriptor != null) {
368369
val classNamesForParent = getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary)
@@ -371,15 +372,18 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M
371372
}
372373
return classNamesForParent
373374
}
374-
else {
375-
val crossInlineParameterUsages = element.containsCrossInlineParameterUsages(typeMapper.bindingContext)
376-
if (crossInlineParameterUsages.isNotEmpty()) {
377-
return classNamesForCrossInlineParameters(crossInlineParameterUsages, typeMapper.bindingContext)
378-
}
375+
}
376+
}
379377

380-
val asmType = CodegenBinding.asmTypeForAnonymousClass(typeMapper.bindingContext, element)
381-
return asmType.internalName.toSet()
382-
}
378+
val crossInlineParameterUsages = element?.containsCrossInlineParameterUsages(typeMapper.bindingContext)
379+
if (crossInlineParameterUsages != null && crossInlineParameterUsages.isNotEmpty()) {
380+
return classNamesForCrossInlineParameters(crossInlineParameterUsages, typeMapper.bindingContext)
381+
}
382+
383+
when {
384+
element is KtFunctionLiteral -> {
385+
val asmType = CodegenBinding.asmTypeForAnonymousClass(typeMapper.bindingContext, element)
386+
return asmType.internalName.toSet()
383387
}
384388
element is KtAnonymousInitializer -> {
385389
val parent = getElementToCalculateClassName(element.parent)
@@ -405,15 +409,6 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M
405409
return getJvmInternalNameForPropertyOwner(typeMapper, descriptor).toSet()
406410
}
407411
element is KtNamedFunction -> {
408-
if (isInlinedLambda(element, typeMapper.bindingContext)) {
409-
return getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary)
410-
}
411-
412-
val crossInlineParameterUsages = element.containsCrossInlineParameterUsages(typeMapper.bindingContext)
413-
if (crossInlineParameterUsages.isNotEmpty()) {
414-
return classNamesForCrossInlineParameters(crossInlineParameterUsages, typeMapper.bindingContext)
415-
}
416-
417412
val parent = getElementToCalculateClassName(element.parent)
418413
val parentInternalName = if (parent is KtClassOrObject) {
419414
getJvmInternalNameForImpl(typeMapper, parent)
@@ -524,8 +519,8 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M
524519
return "$newName$*"
525520
}
526521

527-
private fun KtFunction.containsCrossInlineParameterUsages(context: BindingContext): Collection<ValueParameterDescriptor> {
528-
fun KtFunction.hasParameterCall(parameter: KtParameter): Boolean {
522+
private fun KtElement.containsCrossInlineParameterUsages(context: BindingContext): Collection<ValueParameterDescriptor> {
523+
fun KtElement.hasParameterCall(parameter: KtParameter): Boolean {
529524
return ReferencesSearch.search(parameter).any {
530525
this.textRange.contains(it.element.textRange)
531526
}

idea/testData/debugger/tinyApp/outs/crossinlineLiteral.out

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,57 @@ LineBreakpoint created at crossinlineLiteral.kt:17
33
LineBreakpoint created at crossinlineLiteral.kt:22
44
LineBreakpoint created at crossinlineLiteral.kt:27
55
LineBreakpoint created at crossinlineLiteral.kt:32
6-
LineBreakpoint created at crossinlineLiteral.kt:35
7-
LineBreakpoint created at crossinlineLiteral.kt:40
8-
LineBreakpoint created at crossinlineLiteral.kt:48
9-
LineBreakpoint created at crossinlineLiteral.kt:56
10-
LineBreakpoint created at crossinlineLiteral.kt:64
11-
LineBreakpoint created at crossinlineLiteral.kt:70
12-
LineBreakpoint created at crossinlineLiteral.kt:79
13-
LineBreakpoint created at crossinlineLiteral.kt:87
6+
LineBreakpoint created at crossinlineLiteral.kt:37
7+
LineBreakpoint created at crossinlineLiteral.kt:42
8+
LineBreakpoint created at crossinlineLiteral.kt:45
9+
LineBreakpoint created at crossinlineLiteral.kt:50
10+
LineBreakpoint created at crossinlineLiteral.kt:58
11+
LineBreakpoint created at crossinlineLiteral.kt:66
12+
LineBreakpoint created at crossinlineLiteral.kt:74
13+
LineBreakpoint created at crossinlineLiteral.kt:80
14+
LineBreakpoint created at crossinlineLiteral.kt:89
1415
LineBreakpoint created at crossinlineLiteral.kt:97
15-
LineBreakpoint created at crossinlineLiteral.kt:104
16-
LineBreakpoint created at crossinlineLiteral.kt:114
16+
LineBreakpoint created at crossinlineLiteral.kt:102
17+
LineBreakpoint created at crossinlineLiteral.kt:108
18+
LineBreakpoint created at crossinlineLiteral.kt:120
19+
LineBreakpoint created at crossinlineLiteral.kt:127
20+
LineBreakpoint created at crossinlineLiteral.kt:137
1721
!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
1822
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
19-
crossinlineLiteral.kt:64
23+
crossinlineLiteral.kt:74
2024
crossinlineLiteral.kt:12
21-
crossinlineLiteral.kt:70
25+
crossinlineLiteral.kt:74
2226
crossinlineLiteral.kt:17
23-
crossinlineLiteral.kt:79
27+
crossinlineLiteral.kt:80
2428
crossinlineLiteral.kt:22
25-
crossinlineLiteral.kt:87
29+
crossinlineLiteral.kt:80
2630
crossinlineLiteral.kt:27
27-
crossinlineLiteral.kt:97
31+
crossinlineLiteral.kt:89
2832
crossinlineLiteral.kt:32
29-
crossinlineLiteral.kt:104
30-
crossinlineLiteral.kt:35
31-
crossinlineLiteral.kt:114
32-
crossinlineLiteral.kt:40
33-
crossinlineLiteral.kt:87
34-
crossinlineLiteral.kt:48
35-
crossinlineLiteral.kt:87
36-
crossinlineLiteral.kt:56
33+
crossinlineLiteral.kt:97
34+
crossinlineLiteral.kt:37
35+
crossinlineLiteral.kt:102
36+
crossinlineLiteral.kt:37
37+
crossinlineLiteral.kt:108
38+
crossinlineLiteral.kt:37
39+
crossinlineLiteral.kt:120
40+
crossinlineLiteral.kt:42
41+
crossinlineLiteral.kt:127
42+
crossinlineLiteral.kt:45
43+
crossinlineLiteral.kt:137
44+
crossinlineLiteral.kt:50
45+
crossinlineLiteral.kt:97
46+
crossinlineLiteral.kt:58
47+
crossinlineLiteral.kt:102
48+
crossinlineLiteral.kt:58
49+
crossinlineLiteral.kt:108
50+
crossinlineLiteral.kt:58
51+
crossinlineLiteral.kt:97
52+
crossinlineLiteral.kt:66
53+
crossinlineLiteral.kt:102
54+
crossinlineLiteral.kt:66
55+
crossinlineLiteral.kt:108
56+
crossinlineLiteral.kt:66
3757
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
3858

3959
Process finished with exit code 0

idea/testData/debugger/tinyApp/src/stepping/custom/crossinlineLiteral.kt

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,21 @@ fun callFromTopLevel() {
1212
val a = 1
1313
}
1414

15+
simpleCall(fun(i) {
16+
//Breakpoint!
17+
val a = 1
18+
})
19+
1520
lambdaCall {
1621
//Breakpoint!
1722
val a = 1
1823
}
1924

25+
lambdaCall(fun(i) {
26+
//Breakpoint!
27+
val a = 1
28+
})
29+
2030
inlinedLambdaCall {
2131
//Breakpoint!
2232
val a = 1
@@ -28,12 +38,12 @@ fun callFromTopLevel() {
2838
}
2939

3040
multipleCrossInline({
31-
//Breakpoint!
32-
val a = 1
33-
}, {
34-
//Breakpoint!
35-
val a = 1
36-
})
41+
//Breakpoint!
42+
val a = 1
43+
}, {
44+
//Breakpoint!
45+
val a = 1
46+
})
3747

3848
lambdaInInlinedLambdaCall {
3949
//Breakpoint!
@@ -82,13 +92,26 @@ inline fun inlinedLambdaCall(crossinline f: (Int) -> Unit) {
8292

8393
inline fun objectCall(crossinline f: (Int) -> Unit) {
8494
val a = object {
95+
init {
96+
//Breakpoint!
97+
f(1)
98+
}
99+
85100
fun objFun() {
86101
//Breakpoint!
87102
f(1)
88103
}
104+
105+
val a: Int
106+
get() {
107+
//Breakpoint!
108+
f(1)
109+
return 1
110+
}
89111
}
90112

91113
a.objFun()
114+
a.a
92115
}
93116

94117
inline fun multipleCrossInline(crossinline f1: (Int) -> Unit, crossinline f2: (Int) -> Unit) {
@@ -117,4 +140,4 @@ inline fun lambdaInInlinedLambdaCall(crossinline f: (Int) -> Unit) {
117140
}
118141
}
119142

120-
// RESUME: 17
143+
// RESUME: 35

0 commit comments

Comments
 (0)