Support breakpoints in anonymous objects with usages of cross inline argument
This commit is contained in:
@@ -360,9 +360,10 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M
|
||||
|
||||
private fun getInternalClassNameForElement(notPositionedElement: PsiElement?, typeMapper: JetTypeMapper, file: KtFile, isInLibrary: Boolean): Collection<String> {
|
||||
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<ValueParameterDescriptor> {
|
||||
fun KtFunction.hasParameterCall(parameter: KtParameter): Boolean {
|
||||
private fun KtElement.containsCrossInlineParameterUsages(context: BindingContext): Collection<ValueParameterDescriptor> {
|
||||
fun KtElement.hasParameterCall(parameter: KtParameter): Boolean {
|
||||
return ReferencesSearch.search(parameter).any {
|
||||
this.textRange.contains(it.element.textRange)
|
||||
}
|
||||
|
||||
+43
-23
@@ -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
|
||||
|
||||
@@ -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
|
||||
// RESUME: 35
|
||||
Reference in New Issue
Block a user