From cadb70f64a7db5a5f16ce682471915208d287633 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 21 Feb 2019 00:52:19 +0300 Subject: [PATCH] Evaluator: Allow to evaluate expression on synthetic lines in .kt files --- .../evaluate/KotlinEvaluationBuilder.kt | 4 ++-- .../evaluate/singleBreakpoint/dataClassCopy.kt | 18 ++++++++++++++++++ .../singleBreakpoint/dataClassCopy.out | 10 ++++++++++ .../KotlinEvaluateExpressionTestGenerated.java | 5 +++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/dataClassCopy.kt create mode 100644 idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/dataClassCopy.out diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt index 999a5fbfe9e..42251c4e150 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt @@ -89,12 +89,12 @@ object KotlinEvaluationBuilder : EvaluatorBuilder { return EvaluatorBuilderImpl.getInstance()!!.build(codeFragment, position) } - if (position.line < 0) { + if (position.line < 0 && position.file !is KtFile) { evaluationException("Couldn't evaluate Kotlin expression at $position") } val file = position.file - if (file is KtFile) { + if (file is KtFile && position.line >= 0) { val document = PsiDocumentManager.getInstance(file.project).getDocument(file) if (document == null || document.lineCount < position.line) { evaluationException( diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/dataClassCopy.kt b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/dataClassCopy.kt new file mode 100644 index 00000000000..3fb798725ff --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/dataClassCopy.kt @@ -0,0 +1,18 @@ +package dataClassCopy + +fun main() { + val a = Foo("foo") + //Breakpoint! + a.copy("bar") +} + +data class Foo(val a: String) + +// STEP_INTO: 1 +// STEP_OUT: 1 + +// EXPRESSION: Foo("baz") +// RESULT: instance of dataClassCopy.Foo(id=ID): LdataClassCopy/Foo; + +// EXPRESSION: a +// RESULT: Unresolved reference: a \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/dataClassCopy.out b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/dataClassCopy.out new file mode 100644 index 00000000000..7167326bfd3 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/dataClassCopy.out @@ -0,0 +1,10 @@ +LineBreakpoint created at dataClassCopy.kt:6 +Run Java +Connected to the target VM +dataClassCopy.kt:6 +dataClassCopy.kt:9 +dataClassCopy.kt:-1 +Compile bytecode for Foo("baz") +Disconnected from the target VM + +Process finished with exit code 0 diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java index f9537a61912..8691da5dc9b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java @@ -91,6 +91,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/collections.kt"); } + @TestMetadata("dataClassCopy.kt") + public void testDataClassCopy() throws Exception { + runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/dataClassCopy.kt"); + } + @TestMetadata("defaultParameterValues.kt") public void testDefaultParameterValues() throws Exception { runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/defaultParameterValues.kt");