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> {
|
private fun getInternalClassNameForElement(notPositionedElement: PsiElement?, typeMapper: JetTypeMapper, file: KtFile, isInLibrary: Boolean): Collection<String> {
|
||||||
val element = getElementToCalculateClassName(notPositionedElement)
|
val element = getElementToCalculateClassName(notPositionedElement)
|
||||||
when {
|
|
||||||
element is KtClassOrObject -> return getJvmInternalNameForImpl(typeMapper, element).toSet()
|
when (element) {
|
||||||
element is KtFunctionLiteral -> {
|
is KtClassOrObject -> return getJvmInternalNameForImpl(typeMapper, element).toSet()
|
||||||
|
is KtFunction -> {
|
||||||
val descriptor = InlineUtil.getInlineArgumentDescriptor(element, typeMapper.bindingContext)
|
val descriptor = InlineUtil.getInlineArgumentDescriptor(element, typeMapper.bindingContext)
|
||||||
if (descriptor != null) {
|
if (descriptor != null) {
|
||||||
val classNamesForParent = getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary)
|
val classNamesForParent = getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary)
|
||||||
@@ -371,15 +372,18 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M
|
|||||||
}
|
}
|
||||||
return classNamesForParent
|
return classNamesForParent
|
||||||
}
|
}
|
||||||
else {
|
}
|
||||||
val crossInlineParameterUsages = element.containsCrossInlineParameterUsages(typeMapper.bindingContext)
|
}
|
||||||
if (crossInlineParameterUsages.isNotEmpty()) {
|
|
||||||
return classNamesForCrossInlineParameters(crossInlineParameterUsages, typeMapper.bindingContext)
|
|
||||||
}
|
|
||||||
|
|
||||||
val asmType = CodegenBinding.asmTypeForAnonymousClass(typeMapper.bindingContext, element)
|
val crossInlineParameterUsages = element?.containsCrossInlineParameterUsages(typeMapper.bindingContext)
|
||||||
return asmType.internalName.toSet()
|
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 -> {
|
element is KtAnonymousInitializer -> {
|
||||||
val parent = getElementToCalculateClassName(element.parent)
|
val parent = getElementToCalculateClassName(element.parent)
|
||||||
@@ -405,15 +409,6 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M
|
|||||||
return getJvmInternalNameForPropertyOwner(typeMapper, descriptor).toSet()
|
return getJvmInternalNameForPropertyOwner(typeMapper, descriptor).toSet()
|
||||||
}
|
}
|
||||||
element is KtNamedFunction -> {
|
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 parent = getElementToCalculateClassName(element.parent)
|
||||||
val parentInternalName = if (parent is KtClassOrObject) {
|
val parentInternalName = if (parent is KtClassOrObject) {
|
||||||
getJvmInternalNameForImpl(typeMapper, parent)
|
getJvmInternalNameForImpl(typeMapper, parent)
|
||||||
@@ -524,8 +519,8 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M
|
|||||||
return "$newName$*"
|
return "$newName$*"
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KtFunction.containsCrossInlineParameterUsages(context: BindingContext): Collection<ValueParameterDescriptor> {
|
private fun KtElement.containsCrossInlineParameterUsages(context: BindingContext): Collection<ValueParameterDescriptor> {
|
||||||
fun KtFunction.hasParameterCall(parameter: KtParameter): Boolean {
|
fun KtElement.hasParameterCall(parameter: KtParameter): Boolean {
|
||||||
return ReferencesSearch.search(parameter).any {
|
return ReferencesSearch.search(parameter).any {
|
||||||
this.textRange.contains(it.element.textRange)
|
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:22
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:27
|
LineBreakpoint created at crossinlineLiteral.kt:27
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:32
|
LineBreakpoint created at crossinlineLiteral.kt:32
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:35
|
LineBreakpoint created at crossinlineLiteral.kt:37
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:40
|
LineBreakpoint created at crossinlineLiteral.kt:42
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:48
|
LineBreakpoint created at crossinlineLiteral.kt:45
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:56
|
LineBreakpoint created at crossinlineLiteral.kt:50
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:64
|
LineBreakpoint created at crossinlineLiteral.kt:58
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:70
|
LineBreakpoint created at crossinlineLiteral.kt:66
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:79
|
LineBreakpoint created at crossinlineLiteral.kt:74
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:87
|
LineBreakpoint created at crossinlineLiteral.kt:80
|
||||||
|
LineBreakpoint created at crossinlineLiteral.kt:89
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:97
|
LineBreakpoint created at crossinlineLiteral.kt:97
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:104
|
LineBreakpoint created at crossinlineLiteral.kt:102
|
||||||
LineBreakpoint created at crossinlineLiteral.kt:114
|
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
|
!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'
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
crossinlineLiteral.kt:64
|
crossinlineLiteral.kt:74
|
||||||
crossinlineLiteral.kt:12
|
crossinlineLiteral.kt:12
|
||||||
crossinlineLiteral.kt:70
|
crossinlineLiteral.kt:74
|
||||||
crossinlineLiteral.kt:17
|
crossinlineLiteral.kt:17
|
||||||
crossinlineLiteral.kt:79
|
crossinlineLiteral.kt:80
|
||||||
crossinlineLiteral.kt:22
|
crossinlineLiteral.kt:22
|
||||||
crossinlineLiteral.kt:87
|
crossinlineLiteral.kt:80
|
||||||
crossinlineLiteral.kt:27
|
crossinlineLiteral.kt:27
|
||||||
crossinlineLiteral.kt:97
|
crossinlineLiteral.kt:89
|
||||||
crossinlineLiteral.kt:32
|
crossinlineLiteral.kt:32
|
||||||
crossinlineLiteral.kt:104
|
crossinlineLiteral.kt:97
|
||||||
crossinlineLiteral.kt:35
|
crossinlineLiteral.kt:37
|
||||||
crossinlineLiteral.kt:114
|
crossinlineLiteral.kt:102
|
||||||
crossinlineLiteral.kt:40
|
crossinlineLiteral.kt:37
|
||||||
crossinlineLiteral.kt:87
|
crossinlineLiteral.kt:108
|
||||||
crossinlineLiteral.kt:48
|
crossinlineLiteral.kt:37
|
||||||
crossinlineLiteral.kt:87
|
crossinlineLiteral.kt:120
|
||||||
crossinlineLiteral.kt:56
|
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'
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
Process finished with exit code 0
|
Process finished with exit code 0
|
||||||
|
|||||||
@@ -12,11 +12,21 @@ fun callFromTopLevel() {
|
|||||||
val a = 1
|
val a = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
simpleCall(fun(i) {
|
||||||
|
//Breakpoint!
|
||||||
|
val a = 1
|
||||||
|
})
|
||||||
|
|
||||||
lambdaCall {
|
lambdaCall {
|
||||||
//Breakpoint!
|
//Breakpoint!
|
||||||
val a = 1
|
val a = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lambdaCall(fun(i) {
|
||||||
|
//Breakpoint!
|
||||||
|
val a = 1
|
||||||
|
})
|
||||||
|
|
||||||
inlinedLambdaCall {
|
inlinedLambdaCall {
|
||||||
//Breakpoint!
|
//Breakpoint!
|
||||||
val a = 1
|
val a = 1
|
||||||
@@ -28,12 +38,12 @@ fun callFromTopLevel() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
multipleCrossInline({
|
multipleCrossInline({
|
||||||
//Breakpoint!
|
//Breakpoint!
|
||||||
val a = 1
|
val a = 1
|
||||||
}, {
|
}, {
|
||||||
//Breakpoint!
|
//Breakpoint!
|
||||||
val a = 1
|
val a = 1
|
||||||
})
|
})
|
||||||
|
|
||||||
lambdaInInlinedLambdaCall {
|
lambdaInInlinedLambdaCall {
|
||||||
//Breakpoint!
|
//Breakpoint!
|
||||||
@@ -82,13 +92,26 @@ inline fun inlinedLambdaCall(crossinline f: (Int) -> Unit) {
|
|||||||
|
|
||||||
inline fun objectCall(crossinline f: (Int) -> Unit) {
|
inline fun objectCall(crossinline f: (Int) -> Unit) {
|
||||||
val a = object {
|
val a = object {
|
||||||
|
init {
|
||||||
|
//Breakpoint!
|
||||||
|
f(1)
|
||||||
|
}
|
||||||
|
|
||||||
fun objFun() {
|
fun objFun() {
|
||||||
//Breakpoint!
|
//Breakpoint!
|
||||||
f(1)
|
f(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val a: Int
|
||||||
|
get() {
|
||||||
|
//Breakpoint!
|
||||||
|
f(1)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a.objFun()
|
a.objFun()
|
||||||
|
a.a
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun multipleCrossInline(crossinline f1: (Int) -> Unit, crossinline f2: (Int) -> Unit) {
|
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