Debugger: Fix breakpoints and stepping on a first line (KT-33304)

This commit fixes the 'SmartStepIntoTestGenerated#testFunWithExpressionBody' test.
This commit is contained in:
Yan Zhulanow
2019-08-13 22:10:23 +09:00
parent c3e46ebe5c
commit 39662c09e9
6 changed files with 19 additions and 9 deletions
@@ -319,9 +319,14 @@ public class CodeInsightUtils {
public static PsiElement getTopmostElementAtOffset(@NotNull PsiElement element, int offset) {
do {
PsiElement parent = element.getParent();
if (parent == null || (parent.getTextOffset() < offset) || parent instanceof KtBlockExpression) {
if (parent == null
|| (parent.getTextOffset() < offset)
|| parent instanceof KtBlockExpression
|| parent instanceof PsiFile
) {
break;
}
element = parent;
}
while(true);
@@ -95,6 +95,14 @@ class LineBreakpointExpressionVisitor private constructor(
return ApplicabilityResult.UNKNOWN
}
override fun visitPackageDirective(directive: KtPackageDirective, data: Unit?): ApplicabilityResult {
return ApplicabilityResult.UNKNOWN
}
override fun visitImportDirective(importDirective: KtImportDirective, data: Unit?): ApplicabilityResult {
return ApplicabilityResult.UNKNOWN
}
override fun visitProperty(property: KtProperty, data: Unit?): ApplicabilityResult {
if (property.hasModifier(KtTokens.CONST_KEYWORD)) {
return ApplicabilityResult.UNKNOWN
@@ -23,10 +23,7 @@ import com.intellij.openapi.editor.Document
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.*
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.xdebugger.XDebuggerUtil
import com.intellij.xdebugger.XSourcePosition
@@ -114,7 +111,7 @@ fun isBreakpointApplicable(file: VirtualFile, line: Int, project: Project, check
private fun getTopmostParentOnLineOrSelf(element: PsiElement, document: Document, line: Int): PsiElement {
var current = element
var parent = current.parent
while (parent != null) {
while (parent != null && parent !is PsiFile) {
val offset = parent.textOffset
if (offset > document.textLength) {
val containingFile = element.containingFile
@@ -1,4 +1,4 @@
fun foo() {
fun foo() { /// M
require(true) { "foo" } /// *, L, λ
require(true) { val a = 5 } /// *, L, λ
@@ -1,4 +1,4 @@
fun foo1() {
fun foo1() { /// M
// We don't support function breakpoints for local functions yet
fun local() { /// L
println() /// L
@@ -1,4 +1,4 @@
class Foo1 {
class Foo1 { /// M
val x: String /// F, L
get() = "foo" /// M
}