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:
committed by
Space Team
parent
213967e25c
commit
53e89a9722
+2
-2
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-29
@@ -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) {
|
||||||
|
|||||||
+13
-13
@@ -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,
|
||||||
|
|||||||
+1
-1
@@ -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,
|
||||||
|
|||||||
+3
-3
@@ -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,
|
||||||
|
|||||||
+2
-2
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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:
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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:
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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:
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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:
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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:
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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:
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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")
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+2
-2
@@ -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)
|
||||||
|
|||||||
+8
-2
@@ -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) {
|
||||||
|
|||||||
+2
-2
@@ -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)
|
||||||
|
|||||||
+4
-4
@@ -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)
|
||||||
|
|||||||
+2
-2
@@ -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 }
|
||||||
|
|||||||
+2
-2
@@ -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>
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+3
-3
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+3
-3
@@ -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"
|
||||||
|
|||||||
+2
-2
@@ -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) {
|
||||||
|
|||||||
+2
-2
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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 -> {
|
||||||
|
|||||||
+3
-3
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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 {
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+2
-2
@@ -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) {
|
||||||
|
|||||||
+2
-2
@@ -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()
|
||||||
|
|||||||
+2
-2
@@ -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) {
|
||||||
|
|||||||
+2
-2
@@ -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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-10
@@ -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
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-7
@@ -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>
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|
||||||
|
|||||||
+11
-11
@@ -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())
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==================================================================================
|
// ==================================================================================
|
||||||
|
|||||||
+4
-4
@@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+2
-2
@@ -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)) }
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -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? {
|
||||||
|
|||||||
+6
-6
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+5
-5
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-6
@@ -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) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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 =
|
||||||
|
|||||||
+6
-6
@@ -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(
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+7
-8
@@ -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(
|
||||||
|
|||||||
+4
-4
@@ -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(
|
||||||
|
|||||||
+14
-14
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+5
-5
@@ -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>
|
||||||
}
|
}
|
||||||
+5
-5
@@ -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
|
||||||
|
|||||||
+5
-5
@@ -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
Reference in New Issue
Block a user