Support breakpoints in anonymous objects with usages of cross inline argument

This commit is contained in:
Natalia Ukhorskaya
2015-12-30 14:37:34 +03:00
parent 754b02aa3c
commit ad9303b97b
3 changed files with 90 additions and 52 deletions
@@ -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
View File
@@ -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