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.
This commit is contained in:
Yan Zhulanow
2019-10-10 21:30:10 +09:00
parent fa45122c6b
commit 87e0a2d98c
7 changed files with 36 additions and 5 deletions
@@ -328,7 +328,12 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
if (originalSubstitutor.isEmpty()) { if (originalSubstitutor.isEmpty()) {
return this; return this;
} }
return newCopyBuilder(originalSubstitutor).setOriginal(getOriginal()).setJustForTypeSubstitution(true).build();
return newCopyBuilder(originalSubstitutor)
.setOriginal(getOriginal())
.setPreserveSourceElement()
.setJustForTypeSubstitution(true)
.build();
} }
@Nullable @Nullable
@@ -190,6 +190,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/functionDeclaration.kt"); 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") @TestMetadata("genericCrossinlineArgument.kt")
public void testGenericCrossinlineArgument() throws Exception { public void testGenericCrossinlineArgument() throws Exception {
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/genericCrossinlineArgument.kt"); runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/genericCrossinlineArgument.kt");
@@ -0,0 +1,6 @@
package functionWithBodyExpression
fun main() {
//Breakpoint!
val a = 5
}
@@ -0,0 +1,4 @@
fun f2() = "f2"
f2()
// RESULT: "f2": Ljava/lang/String;
@@ -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
@@ -2,8 +2,8 @@
<html> <html>
Overload resolution ambiguity. All these functions match. Overload resolution ambiguity. All these functions match.
<ul> <ul>
<li><b>public</b> <b>fun</b> <`T> foo(b: a.b.String, t: ???): Unit <i>defined in</i> a.b</li> <li><b>public</b> <b>fun</b> <`T> foo(b: a.b.String, t: ???): Unit <i>defined in</i> a.b <i>in file</i> overloadResolutionAmbiguityHtml.kt</li>
<li><b>public</b> <b>fun</b> foo(i: Int): Unit <i>defined in</i> a.b <i>in file</i> overloadResolutionAmbiguityHtml.kt</li> <li><b>public</b> <b>fun</b> foo(i: Int): Unit <i>defined in</i> a.b <i>in file</i> overloadResolutionAmbiguityHtml.kt</li>
<li><b>public</b> <b>fun</b> <`T> foo(a: kotlin.String, t: ???): Unit <i>defined in</i> a.b</li> <li><b>public</b> <b>fun</b> <`T> foo(a: kotlin.String, t: ???): Unit <i>defined in</i> a.b <i>in file</i> overloadResolutionAmbiguityHtml.kt</li>
</ul> </ul>
</html> </html>
@@ -1,5 +1,5 @@
<!-- overloadResolutionAmbiguityTxt1 --> <!-- overloadResolutionAmbiguityTxt1 -->
Overload resolution ambiguity: Overload resolution ambiguity:
public fun <T> foo(b: a.b.String, t: ???): Unit defined in a.b public fun <T> 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(i: Int): Unit defined in a.b in file overloadResolutionAmbiguityTxt.kt
public fun <T> foo(a: kotlin.String, t: ???): Unit defined in a.b public fun <T> foo(a: kotlin.String, t: ???): Unit defined in a.b in file overloadResolutionAmbiguityTxt.kt