Introduce new feature: division by zero in constant expressions
This commit is contained in:
+6
-2
@@ -21,6 +21,8 @@ import com.intellij.psi.util.PsiTreeUtil
|
||||
import com.intellij.util.text.LiteralFormatUtil
|
||||
import org.jetbrains.kotlin.KtNodeTypes
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
@@ -44,7 +46,8 @@ import java.math.BigInteger
|
||||
import java.util.*
|
||||
|
||||
class ConstantExpressionEvaluator(
|
||||
internal val builtIns: KotlinBuiltIns
|
||||
internal val builtIns: KotlinBuiltIns,
|
||||
internal val languageVersionSettings: LanguageVersionSettings
|
||||
) {
|
||||
internal val constantValueFactory = ConstantValueFactory(builtIns)
|
||||
|
||||
@@ -456,7 +459,8 @@ private class ConstantExpressionEvaluatorVisitor(
|
||||
val parentExpression: KtExpression = PsiTreeUtil.getParentOfType(receiverExpression, KtExpression::class.java)!!
|
||||
trace.report(Errors.DIVISION_BY_ZERO.on(parentExpression))
|
||||
|
||||
if (isIntegerType(argumentForReceiver.value) && isIntegerType(argumentForParameter.value)) {
|
||||
if ((isIntegerType(argumentForReceiver.value) && isIntegerType(argumentForParameter.value)) ||
|
||||
!constantExpressionEvaluator.languageVersionSettings.supportsFeature(LanguageFeature.DivisionByZeroInConstantExpressions)) {
|
||||
return factory.createErrorValue("Division by zero").wrap()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.kotlin.script
|
||||
|
||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||
import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtUserType
|
||||
import org.jetbrains.kotlin.resolve.BindingTraceContext
|
||||
@@ -42,7 +43,7 @@ internal class KtAnnotationWrapper(val psi: KtAnnotationEntry, val targetClass:
|
||||
// TODO: annotation constructors unsupported yet in kotlin reflection, test and correct when they will be ready
|
||||
val targetAnnParams = targetClass.primaryConstructor?.parameters
|
||||
psi.valueArguments.mapIndexed { i, arg ->
|
||||
val evaluator = ConstantExpressionEvaluator(DefaultBuiltIns.Instance)
|
||||
val evaluator = ConstantExpressionEvaluator(DefaultBuiltIns.Instance, LanguageVersionSettingsImpl.DEFAULT)
|
||||
val trace = BindingTraceContext()
|
||||
val result = evaluator.evaluateToConstantValue(arg.getArgumentExpression()!!, trace, TypeUtils.NO_EXPECTED_TYPE)
|
||||
// TODO: consider inspecting `trace` to find diagnostics reported during the computation (such as division by zero, integer overflow, invalid annotation parameters etc.)
|
||||
|
||||
Reference in New Issue
Block a user