K2. Minor. Rename FirConstExpression to FirLiteralExpression

FirConstExpression is usually confused with "constant" calculations,
while in fact, it just denotes a simple literal expression
and `1 + 1` isn't represented by a FirConstExpression.

^KT-64314 Fixed
This commit is contained in:
Simon Ogorodnik
2024-01-12 18:44:13 +01:00
committed by Space Team
parent 213967e25c
commit 53e89a9722
105 changed files with 300 additions and 295 deletions
@@ -42,7 +42,7 @@ internal object FirAnnotationValueConverter {
) )
} }
private fun <T> FirConstExpression<T>.convertConstantExpression(): KtConstantAnnotationValue? { private fun <T> FirLiteralExpression<T>.convertConstantExpression(): KtConstantAnnotationValue? {
val expression = psi as? KtElement val expression = psi as? KtElement
@OptIn(UnresolvedExpressionTypeAccess::class) @OptIn(UnresolvedExpressionTypeAccess::class)
@@ -98,7 +98,7 @@ internal object FirAnnotationValueConverter {
private fun FirExpression.convertConstantExpression(builder: KtSymbolByFirBuilder): KtAnnotationValue? { private fun FirExpression.convertConstantExpression(builder: KtSymbolByFirBuilder): KtAnnotationValue? {
val sourcePsi = psi as? KtElement val sourcePsi = psi as? KtElement
return when (this) { return when (this) {
is FirConstExpression<*> -> convertConstantExpression() is FirLiteralExpression<*> -> convertConstantExpression()
is FirNamedArgumentExpression -> { is FirNamedArgumentExpression -> {
expression.convertConstantExpression(builder) expression.convertConstantExpression(builder)
} }
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isConst
import org.jetbrains.kotlin.fir.declarations.utils.isFinal import org.jetbrains.kotlin.fir.declarations.utils.isFinal
import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.declarations.utils.isStatic
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLiteralExpression
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
@@ -45,7 +45,7 @@ internal object FirCompileTimeConstantEvaluator {
fun evaluate( fun evaluate(
fir: FirElement?, fir: FirElement?,
mode: KtConstantEvaluationMode, mode: KtConstantEvaluationMode,
): FirConstExpression<*>? = ): FirLiteralExpression<*>? =
when (fir) { when (fir) {
is FirPropertyAccessExpression -> { is FirPropertyAccessExpression -> {
when (val referredVariable = fir.calleeReference.toResolvedVariableSymbol()) { when (val referredVariable = fir.calleeReference.toResolvedVariableSymbol()) {
@@ -53,14 +53,14 @@ internal object FirCompileTimeConstantEvaluator {
if (referredVariable.callableId.isStringLength) { if (referredVariable.callableId.isStringLength) {
evaluate(fir.explicitReceiver, mode)?.evaluateStringLength() evaluate(fir.explicitReceiver, mode)?.evaluateStringLength()
} else { } else {
referredVariable.toConstExpression(mode) referredVariable.toLiteralExpression(mode)
} }
} }
is FirFieldSymbol -> referredVariable.toConstExpression(mode) is FirFieldSymbol -> referredVariable.toLiteralExpression(mode)
else -> null else -> null
} }
} }
is FirConstExpression<*> -> { is FirLiteralExpression<*> -> {
fir.adaptToConstKind() fir.adaptToConstKind()
} }
is FirFunctionCall -> { is FirFunctionCall -> {
@@ -70,7 +70,7 @@ internal object FirCompileTimeConstantEvaluator {
evaluateStringConcatenationCall(fir, mode) evaluateStringConcatenationCall(fir, mode)
} }
is FirNamedReference -> { is FirNamedReference -> {
fir.toResolvedPropertySymbol()?.toConstExpression(mode) fir.toResolvedPropertySymbol()?.toLiteralExpression(mode)
} }
else -> null else -> null
} }
@@ -78,9 +78,9 @@ internal object FirCompileTimeConstantEvaluator {
private val CallableId.isStringLength: Boolean private val CallableId.isStringLength: Boolean
get() = classId == StandardClassIds.String && callableName.identifierOrNullIfSpecial == "length" get() = classId == StandardClassIds.String && callableName.identifierOrNullIfSpecial == "length"
private fun FirPropertySymbol.toConstExpression( private fun FirPropertySymbol.toLiteralExpression(
mode: KtConstantEvaluationMode, mode: KtConstantEvaluationMode,
): FirConstExpression<*>? { ): FirLiteralExpression<*>? {
return when { return when {
mode == KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION && !isConst -> null mode == KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION && !isConst -> null
isVal && hasInitializer -> { isVal && hasInitializer -> {
@@ -92,9 +92,9 @@ internal object FirCompileTimeConstantEvaluator {
} }
} }
private fun FirFieldSymbol.toConstExpression( private fun FirFieldSymbol.toLiteralExpression(
mode: KtConstantEvaluationMode, mode: KtConstantEvaluationMode,
): FirConstExpression<*>? { ): FirLiteralExpression<*>? {
return when { return when {
mode == KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION && !(isStatic && isFinal) -> null mode == KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION && !(isStatic && isFinal) -> null
isVal && hasInitializer -> { isVal && hasInitializer -> {
@@ -148,8 +148,8 @@ internal object FirCompileTimeConstantEvaluator {
} }
} }
private fun FirConstExpression<*>.adaptToConstKind(): FirConstExpression<*> { private fun FirLiteralExpression<*>.adaptToConstKind(): FirLiteralExpression<*> {
return kind.toConstExpression( return kind.toLiteralExpression(
source, source,
kind.convertToNumber(value as? Number) ?: value kind.convertToNumber(value as? Number) ?: value
) )
@@ -158,7 +158,7 @@ internal object FirCompileTimeConstantEvaluator {
private fun evaluateStringConcatenationCall( private fun evaluateStringConcatenationCall(
stringConcatenationCall: FirStringConcatenationCall, stringConcatenationCall: FirStringConcatenationCall,
mode: KtConstantEvaluationMode, mode: KtConstantEvaluationMode,
): FirConstExpression<String>? { ): FirLiteralExpression<String>? {
val concatenated = buildString { val concatenated = buildString {
for (arg in stringConcatenationCall.arguments) { for (arg in stringConcatenationCall.arguments) {
val evaluated = evaluate(arg, mode) ?: return null val evaluated = evaluate(arg, mode) ?: return null
@@ -166,13 +166,13 @@ internal object FirCompileTimeConstantEvaluator {
} }
} }
return ConstantValueKind.String.toConstExpression(stringConcatenationCall.source, concatenated) return ConstantValueKind.String.toLiteralExpression(stringConcatenationCall.source, concatenated)
} }
private fun evaluateFunctionCall( private fun evaluateFunctionCall(
functionCall: FirFunctionCall, functionCall: FirFunctionCall,
mode: KtConstantEvaluationMode, mode: KtConstantEvaluationMode,
): FirConstExpression<*>? { ): FirLiteralExpression<*>? {
val function = functionCall.getOriginalFunction() as? FirSimpleFunction ?: return null val function = functionCall.getOriginalFunction() as? FirSimpleFunction ?: return null
val opr1 = evaluate(functionCall.explicitReceiver, mode) ?: return null val opr1 = evaluate(functionCall.explicitReceiver, mode) ?: return null
@@ -188,7 +188,7 @@ internal object FirCompileTimeConstantEvaluator {
return null return null
} }
private fun FirConstExpression<*>.adjustType(expectedType: ConeKotlinType): FirConstExpression<*> { private fun FirLiteralExpression<*>.adjustType(expectedType: ConeKotlinType): FirLiteralExpression<*> {
val expectedKind = expectedType.toConstantValueKind() val expectedKind = expectedType.toConstantValueKind()
// Note that the resolved type for the const expression is not always matched with the const kind. For example, // Note that the resolved type for the const expression is not always matched with the const kind. For example,
// fun foo(x: Int) { // fun foo(x: Int) {
@@ -200,7 +200,7 @@ internal object FirCompileTimeConstantEvaluator {
val expression = val expression =
if (expectedKind != null && expectedKind != kind && value is Number) { if (expectedKind != null && expectedKind != kind && value is Number) {
val typeAdjustedValue = expectedKind.convertToNumber(value as Number)!! val typeAdjustedValue = expectedKind.convertToNumber(value as Number)!!
expectedKind.toConstExpression(source, typeAdjustedValue) expectedKind.toLiteralExpression(source, typeAdjustedValue)
} else { } else {
this this
} }
@@ -227,7 +227,7 @@ internal object FirCompileTimeConstantEvaluator {
} }
// Unary operators // Unary operators
private fun FirConstExpression<*>.evaluate(function: FirSimpleFunction): FirConstExpression<*>? { private fun FirLiteralExpression<*>.evaluate(function: FirSimpleFunction): FirLiteralExpression<*>? {
if (value == null) return null if (value == null) return null
(value as? String)?.let { opr -> (value as? String)?.let { opr ->
evalUnaryOp( evalUnaryOp(
@@ -235,7 +235,7 @@ internal object FirCompileTimeConstantEvaluator {
kind.toCompileTimeType(), kind.toCompileTimeType(),
opr opr
)?.let { )?.let {
return it.toConstantValueKind().toConstExpression(source, it) return it.toConstantValueKind().toLiteralExpression(source, it)
} }
} }
return kind.convertToNumber(value as? Number)?.let { opr -> return kind.convertToNumber(value as? Number)?.let { opr ->
@@ -244,22 +244,22 @@ internal object FirCompileTimeConstantEvaluator {
kind.toCompileTimeType(), kind.toCompileTimeType(),
opr opr
)?.let { )?.let {
it.toConstantValueKind().toConstExpression(source, it) it.toConstantValueKind().toLiteralExpression(source, it)
} }
} }
} }
private fun FirConstExpression<*>.evaluateStringLength(): FirConstExpression<*>? { private fun FirLiteralExpression<*>.evaluateStringLength(): FirLiteralExpression<*>? {
return (value as? String)?.length?.let { return (value as? String)?.length?.let {
it.toConstantValueKind().toConstExpression(source, it) it.toConstantValueKind().toLiteralExpression(source, it)
} }
} }
// Binary operators // Binary operators
private fun FirConstExpression<*>.evaluate( private fun FirLiteralExpression<*>.evaluate(
function: FirSimpleFunction, function: FirSimpleFunction,
other: FirConstExpression<*> other: FirLiteralExpression<*>
): FirConstExpression<*>? { ): FirLiteralExpression<*>? {
if (value == null || other.value == null) return null if (value == null || other.value == null) return null
// NB: some utils accept very general types, and due to the way operation map works, we should up-cast rhs type. // NB: some utils accept very general types, and due to the way operation map works, we should up-cast rhs type.
val rightType = when { val rightType = when {
@@ -276,7 +276,7 @@ internal object FirCompileTimeConstantEvaluator {
rightType, rightType,
opr2 opr2
)?.let { )?.let {
return it.toConstantValueKind().toConstExpression(source, it) return it.toConstantValueKind().toLiteralExpression(source, it)
} }
} }
} }
@@ -289,7 +289,7 @@ internal object FirCompileTimeConstantEvaluator {
other.kind.toCompileTimeType(), other.kind.toCompileTimeType(),
opr2 opr2
)?.let { )?.let {
it.toConstantValueKind().toConstExpression(source, it) it.toConstantValueKind().toLiteralExpression(source, it)
} }
} }
} }
@@ -367,9 +367,9 @@ internal object FirCompileTimeConstantEvaluator {
} }
} }
private fun <T> ConstantValueKind<T>.toConstExpression(source: KtSourceElement?, value: Any?): FirConstExpression<T> = private fun <T> ConstantValueKind<T>.toLiteralExpression(source: KtSourceElement?, value: Any?): FirLiteralExpression<T> =
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
buildConstExpression(source, this, value as T, setType = false) buildLiteralExpression(source, this, value as T, setType = false)
private fun FirFunctionCall.getOriginalFunction(): FirCallableDeclaration? { private fun FirFunctionCall.getOriginalFunction(): FirCallableDeclaration? {
val symbol: FirBasedSymbol<*>? = when (val reference = calleeReference) { val symbol: FirBasedSymbol<*>? = when (val reference = calleeReference) {
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.builder.toFirOperationOrNull import org.jetbrains.kotlin.fir.builder.toFirOperationOrNull
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLiteralExpression
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -77,16 +77,16 @@ internal open class FirElementsRecorder : FirVisitor<Unit, MutableMap<KtElement,
visitElement(variableAssignment, data) visitElement(variableAssignment, data)
} }
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: MutableMap<KtElement, FirElement>) { override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: MutableMap<KtElement, FirElement>) {
cacheElement(constExpression, data) cacheElement(literalExpression, data)
constExpression.annotations.forEach { literalExpression.annotations.forEach {
it.accept(this, data) it.accept(this, data)
} }
// KtPrefixExpression(-, KtConstExpression(n)) is represented as FirConstExpression(-n) with converted constant value. // KtPrefixExpression(-, KtConstExpression(n)) is represented as FirLiteralExpression(-n) with converted constant value.
// If one queries FIR for KtConstExpression, we still return FirConstExpression(-n) even though its source is KtPrefixExpression. // If one queries FIR for KtConstExpression, we still return FirLiteralExpression(-n) even though its source is KtPrefixExpression.
// Here, we cache FirConstExpression(n) for KtConstExpression(n) to make everything natural and intuitive! // Here, we cache FirLiteralExpression(n) for KtConstExpression(n) to make everything natural and intuitive!
if (constExpression.isConverted) { if (literalExpression.isConverted) {
constExpression.kind.reverseConverted(constExpression)?.let { cacheElement(it, data) } literalExpression.kind.reverseConverted(literalExpression)?.let { cacheElement(it, data) }
} }
} }
@@ -192,19 +192,19 @@ internal open class FirElementsRecorder : FirVisitor<Unit, MutableMap<KtElement,
return FirOperationNameConventions.ASSIGNMENTS[firOperation] return FirOperationNameConventions.ASSIGNMENTS[firOperation]
} }
private val FirConstExpression<*>.isConverted: Boolean private val FirLiteralExpression<*>.isConverted: Boolean
get() { get() {
val firSourcePsi = this.source?.psi ?: return false val firSourcePsi = this.source?.psi ?: return false
return firSourcePsi is KtPrefixExpression && firSourcePsi.operationToken == KtTokens.MINUS return firSourcePsi is KtPrefixExpression && firSourcePsi.operationToken == KtTokens.MINUS
} }
private val FirConstExpression<*>.ktConstantExpression: KtConstantExpression? private val FirLiteralExpression<*>.ktConstantExpression: KtConstantExpression?
get() { get() {
val firSourcePsi = this.source?.psi val firSourcePsi = this.source?.psi
return firSourcePsi?.findDescendantOfType() return firSourcePsi?.findDescendantOfType()
} }
private fun <T> ConstantValueKind<T>.reverseConverted(original: FirConstExpression<T>): FirConstExpression<T>? { private fun <T> ConstantValueKind<T>.reverseConverted(original: FirLiteralExpression<T>): FirLiteralExpression<T>? {
val value = original.value as? Number ?: return null val value = original.value as? Number ?: return null
val convertedValue = when (this) { val convertedValue = when (this) {
ConstantValueKind.Byte -> value.toByte().unaryMinus() ConstantValueKind.Byte -> value.toByte().unaryMinus()
@@ -216,7 +216,7 @@ internal open class FirElementsRecorder : FirVisitor<Unit, MutableMap<KtElement,
else -> null else -> null
} ?: return null } ?: return null
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
return buildConstExpression( return buildLiteralExpression(
original.ktConstantExpression?.toKtPsiSourceElement(), original.ktConstantExpression?.toKtPsiSourceElement(),
this, this,
convertedValue as T, convertedValue as T,
@@ -320,7 +320,7 @@ private fun rebindThisRef(
oldTarget: FirPropertySymbol, oldTarget: FirPropertySymbol,
canHavePropertySymbolAsThisReference: Boolean, canHavePropertySymbolAsThisReference: Boolean,
) { ) {
if (expression is FirConstExpression<*>) return if (expression is FirLiteralExpression<*>) return
requireWithAttachment( requireWithAttachment(
expression is FirThisReceiverExpression, expression is FirThisReceiverExpression,
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.collectEnumEntries import org.jetbrains.kotlin.fir.declarations.collectEnumEntries
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.buildUnaryArgumentList import org.jetbrains.kotlin.fir.expressions.buildUnaryArgumentList
import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.expressions.builder.*
@@ -198,8 +198,8 @@ class StubBasedAnnotationDeserializer(
value: T, value: T,
typeRef: FirResolvedTypeRef, typeRef: FirResolvedTypeRef,
sourceElement: PsiElement sourceElement: PsiElement
): FirConstExpression<T> { ): FirLiteralExpression<T> {
return buildConstExpression( return buildLiteralExpression(
KtRealPsiSourceElement(sourceElement), KtRealPsiSourceElement(sourceElement),
kind, kind,
value, value,
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMapping import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLiteralExpression
import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
@@ -121,7 +121,7 @@ internal class StubBasedFirTypeDeserializer(
} }
this.argumentMapping = buildAnnotationArgumentMapping { this.argumentMapping = buildAnnotationArgumentMapping {
mapping[StandardNames.NAME] = mapping[StandardNames.NAME] =
buildConstExpression(null, ConstantValueKind.String, paramName, setType = true) buildLiteralExpression(null, ConstantValueKind.String, paramName, setType = true)
} }
} }
} }
@@ -1,5 +1,5 @@
KT element: KtValueArgument KT element: KtValueArgument
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtValueArgument KT element: KtValueArgument
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtValueArgument KT element: KtValueArgument
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtValueArgument KT element: KtValueArgument
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtStringTemplateExpression KT element: KtStringTemplateExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtStringTemplateExpression KT element: KtStringTemplateExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtValueArgument KT element: KtValueArgument
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtValueArgument KT element: KtValueArgument
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtConstantExpression KT element: KtConstantExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtConstantExpression KT element: KtConstantExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtConstantExpression KT element: KtConstantExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtStringTemplateExpression KT element: KtStringTemplateExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtConstantExpression KT element: KtConstantExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtConstantExpression KT element: KtConstantExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtConstantExpression KT element: KtConstantExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtConstantExpression KT element: KtConstantExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtPrefixExpression KT element: KtPrefixExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtConstantExpression KT element: KtConstantExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtPrefixExpression KT element: KtPrefixExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtConstantExpression KT element: KtConstantExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtStringTemplateExpression KT element: KtStringTemplateExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -1,5 +1,5 @@
KT element: KtStringTemplateExpression KT element: KtStringTemplateExpression
FIR element: FirConstExpressionImpl FIR element: FirLiteralExpressionImpl
FIR source kind: KtRealSourceElementKind FIR source kind: KtRealSourceElementKind
FIR element rendered: FIR element rendered:
@@ -56,7 +56,7 @@ fun main(args: Array<String>) {
alias<FirStringConcatenationCall>("StringConcatenationCallChecker") alias<FirStringConcatenationCall>("StringConcatenationCallChecker")
alias<FirTypeOperatorCall>("TypeOperatorCallChecker") alias<FirTypeOperatorCall>("TypeOperatorCallChecker")
alias<FirResolvedQualifier>("ResolvedQualifierChecker") alias<FirResolvedQualifier>("ResolvedQualifierChecker")
alias<FirConstExpression<*>>("ConstExpressionChecker") alias<FirLiteralExpression<*>>("LiteralExpressionChecker")
alias<FirCallableReferenceAccess>("CallableReferenceAccessChecker") alias<FirCallableReferenceAccess>("CallableReferenceAccessChecker")
alias<FirThisReceiverExpression>("ThisReceiverExpressionChecker") alias<FirThisReceiverExpression>("ThisReceiverExpressionChecker")
alias<FirWhileLoop>("WhileLoopChecker") alias<FirWhileLoop>("WhileLoopChecker")
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.analysis.js.checkers.isExportedObject
import org.jetbrains.kotlin.fir.analysis.js.checkers.sanitizeName import org.jetbrains.kotlin.fir.analysis.js.checkers.sanitizeName
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.isEnumEntries import org.jetbrains.kotlin.fir.isEnumEntries
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
@@ -242,7 +242,7 @@ object FirJsExportDeclarationChecker : FirBasicDeclarationChecker(MppCheckerKind
val jsNameArgument = declaration.symbol.getAnnotationFirstArgument(JsStandardClassIds.Annotations.JsName, context.session) val jsNameArgument = declaration.symbol.getAnnotationFirstArgument(JsStandardClassIds.Annotations.JsName, context.session)
val reportTarget = jsNameArgument?.source ?: declaration.source val reportTarget = jsNameArgument?.source ?: declaration.source
val name = (jsNameArgument as? FirConstExpression<*>)?.value as? String ?: declaration.nameOrSpecialName.asString() val name = (jsNameArgument as? FirLiteralExpression<*>)?.value as? String ?: declaration.nameOrSpecialName.asString()
if (name in SPECIAL_KEYWORDS || (name !in RESERVED_KEYWORDS && sanitizeName(name) == name)) { if (name in SPECIAL_KEYWORDS || (name !in RESERVED_KEYWORDS && sanitizeName(name) == name)) {
return return
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isInline import org.jetbrains.kotlin.fir.declarations.utils.isInline
import org.jetbrains.kotlin.fir.declarations.utils.isOverridable import org.jetbrains.kotlin.fir.declarations.utils.isOverridable
import org.jetbrains.kotlin.fir.declarations.utils.isOverride import org.jetbrains.kotlin.fir.declarations.utils.isOverride
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.java.findJvmNameAnnotation import org.jetbrains.kotlin.fir.java.findJvmNameAnnotation
import org.jetbrains.kotlin.fir.resolve.getContainingClass import org.jetbrains.kotlin.fir.resolve.getContainingClass
import org.jetbrains.kotlin.fir.types.resolvedType import org.jetbrains.kotlin.fir.types.resolvedType
@@ -34,7 +34,7 @@ object FirJvmNameChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) {
return return
} }
val value = (name as? FirConstExpression<*>)?.value as? String ?: return val value = (name as? FirLiteralExpression<*>)?.value as? String ?: return
if (!Name.isValidIdentifier(value)) { if (!Name.isValidIdentifier(value)) {
reporter.reportOn(jvmName.source, FirJvmErrors.ILLEGAL_JVM_NAME, context) reporter.reportOn(jvmName.source, FirJvmErrors.ILLEGAL_JVM_NAME, context)
@@ -26,7 +26,13 @@ import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.utils.isOverride import org.jetbrains.kotlin.fir.declarations.utils.isOverride
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
object FirNativeObjCNameChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) { object FirNativeObjCNameChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
@@ -48,7 +54,7 @@ object FirNativeObjCNameChecker : FirBasicDeclarationChecker(MppCheckerKind.Comm
private fun checkObjCName(objCName: ObjCName, declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkObjCName(objCName: ObjCName, declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
val annotationSource = objCName.annotation.source val annotationSource = objCName.annotation.source
for ((_, argument) in objCName.annotation.argumentMapping.mapping) { for ((_, argument) in objCName.annotation.argumentMapping.mapping) {
if (argument is FirConstExpression<*>) continue if (argument is FirLiteralExpression<*>) continue
reporter.reportOn(argument.source, NON_LITERAL_OBJC_NAME_ARG, context) reporter.reportOn(argument.source, NON_LITERAL_OBJC_NAME_ARG, context)
} }
if (objCName.name == null && objCName.swiftName == null) { if (objCName.name == null && objCName.swiftName == null) {
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirAnnotationCallCh
import org.jetbrains.kotlin.fir.analysis.diagnostics.web.common.FirWebCommonErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.web.common.FirWebCommonErrors
import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.js.validateQualifier import org.jetbrains.kotlin.js.validateQualifier
import org.jetbrains.kotlin.name.WebCommonStandardClassIds.Annotations.JsQualifier import org.jetbrains.kotlin.name.WebCommonStandardClassIds.Annotations.JsQualifier
@@ -23,7 +23,7 @@ object FirJsQualifierChecker : FirAnnotationCallChecker(MppCheckerKind.Common) {
return return
} }
val string = (expression.argumentMapping.mapping.values.firstOrNull() as? FirConstExpression<*>)?.value as? String ?: return val string = (expression.argumentMapping.mapping.values.firstOrNull() as? FirLiteralExpression<*>)?.value as? String ?: return
if (!validateQualifier(string)) { if (!validateQualifier(string)) {
reporter.reportOn(expression.argumentList.arguments.first().source, FirWebCommonErrors.WRONG_JS_QUALIFIER, context) reporter.reportOn(expression.argumentList.arguments.first().source, FirWebCommonErrors.WRONG_JS_QUALIFIER, context)
@@ -65,8 +65,8 @@ class ComposedExpressionCheckers(val predicate: (FirCheckerWithMppKind) -> Boole
get() = _typeOperatorCallCheckers get() = _typeOperatorCallCheckers
override val resolvedQualifierCheckers: Set<FirResolvedQualifierChecker> override val resolvedQualifierCheckers: Set<FirResolvedQualifierChecker>
get() = _resolvedQualifierCheckers get() = _resolvedQualifierCheckers
override val constExpressionCheckers: Set<FirConstExpressionChecker> override val literalExpressionCheckers: Set<FirLiteralExpressionChecker>
get() = _constExpressionCheckers get() = _literalExpressionCheckers
override val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> override val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker>
get() = _callableReferenceAccessCheckers get() = _callableReferenceAccessCheckers
override val thisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker> override val thisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker>
@@ -108,7 +108,7 @@ class ComposedExpressionCheckers(val predicate: (FirCheckerWithMppKind) -> Boole
private val _stringConcatenationCallCheckers: MutableSet<FirStringConcatenationCallChecker> = mutableSetOf() private val _stringConcatenationCallCheckers: MutableSet<FirStringConcatenationCallChecker> = mutableSetOf()
private val _typeOperatorCallCheckers: MutableSet<FirTypeOperatorCallChecker> = mutableSetOf() private val _typeOperatorCallCheckers: MutableSet<FirTypeOperatorCallChecker> = mutableSetOf()
private val _resolvedQualifierCheckers: MutableSet<FirResolvedQualifierChecker> = mutableSetOf() private val _resolvedQualifierCheckers: MutableSet<FirResolvedQualifierChecker> = mutableSetOf()
private val _constExpressionCheckers: MutableSet<FirConstExpressionChecker> = mutableSetOf() private val _literalExpressionCheckers: MutableSet<FirLiteralExpressionChecker> = mutableSetOf()
private val _callableReferenceAccessCheckers: MutableSet<FirCallableReferenceAccessChecker> = mutableSetOf() private val _callableReferenceAccessCheckers: MutableSet<FirCallableReferenceAccessChecker> = mutableSetOf()
private val _thisReceiverExpressionCheckers: MutableSet<FirThisReceiverExpressionChecker> = mutableSetOf() private val _thisReceiverExpressionCheckers: MutableSet<FirThisReceiverExpressionChecker> = mutableSetOf()
private val _whileLoopCheckers: MutableSet<FirWhileLoopChecker> = mutableSetOf() private val _whileLoopCheckers: MutableSet<FirWhileLoopChecker> = mutableSetOf()
@@ -144,7 +144,7 @@ class ComposedExpressionCheckers(val predicate: (FirCheckerWithMppKind) -> Boole
checkers.stringConcatenationCallCheckers.filterTo(_stringConcatenationCallCheckers, predicate) checkers.stringConcatenationCallCheckers.filterTo(_stringConcatenationCallCheckers, predicate)
checkers.typeOperatorCallCheckers.filterTo(_typeOperatorCallCheckers, predicate) checkers.typeOperatorCallCheckers.filterTo(_typeOperatorCallCheckers, predicate)
checkers.resolvedQualifierCheckers.filterTo(_resolvedQualifierCheckers, predicate) checkers.resolvedQualifierCheckers.filterTo(_resolvedQualifierCheckers, predicate)
checkers.constExpressionCheckers.filterTo(_constExpressionCheckers, predicate) checkers.literalExpressionCheckers.filterTo(_literalExpressionCheckers, predicate)
checkers.callableReferenceAccessCheckers.filterTo(_callableReferenceAccessCheckers, predicate) checkers.callableReferenceAccessCheckers.filterTo(_callableReferenceAccessCheckers, predicate)
checkers.thisReceiverExpressionCheckers.filterTo(_thisReceiverExpressionCheckers, predicate) checkers.thisReceiverExpressionCheckers.filterTo(_thisReceiverExpressionCheckers, predicate)
checkers.whileLoopCheckers.filterTo(_whileLoopCheckers, predicate) checkers.whileLoopCheckers.filterTo(_whileLoopCheckers, predicate)
@@ -41,7 +41,7 @@ abstract class ExpressionCheckers {
open val stringConcatenationCallCheckers: Set<FirStringConcatenationCallChecker> = emptySet() open val stringConcatenationCallCheckers: Set<FirStringConcatenationCallChecker> = emptySet()
open val typeOperatorCallCheckers: Set<FirTypeOperatorCallChecker> = emptySet() open val typeOperatorCallCheckers: Set<FirTypeOperatorCallChecker> = emptySet()
open val resolvedQualifierCheckers: Set<FirResolvedQualifierChecker> = emptySet() open val resolvedQualifierCheckers: Set<FirResolvedQualifierChecker> = emptySet()
open val constExpressionCheckers: Set<FirConstExpressionChecker> = emptySet() open val literalExpressionCheckers: Set<FirLiteralExpressionChecker> = emptySet()
open val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> = emptySet() open val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> = emptySet()
open val thisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker> = emptySet() open val thisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker> = emptySet()
open val whileLoopCheckers: Set<FirWhileLoopChecker> = emptySet() open val whileLoopCheckers: Set<FirWhileLoopChecker> = emptySet()
@@ -75,7 +75,7 @@ abstract class ExpressionCheckers {
@CheckersComponentInternal internal val allStringConcatenationCallCheckers: Set<FirStringConcatenationCallChecker> by lazy { stringConcatenationCallCheckers + basicExpressionCheckers + callCheckers } @CheckersComponentInternal internal val allStringConcatenationCallCheckers: Set<FirStringConcatenationCallChecker> by lazy { stringConcatenationCallCheckers + basicExpressionCheckers + callCheckers }
@CheckersComponentInternal internal val allTypeOperatorCallCheckers: Set<FirTypeOperatorCallChecker> by lazy { typeOperatorCallCheckers + basicExpressionCheckers + callCheckers } @CheckersComponentInternal internal val allTypeOperatorCallCheckers: Set<FirTypeOperatorCallChecker> by lazy { typeOperatorCallCheckers + basicExpressionCheckers + callCheckers }
@CheckersComponentInternal internal val allResolvedQualifierCheckers: Set<FirResolvedQualifierChecker> by lazy { resolvedQualifierCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allResolvedQualifierCheckers: Set<FirResolvedQualifierChecker> by lazy { resolvedQualifierCheckers + basicExpressionCheckers }
@CheckersComponentInternal internal val allConstExpressionCheckers: Set<FirConstExpressionChecker> by lazy { constExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allLiteralExpressionCheckers: Set<FirLiteralExpressionChecker> by lazy { literalExpressionCheckers + basicExpressionCheckers }
@CheckersComponentInternal internal val allCallableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> by lazy { callableReferenceAccessCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allCallableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> by lazy { callableReferenceAccessCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers }
@CheckersComponentInternal internal val allThisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker> by lazy { thisReceiverExpressionCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allThisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker> by lazy { thisReceiverExpressionCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers }
@CheckersComponentInternal internal val allWhileLoopCheckers: Set<FirWhileLoopChecker> by lazy { whileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allWhileLoopCheckers: Set<FirWhileLoopChecker> by lazy { whileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers }
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.expressions.FirCall
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall
import org.jetbrains.kotlin.fir.expressions.FirClassReferenceExpression import org.jetbrains.kotlin.fir.expressions.FirClassReferenceExpression
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirElvisExpression import org.jetbrains.kotlin.fir.expressions.FirElvisExpression
import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall
@@ -27,6 +26,7 @@ import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirGetClassCall import org.jetbrains.kotlin.fir.expressions.FirGetClassCall
import org.jetbrains.kotlin.fir.expressions.FirInaccessibleReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirInaccessibleReceiverExpression
import org.jetbrains.kotlin.fir.expressions.FirIntegerLiteralOperatorCall import org.jetbrains.kotlin.fir.expressions.FirIntegerLiteralOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.FirLoop
import org.jetbrains.kotlin.fir.expressions.FirLoopJump import org.jetbrains.kotlin.fir.expressions.FirLoopJump
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
@@ -68,7 +68,7 @@ typealias FirEqualityOperatorCallChecker = FirExpressionChecker<FirEqualityOpera
typealias FirStringConcatenationCallChecker = FirExpressionChecker<FirStringConcatenationCall> typealias FirStringConcatenationCallChecker = FirExpressionChecker<FirStringConcatenationCall>
typealias FirTypeOperatorCallChecker = FirExpressionChecker<FirTypeOperatorCall> typealias FirTypeOperatorCallChecker = FirExpressionChecker<FirTypeOperatorCall>
typealias FirResolvedQualifierChecker = FirExpressionChecker<FirResolvedQualifier> typealias FirResolvedQualifierChecker = FirExpressionChecker<FirResolvedQualifier>
typealias FirConstExpressionChecker = FirExpressionChecker<FirConstExpression<*>> typealias FirLiteralExpressionChecker = FirExpressionChecker<FirLiteralExpression<*>>
typealias FirCallableReferenceAccessChecker = FirExpressionChecker<FirCallableReferenceAccess> typealias FirCallableReferenceAccessChecker = FirExpressionChecker<FirCallableReferenceAccess>
typealias FirThisReceiverExpressionChecker = FirExpressionChecker<FirThisReceiverExpression> typealias FirThisReceiverExpressionChecker = FirExpressionChecker<FirThisReceiverExpression>
typealias FirWhileLoopChecker = FirExpressionChecker<FirWhileLoop> typealias FirWhileLoopChecker = FirExpressionChecker<FirWhileLoop>
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.fir.contracts.effects
import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
import org.jetbrains.kotlin.fir.expressions.FirWhenExpression import org.jetbrains.kotlin.fir.expressions.FirWhenExpression
@@ -111,7 +111,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker(MppCheckerKind.Common)
var flow = node.flow var flow = node.flow
val operation = effect.value.toOperation() val operation = effect.value.toOperation()
if (operation != null) { if (operation != null) {
if (resultExpression is FirConstExpression<*>) { if (resultExpression is FirLiteralExpression<*>) {
if (!operation.isTrueFor(resultExpression.value)) return false if (!operation.isTrueFor(resultExpression.value)) return false
} else { } else {
if (expressionType != null && !operation.canBeTrueFor(context.session, expressionType)) return false if (expressionType != null && !operation.canBeTrueFor(context.session, expressionType)) return false
@@ -119,7 +119,7 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
return if (intrinsicConstEvaluation) ConstantArgumentKind.VALID_CONST else ConstantArgumentKind.NOT_CONST return if (intrinsicConstEvaluation) ConstantArgumentKind.VALID_CONST else ConstantArgumentKind.NOT_CONST
} }
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: Nothing?): ConstantArgumentKind { override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: Nothing?): ConstantArgumentKind {
return ConstantArgumentKind.VALID_CONST return ConstantArgumentKind.VALID_CONST
} }
@@ -143,7 +143,7 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
} }
for (exp in equalityOperatorCall.arguments) { for (exp in equalityOperatorCall.arguments) {
if (exp is FirConstExpression<*> && exp.value == null) { if (exp is FirLiteralExpression<*> && exp.value == null) {
return ConstantArgumentKind.NOT_CONST return ConstantArgumentKind.NOT_CONST
} }
@@ -219,7 +219,7 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor
// Ok, because we only look at the structure, not resolution-dependent properties. // Ok, because we only look at the structure, not resolution-dependent properties.
@OptIn(SymbolInternals::class) @OptIn(SymbolInternals::class)
return when (propertySymbol.fir.initializer) { return when (propertySymbol.fir.initializer) {
is FirConstExpression<*> -> when { is FirLiteralExpression<*> -> when {
propertySymbol.isVal -> ConstantArgumentKind.NOT_CONST_VAL_IN_CONST_EXPRESSION propertySymbol.isVal -> ConstantArgumentKind.NOT_CONST_VAL_IN_CONST_EXPRESSION
else -> ConstantArgumentKind.NOT_CONST else -> ConstantArgumentKind.NOT_CONST
} }
@@ -792,7 +792,7 @@ fun FirBasedSymbol<*>.getAnnotationFirstArgument(classId: ClassId, session: FirS
} }
fun FirBasedSymbol<*>.getAnnotationStringParameter(classId: ClassId, session: FirSession): String? { fun FirBasedSymbol<*>.getAnnotationStringParameter(classId: ClassId, session: FirSession): String? {
val expression = getAnnotationFirstArgument(classId, session) as? FirConstExpression<*> val expression = getAnnotationFirstArgument(classId, session) as? FirLiteralExpression<*>
return expression?.value as? String return expression?.value as? String
} }
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds
@@ -56,7 +56,7 @@ private fun FirDeclaration.getOwnSinceKotlinVersion(session: FirSession): FirSin
val sinceKotlinSingleArgument = getAnnotationByClassId(StandardClassIds.Annotations.SinceKotlin, session)?.findArgumentByName( val sinceKotlinSingleArgument = getAnnotationByClassId(StandardClassIds.Annotations.SinceKotlin, session)?.findArgumentByName(
StandardClassIds.Annotations.ParameterNames.sinceKotlinVersion StandardClassIds.Annotations.ParameterNames.sinceKotlinVersion
) )
val apiVersion = ((sinceKotlinSingleArgument as? FirConstExpression<*>)?.value as? String)?.let(ApiVersion.Companion::parse) val apiVersion = ((sinceKotlinSingleArgument as? FirLiteralExpression<*>)?.value as? String)?.let(ApiVersion.Companion::parse)
return if (apiVersion != null) { return if (apiVersion != null) {
FirSinceKotlinValue(apiVersion, loadWasExperimentalMarkerClasses(session)) FirSinceKotlinValue(apiVersion, loadWasExperimentalMarkerClasses(session))
} else null } else null
@@ -456,7 +456,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker(MppCheckerKind.Common) {
expression is FirFunctionCall || expression is FirFunctionCall ||
expression is FirLambdaArgumentExpression || expression is FirLambdaArgumentExpression ||
expression is FirAnonymousFunctionExpression || expression is FirAnonymousFunctionExpression ||
(expression is FirConstExpression<*> && expression.value == null) //this will be reported separately (expression is FirLiteralExpression<*> && expression.value == null) //this will be reported separately
fun checkCallableDeclaration(declaration: FirCallableDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { fun checkCallableDeclaration(declaration: FirCallableDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration is FirPropertyAccessor) return if (declaration is FirPropertyAccessor) return
@@ -123,8 +123,8 @@ object FirAnnotationExpressionChecker : FirAnnotationCallChecker(MppCheckerKind.
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
): ApiVersion? { ): ApiVersion? {
val constantExpression = (expression as? FirConstExpression<*>) val constantExpression = (expression as? FirLiteralExpression<*>)
?: ((expression as? FirNamedArgumentExpression)?.expression as? FirConstExpression<*>) ?: return null ?: ((expression as? FirNamedArgumentExpression)?.expression as? FirLiteralExpression<*>) ?: return null
val stringValue = constantExpression.value as? String ?: return null val stringValue = constantExpression.value as? String ?: return null
if (!stringValue.matches(RequireKotlinConstants.VERSION_REGEX)) { if (!stringValue.matches(RequireKotlinConstants.VERSION_REGEX)) {
reporter.reportOn(expression.source, FirErrors.ILLEGAL_KOTLIN_VERSION_STRING_VALUE, context) reporter.reportOn(expression.source, FirErrors.ILLEGAL_KOTLIN_VERSION_STRING_VALUE, context)
@@ -242,7 +242,7 @@ object FirAnnotationExpressionChecker : FirAnnotationCallChecker(MppCheckerKind.
if (annotationClassId != StandardClassIds.Annotations.Suppress) return if (annotationClassId != StandardClassIds.Annotations.Suppress) return
val nameExpressions = argumentMapping[StandardClassIds.Annotations.ParameterNames.suppressNames]?.unwrapVarargValue() ?: return val nameExpressions = argumentMapping[StandardClassIds.Annotations.ParameterNames.suppressNames]?.unwrapVarargValue() ?: return
for (nameExpression in nameExpressions) { for (nameExpression in nameExpressions) {
val name = (nameExpression as? FirConstExpression<*>)?.value as? String ?: continue val name = (nameExpression as? FirLiteralExpression<*>)?.value as? String ?: continue
val parameter = when (name) { val parameter = when (name) {
in FIR_NON_SUPPRESSIBLE_ERROR_NAMES -> name in FIR_NON_SUPPRESSIBLE_ERROR_NAMES -> name
AbstractDiagnosticCollector.SUPPRESS_ALL_ERRORS -> "all errors" AbstractDiagnosticCollector.SUPPRESS_ALL_ERRORS -> "all errors"
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.arguments import org.jetbrains.kotlin.fir.expressions.arguments
import org.jetbrains.kotlin.fir.references.toResolvedNamedFunctionSymbol import org.jetbrains.kotlin.fir.references.toResolvedNamedFunctionSymbol
@@ -22,7 +22,7 @@ object FirDivisionByZeroChecker : FirFunctionCallChecker(MppCheckerKind.Common)
private val defaultDivName = Name.identifier("div") private val defaultDivName = Name.identifier("div")
override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
val firstValue = (expression.arguments.singleOrNull() as? FirConstExpression<*>)?.value val firstValue = (expression.arguments.singleOrNull() as? FirLiteralExpression<*>)?.value
if (firstValue != null && (firstValue == 0L || firstValue == 0.0f || firstValue == 0.0)) { if (firstValue != null && (firstValue == 0L || firstValue == 0.0f || firstValue == 0.0)) {
val callableId = (expression.calleeReference.toResolvedNamedFunctionSymbol())?.callableId val callableId = (expression.calleeReference.toResolvedNamedFunctionSymbol())?.callableId
if (callableId != null && callableId.packageName == defaultPackageName && callableId.callableName == defaultDivName) { if (callableId != null && callableId.packageName == defaultPackageName && callableId.callableName == defaultDivName) {
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.correspondingValueParameterFromPrimaryConstructor import org.jetbrains.kotlin.fir.declarations.utils.correspondingValueParameterFromPrimaryConstructor
import org.jetbrains.kotlin.fir.declarations.utils.isData import org.jetbrains.kotlin.fir.declarations.utils.isData
import org.jetbrains.kotlin.fir.declarations.utils.nameOrSpecialName import org.jetbrains.kotlin.fir.declarations.utils.nameOrSpecialName
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.toReference import org.jetbrains.kotlin.fir.expressions.toReference
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
@@ -281,7 +281,7 @@ object FirOptInUsageBaseChecker {
val levelName = levelArgument?.extractEnumValueArgumentInfo()?.enumEntryName?.asString() val levelName = levelArgument?.extractEnumValueArgumentInfo()?.enumEntryName?.asString()
val severity = Experimentality.Severity.entries.firstOrNull { it.name == levelName } ?: Experimentality.DEFAULT_SEVERITY val severity = Experimentality.Severity.entries.firstOrNull { it.name == levelName } ?: Experimentality.DEFAULT_SEVERITY
val message = (experimental.findArgumentByName(MESSAGE) as? FirConstExpression<*>)?.value as? String val message = (experimental.findArgumentByName(MESSAGE) as? FirLiteralExpression<*>)?.value as? String
return Experimentality(symbol.classId, severity, message, annotatedOwnerClassName) return Experimentality(symbol.classId, severity, message, annotatedOwnerClassName)
} }
@@ -42,7 +42,7 @@ object FirWhenConditionChecker : FirWhenExpressionChecker(MppCheckerKind.Common)
val arguments = condition.arguments val arguments = condition.arguments
if (arguments.size == 2 && arguments[0].unwrapSmartcastExpression() is FirWhenSubjectExpression) { if (arguments.size == 2 && arguments[0].unwrapSmartcastExpression() is FirWhenSubjectExpression) {
val value = when (val targetExpression = arguments[1]) { val value = when (val targetExpression = arguments[1]) {
is FirConstExpression<*> -> targetExpression.value is FirLiteralExpression<*> -> targetExpression.value
is FirQualifiedAccessExpression -> targetExpression.calleeReference.toResolvedCallableSymbol() as? FirEnumEntrySymbol is FirQualifiedAccessExpression -> targetExpression.calleeReference.toResolvedCallableSymbol() as? FirEnumEntrySymbol
?: continue ?: continue
is FirResolvedQualifier -> { is FirResolvedQualifier -> {
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
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.expression.FirFunctionCallChecker import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirFunctionCallChecker
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
object EmptyRangeChecker : FirFunctionCallChecker(MppCheckerKind.Common) { object EmptyRangeChecker : FirFunctionCallChecker(MppCheckerKind.Common) {
@@ -41,12 +41,12 @@ object EmptyRangeChecker : FirFunctionCallChecker(MppCheckerKind.Common) {
private val FirFunctionCall.rangeLeft: Long? private val FirFunctionCall.rangeLeft: Long?
get() { get() {
return (explicitReceiver as? FirConstExpression<*>)?.value as? Long return (explicitReceiver as? FirLiteralExpression<*>)?.value as? Long
} }
private val FirFunctionCall.rangeRight: Long? private val FirFunctionCall.rangeRight: Long?
get() { get() {
val arg = argumentList.arguments.getOrNull(0) as? FirConstExpression<*> val arg = argumentList.arguments.getOrNull(0) as? FirLiteralExpression<*>
return arg?.value as? Long return arg?.value as? Long
} }
} }
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
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.expression.FirQualifiedAccessExpressionChecker import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
@@ -38,7 +38,7 @@ object RedundantCallOfConversionMethod : FirQualifiedAccessExpressionChecker(Mpp
} }
private fun FirExpression.isRedundant(qualifiedClassId: ClassId, session: FirSession): Boolean { private fun FirExpression.isRedundant(qualifiedClassId: ClassId, session: FirSession): Boolean {
val thisType = if (this is FirConstExpression<*>) { val thisType = if (this is FirLiteralExpression<*>) {
this.resolvedType.classId this.resolvedType.classId
} else { } else {
when { when {
@@ -38,7 +38,7 @@ object RedundantExplicitTypeChecker : FirPropertyChecker(MppCheckerKind.Common)
if (typeReference.annotations.isNotEmpty()) return if (typeReference.annotations.isNotEmpty()) return
when (initializer) { when (initializer) {
is FirConstExpression<*> -> { is FirLiteralExpression<*> -> {
when (initializer.source?.elementType) { when (initializer.source?.elementType) {
KtNodeTypes.BOOLEAN_CONSTANT -> { KtNodeTypes.BOOLEAN_CONSTANT -> {
if (!type.isSame(StandardClassIds.Boolean)) return if (!type.isSame(StandardClassIds.Boolean)) return
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.customAnnotations import org.jetbrains.kotlin.fir.types.customAnnotations
@@ -26,7 +26,7 @@ object FirDuplicateParameterNameInFunctionTypeChecker : FirTypeRefChecker(MppChe
val type = it.type ?: return@groupBy null val type = it.type ?: return@groupBy null
val annotation = type.customAnnotations.getAnnotationByClassId(StandardNames.FqNames.parameterNameClassId, context.session) val annotation = type.customAnnotations.getAnnotationByClassId(StandardNames.FqNames.parameterNameClassId, context.session)
val nameEntry = annotation?.argumentMapping?.mapping?.get(StandardNames.NAME) val nameEntry = annotation?.argumentMapping?.mapping?.get(StandardNames.NAME)
(nameEntry as? FirConstExpression<*>)?.value as? String (nameEntry as? FirLiteralExpression<*>)?.value as? String
} }
for ((name, projections) in nameToArgumentProjection) { for ((name, projections) in nameToArgumentProjection) {
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.findArgumentByName import org.jetbrains.kotlin.fir.declarations.findArgumentByName
import org.jetbrains.kotlin.fir.declarations.unwrapVarargValue import org.jetbrains.kotlin.fir.declarations.unwrapVarargValue
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.SessionHolder import org.jetbrains.kotlin.fir.resolve.SessionHolder
import org.jetbrains.kotlin.fir.symbols.lazyDeclarationResolver import org.jetbrains.kotlin.fir.symbols.lazyDeclarationResolver
@@ -60,7 +60,7 @@ abstract class AbstractDiagnosticCollector(
?: continue ?: continue
for (argumentValue in argumentValues) { for (argumentValue in argumentValues) {
val value = (argumentValue as? FirConstExpression<*>)?.value as? String ?: continue val value = (argumentValue as? FirLiteralExpression<*>)?.value as? String ?: continue
if (result == null) { if (result == null) {
result = mutableListOf() result = mutableListOf()
@@ -46,8 +46,8 @@ class ExpressionCheckersDiagnosticComponent(
checkers.allTypeOperatorCallCheckers.check(typeOperatorCall, data) checkers.allTypeOperatorCallCheckers.check(typeOperatorCall, data)
} }
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: CheckerContext) { override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: CheckerContext) {
checkers.allConstExpressionCheckers.check(constExpression, data) checkers.allLiteralExpressionCheckers.check(literalExpression, data)
} }
override fun visitAnnotation(annotation: FirAnnotation, data: CheckerContext) { override fun visitAnnotation(annotation: FirAnnotation, data: CheckerContext) {
@@ -759,7 +759,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
} }
} }
private fun FlowContent.generate(expression: FirConstExpression<*>) { private fun FlowContent.generate(expression: FirLiteralExpression<*>) {
val value = expression.value val value = expression.value
if (value == null && expression.kind != ConstantValueKind.Null) { if (value == null && expression.kind != ConstantValueKind.Null) {
return error { return error {
@@ -1545,7 +1545,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
is FirElseIfTrueCondition -> generate(expression) is FirElseIfTrueCondition -> generate(expression)
is FirWhenExpression -> generate(expression, isStatement = false) is FirWhenExpression -> generate(expression, isStatement = false)
is FirTryExpression -> generate(expression, isStatement = false) is FirTryExpression -> generate(expression, isStatement = false)
is FirConstExpression<*> -> generate(expression) is FirLiteralExpression<*> -> generate(expression)
is FirReturnExpression -> { is FirReturnExpression -> {
span("return-label") { span("return-label") {
symbolRef(expression.target.labeledElement.symbol) { symbolRef(expression.target.labeledElement.symbol) {
@@ -298,7 +298,7 @@ abstract class AbstractAnnotationDeserializer(
} }
} }
private fun <T> const(kind: ConstantValueKind<T>, value: T, typeRef: FirResolvedTypeRef): FirConstExpression<T> { private fun <T> const(kind: ConstantValueKind<T>, value: T, typeRef: FirResolvedTypeRef): FirLiteralExpression<T> {
return buildConstExpression(null, kind, value, setType = true).apply { this.replaceConeTypeOrNull(typeRef.coneType) } return buildLiteralExpression(null, kind, value, setType = true).apply { this.replaceConeTypeOrNull(typeRef.coneType) }
} }
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLiteralExpression
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.metadata.deserialization.NameResolver
@@ -35,31 +35,31 @@ fun buildFirConstant(
protoValue: ProtoBuf.Annotation.Argument.Value?, sourceValue: Any?, constKind: String, nameResolver: NameResolver protoValue: ProtoBuf.Annotation.Argument.Value?, sourceValue: Any?, constKind: String, nameResolver: NameResolver
): FirExpression? { ): FirExpression? {
return when (constKind) { return when (constKind) {
"BYTE", "B" -> buildConstExpression( "BYTE", "B" -> buildLiteralExpression(
null, ConstantValueKind.Byte, ((protoValue?.intValue ?: sourceValue) as Number).toByte(), setType = true null, ConstantValueKind.Byte, ((protoValue?.intValue ?: sourceValue) as Number).toByte(), setType = true
) )
"CHAR", "C" -> buildConstExpression( "CHAR", "C" -> buildLiteralExpression(
null, ConstantValueKind.Char, ((protoValue?.intValue ?: sourceValue) as Number).toInt().toChar(), setType = true null, ConstantValueKind.Char, ((protoValue?.intValue ?: sourceValue) as Number).toInt().toChar(), setType = true
) )
"SHORT", "S" -> buildConstExpression( "SHORT", "S" -> buildLiteralExpression(
null, ConstantValueKind.Short, ((protoValue?.intValue ?: sourceValue) as Number).toShort(), setType = true null, ConstantValueKind.Short, ((protoValue?.intValue ?: sourceValue) as Number).toShort(), setType = true
) )
"INT", "I" -> buildConstExpression( "INT", "I" -> buildLiteralExpression(
null, ConstantValueKind.Int, protoValue?.intValue?.toInt() ?: sourceValue as Int, setType = true null, ConstantValueKind.Int, protoValue?.intValue?.toInt() ?: sourceValue as Int, setType = true
) )
"LONG", "J" -> buildConstExpression( "LONG", "J" -> buildLiteralExpression(
null, ConstantValueKind.Long, protoValue?.intValue ?: sourceValue as Long, setType = true null, ConstantValueKind.Long, protoValue?.intValue ?: sourceValue as Long, setType = true
) )
"FLOAT", "F" -> buildConstExpression( "FLOAT", "F" -> buildLiteralExpression(
null, ConstantValueKind.Float, protoValue?.floatValue ?: sourceValue as Float, setType = true null, ConstantValueKind.Float, protoValue?.floatValue ?: sourceValue as Float, setType = true
) )
"DOUBLE", "D" -> buildConstExpression( "DOUBLE", "D" -> buildLiteralExpression(
null, ConstantValueKind.Double, protoValue?.doubleValue ?: sourceValue as Double, setType = true null, ConstantValueKind.Double, protoValue?.doubleValue ?: sourceValue as Double, setType = true
) )
"BOOLEAN", "Z" -> buildConstExpression( "BOOLEAN", "Z" -> buildLiteralExpression(
null, ConstantValueKind.Boolean, (protoValue?.intValue?.toInt() ?: sourceValue) != 0, setType = true null, ConstantValueKind.Boolean, (protoValue?.intValue?.toInt() ?: sourceValue) != 0, setType = true
) )
"STRING", "Ljava/lang/String;" -> buildConstExpression( "STRING", "Ljava/lang/String;" -> buildLiteralExpression(
null, ConstantValueKind.String, null, ConstantValueKind.String,
protoValue?.stringValue?.let { nameResolver.getString(it) } ?: sourceValue as String, setType = true protoValue?.stringValue?.let { nameResolver.getString(it) } ?: sourceValue as String, setType = true
) )
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.fir.deserialization.projection
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMapping import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLiteralExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.extensions.FirExtensionApiInternals import org.jetbrains.kotlin.fir.extensions.FirExtensionApiInternals
import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.extensionService
@@ -938,7 +938,7 @@ class FirElementSerializer private constructor(
correspondingTypeRef?.annotations, CompilerConeAttributes.ContextFunctionTypeParams.ANNOTATION_CLASS_ID, correspondingTypeRef?.annotations, CompilerConeAttributes.ContextFunctionTypeParams.ANNOTATION_CLASS_ID,
argumentMapping = buildAnnotationArgumentMapping { argumentMapping = buildAnnotationArgumentMapping {
this.mapping[StandardNames.CONTEXT_FUNCTION_TYPE_PARAMETER_COUNT_NAME] = this.mapping[StandardNames.CONTEXT_FUNCTION_TYPE_PARAMETER_COUNT_NAME] =
buildConstExpression( buildLiteralExpression(
source = null, ConstantValueKind.Int, type.contextReceiversNumberForFunctionType, setType = false source = null, ConstantValueKind.Int, type.contextReceiversNumberForFunctionType, setType = false
) )
} }
@@ -60,12 +60,12 @@ internal object FirToConstantValueTransformer : FirDefaultVisitor<ConstantValue<
error("Illegal element as annotation argument: ${element::class.qualifiedName} -> ${element.render()}") error("Illegal element as annotation argument: ${element::class.qualifiedName} -> ${element.render()}")
} }
override fun <T> visitConstExpression( override fun <T> visitLiteralExpression(
constExpression: FirConstExpression<T>, literalExpression: FirLiteralExpression<T>,
data: FirToConstantValueTransformerData data: FirToConstantValueTransformerData
): ConstantValue<*>? { ): ConstantValue<*>? {
val value = constExpression.value val value = literalExpression.value
return when (constExpression.kind) { return when (literalExpression.kind) {
ConstantValueKind.Boolean -> BooleanValue(value as Boolean) ConstantValueKind.Boolean -> BooleanValue(value as Boolean)
ConstantValueKind.Char -> CharValue(value as Char) ConstantValueKind.Char -> CharValue(value as Char)
ConstantValueKind.Byte -> ByteValue((value as Number).toByte()) ConstantValueKind.Byte -> ByteValue((value as Number).toByte())
@@ -250,11 +250,11 @@ internal object FirToConstantValueChecker : FirDefaultVisitor<Boolean, FirSessio
return false return false
} }
override fun <T> visitConstExpression( override fun <T> visitLiteralExpression(
constExpression: FirConstExpression<T>, literalExpression: FirLiteralExpression<T>,
data: FirSession data: FirSession
): Boolean { ): Boolean {
return constExpression.kind in supportedConstKinds return literalExpression.kind in supportedConstKinds
} }
override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: FirSession): Boolean { override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: FirSession): Boolean {
@@ -333,7 +333,7 @@ fun FirCallableSymbol<*>.toSymbolForCall(
} }
} }
fun FirConstExpression<*>.getIrConstKind(): IrConstKind<*> = when (kind) { fun FirLiteralExpression<*>.getIrConstKind(): IrConstKind<*> = when (kind) {
ConstantValueKind.IntegerLiteral, ConstantValueKind.UnsignedIntegerLiteral -> { ConstantValueKind.IntegerLiteral, ConstantValueKind.UnsignedIntegerLiteral -> {
val type = resolvedType as ConeIntegerLiteralType val type = resolvedType as ConeIntegerLiteralType
type.getApproximatedType().toConstKind()!!.toIrConstKind() type.getApproximatedType().toConstKind()!!.toIrConstKind()
@@ -342,7 +342,7 @@ fun FirConstExpression<*>.getIrConstKind(): IrConstKind<*> = when (kind) {
else -> kind.toIrConstKind() else -> kind.toIrConstKind()
} }
fun <T> FirConstExpression<T>.toIrConst(irType: IrType): IrConst<T> { fun <T> FirLiteralExpression<T>.toIrConst(irType: IrType): IrConst<T> {
return convertWithOffsets { startOffset, endOffset -> return convertWithOffsets { startOffset, endOffset ->
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val kind = getIrConstKind() as IrConstKind<T> val kind = getIrConstKind() as IrConstKind<T>
@@ -62,7 +62,7 @@ class Fir2IrImplicitCastInserter(
override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall, data: IrElement): IrElement = data override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall, data: IrElement): IrElement = data
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: IrElement): IrElement = data override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: IrElement): IrElement = data
override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: IrElement): IrElement = data override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: IrElement): IrElement = data
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMapping import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLiteralExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub
import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.providers.getContainingFile import org.jetbrains.kotlin.fir.resolve.providers.getContainingFile
@@ -280,61 +280,61 @@ class Fir2IrIrGeneratedDeclarationsRegistrar(private val components: Fir2IrCompo
val name = this@toFirAnnotation.symbol.owner.valueParameters[i].name val name = this@toFirAnnotation.symbol.owner.valueParameters[i].name
val argument = this@toFirAnnotation.getValueArgument(i) as IrConst<*> val argument = this@toFirAnnotation.getValueArgument(i) as IrConst<*>
this.mapping[name] = when (argument.kind) { this.mapping[name] = when (argument.kind) {
IrConstKind.Boolean -> buildConstExpression( IrConstKind.Boolean -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.Boolean, ConstantValueKind.Boolean,
argument.value as Boolean, argument.value as Boolean,
setType = true setType = true
) )
IrConstKind.Byte -> buildConstExpression( IrConstKind.Byte -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.Byte, ConstantValueKind.Byte,
argument.value as Byte, argument.value as Byte,
setType = true setType = true
) )
IrConstKind.Char -> buildConstExpression( IrConstKind.Char -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.Char, ConstantValueKind.Char,
argument.value as Char, argument.value as Char,
setType = true setType = true
) )
IrConstKind.Double -> buildConstExpression( IrConstKind.Double -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.Double, ConstantValueKind.Double,
argument.value as Double, argument.value as Double,
setType = true setType = true
) )
IrConstKind.Float -> buildConstExpression( IrConstKind.Float -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.Float, ConstantValueKind.Float,
argument.value as Float, argument.value as Float,
setType = true setType = true
) )
IrConstKind.Int -> buildConstExpression( IrConstKind.Int -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.Int, ConstantValueKind.Int,
argument.value as Int, argument.value as Int,
setType = true setType = true
) )
IrConstKind.Long -> buildConstExpression( IrConstKind.Long -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.Long, ConstantValueKind.Long,
argument.value as Long, argument.value as Long,
setType = true setType = true
) )
IrConstKind.Null -> buildConstExpression( IrConstKind.Null -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.Null, ConstantValueKind.Null,
value = null, value = null,
setType = true setType = true
) )
IrConstKind.Short -> buildConstExpression( IrConstKind.Short -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.Short, ConstantValueKind.Short,
argument.value as Short, argument.value as Short,
setType = false setType = false
) )
IrConstKind.String -> buildConstExpression( IrConstKind.String -> buildLiteralExpression(
source = null, source = null,
ConstantValueKind.String, ConstantValueKind.String,
argument.value as String, argument.value as String,
@@ -876,8 +876,8 @@ class Fir2IrVisitor(
return desugaredAssignmentValueReferenceExpression.expressionRef.value.accept(this, null) return desugaredAssignmentValueReferenceExpression.expressionRef.value.accept(this, null)
} }
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: Any?): IrElement { override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: Any?): IrElement {
return constExpression.toIrConst(constExpression.resolvedType.toIrType()) return literalExpression.toIrConst(literalExpression.resolvedType.toIrType())
} }
// ================================================================================== // ==================================================================================
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.fir.descriptors.FirPackageFragmentDescriptor import org.jetbrains.kotlin.fir.descriptors.FirPackageFragmentDescriptor
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
@@ -312,7 +312,7 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
initializer, initializer,
typeToUse typeToUse
).also { field -> ).also { field ->
if (initializer is FirConstExpression<*>) { if (initializer is FirLiteralExpression<*>) {
val constType = initializer.resolvedType.toIrType() val constType = initializer.resolvedType.toIrType()
field.initializer = factory.createExpressionBody(initializer.toIrConst(constType)) field.initializer = factory.createExpressionBody(initializer.toIrConst(constType))
} }
@@ -368,7 +368,7 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
private fun getEffectivePropertyInitializer(property: FirProperty, resolveIfNeeded: Boolean): FirExpression? { private fun getEffectivePropertyInitializer(property: FirProperty, resolveIfNeeded: Boolean): FirExpression? {
val initializer = property.backingField?.initializer ?: property.initializer val initializer = property.backingField?.initializer ?: property.initializer
if (resolveIfNeeded && initializer is FirConstExpression<*>) { if (resolveIfNeeded && initializer is FirLiteralExpression<*>) {
property.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE) property.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE)
return getEffectivePropertyInitializer(property, resolveIfNeeded = false) return getEffectivePropertyInitializer(property, resolveIfNeeded = false)
} }
@@ -558,7 +558,7 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
).apply { ).apply {
metadata = FirMetadataSource.Field(field) metadata = FirMetadataSource.Field(field)
val initializer = field.unwrapFakeOverrides().initializer val initializer = field.unwrapFakeOverrides().initializer
if (initializer is FirConstExpression<*>) { if (initializer is FirLiteralExpression<*>) {
this.initializer = factory.createExpressionBody(initializer.toIrConst(irType)) this.initializer = factory.createExpressionBody(initializer.toIrConst(irType))
} }
/* /*
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isExternal
import org.jetbrains.kotlin.fir.declarations.utils.isFinal import org.jetbrains.kotlin.fir.declarations.utils.isFinal
import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.declarations.utils.isStatic
import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.unwrapFakeOverrides import org.jetbrains.kotlin.fir.unwrapFakeOverrides
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
@@ -72,7 +72,7 @@ class Fir2IrLazyField(
override var initializer: IrExpressionBody? by lazyVar(lock) { override var initializer: IrExpressionBody? by lazyVar(lock) {
when (val initializer = fir.unwrapFakeOverrides().initializer) { when (val initializer = fir.unwrapFakeOverrides().initializer) {
is FirConstExpression<*> -> factory.createExpressionBody(initializer.toIrConst(type)) is FirLiteralExpression<*> -> factory.createExpressionBody(initializer.toIrConst(type))
else -> null else -> null
} }
} }
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.resolvedType import org.jetbrains.kotlin.fir.types.resolvedType
@@ -100,7 +100,7 @@ class Fir2IrLazyProperty(
components, fir.returnTypeRef.coneType components, fir.returnTypeRef.coneType
) )
// Setting initializers to every other class causes some cryptic errors in lowerings // Setting initializers to every other class causes some cryptic errors in lowerings
initializer is FirConstExpression<*> -> { initializer is FirLiteralExpression<*> -> {
val constType = with(typeConverter) { initializer.resolvedType.toIrType() } val constType = with(typeConverter) { initializer.resolvedType.toIrType() }
factory.createExpressionBody(initializer.toIrConst(constType)) factory.createExpressionBody(initializer.toIrConst(constType))
} }
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.fir.caches.getValue
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
@@ -132,7 +132,7 @@ class FirJavaElementFinder(
private fun FirFile.jvmName(): String { private fun FirFile.jvmName(): String {
val jvmNameAnnotation = this.findJvmNameAnnotation() val jvmNameAnnotation = this.findJvmNameAnnotation()
val jvmName = jvmNameAnnotation?.findArgumentByName(StandardNames.NAME) val jvmName = jvmNameAnnotation?.findArgumentByName(StandardNames.NAME)
val jvmNameValue = (jvmName as? FirConstExpression<*>)?.value as? String val jvmNameValue = (jvmName as? FirLiteralExpression<*>)?.value as? String
return jvmNameValue ?: (this.name.removeSuffix(".kt").capitalizeAsciiOnly() + "Kt") return jvmNameValue ?: (this.name.removeSuffix(".kt").capitalizeAsciiOnly() + "Kt")
} }
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.expressions.FirArrayLiteral
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildArgumentList import org.jetbrains.kotlin.fir.expressions.builder.buildArgumentList
import org.jetbrains.kotlin.fir.expressions.builder.buildArrayLiteral import org.jetbrains.kotlin.fir.expressions.builder.buildArrayLiteral
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLiteralExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildErrorExpression import org.jetbrains.kotlin.fir.expressions.builder.buildErrorExpression
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.expectedConeType import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.expectedConeType
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -77,31 +77,31 @@ internal fun Any?.createConstantOrError(session: FirSession, expectedTypeRef: Fi
internal fun Any?.createConstantIfAny(session: FirSession, unsigned: Boolean = false): FirExpression? { internal fun Any?.createConstantIfAny(session: FirSession, unsigned: Boolean = false): FirExpression? {
return when (this) { return when (this) {
is Byte -> buildConstExpression( is Byte -> buildLiteralExpression(
null, if (unsigned) ConstantValueKind.UnsignedByte else ConstantValueKind.Byte, this, setType = true null, if (unsigned) ConstantValueKind.UnsignedByte else ConstantValueKind.Byte, this, setType = true
) )
is Short -> buildConstExpression( is Short -> buildLiteralExpression(
null, if (unsigned) ConstantValueKind.UnsignedShort else ConstantValueKind.Short, this, setType = true null, if (unsigned) ConstantValueKind.UnsignedShort else ConstantValueKind.Short, this, setType = true
) )
is Int -> buildConstExpression( is Int -> buildLiteralExpression(
null, if (unsigned) ConstantValueKind.UnsignedInt else ConstantValueKind.Int, this, setType = true null, if (unsigned) ConstantValueKind.UnsignedInt else ConstantValueKind.Int, this, setType = true
) )
is Long -> buildConstExpression( is Long -> buildLiteralExpression(
null, if (unsigned) ConstantValueKind.UnsignedLong else ConstantValueKind.Long, this, setType = true null, if (unsigned) ConstantValueKind.UnsignedLong else ConstantValueKind.Long, this, setType = true
) )
is Char -> buildConstExpression( is Char -> buildLiteralExpression(
null, ConstantValueKind.Char, this, setType = true null, ConstantValueKind.Char, this, setType = true
) )
is Float -> buildConstExpression( is Float -> buildLiteralExpression(
null, ConstantValueKind.Float, this, setType = true null, ConstantValueKind.Float, this, setType = true
) )
is Double -> buildConstExpression( is Double -> buildLiteralExpression(
null, ConstantValueKind.Double, this, setType = true null, ConstantValueKind.Double, this, setType = true
) )
is Boolean -> buildConstExpression( is Boolean -> buildLiteralExpression(
null, ConstantValueKind.Boolean, this, setType = true null, ConstantValueKind.Boolean, this, setType = true
) )
is String -> buildConstExpression( is String -> buildLiteralExpression(
null, ConstantValueKind.String, this, setType = true null, ConstantValueKind.String, this, setType = true
) )
is ByteArray -> toList().createArrayLiteral(session, ConstantValueKind.Byte) is ByteArray -> toList().createArrayLiteral(session, ConstantValueKind.Byte)
@@ -112,7 +112,7 @@ internal fun Any?.createConstantIfAny(session: FirSession, unsigned: Boolean = f
is FloatArray -> toList().createArrayLiteral(session, ConstantValueKind.Float) is FloatArray -> toList().createArrayLiteral(session, ConstantValueKind.Float)
is DoubleArray -> toList().createArrayLiteral(session, ConstantValueKind.Double) is DoubleArray -> toList().createArrayLiteral(session, ConstantValueKind.Double)
is BooleanArray -> toList().createArrayLiteral(session, ConstantValueKind.Boolean) is BooleanArray -> toList().createArrayLiteral(session, ConstantValueKind.Boolean)
null -> buildConstExpression( null -> buildLiteralExpression(
null, ConstantValueKind.Null, null, setType = true null, ConstantValueKind.Null, null, setType = true
) )
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.deserialization.AbstractAnnotationDeserializer import org.jetbrains.kotlin.fir.deserialization.AbstractAnnotationDeserializer
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation
import org.jetbrains.kotlin.fir.java.createConstantIfAny import org.jetbrains.kotlin.fir.java.createConstantIfAny
@@ -216,7 +216,7 @@ class JvmBinaryAnnotationDeserializer(
): FirExpression? { ): FirExpression? {
val signature = getCallableSignature(propertyProto, nameResolver, typeTable, CallableKind.PROPERTY_GETTER) ?: return null val signature = getCallableSignature(propertyProto, nameResolver, typeTable, CallableKind.PROPERTY_GETTER) ?: return null
val firExpr = annotationInfo.annotationMethodsDefaultValues[signature] val firExpr = annotationInfo.annotationMethodsDefaultValues[signature]
return if (firExpr is FirConstExpression<*> && expectedPropertyType.coneType.isUnsignedType && firExpr.kind.isSignedNumber) return if (firExpr is FirLiteralExpression<*> && expectedPropertyType.coneType.isUnsignedType && firExpr.kind.isSignedNumber)
firExpr.value.createConstantIfAny(session, unsigned = true) firExpr.value.createConstantIfAny(session, unsigned = true)
else else
firExpr firExpr
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.unexpandedClassId import org.jetbrains.kotlin.fir.expressions.unexpandedClassId
import org.jetbrains.kotlin.fir.java.FirJavaTypeConversionMode import org.jetbrains.kotlin.fir.java.FirJavaTypeConversionMode
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
@@ -533,7 +533,7 @@ class FirSignatureEnhancement(
private fun getPurelyImplementedSupertype(session: FirSession): ConeKotlinType? { private fun getPurelyImplementedSupertype(session: FirSession): ConeKotlinType? {
val purelyImplementedClassIdFromAnnotation = owner.annotations val purelyImplementedClassIdFromAnnotation = owner.annotations
.firstOrNull { it.unexpandedClassId?.asSingleFqName() == JvmAnnotationNames.PURELY_IMPLEMENTS_ANNOTATION } .firstOrNull { it.unexpandedClassId?.asSingleFqName() == JvmAnnotationNames.PURELY_IMPLEMENTS_ANNOTATION }
?.let { (it.argumentMapping.mapping.values.firstOrNull() as? FirConstExpression<*>) } ?.let { (it.argumentMapping.mapping.values.firstOrNull() as? FirLiteralExpression<*>) }
?.let { it.value as? String } ?.let { it.value as? String }
?.takeIf { it.isNotBlank() && isValidJavaFqName(it) } ?.takeIf { it.isNotBlank() && isValidJavaFqName(it) }
?.let { ClassId.topLevel(FqName(it)) } ?.let { ClassId.topLevel(FqName(it)) }
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions
import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
@@ -88,7 +88,7 @@ private fun FirAnnotation.constBooleanArgumentOrNull(argumentName: String): Bool
constArgument(argumentName) as Boolean? constArgument(argumentName) as Boolean?
private fun FirAnnotation.constArgument(argumentName: String) = private fun FirAnnotation.constArgument(argumentName: String) =
(argumentMapping.mapping[Name.identifier(argumentName)] as? FirConstExpression<*>)?.value (argumentMapping.mapping[Name.identifier(argumentName)] as? FirLiteralExpression<*>)?.value
internal fun FirFunction.hasObjCFactoryAnnotation(session: FirSession) = this.annotations.hasAnnotation(NativeStandardInteropNames.objCFactoryClassId, session) internal fun FirFunction.hasObjCFactoryAnnotation(session: FirSession) = this.annotations.hasAnnotation(NativeStandardInteropNames.objCFactoryClassId, session)
@@ -127,4 +127,4 @@ private fun FirAnnotation.tryExpandClassId(session: FirSession): ClassId? {
} }
private fun FirAnnotation.extractContextReceiversCount() = private fun FirAnnotation.extractContextReceiversCount() =
(argumentMapping.mapping[StandardNames.CONTEXT_FUNCTION_TYPE_PARAMETER_COUNT_NAME] as? FirConstExpression<*>)?.value as? Int (argumentMapping.mapping[StandardNames.CONTEXT_FUNCTION_TYPE_PARAMETER_COUNT_NAME] as? FirLiteralExpression<*>)?.value as? Int
@@ -141,12 +141,12 @@ fun FirAnnotation.getBooleanArgument(name: Name): Boolean? = getPrimitiveArgumen
fun FirAnnotation.getStringArgument(name: Name): String? = getPrimitiveArgumentValue(name) fun FirAnnotation.getStringArgument(name: Name): String? = getPrimitiveArgumentValue(name)
fun FirAnnotation.getStringArrayArgument(name: Name): List<String>? { fun FirAnnotation.getStringArrayArgument(name: Name): List<String>? {
val argument = findArgumentByName(name) as? FirArrayLiteral ?: return null val argument = findArgumentByName(name) as? FirArrayLiteral ?: return null
return argument.arguments.mapNotNull { (it as? FirConstExpression<*>)?.value as? String } return argument.arguments.mapNotNull { (it as? FirLiteralExpression<*>)?.value as? String }
} }
private inline fun <reified T> FirAnnotation.getPrimitiveArgumentValue(name: Name): T? { private inline fun <reified T> FirAnnotation.getPrimitiveArgumentValue(name: Name): T? {
return findArgumentByName(name)?.let { expression -> return findArgumentByName(name)?.let { expression ->
(expression as? FirConstExpression<*>)?.value as? T (expression as? FirLiteralExpression<*>)?.value as? T
} }
} }
@@ -273,7 +273,7 @@ private fun List<FirAnnotation>.extractDeprecationAnnotationInfoPerUseSite(
for ((deprecated, shouldPropagateToOverrides) in annotations) { for ((deprecated, shouldPropagateToOverrides) in annotations) {
if (deprecated.unexpandedClassId == StandardClassIds.Annotations.SinceKotlin) { if (deprecated.unexpandedClassId == StandardClassIds.Annotations.SinceKotlin) {
val sinceKotlinSingleArgument = deprecated.findArgumentByName(ParameterNames.sinceKotlinVersion) val sinceKotlinSingleArgument = deprecated.findArgumentByName(ParameterNames.sinceKotlinVersion)
val apiVersion = ((sinceKotlinSingleArgument as? FirConstExpression<*>)?.value as? String) val apiVersion = ((sinceKotlinSingleArgument as? FirLiteralExpression<*>)?.value as? String)
?.let(ApiVersion.Companion::parse) ?: continue ?.let(ApiVersion.Companion::parse) ?: continue
val wasExperimental = this@extractDeprecationAnnotationInfoPerUseSite.any { val wasExperimental = this@extractDeprecationAnnotationInfoPerUseSite.any {
it.unexpandedClassId == StandardClassIds.Annotations.WasExperimental it.unexpandedClassId == StandardClassIds.Annotations.WasExperimental
@@ -315,7 +315,7 @@ private fun List<FirAnnotation>.extractDeprecationAnnotationInfoPerUseSite(
private fun FirAnnotation.getFirstArgumentStringIfNotNamed(): String? { private fun FirAnnotation.getFirstArgumentStringIfNotNamed(): String? {
if (this !is FirAnnotationCall) return null if (this !is FirAnnotationCall) return null
val firstArgument = argumentList.arguments.firstOrNull() ?: return null val firstArgument = argumentList.arguments.firstOrNull() ?: return null
return (firstArgument as? FirConstExpression<*>)?.value?.toString() return (firstArgument as? FirLiteralExpression<*>)?.value?.toString()
} }
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isInner
import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMapping import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLiteralExpression
import org.jetbrains.kotlin.fir.getContainingClassLookupTag import org.jetbrains.kotlin.fir.getContainingClassLookupTag
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
@@ -109,7 +109,7 @@ fun ConeKotlinType.withParameterNameAnnotation(parameter: FirFunctionTypeParamet
} }
argumentMapping = buildAnnotationArgumentMapping { argumentMapping = buildAnnotationArgumentMapping {
mapping[StandardClassIds.Annotations.ParameterNames.parameterNameName] = mapping[StandardClassIds.Annotations.ParameterNames.parameterNameName] =
buildConstExpression(fakeSource, ConstantValueKind.String, name.asString(), setType = true) buildLiteralExpression(fakeSource, ConstantValueKind.String, name.asString(), setType = true)
} }
} }
val attributesWithParameterNameAnnotation = val attributesWithParameterNameAnnotation =
@@ -569,7 +569,7 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext, Ty
is FirNamedArgumentExpression -> argument.expression is FirNamedArgumentExpression -> argument.expression
else -> argument else -> argument
} ?: return null } ?: return null
return (argument as? FirConstExpression<*>)?.value return (argument as? FirLiteralExpression<*>)?.value
} }
override fun TypeConstructorMarker.getTypeParameterClassifier(): TypeParameterMarker? { override fun TypeConstructorMarker.getTypeParameterClassifier(): TypeParameterMarker? {
@@ -470,14 +470,14 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
) )
} }
BOOLEAN_CONSTANT -> BOOLEAN_CONSTANT ->
buildConstExpression( buildLiteralExpression(
sourceElement, sourceElement,
ConstantValueKind.Boolean, ConstantValueKind.Boolean,
convertedText as Boolean, convertedText as Boolean,
setType = false setType = false
) )
NULL -> NULL ->
buildConstExpression( buildLiteralExpression(
sourceElement, sourceElement,
ConstantValueKind.Null, ConstantValueKind.Null,
null, null,
@@ -503,7 +503,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
receiver: FirExpression, receiver: FirExpression,
operationToken: IElementType, operationToken: IElementType,
): FirExpression? { ): FirExpression? {
if (receiver !is FirConstExpression<*>) return null if (receiver !is FirLiteralExpression<*>) return null
if (receiver.kind != ConstantValueKind.IntegerLiteral) return null if (receiver.kind != ConstantValueKind.IntegerLiteral) return null
if (operationToken != PLUS && operationToken != MINUS) return null if (operationToken != PLUS && operationToken != MINUS) return null
@@ -514,7 +514,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
else -> error("Should not be here") else -> error("Should not be here")
} }
return buildConstExpression( return buildLiteralExpression(
source.toFirSourceElement(), source.toFirSourceElement(),
ConstantValueKind.IntegerLiteral, ConstantValueKind.IntegerLiteral,
convertedValue, convertedValue,
@@ -537,7 +537,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
OPEN_QUOTE, CLOSING_QUOTE -> continue@L OPEN_QUOTE, CLOSING_QUOTE -> continue@L
LITERAL_STRING_TEMPLATE_ENTRY -> { LITERAL_STRING_TEMPLATE_ENTRY -> {
sb.append(entry.asText) sb.append(entry.asText)
buildConstExpression( buildLiteralExpression(
entry.toFirSourceElement(), ConstantValueKind.String, entry.asText, setType = false entry.toFirSourceElement(), ConstantValueKind.String, entry.asText, setType = false
) )
} }
@@ -571,7 +571,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
source = base?.toFirSourceElement() source = base?.toFirSourceElement()
// Fast-pass if there is no errors and non-const string expressions // Fast-pass if there is no errors and non-const string expressions
if (!hasExpressions && !argumentList.arguments.any { it is FirErrorExpression }) if (!hasExpressions && !argumentList.arguments.any { it is FirErrorExpression })
return buildConstExpression(source, ConstantValueKind.String, sb.toString(), setType = false) return buildLiteralExpression(source, ConstantValueKind.String, sb.toString(), setType = false)
} }
} }
@@ -363,7 +363,7 @@ fun <T> FirPropertyBuilder.generateAccessorsByDelegate(
} }
coneTypeOrNull = context.dispatchReceiverTypesStack.last() coneTypeOrNull = context.dispatchReceiverTypesStack.last()
} }
else -> buildConstExpression(null, ConstantValueKind.Null, null, setType = false) else -> buildLiteralExpression(null, ConstantValueKind.Null, null, setType = false)
} }
fun delegateAccess() = buildPropertyAccessExpression { fun delegateAccess() = buildPropertyAccessExpression {
@@ -815,7 +815,7 @@ class FirCallResolver(
candidates.isEmpty() -> { candidates.isEmpty() -> {
when { when {
name.asString() == "invoke" && explicitReceiver is FirConstExpression<*> -> name.asString() == "invoke" && explicitReceiver is FirLiteralExpression<*> ->
ConeFunctionExpectedError( ConeFunctionExpectedError(
explicitReceiver.value?.toString() ?: "", explicitReceiver.value?.toString() ?: "",
explicitReceiver.resolvedType, explicitReceiver.resolvedType,
@@ -563,7 +563,7 @@ fun FirExpression?.isIntegerLiteralOrOperatorCall(): Boolean {
returns(true) implies (this@isIntegerLiteralOrOperatorCall != null) returns(true) implies (this@isIntegerLiteralOrOperatorCall != null)
} }
return when (this) { return when (this) {
is FirConstExpression<*> -> kind == ConstantValueKind.Int is FirLiteralExpression<*> -> kind == ConstantValueKind.Int
|| kind == ConstantValueKind.IntegerLiteral || kind == ConstantValueKind.IntegerLiteral
|| kind == ConstantValueKind.UnsignedInt || kind == ConstantValueKind.UnsignedInt
|| kind == ConstantValueKind.UnsignedIntegerLiteral || kind == ConstantValueKind.UnsignedIntegerLiteral
@@ -435,8 +435,8 @@ abstract class FirDataFlowAnalyzer(
val leftConst = when (leftOperand) { val leftConst = when (leftOperand) {
is FirWhenSubjectExpression -> leftOperand.whenRef.value.subject is FirWhenSubjectExpression -> leftOperand.whenRef.value.subject
else -> leftOperand else -> leftOperand
} as? FirConstExpression<*> } as? FirLiteralExpression<*>
val rightConst = rightOperand as? FirConstExpression<*> val rightConst = rightOperand as? FirLiteralExpression<*>
val leftIsNullConst = leftConst?.kind == ConstantValueKind.Null val leftIsNullConst = leftConst?.kind == ConstantValueKind.Null
val rightIsNullConst = rightConst?.kind == ConstantValueKind.Null val rightIsNullConst = rightConst?.kind == ConstantValueKind.Null
val leftIsNull = leftIsNullConst || leftOperand.resolvedType.isNullableNothing && !rightIsNullConst val leftIsNull = leftIsNullConst || leftOperand.resolvedType.isNullableNothing && !rightIsNullConst
@@ -460,7 +460,7 @@ abstract class FirDataFlowAnalyzer(
flow: MutableFlow, flow: MutableFlow,
expression: FirEqualityOperatorCall, expression: FirEqualityOperatorCall,
operand: FirExpression, operand: FirExpression,
const: FirConstExpression<*>, const: FirLiteralExpression<*>,
isEq: Boolean isEq: Boolean
) { ) {
if (const.kind == ConstantValueKind.Null) { if (const.kind == ConstantValueKind.Null) {
@@ -1020,7 +1020,7 @@ abstract class FirDataFlowAnalyzer(
} }
} }
fun exitConstExpression(constExpression: FirConstExpression<*>) { fun exitConstExpression(constExpression: FirLiteralExpression<*>) {
if (constExpression.isResolved) return if (constExpression.isResolved) return
graphBuilder.exitConstExpression(constExpression).mergeIncomingFlow() graphBuilder.exitConstExpression(constExpression).mergeIncomingFlow()
} }
@@ -1265,7 +1265,7 @@ abstract class FirDataFlowAnalyzer(
// For any predicate P(x), if P(v) != P(u ?: v) then u != null. In general this requires two levels of // For any predicate P(x), if P(v) != P(u ?: v) then u != null. In general this requires two levels of
// implications, but for constant v the logic system can handle some basic cases of P(x). // implications, but for constant v the logic system can handle some basic cases of P(x).
val rhs = (elvisExpression.rhs as? FirConstExpression<*>)?.value as? Boolean val rhs = (elvisExpression.rhs as? FirLiteralExpression<*>)?.value as? Boolean
if (rhs != null) { if (rhs != null) {
flow.addAllConditionally(elvisVariable eq !rhs, node.firstPreviousNode.getFlow(path)) flow.addAllConditionally(elvisVariable eq !rhs, node.firstPreviousNode.getFlow(path))
} }
@@ -966,7 +966,7 @@ class ControlFlowGraphBuilder {
fun exitWhileLoopCondition(loop: FirLoop): Pair<LoopConditionExitNode, LoopBlockEnterNode> { fun exitWhileLoopCondition(loop: FirLoop): Pair<LoopConditionExitNode, LoopBlockEnterNode> {
val conditionExitNode = createLoopConditionExitNode(loop.condition).also { addNewSimpleNode(it) } val conditionExitNode = createLoopConditionExitNode(loop.condition).also { addNewSimpleNode(it) }
val conditionConstBooleanValue = loop.condition.booleanConstValue val conditionConstBooleanValue = loop.condition.booleanLiteralValue
addEdge(conditionExitNode, loopExitNodes.getValue(loop), propagateDeadness = false, isDead = conditionConstBooleanValue == true) addEdge(conditionExitNode, loopExitNodes.getValue(loop), propagateDeadness = false, isDead = conditionConstBooleanValue == true)
val loopBlockEnterNode = createLoopBlockEnterNode(loop) val loopBlockEnterNode = createLoopBlockEnterNode(loop)
addNewSimpleNode(loopBlockEnterNode, conditionConstBooleanValue == false) addNewSimpleNode(loopBlockEnterNode, conditionConstBooleanValue == false)
@@ -1008,7 +1008,7 @@ class ControlFlowGraphBuilder {
fun exitDoWhileLoop(loop: FirLoop): Pair<LoopConditionExitNode, LoopExitNode> { fun exitDoWhileLoop(loop: FirLoop): Pair<LoopConditionExitNode, LoopExitNode> {
loopConditionEnterNodes.remove(loop) loopConditionEnterNodes.remove(loop)
val conditionExitNode = createLoopConditionExitNode(loop.condition) val conditionExitNode = createLoopConditionExitNode(loop.condition)
val conditionBooleanValue = loop.condition.booleanConstValue val conditionBooleanValue = loop.condition.booleanLiteralValue
popAndAddEdge(conditionExitNode) popAndAddEdge(conditionExitNode)
val blockEnterNode = lastNodes.pop() val blockEnterNode = lastNodes.pop()
require(blockEnterNode is LoopBlockEnterNode) require(blockEnterNode is LoopBlockEnterNode)
@@ -1041,7 +1041,7 @@ class ControlFlowGraphBuilder {
addNewSimpleNode(leftExitNode) addNewSimpleNode(leftExitNode)
lastNodes.push(leftExitNode) // to create an exit edge later lastNodes.push(leftExitNode) // to create an exit edge later
val rhsNeverExecuted = val rhsNeverExecuted =
binaryLogicExpression.leftOperand.booleanConstValue == (binaryLogicExpression.kind != LogicOperationKind.AND) binaryLogicExpression.leftOperand.booleanLiteralValue == (binaryLogicExpression.kind != LogicOperationKind.AND)
addNewSimpleNode(rightEnterNode, isDead = rhsNeverExecuted) addNewSimpleNode(rightEnterNode, isDead = rhsNeverExecuted)
return leftExitNode to rightEnterNode return leftExitNode to rightEnterNode
} }
@@ -1054,14 +1054,14 @@ class ControlFlowGraphBuilder {
val rightNode = lastNodes.pop() val rightNode = lastNodes.pop()
val leftNode = lastNodes.pop() val leftNode = lastNodes.pop()
val rhsAlwaysExecuted = val rhsAlwaysExecuted =
binaryLogicExpression.leftOperand.booleanConstValue == (binaryLogicExpression.kind == LogicOperationKind.AND) binaryLogicExpression.leftOperand.booleanLiteralValue == (binaryLogicExpression.kind == LogicOperationKind.AND)
addEdge(leftNode, exitNode, propagateDeadness = !rhsAlwaysExecuted, isDead = rhsAlwaysExecuted) addEdge(leftNode, exitNode, propagateDeadness = !rhsAlwaysExecuted, isDead = rhsAlwaysExecuted)
addEdge(rightNode, exitNode, propagateDeadness = rhsAlwaysExecuted) addEdge(rightNode, exitNode, propagateDeadness = rhsAlwaysExecuted)
lastNodes.push(exitNode) lastNodes.push(exitNode)
return exitNode return exitNode
} }
private val FirExpression.booleanConstValue: Boolean? get() = (this as? FirConstExpression<*>)?.value as? Boolean? private val FirExpression.booleanLiteralValue: Boolean? get() = (this as? FirLiteralExpression<*>)?.value as? Boolean?
// ----------------------------------- Try-catch-finally ----------------------------------- // ----------------------------------- Try-catch-finally -----------------------------------
@@ -1330,7 +1330,7 @@ class ControlFlowGraphBuilder {
return node return node
} }
fun exitConstExpression(constExpression: FirConstExpression<*>): ConstExpressionNode { fun exitLiteralExpression(constExpression: FirLiteralExpression<*>): ConstExpressionNode {
return createConstExpressionNode(constExpression).also { addNewSimpleNode(it) } return createConstExpressionNode(constExpression).also { addNewSimpleNode(it) }
} }
@@ -163,7 +163,7 @@ fun ControlFlowGraphBuilder.createElvisExitNode(fir: FirElvisExpression): ElvisE
fun ControlFlowGraphBuilder.createVariableDeclarationNode(fir: FirProperty): VariableDeclarationNode = fun ControlFlowGraphBuilder.createVariableDeclarationNode(fir: FirProperty): VariableDeclarationNode =
VariableDeclarationNode(currentGraph, fir, levelCounter) VariableDeclarationNode(currentGraph, fir, levelCounter)
fun ControlFlowGraphBuilder.createConstExpressionNode(fir: FirConstExpression<*>): ConstExpressionNode = fun ControlFlowGraphBuilder.createConstExpressionNode(fir: FirLiteralExpression<*>): ConstExpressionNode =
ConstExpressionNode(currentGraph, fir, levelCounter) ConstExpressionNode(currentGraph, fir, levelCounter)
fun ControlFlowGraphBuilder.createThrowExceptionNode(fir: FirThrowExpression): ThrowExceptionNode = fun ControlFlowGraphBuilder.createThrowExceptionNode(fir: FirThrowExpression): ThrowExceptionNode =
@@ -938,16 +938,16 @@ class FirCallCompletionResultsWriterTransformer(
) )
} }
override fun <T> transformConstExpression( override fun <T> transformLiteralExpression(
constExpression: FirConstExpression<T>, literalExpression: FirLiteralExpression<T>,
data: ExpectedArgumentType?, data: ExpectedArgumentType?,
): FirStatement { ): FirStatement {
if (data == ExpectedArgumentType.NoApproximation) return constExpression if (data == ExpectedArgumentType.NoApproximation) return literalExpression
val expectedType = data?.getExpectedType(constExpression) val expectedType = data?.getExpectedType(literalExpression)
if (expectedType is ConeIntegerConstantOperatorType) { if (expectedType is ConeIntegerConstantOperatorType) {
return constExpression return literalExpression
} }
return constExpression.transformSingle(integerOperatorApproximator, expectedType) return literalExpression.transformSingle(integerOperatorApproximator, expectedType)
} }
override fun transformIntegerLiteralOperatorCall( override fun transformIntegerLiteralOperatorCall(
@@ -271,7 +271,7 @@ private object WhenOnBooleanExhaustivenessChecker : WhenExhaustivenessChecker()
override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall, data: Flags) { override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall, data: Flags) {
if (equalityOperatorCall.operation.let { it == FirOperation.EQ || it == FirOperation.IDENTITY }) { if (equalityOperatorCall.operation.let { it == FirOperation.EQ || it == FirOperation.IDENTITY }) {
val argument = equalityOperatorCall.arguments[1] val argument = equalityOperatorCall.arguments[1]
if (argument is FirConstExpression<*>) { if (argument is FirLiteralExpression<*>) {
when (argument.value) { when (argument.value) {
true -> data.containsTrue = true true -> data.containsTrue = true
false -> data.containsFalse = true false -> data.containsFalse = true
@@ -10,10 +10,9 @@ import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirIntegerLiteralOperatorCall import org.jetbrains.kotlin.fir.expressions.FirIntegerLiteralOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess
import org.jetbrains.kotlin.fir.expressions.builder.buildFunctionCall import org.jetbrains.kotlin.fir.expressions.builder.buildFunctionCall
import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
@@ -58,17 +57,17 @@ class IntegerLiteralAndOperatorApproximationTransformer(
return element return element
} }
override fun <T> transformConstExpression( override fun <T> transformLiteralExpression(
constExpression: FirConstExpression<T>, literalExpression: FirLiteralExpression<T>,
data: ConeKotlinType?, data: ConeKotlinType?,
): FirStatement { ): FirStatement {
val type = constExpression.resolvedType as? ConeIntegerLiteralType ?: return constExpression val type = literalExpression.resolvedType as? ConeIntegerLiteralType ?: return literalExpression
val approximatedType = type.getApproximatedType(data?.fullyExpandedType(session)) val approximatedType = type.getApproximatedType(data?.fullyExpandedType(session))
constExpression.resultType = approximatedType literalExpression.resultType = approximatedType
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val kind = approximatedType.toConstKind() as ConstantValueKind<T> val kind = approximatedType.toConstKind() as ConstantValueKind<T>
constExpression.replaceKind(kind) literalExpression.replaceKind(kind)
return constExpression return literalExpression
} }
override fun transformIntegerLiteralOperatorCall( override fun transformIntegerLiteralOperatorCall(
@@ -299,13 +299,13 @@ abstract class FirAbstractBodyResolveTransformerDispatcher(
FirDeclarationsResolveTransformer::transformWrappedDelegateExpression, FirDeclarationsResolveTransformer::transformWrappedDelegateExpression,
) )
override fun <T> transformConstExpression( override fun <T> transformLiteralExpression(
constExpression: FirConstExpression<T>, literalExpression: FirLiteralExpression<T>,
data: ResolutionMode, data: ResolutionMode,
): FirStatement = expressionTransformation( ): FirStatement = expressionTransformation(
constExpression, literalExpression,
data, data,
FirExpressionsResolveTransformer::transformConstExpression, FirExpressionsResolveTransformer::transformLiteralExpression,
) )
override fun transformAnnotation( override fun transformAnnotation(
@@ -1089,7 +1089,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
): FirStatement = whileAnalysing(session, getClassCall) { ): FirStatement = whileAnalysing(session, getClassCall) {
getClassCall.transformAnnotations(transformer, ResolutionMode.ContextIndependent) getClassCall.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
val arg = getClassCall.argument val arg = getClassCall.argument
val dataForLhs = if (arg is FirConstExpression<*>) { val dataForLhs = if (arg is FirLiteralExpression<*>) {
withExpectedType(arg.kind.expectedConeType(session).toFirResolvedTypeRef()) withExpectedType(arg.kind.expectedConeType(session).toFirResolvedTypeRef())
} else { } else {
ResolutionMode.ContextIndependent ResolutionMode.ContextIndependent
@@ -1163,16 +1163,16 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
return true return true
} }
override fun <T> transformConstExpression( override fun <T> transformLiteralExpression(
constExpression: FirConstExpression<T>, literalExpression: FirLiteralExpression<T>,
data: ResolutionMode, data: ResolutionMode,
): FirStatement { ): FirStatement {
constExpression.transformAnnotations(transformer, ResolutionMode.ContextIndependent) literalExpression.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
val type = when (val kind = constExpression.kind) { val type = when (val kind = literalExpression.kind) {
ConstantValueKind.IntegerLiteral, ConstantValueKind.UnsignedIntegerLiteral -> { ConstantValueKind.IntegerLiteral, ConstantValueKind.UnsignedIntegerLiteral -> {
val expressionType = ConeIntegerLiteralConstantTypeImpl.create( val expressionType = ConeIntegerLiteralConstantTypeImpl.create(
constExpression.value as Long, literalExpression.value as Long,
isTypePresent = { it.lookupTag.toSymbol(session) != null }, isTypePresent = { it.lookupTag.toSymbol(session) != null },
isUnsigned = kind == ConstantValueKind.UnsignedIntegerLiteral isUnsigned = kind == ConstantValueKind.UnsignedIntegerLiteral
) )
@@ -1183,7 +1183,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
expressionType expressionType
} }
expressionType is ConeClassLikeType -> { expressionType is ConeClassLikeType -> {
constExpression.replaceKind(expressionType.toConstKind() as ConstantValueKind<T>) literalExpression.replaceKind(expressionType.toConstKind() as ConstantValueKind<T>)
expressionType expressionType
} }
data is ResolutionMode.ReceiverResolution && !data.forCallableReference -> { data is ResolutionMode.ReceiverResolution && !data.forCallableReference -> {
@@ -1194,7 +1194,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
require(expressionType is ConeIntegerLiteralConstantTypeImpl) require(expressionType is ConeIntegerLiteralConstantTypeImpl)
val coneType = expectedTypeRef.coneTypeSafe<ConeKotlinType>()?.fullyExpandedType(session) val coneType = expectedTypeRef.coneTypeSafe<ConeKotlinType>()?.fullyExpandedType(session)
val approximatedType = expressionType.getApproximatedType(coneType) val approximatedType = expressionType.getApproximatedType(coneType)
constExpression.replaceKind(approximatedType.toConstKind() as ConstantValueKind<T>) literalExpression.replaceKind(approximatedType.toConstKind() as ConstantValueKind<T>)
approximatedType approximatedType
} }
else -> { else -> {
@@ -1205,17 +1205,17 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
else -> kind.expectedConeType(session) else -> kind.expectedConeType(session)
} }
dataFlowAnalyzer.exitConstExpression(constExpression as FirConstExpression<*>) dataFlowAnalyzer.exitConstExpression(literalExpression as FirLiteralExpression<*>)
constExpression.resultType = type literalExpression.resultType = type
return when (val resolvedType = constExpression.resolvedType) { return when (val resolvedType = literalExpression.resolvedType) {
is ConeErrorType -> buildErrorExpression { is ConeErrorType -> buildErrorExpression {
expression = constExpression expression = literalExpression
diagnostic = resolvedType.diagnostic diagnostic = resolvedType.diagnostic
source = constExpression.source source = literalExpression.source
} }
else -> constExpression else -> literalExpression
} }
} }
@@ -130,7 +130,7 @@ class ConeEffectExtractor(
} }
val argument = equalityOperatorCall.arguments[1] val argument = equalityOperatorCall.arguments[1]
val const = argument as? FirConstExpression<*> ?: return ConeContractDescriptionError.NotAConstant(argument).asElement() val const = argument as? FirLiteralExpression<*> ?: return ConeContractDescriptionError.NotAConstant(argument).asElement()
if (const.kind != ConstantValueKind.Null) return ConeContractDescriptionError.IllegalConst(const, onlyNullAllowed = true).asElement() if (const.kind != ConstantValueKind.Null) return ConeContractDescriptionError.IllegalConst(const, onlyNullAllowed = true).asElement()
val arg = equalityOperatorCall.arguments[0].asContractValueExpression() val arg = equalityOperatorCall.arguments[0].asContractValueExpression()
@@ -203,14 +203,14 @@ class ConeEffectExtractor(
} }
} }
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: Nothing?): ConeContractDescriptionElement { override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: Nothing?): ConeContractDescriptionElement {
return when (constExpression.kind) { return when (literalExpression.kind) {
ConstantValueKind.Null -> ConeContractConstantValues.NULL ConstantValueKind.Null -> ConeContractConstantValues.NULL
ConstantValueKind.Boolean -> when (constExpression.value as Boolean) { ConstantValueKind.Boolean -> when (literalExpression.value as Boolean) {
true -> ConeContractConstantValues.TRUE true -> ConeContractConstantValues.TRUE
false -> ConeContractConstantValues.FALSE false -> ConeContractConstantValues.FALSE
} }
else -> ConeContractDescriptionError.IllegalConst(constExpression, onlyNullAllowed = false).asElement() else -> ConeContractDescriptionError.IllegalConst(literalExpression, onlyNullAllowed = false).asElement()
} }
} }
@@ -483,7 +483,7 @@ class FirExpectActualMatchingContextImpl private constructor(
// Because of that, we have "honest" checker at backend IR stage // Because of that, we have "honest" checker at backend IR stage
// and "only simplest case" checker in frontend, so that we have at least some reporting in the IDE. // and "only simplest case" checker in frontend, so that we have at least some reporting in the IDE.
return when { return when {
expression1 is FirConstExpression<*> && expression2 is FirConstExpression<*> -> { expression1 is FirLiteralExpression<*> && expression2 is FirLiteralExpression<*> -> {
expression1.value == expression2.value expression1.value == expression2.value
} }
else -> true else -> true
@@ -668,7 +668,7 @@ class JumpNode(owner: ControlFlowGraph, override val fir: FirJump<*>, level: Int
return visitor.visitJumpNode(this, data) return visitor.visitJumpNode(this, data)
} }
} }
class ConstExpressionNode(owner: ControlFlowGraph, override val fir: FirConstExpression<*>, level: Int) : CFGNode<FirConstExpression<*>>(owner, level) { class ConstExpressionNode(owner: ControlFlowGraph, override val fir: FirLiteralExpression<*>, level: Int) : CFGNode<FirLiteralExpression<*>>(owner, level) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R { override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitConstExpressionNode(this, data) return visitor.visitConstExpressionNode(this, data)
} }
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnosticWithNullability import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnosticWithNullability
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnosticWithSource import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnosticWithSource
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.FirOperation import org.jetbrains.kotlin.fir.expressions.FirOperation
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
@@ -199,7 +199,7 @@ sealed class ConeContractDescriptionError : ConeDiagnostic {
} }
class IllegalConst( class IllegalConst(
val element: FirConstExpression<*>, val element: FirLiteralExpression<*>,
val onlyNullAllowed: Boolean val onlyNullAllowed: Boolean
) : ConeContractDescriptionError() { ) : ConeContractDescriptionError() {
override val reason: String override val reason: String
@@ -16,9 +16,9 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.types.ConstantValueKind import org.jetbrains.kotlin.types.ConstantValueKind
/** /**
* Generated from: [org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.constExpression] * Generated from: [org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.literalExpression]
*/ */
abstract class FirConstExpression<T> : FirExpression() { abstract class FirLiteralExpression<T> : FirExpression() {
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
@UnresolvedExpressionTypeAccess @UnresolvedExpressionTypeAccess
abstract override val coneTypeOrNull: ConeKotlinType? abstract override val coneTypeOrNull: ConeKotlinType?
@@ -27,11 +27,11 @@ abstract class FirConstExpression<T> : FirExpression() {
abstract val value: T abstract val value: T
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitConstExpression(this, data) visitor.visitLiteralExpression(this, data)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
override fun <E : FirElement, D> transform(transformer: FirTransformer<D>, data: D): E = override fun <E : FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformConstExpression(this, data) as E transformer.transformLiteralExpression(this, data) as E
abstract override fun replaceConeTypeOrNull(newConeTypeOrNull: ConeKotlinType?) abstract override fun replaceConeTypeOrNull(newConeTypeOrNull: ConeKotlinType?)
@@ -39,5 +39,5 @@ abstract class FirConstExpression<T> : FirExpression() {
abstract fun replaceKind(newKind: ConstantValueKind<T>) abstract fun replaceKind(newKind: ConstantValueKind<T>)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirConstExpression<T> abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLiteralExpression<T>
} }
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.MutableOrEmptyList import org.jetbrains.kotlin.fir.MutableOrEmptyList
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -23,25 +23,25 @@ import org.jetbrains.kotlin.fir.visitors.transformInplace
import org.jetbrains.kotlin.types.ConstantValueKind import org.jetbrains.kotlin.types.ConstantValueKind
@OptIn(UnresolvedExpressionTypeAccess::class) @OptIn(UnresolvedExpressionTypeAccess::class)
internal class FirConstExpressionImpl<T> ( internal class FirLiteralExpressionImpl<T> (
override val source: KtSourceElement?, override val source: KtSourceElement?,
@property:UnresolvedExpressionTypeAccess @property:UnresolvedExpressionTypeAccess
override var coneTypeOrNull: ConeKotlinType?, override var coneTypeOrNull: ConeKotlinType?,
override var annotations: MutableOrEmptyList<FirAnnotation>, override var annotations: MutableOrEmptyList<FirAnnotation>,
override var kind: ConstantValueKind<T>, override var kind: ConstantValueKind<T>,
override val value: T, override val value: T,
) : FirConstExpression<T>() { ) : FirLiteralExpression<T>() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirConstExpressionImpl<T> { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirLiteralExpressionImpl<T> {
transformAnnotations(transformer, data) transformAnnotations(transformer, data)
return this return this
} }
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirConstExpressionImpl<T> { override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLiteralExpressionImpl<T> {
annotations.transformInplace(transformer, data) annotations.transformInplace(transformer, data)
return this return this
} }
@@ -101,8 +101,8 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitContinueExpression(continueExpression: FirContinueExpression, data: D): R = override fun visitContinueExpression(continueExpression: FirContinueExpression, data: D): R =
visitLoopJump(continueExpression, data) visitLoopJump(continueExpression, data)
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: D): R = override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: D): R =
visitExpression(constExpression, data) visitExpression(literalExpression, data)
override fun visitStarProjection(starProjection: FirStarProjection, data: D): R = override fun visitStarProjection(starProjection: FirStarProjection, data: D): R =
visitTypeProjection(starProjection, data) visitTypeProjection(starProjection, data)
@@ -74,7 +74,7 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitContinueExpression(continueExpression: FirContinueExpression) = visitLoopJump(continueExpression) override fun visitContinueExpression(continueExpression: FirContinueExpression) = visitLoopJump(continueExpression)
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>) = visitExpression(constExpression) override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>) = visitExpression(literalExpression)
override fun visitStarProjection(starProjection: FirStarProjection) = visitTypeProjection(starProjection) override fun visitStarProjection(starProjection: FirStarProjection) = visitTypeProjection(starProjection)
@@ -555,12 +555,12 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformTryExpression(tryExpression, data) return transformTryExpression(tryExpression, data)
} }
open fun <T> transformConstExpression(constExpression: FirConstExpression<T>, data: D): FirStatement { open fun <T> transformLiteralExpression(literalExpression: FirLiteralExpression<T>, data: D): FirStatement {
return transformElement(constExpression, data) return transformElement(literalExpression, data)
} }
final override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: D): FirStatement { final override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: D): FirStatement {
return transformConstExpression(constExpression, data) return transformLiteralExpression(literalExpression, data)
} }
open fun transformTypeProjection(typeProjection: FirTypeProjection, data: D): FirTypeProjection { open fun transformTypeProjection(typeProjection: FirTypeProjection, data: D): FirTypeProjection {
@@ -221,8 +221,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitTryExpression(tryExpression: FirTryExpression, data: D): R = open fun visitTryExpression(tryExpression: FirTryExpression, data: D): R =
visitElement(tryExpression, data) visitElement(tryExpression, data)
open fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: D): R = open fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: D): R =
visitElement(constExpression, data) visitElement(literalExpression, data)
open fun visitTypeProjection(typeProjection: FirTypeProjection, data: D): R = open fun visitTypeProjection(typeProjection: FirTypeProjection, data: D): R =
visitElement(typeProjection, data) visitElement(typeProjection, data)
@@ -555,12 +555,12 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(tryExpression) visitElement(tryExpression)
} }
final override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: Nothing?) { final override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>, data: Nothing?) {
visitConstExpression(constExpression) visitLiteralExpression(literalExpression)
} }
open fun <T> visitConstExpression(constExpression: FirConstExpression<T>) { open fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>) {
visitElement(constExpression) visitElement(literalExpression)
} }
final override fun visitTypeProjection(typeProjection: FirTypeProjection, data: Nothing?) { final override fun visitTypeProjection(typeProjection: FirTypeProjection, data: Nothing?) {
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.declarations.utils.isStatic
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLiteralExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildErrorExpression import org.jetbrains.kotlin.fir.expressions.builder.buildErrorExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildErrorLoop import org.jetbrains.kotlin.fir.expressions.builder.buildErrorLoop
import org.jetbrains.kotlin.fir.expressions.impl.FirBlockImpl import org.jetbrains.kotlin.fir.expressions.impl.FirBlockImpl
@@ -34,7 +34,7 @@ inline val FirAnnotation.unexpandedClassId: ClassId?
fun <T> buildConstOrErrorExpression(source: KtSourceElement?, kind: ConstantValueKind<T>, value: T?, diagnostic: ConeDiagnostic): FirExpression = fun <T> buildConstOrErrorExpression(source: KtSourceElement?, kind: ConstantValueKind<T>, value: T?, diagnostic: ConeDiagnostic): FirExpression =
value?.let { value?.let {
buildConstExpression(source, kind, it, setType = false) buildLiteralExpression(source, kind, it, setType = false)
} ?: buildErrorExpression { } ?: buildErrorExpression {
this.source = source this.source = source
this.diagnostic = diagnostic this.diagnostic = diagnostic
@@ -8,22 +8,22 @@ package org.jetbrains.kotlin.fir.expressions.builder
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirLiteralExpressionImpl
import org.jetbrains.kotlin.fir.types.constructClassLikeType import org.jetbrains.kotlin.fir.types.constructClassLikeType
import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.types.ConstantValueKind import org.jetbrains.kotlin.types.ConstantValueKind
@OptIn(UnresolvedExpressionTypeAccess::class) @OptIn(UnresolvedExpressionTypeAccess::class)
fun <T> buildConstExpression( fun <T> buildLiteralExpression(
source: KtSourceElement?, source: KtSourceElement?,
kind: ConstantValueKind<T>, kind: ConstantValueKind<T>,
value: T, value: T,
annotations: MutableList<FirAnnotation> = mutableListOf(), annotations: MutableList<FirAnnotation> = mutableListOf(),
setType: Boolean setType: Boolean
): FirConstExpression<T> { ): FirLiteralExpression<T> {
return FirConstExpressionImpl(source, null, annotations.toMutableOrEmpty(), kind, value).also { return FirLiteralExpressionImpl(source, null, annotations.toMutableOrEmpty(), kind, value).also {
if (setType) { if (setType) {
when (kind) { when (kind) {
ConstantValueKind.Boolean -> it.coneTypeOrNull = StandardClassIds.Boolean.constructClassLikeType() ConstantValueKind.Boolean -> it.coneTypeOrNull = StandardClassIds.Boolean.constructClassLikeType()
@@ -699,10 +699,10 @@ class FirRenderer(
print("LAZY_EXPRESSION") print("LAZY_EXPRESSION")
} }
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>) { override fun <T> visitLiteralExpression(literalExpression: FirLiteralExpression<T>) {
annotationRenderer?.render(constExpression) annotationRenderer?.render(literalExpression)
val kind = constExpression.kind val kind = literalExpression.kind
val value = constExpression.value val value = literalExpression.value
print("$kind(") print("$kind(")
if (value !is Char) { if (value !is Char) {
print(value.toString()) print(value.toString())
@@ -85,7 +85,7 @@ val FirTypeRef.isArrayType: Boolean
|| StandardClassIds.unsignedArrayTypeByElementType.values.any { isBuiltinType(it, false) } || StandardClassIds.unsignedArrayTypeByElementType.values.any { isBuiltinType(it, false) }
val FirExpression.isNullLiteral: Boolean val FirExpression.isNullLiteral: Boolean
get() = this is FirConstExpression<*> && get() = this is FirLiteralExpression<*> &&
this.kind == ConstantValueKind.Null && this.kind == ConstantValueKind.Null &&
this.value == null && this.value == null &&
this.source != null this.source != null

Some files were not shown because too many files have changed in this diff Show More