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.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
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
@@ -196,6 +197,9 @@ class CodeFragmentParameterAnalyzer(
|
||||
evaluationStatus.error(EvaluationError.SuspendCall)
|
||||
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)
|
||||
|
||||
+5
@@ -345,6 +345,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
|
||||
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")
|
||||
public void testOnClassHeader() throws Exception {
|
||||
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