Skip to content

Commit 9d2d71d

Browse files
committed
Fix dynamic breakpoint placement in local/inner classes
Previously, breakpoints were not placed correctly in local types after being loaded as only the top-level class name was filtered.
1 parent 327b11d commit 9d2d71d

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ target
99
.DS_Store
1010
node_modules
1111
*.vsix
12+
*.log
1213
out

adapter/src/main/kotlin/org/javacs/ktda/jdi/JDIDebuggee.kt

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -97,30 +97,36 @@ class JDIDebuggee(
9797
/** Tries to set a breakpoint */
9898
private fun setBreakpoint(filePath: String, lineNumber: Long) {
9999
val eventRequestManager = vm.eventRequestManager()
100+
100101
toJVMClassNames(filePath)
101-
.flatMap { listOf(it, "$it$*") } // For local types
102102
.forEach { className ->
103103
// Try setting breakpoint using a ClassPrepareRequest
104104

105-
val request = eventRequestManager
106-
.createClassPrepareRequest()
107-
.apply { addClassFilter(className) }
105+
for (name in listOf(className, "$className$*")) { // For local types
106+
val request = eventRequestManager
107+
.createClassPrepareRequest()
108+
.apply { addClassFilter(className) }
108109

109-
breakpointSubscriptions.add(eventBus.subscribe(ClassPrepareEvent::class) {
110-
if (it.jdiEvent.request() == request) {
111-
LOG.info("Setting breakpoint at prepared type {}", it.jdiEvent.referenceType().name())
112-
setBreakpointAtType(it.jdiEvent.referenceType(), lineNumber)
113-
}
114-
})
115-
116-
request.enable()
110+
breakpointSubscriptions.add(eventBus.subscribe(ClassPrepareEvent::class) {
111+
if (it.jdiEvent.request() == request) {
112+
val referenceType = it.jdiEvent.referenceType()
113+
LOG.trace("Setting breakpoint at prepared type {}", referenceType.name())
114+
setBreakpointAtType(referenceType, lineNumber)
115+
}
116+
})
117+
118+
request.enable()
119+
}
117120

118121
// Try setting breakpoint using loaded VM classes
119122

120-
vm.classesByName(className).forEach {
121-
LOG.info("Setting breakpoint at known type {}", it.name())
122-
setBreakpointAtType(it, lineNumber)
123-
}
123+
val classPattern = "^${Regex.escape(className)}(?:\\$.*)?".toRegex()
124+
vm.allClasses()
125+
.filter { classPattern.matches(it.name()) }
126+
.forEach {
127+
LOG.trace("Setting breakpoint at known type {}", it.name())
128+
setBreakpointAtType(it, lineNumber)
129+
}
124130
}
125131
}
126132

0 commit comments

Comments
 (0)