EA-218160: Force-box only assignment l-values
This commit is contained in:
+7
-4
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.idea.debugger.evaluate.compilation
|
|||||||
|
|
||||||
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil
|
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
import org.jetbrains.kotlin.codegen.getCallLabelForLambdaArgument
|
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.scopes.receivers.ImplicitReceiver
|
||||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.expressions.BasicExpressionTypingVisitor
|
|
||||||
import org.jetbrains.kotlin.types.expressions.createFunctionType
|
import org.jetbrains.kotlin.types.expressions.createFunctionType
|
||||||
|
|
||||||
class CodeFragmentParameterInfo(
|
class CodeFragmentParameterInfo(
|
||||||
@@ -307,8 +305,8 @@ class CodeFragmentParameterAnalyzer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
is ValueDescriptor -> {
|
is ValueDescriptor -> {
|
||||||
val parent = PsiTreeUtil.skipParentsOfType(expression, KtParenthesizedExpression::class.java)
|
val unwrappedExpression = KtPsiUtil.deparenthesize(expression)
|
||||||
val isLValue = BasicExpressionTypingVisitor.isLValue(expression, parent)
|
val isLValue = unwrappedExpression?.let { isAssignmentLValue(it) } ?: false
|
||||||
|
|
||||||
parameters.getOrPut(target) {
|
parameters.getOrPut(target) {
|
||||||
val type = target.type
|
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 {
|
private fun isContainingPrimaryConstructorParameter(target: PropertyDescriptor): Boolean {
|
||||||
val primaryConstructor = containingPrimaryConstructor ?: return false
|
val primaryConstructor = containingPrimaryConstructor ?: return false
|
||||||
for (parameter in primaryConstructor.valueParameters) {
|
for (parameter in primaryConstructor.valueParameters) {
|
||||||
|
|||||||
+5
@@ -350,6 +350,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
|
|||||||
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nestedInlineArguments.kt");
|
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")
|
@TestMetadata("nothing.kt")
|
||||||
public void testNothing() throws Exception {
|
public void testNothing() throws Exception {
|
||||||
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nothing.kt");
|
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nothing.kt");
|
||||||
|
|||||||
Vendored
+14
@@ -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
|
||||||
Vendored
+37
@@ -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
|
||||||
Reference in New Issue
Block a user