From 3027fab238845cc9219d757e58e29c54ef105afa Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 15 Jan 2020 23:10:34 +0900 Subject: [PATCH] EA-218160: Force-box only assignment l-values --- .../CodeFragmentParameterAnalyzer.kt | 11 ++++-- ...KotlinEvaluateExpressionTestGenerated.java | 5 +++ .../singleBreakpoint/nonAssignmentLValue.kt | 14 +++++++ .../singleBreakpoint/nonAssignmentLValue.out | 37 +++++++++++++++++++ 4 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nonAssignmentLValue.kt create mode 100644 idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nonAssignmentLValue.out diff --git a/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/CodeFragmentParameterAnalyzer.kt b/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/CodeFragmentParameterAnalyzer.kt index 55d37380524..bdacebf390c 100644 --- a/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/CodeFragmentParameterAnalyzer.kt +++ b/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/CodeFragmentParameterAnalyzer.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.idea.debugger.evaluate.compilation import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil import com.intellij.psi.PsiElement -import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.getCallLabelForLambdaArgument @@ -39,7 +38,6 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.expressions.BasicExpressionTypingVisitor import org.jetbrains.kotlin.types.expressions.createFunctionType class CodeFragmentParameterInfo( @@ -307,8 +305,8 @@ class CodeFragmentParameterAnalyzer( } } is ValueDescriptor -> { - val parent = PsiTreeUtil.skipParentsOfType(expression, KtParenthesizedExpression::class.java) - val isLValue = BasicExpressionTypingVisitor.isLValue(expression, parent) + val unwrappedExpression = KtPsiUtil.deparenthesize(expression) + val isLValue = unwrappedExpression?.let { isAssignmentLValue(it) } ?: false parameters.getOrPut(target) { val type = target.type @@ -322,6 +320,11 @@ class CodeFragmentParameterAnalyzer( } } + private fun isAssignmentLValue(expression: PsiElement): Boolean { + val assignmentExpression = (expression.parent as? KtBinaryExpression)?.takeIf { KtPsiUtil.isAssignment(it) } ?: return false + return assignmentExpression.left == expression + } + private fun isContainingPrimaryConstructorParameter(target: PropertyDescriptor): Boolean { val primaryConstructor = containingPrimaryConstructor ?: return false for (parameter in primaryConstructor.valueParameters) { 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 edf78427184..be354077583 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 @@ -350,6 +350,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nestedInlineArguments.kt"); } + @TestMetadata("nonAssignmentLValue.kt") + public void testNonAssignmentLValue() throws Exception { + runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nonAssignmentLValue.kt"); + } + @TestMetadata("nothing.kt") public void testNothing() throws Exception { runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nothing.kt"); diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nonAssignmentLValue.kt b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nonAssignmentLValue.kt new file mode 100644 index 00000000000..5a8d0b35948 --- /dev/null +++ b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nonAssignmentLValue.kt @@ -0,0 +1,14 @@ +package foo + +fun main() { + val existing = mutableListOf() + for (i in 1..10) { + //Breakpoint! + if (existing.none { i % it != 0 }) { + existing += i + } + } +} + +// EXPRESSION: existing.none { i % it != 0 } +// RESULT: 1: Z \ No newline at end of file diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nonAssignmentLValue.out b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nonAssignmentLValue.out new file mode 100644 index 00000000000..d63d2b30475 --- /dev/null +++ b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nonAssignmentLValue.out @@ -0,0 +1,37 @@ +LineBreakpoint created at nonAssignmentLValue.kt:7 +Run Java +Connected to the target VM +nonAssignmentLValue.kt:7 +Compile bytecode for existing.none { i % it != 0 } +nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +resuming nonAssignmentLValue.kt:7 +Disconnected from the target VM + +Process finished with exit code 0