fix KT-9553 Invalid const initializers must be compile-time errors
#KT-9553 Fixed
This commit is contained in:
+21
-2
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.types.KotlinType
|
|||||||
import org.jetbrains.kotlin.types.TypeUtils
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
|
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
|
||||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -340,8 +341,26 @@ private class ConstantExpressionEvaluatorVisitor(
|
|||||||
else null
|
else null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitBinaryWithTypeRHSExpression(expression: KtBinaryExpressionWithTypeRHS, expectedType: KotlinType?): CompileTimeConstant<*>? =
|
override fun visitBinaryWithTypeRHSExpression(expression: KtBinaryExpressionWithTypeRHS, expectedType: KotlinType?): CompileTimeConstant<*>? {
|
||||||
evaluate(expression.getLeft(), expectedType)
|
val compileTimeConstant = evaluate(expression.left, expectedType)
|
||||||
|
if (compileTimeConstant != null) {
|
||||||
|
if (expectedType != null && !TypeUtils.noExpectedType(expectedType)) {
|
||||||
|
val constantType = when(compileTimeConstant) {
|
||||||
|
is TypedCompileTimeConstant<*> ->
|
||||||
|
compileTimeConstant.type
|
||||||
|
is IntegerValueTypeConstant ->
|
||||||
|
compileTimeConstant.getType(expectedType)
|
||||||
|
else ->
|
||||||
|
throw IllegalStateException("Unexpected compileTimeConstant class: ${compileTimeConstant.javaClass.canonicalName}")
|
||||||
|
|
||||||
|
}
|
||||||
|
if (!constantType.isSubtypeOf(expectedType)) return null
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return compileTimeConstant
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitBinaryExpression(expression: KtBinaryExpression, expectedType: KotlinType?): CompileTimeConstant<*>? {
|
override fun visitBinaryExpression(expression: KtBinaryExpression, expectedType: KotlinType?): CompileTimeConstant<*>? {
|
||||||
val leftExpression = expression.getLeft() ?: return null
|
val leftExpression = expression.getLeft() ?: return null
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// !DIAGNOSTICS:-UNUSED_VARIABLE
|
// !DIAGNOSTICS:-UNUSED_VARIABLE,-CAST_NEVER_SUCCEEDS
|
||||||
|
|
||||||
import kotlin.reflect.KProperty
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
@@ -67,7 +67,11 @@ class Outer {
|
|||||||
const val defaultGetter = 19
|
const val defaultGetter = 19
|
||||||
<!CONST_VAL_WITH_GETTER!>get<!>
|
<!CONST_VAL_WITH_GETTER!>get<!>
|
||||||
|
|
||||||
const val nonConstInitializer = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>foo()<!>
|
const val nonConstInitializer1 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>foo()<!>
|
||||||
|
const val nonConstInitializer2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1 as String<!>
|
||||||
|
const val nonConstInitializer3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1.0 as String<!>
|
||||||
|
const val nonConstInitializer4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1 as Double<!>
|
||||||
|
const val nonConstInitializer5 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>"2" as Int<!>
|
||||||
|
|
||||||
// ------------------
|
// ------------------
|
||||||
class Delegate {
|
class Delegate {
|
||||||
|
|||||||
@@ -2,7 +2,11 @@ package
|
|||||||
|
|
||||||
public const val defaultGetter: kotlin.Int = 19
|
public const val defaultGetter: kotlin.Int = 19
|
||||||
public const val delegated: kotlin.Int
|
public const val delegated: kotlin.Int
|
||||||
public const val nonConstInitializer: kotlin.Int
|
public const val nonConstInitializer1: kotlin.Int
|
||||||
|
public const val nonConstInitializer2: kotlin.String
|
||||||
|
public const val nonConstInitializer3: kotlin.String
|
||||||
|
public const val nonConstInitializer4: kotlin.Double
|
||||||
|
public const val nonConstInitializer5: kotlin.Int
|
||||||
private val privateTopLevel: kotlin.Int = 3
|
private val privateTopLevel: kotlin.Int = 3
|
||||||
public const var topLeveLVar: kotlin.Int
|
public const var topLeveLVar: kotlin.Int
|
||||||
public const val topLevel: kotlin.Int = 0
|
public const val topLevel: kotlin.Int = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user