Debugger: Forbid 'Nothing' constructor calls in evaluated code (KT-33093)

This commit is contained in:
Yan Zhulanow
2019-11-11 18:05:36 +09:00
parent 55b3637f03
commit 82a1750d26
4 changed files with 44 additions and 0 deletions
@@ -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)
@@ -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");
@@ -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
@@ -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