Debugger: Forbid 'Nothing' constructor calls in evaluated code (KT-33093)
This commit is contained in:
+4
@@ -8,6 +8,7 @@ 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 com.intellij.psi.util.PsiTreeUtil
|
||||||
|
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
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
@@ -196,6 +197,9 @@ class CodeFragmentParameterAnalyzer(
|
|||||||
evaluationStatus.error(EvaluationError.SuspendCall)
|
evaluationStatus.error(EvaluationError.SuspendCall)
|
||||||
throw EvaluateExceptionUtil.createEvaluateException("Evaluation of 'suspend' calls is not supported")
|
throw EvaluateExceptionUtil.createEvaluateException("Evaluation of 'suspend' calls is not supported")
|
||||||
}
|
}
|
||||||
|
if (descriptor is ConstructorDescriptor && KotlinBuiltIns.isNothing(descriptor.returnType)) {
|
||||||
|
throw EvaluateExceptionUtil.createEvaluateException("'Nothing' can't be instantiated")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.visitCallExpression(expression, data)
|
return super.visitCallExpression(expression, data)
|
||||||
|
|||||||
+5
@@ -345,6 +345,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("nothing.kt")
|
||||||
|
public void testNothing() throws Exception {
|
||||||
|
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/nothing.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("onClassHeader.kt")
|
@TestMetadata("onClassHeader.kt")
|
||||||
public void testOnClassHeader() throws Exception {
|
public void testOnClassHeader() throws Exception {
|
||||||
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/onClassHeader.kt");
|
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/onClassHeader.kt");
|
||||||
|
|||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
package nothing
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
//Breakpoint!
|
||||||
|
val a = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
fun block(foo: () -> Unit) {
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPRESSION: Nothing()
|
||||||
|
// RESULT: 'Nothing' can't be instantiated
|
||||||
|
|
||||||
|
// EXPRESSION: "" + Nothing()
|
||||||
|
// RESULT: 'Nothing' can't be instantiated
|
||||||
|
|
||||||
|
// EXPRESSION: run { Nothing() }
|
||||||
|
// RESULT: 'Nothing' can't be instantiated
|
||||||
|
|
||||||
|
// EXPRESSION: { Nothing() }
|
||||||
|
// RESULT: 'Nothing' can't be instantiated
|
||||||
|
|
||||||
|
// EXPRESSION: block { Nothing() }
|
||||||
|
// RESULT: 'Nothing' can't be instantiated
|
||||||
|
|
||||||
|
// EXPRESSION: fun foo() { Nothing() }
|
||||||
|
// RESULT: 'Nothing' can't be instantiated
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
LineBreakpoint created at nothing.kt:5
|
||||||
|
Run Java
|
||||||
|
Connected to the target VM
|
||||||
|
nothing.kt:5
|
||||||
|
Disconnected from the target VM
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
Reference in New Issue
Block a user