[K2] Report NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION when it is appropriate
This commit is contained in:
@@ -21,8 +21,8 @@ const val l = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>k<!>
|
|||||||
const val m = "123".toString()
|
const val m = "123".toString()
|
||||||
const val n = "456".length
|
const val n = "456".length
|
||||||
val o = "789"
|
val o = "789"
|
||||||
const val p = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>o.toString()<!>
|
const val p = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>o.toString()<!>
|
||||||
const val q = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>o.length<!>
|
const val q = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>o.length<!>
|
||||||
|
|
||||||
class ForConst{
|
class ForConst{
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ FILE: withSuppression.kt
|
|||||||
}
|
}
|
||||||
public final val y: R|kotlin/String| = String(789)
|
public final val y: R|kotlin/String| = String(789)
|
||||||
public get(): R|kotlin/String|
|
public get(): R|kotlin/String|
|
||||||
public final const val z: R|kotlin/String| = @R|kotlin/Suppress|(names = vararg(String(CONST_VAL_WITH_NON_CONST_INITIALIZER))) R|/y|
|
public final const val z: R|kotlin/String| = @R|kotlin/Suppress|(names = vararg(String(NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION))) R|/y|
|
||||||
public get(): R|kotlin/String|
|
public get(): R|kotlin/String|
|
||||||
@R|kotlin/annotation/Target|(allowedTargets = vararg(Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.TYPE|)) public final annotation class Ann : R|kotlin/Annotation| {
|
@R|kotlin/annotation/Target|(allowedTargets = vararg(Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.TYPE|)) public final annotation class Ann : R|kotlin/Annotation| {
|
||||||
public constructor(): R|Ann| {
|
public constructor(): R|Ann| {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const val x = "123"
|
|||||||
|
|
||||||
val y = "789"
|
val y = "789"
|
||||||
|
|
||||||
const val z = @Suppress(<!ERROR_SUPPRESSION!>"CONST_VAL_WITH_NON_CONST_INITIALIZER"<!>) y
|
const val z = @Suppress(<!ERROR_SUPPRESSION!>"NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION"<!>) y
|
||||||
|
|
||||||
@Target(AnnotationTarget.TYPE)
|
@Target(AnnotationTarget.TYPE)
|
||||||
annotation class Ann
|
annotation class Ann
|
||||||
|
|||||||
+9
-5
@@ -7,16 +7,17 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.canBeUsedForConstVal
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.getModifier
|
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.canBeEvaluatedAtCompileTime
|
import org.jetbrains.kotlin.fir.analysis.checkers.*
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.ConstantArgumentKind
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.checkConstantArguments
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isConst
|
import org.jetbrains.kotlin.fir.declarations.utils.isConst
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
import org.jetbrains.kotlin.fir.types.ConeErrorType
|
import org.jetbrains.kotlin.fir.types.ConeErrorType
|
||||||
import org.jetbrains.kotlin.fir.types.coneType
|
import org.jetbrains.kotlin.fir.types.coneType
|
||||||
@@ -62,8 +63,11 @@ object FirConstPropertyChecker : FirPropertyChecker() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!canBeEvaluatedAtCompileTime(initializer, context.session)) {
|
val errorKind = when (checkConstantArguments(initializer, context.session)) {
|
||||||
reporter.reportOn(initializer.source, FirErrors.CONST_VAL_WITH_NON_CONST_INITIALIZER, context)
|
null -> return
|
||||||
|
ConstantArgumentKind.NOT_CONST_VAL_IN_CONST_EXPRESSION -> FirErrors.NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION
|
||||||
|
else -> FirErrors.CONST_VAL_WITH_NON_CONST_INITIALIZER
|
||||||
}
|
}
|
||||||
|
reporter.reportOn(initializer.source, errorKind, context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ val nonConstBool = true
|
|||||||
const val constBool = false
|
const val constBool = false
|
||||||
|
|
||||||
const val andExpr1 = true && false
|
const val andExpr1 = true && false
|
||||||
const val andExpr2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>nonConstBool && false<!>
|
const val andExpr2 = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConstBool && false<!>
|
||||||
const val andExpr3 = true && constBool
|
const val andExpr3 = true && constBool
|
||||||
const val andExpr4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>nonConstBool && constBool<!>
|
const val andExpr4 = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConstBool && constBool<!>
|
||||||
|
|
||||||
const val orExpr1 = true || false
|
const val orExpr1 = true || false
|
||||||
const val orExpr2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>nonConstBool || false<!>
|
const val orExpr2 = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConstBool || false<!>
|
||||||
const val orExpr3 = true || constBool
|
const val orExpr3 = true || constBool
|
||||||
const val orExpr4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>nonConstBool || constBool<!>
|
const val orExpr4 = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConstBool || constBool<!>
|
||||||
|
|||||||
Vendored
+1
-1
@@ -4,5 +4,5 @@ val nonConstBool = true
|
|||||||
const val constBool = false
|
const val constBool = false
|
||||||
|
|
||||||
const val s1 = """ ${ true && false } """
|
const val s1 = """ ${ true && false } """
|
||||||
const val s2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>""" ${ nonConstBool && false } """<!>
|
const val s2 = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>""" ${ nonConstBool && false } """<!>
|
||||||
const val s3 = """ ${ constBool && false } """
|
const val s3 = """ ${ constBool && false } """
|
||||||
|
|||||||
Vendored
-8
@@ -1,8 +0,0 @@
|
|||||||
// LANGUAGE: -ProhibitSimplificationOfNonTrivialConstBooleanExpressions
|
|
||||||
|
|
||||||
val nonConstBool = true
|
|
||||||
const val constBool = false
|
|
||||||
|
|
||||||
const val s1 = """ ${ true && false } """
|
|
||||||
const val s2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>""" ${ nonConstBool && false } """<!>
|
|
||||||
const val s3 = """ ${ constBool && false } """
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// LANGUAGE: -ProhibitSimplificationOfNonTrivialConstBooleanExpressions
|
// LANGUAGE: -ProhibitSimplificationOfNonTrivialConstBooleanExpressions
|
||||||
|
|
||||||
val nonConstBool = true
|
val nonConstBool = true
|
||||||
|
|||||||
+2
-2
@@ -20,5 +20,5 @@ const val withWhen3 = when(value) {
|
|||||||
const val multibranchIf = if (value == 100) 1 else if (value == 1000) 2 else 3
|
const val multibranchIf = if (value == 100) 1 else if (value == 1000) 2 else 3
|
||||||
|
|
||||||
val nonConstFlag = true
|
val nonConstFlag = true
|
||||||
const val errorConstIf = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>if (nonConstFlag) 1 else 2<!>
|
const val errorConstIf = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>if (nonConstFlag) 1 else 2<!>
|
||||||
const val errorBranch = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>if (flag) nonConstFlag else false<!>
|
const val errorBranch = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>if (flag) nonConstFlag else false<!>
|
||||||
|
|||||||
-16
@@ -1,16 +0,0 @@
|
|||||||
const val simple = "O${'K'} ${1.toLong() + 2.0}"
|
|
||||||
const val withInnerConcatenation = "1 ${"2 ${3} ${4} 5"} 6"
|
|
||||||
|
|
||||||
object A
|
|
||||||
object B {
|
|
||||||
override fun toString(): String = "B"
|
|
||||||
}
|
|
||||||
|
|
||||||
const val printA = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>"A: $A"<!>
|
|
||||||
const val printB = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>"B: $B"<!>
|
|
||||||
|
|
||||||
const val withNull = "1 ${null}"
|
|
||||||
const val withNullPlus = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>"1" + null<!>
|
|
||||||
|
|
||||||
val nonConst = 0
|
|
||||||
const val withNonConst = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>"A $nonConst B"<!>
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
const val simple = "O${'K'} ${1.toLong() + 2.0}"
|
const val simple = "O${'K'} ${1.toLong() + 2.0}"
|
||||||
const val withInnerConcatenation = "1 ${"2 ${3} ${4} 5"} 6"
|
const val withInnerConcatenation = "1 ${"2 ${3} ${4} 5"} 6"
|
||||||
|
|
||||||
|
|||||||
-16
@@ -1,16 +0,0 @@
|
|||||||
val nonConst = 1
|
|
||||||
|
|
||||||
const val constConst = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>nonConst * nonConst + 2<!>
|
|
||||||
|
|
||||||
annotation class Ann(val x: Int, val y: String)
|
|
||||||
|
|
||||||
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConst<!>, <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>"${nonConst}"<!>)
|
|
||||||
fun foo1() {}
|
|
||||||
|
|
||||||
@Ann(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConst + constConst<!>, "${constConst}")
|
|
||||||
fun foo2() {}
|
|
||||||
|
|
||||||
annotation class ArrayAnn(val x: IntArray)
|
|
||||||
|
|
||||||
@ArrayAnn(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(1, constConst, <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConst<!>)<!>)
|
|
||||||
fun foo3() {}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
val nonConst = 1
|
val nonConst = 1
|
||||||
|
|
||||||
const val constConst = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConst * nonConst + 2<!>
|
const val constConst = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>nonConst * nonConst + 2<!>
|
||||||
|
|||||||
Reference in New Issue
Block a user