From 87e0a2d98cc3bbd5a2a7bebaec44b857389be57c Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 10 Oct 2019 21:30:10 +0900 Subject: [PATCH] Debugger: Fix evaluation of function declarations with expression bodies (KT-32704) Before this commit, the substituted FunctionDescriptor didn't have a source element. As a result, 'CodeFragmentParameterAnalyzer.isCodeFragmentDeclaration' failed to recognize such a descriptor as fragment-local, and it was erroneously captured. --- .../descriptors/impl/FunctionDescriptorImpl.java | 7 ++++++- .../test/KotlinEvaluateExpressionTestGenerated.java | 5 +++++ .../singleBreakpoint/functionWithBodyExpression.kt | 6 ++++++ .../functionWithBodyExpression.kt.fragment | 4 ++++ .../singleBreakpoint/functionWithBodyExpression.out | 11 +++++++++++ .../overloadResolutionAmbiguityHtml1.html | 4 ++-- .../overloadResolutionAmbiguityTxt1.txt | 4 ++-- 7 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.kt create mode 100644 idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.kt.fragment create mode 100644 idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.out diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java index 2842c4f1fcd..7729c06faa3 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -328,7 +328,12 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo if (originalSubstitutor.isEmpty()) { return this; } - return newCopyBuilder(originalSubstitutor).setOriginal(getOriginal()).setJustForTypeSubstitution(true).build(); + + return newCopyBuilder(originalSubstitutor) + .setOriginal(getOriginal()) + .setPreserveSourceElement() + .setJustForTypeSubstitution(true) + .build(); } @Nullable diff --git a/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinEvaluateExpressionTestGenerated.java b/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinEvaluateExpressionTestGenerated.java index 2563152104b..6e06bcd5417 100644 --- a/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinEvaluateExpressionTestGenerated.java @@ -190,6 +190,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionDeclaration.kt"); } + @TestMetadata("functionWithBodyExpression.kt") + public void testFunctionWithBodyExpression() throws Exception { + runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.kt"); + } + @TestMetadata("genericCrossinlineArgument.kt") public void testGenericCrossinlineArgument() throws Exception { runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/genericCrossinlineArgument.kt"); diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.kt b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.kt new file mode 100644 index 00000000000..106e6c466c1 --- /dev/null +++ b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.kt @@ -0,0 +1,6 @@ +package functionWithBodyExpression + +fun main() { + //Breakpoint! + val a = 5 +} \ No newline at end of file diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.kt.fragment b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.kt.fragment new file mode 100644 index 00000000000..c5613960665 --- /dev/null +++ b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.kt.fragment @@ -0,0 +1,4 @@ +fun f2() = "f2" +f2() + +// RESULT: "f2": Ljava/lang/String; \ No newline at end of file diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.out b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.out new file mode 100644 index 00000000000..238eecf02da --- /dev/null +++ b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionWithBodyExpression.out @@ -0,0 +1,11 @@ +LineBreakpoint created at functionWithBodyExpression.kt:5 +Run Java +Connected to the target VM +functionWithBodyExpression.kt:5 +Compile bytecode for fun f2() = "f2" +f2() + +// RESULT: "f2": Ljava/lang/String; +Disconnected from the target VM + +Process finished with exit code 0 diff --git a/idea/testData/diagnosticMessage/overloadResolutionAmbiguityHtml1.html b/idea/testData/diagnosticMessage/overloadResolutionAmbiguityHtml1.html index 26ceb028937..7d6b6040089 100644 --- a/idea/testData/diagnosticMessage/overloadResolutionAmbiguityHtml1.html +++ b/idea/testData/diagnosticMessage/overloadResolutionAmbiguityHtml1.html @@ -2,8 +2,8 @@ Overload resolution ambiguity. All these functions match. \ No newline at end of file diff --git a/idea/testData/diagnosticMessage/overloadResolutionAmbiguityTxt1.txt b/idea/testData/diagnosticMessage/overloadResolutionAmbiguityTxt1.txt index 82df8f335f1..3f3ccde7c4d 100644 --- a/idea/testData/diagnosticMessage/overloadResolutionAmbiguityTxt1.txt +++ b/idea/testData/diagnosticMessage/overloadResolutionAmbiguityTxt1.txt @@ -1,5 +1,5 @@ Overload resolution ambiguity: -public fun foo(b: a.b.String, t: ???): Unit defined in a.b +public fun foo(b: a.b.String, t: ???): Unit defined in a.b in file overloadResolutionAmbiguityTxt.kt public fun foo(i: Int): Unit defined in a.b in file overloadResolutionAmbiguityTxt.kt -public fun foo(a: kotlin.String, t: ???): Unit defined in a.b \ No newline at end of file +public fun foo(a: kotlin.String, t: ???): Unit defined in a.b in file overloadResolutionAmbiguityTxt.kt \ No newline at end of file