EA-218160: Force-box only assignment l-values

This commit is contained in:
Yan Zhulanow
2020-01-15 23:10:34 +09:00
parent d539a870ed
commit 3027fab238
4 changed files with 63 additions and 4 deletions
@@ -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) {
@@ -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");
@@ -0,0 +1,14 @@
package foo
fun main() {
val existing = mutableListOf<Int>()
for (i in 1..10) {
//Breakpoint!
if (existing.none { i % it != 0 }) {
existing += i
}
}
}
// EXPRESSION: existing.none { i % it != 0 }
// RESULT: 1: Z
@@ -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