From 39662c09e9bf693a5a4d7d4c67a7f1e708d84891 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 13 Aug 2019 22:10:23 +0900 Subject: [PATCH] Debugger: Fix breakpoints and stepping on a first line (KT-33304) This commit fixes the 'SmartStepIntoTestGenerated#testFunWithExpressionBody' test. --- .../jetbrains/kotlin/idea/core/util/CodeInsightUtils.java | 7 ++++++- .../breakpoints/LineBreakpointExpressionVisitor.kt | 8 ++++++++ .../idea/debugger/breakpoints/breakpointTypeUtils.kt | 7 ++----- .../testData/breakpointApplicability/inlineOnly.kt | 2 +- .../testData/breakpointApplicability/locals.kt | 2 +- .../testData/breakpointApplicability/properties.kt | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/util/CodeInsightUtils.java b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/util/CodeInsightUtils.java index 056299bede9..f59b975cdef 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/util/CodeInsightUtils.java +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/util/CodeInsightUtils.java @@ -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); diff --git a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/breakpoints/LineBreakpointExpressionVisitor.kt b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/breakpoints/LineBreakpointExpressionVisitor.kt index 042ee870a89..a16b0c60ba1 100644 --- a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/breakpoints/LineBreakpointExpressionVisitor.kt +++ b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/breakpoints/LineBreakpointExpressionVisitor.kt @@ -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 diff --git a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt index b7bc48b076d..07ed716303e 100644 --- a/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt +++ b/idea/jvm-debugger/jvm-debugger-core/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt @@ -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 diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/inlineOnly.kt b/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/inlineOnly.kt index 706c32abd99..9e3bc9b4ff6 100644 --- a/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/inlineOnly.kt +++ b/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/inlineOnly.kt @@ -1,4 +1,4 @@ -fun foo() { +fun foo() { /// M require(true) { "foo" } /// *, L, λ require(true) { val a = 5 } /// *, L, λ diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/locals.kt b/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/locals.kt index 6d2215ae6dd..08266371613 100644 --- a/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/locals.kt +++ b/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/locals.kt @@ -1,4 +1,4 @@ -fun foo1() { +fun foo1() { /// M // We don't support function breakpoints for local functions yet fun local() { /// L println() /// L diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/properties.kt b/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/properties.kt index e26f67f666f..601614f2939 100644 --- a/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/properties.kt +++ b/idea/jvm-debugger/jvm-debugger-test/testData/breakpointApplicability/properties.kt @@ -1,4 +1,4 @@ -class Foo1 { +class Foo1 { /// M val x: String /// F, L get() = "foo" /// M }