From b53c4a63530140b27d0a621d1c2f11bfc8aa34c3 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 14 Dec 2022 14:18:01 +0200 Subject: [PATCH] [FIR] Introduce some typed `FirReference.toResolvedXXXSymbol` utilities --- .../FirCompileTimeConstantEvaluator.kt | 7 +-- .../references/FirReferenceResolveHelper.kt | 10 ++-- .../FirSuperCallWithDefaultsChecker.kt | 5 +- .../FirDestructuringDeclarationChecker.kt | 13 +++--- .../FirFunctionParameterChecker.kt | 13 +++--- .../FirAssignmentOperatorCallChecker.kt | 9 ++-- .../expression/FirClassLiteralChecker.kt | 10 ++-- .../expression/FirConstructorCallChecker.kt | 9 ++-- .../expression/FirDivisionByZeroChecker.kt | 10 ++-- .../expression/FirOptInUsageAccessChecker.kt | 6 +-- ...irReassignmentAndInvisibleSetterChecker.kt | 7 ++- .../FirReturnSyntaxAndLabelChecker.kt | 9 ++-- .../expression/FirUninitializedEnumChecker.kt | 15 +++--- .../checkers/extended/CanBeValChecker.kt | 10 ++-- .../checkers/extended/UnusedChecker.kt | 9 ++-- .../extended/UselessCallOnNotNullChecker.kt | 18 ++++---- .../fir/backend/Fir2IrDeclarationStorage.kt | 7 +-- .../fir/backend/Fir2IrImplicitCastInserter.kt | 5 +- .../kotlin/fir/backend/Fir2IrVisitor.kt | 4 +- .../generators/CallAndReferenceGenerator.kt | 12 +++-- .../generators/ClassMemberGenerator.kt | 4 +- .../fir/declarations/FirAnnotationUtils.kt | 5 +- .../fir/resolve/dfa/FirDataFlowAnalyzer.kt | 8 ++-- .../FirExpressionsResolveTransformer.kt | 5 +- .../declarations/utils/FirDeclarationUtil.kt | 4 +- .../fir/expressions/FirExpressionUtil.kt | 5 +- .../fir/references/FirReferenceUtils.kt | 46 +++++++++++++++++-- .../fir/symbols/impl/FirFunctionSymbol.kt | 7 +-- ...rAssignmentPluginAssignAltererExtension.kt | 6 +-- 29 files changed, 151 insertions(+), 127 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt index a2950bdaa97..21da341bcb2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedPropertySymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol @@ -67,10 +67,7 @@ internal object FirCompileTimeConstantEvaluator { evaluateFunctionCall(fir, mode) } is FirNamedReference -> { - when (val resolvedSymbol = fir.resolvedSymbol) { - is FirPropertySymbol -> resolvedSymbol.toConstExpression(mode) - else -> null - } + fir.toResolvedPropertySymbol()?.toConstExpression(mode) } else -> null } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt index 192ac4017b1..8b54dccb0fa 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt @@ -15,7 +15,9 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirPackageSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe -import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.FirPackageDirective +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.buildImport import org.jetbrains.kotlin.fir.declarations.utils.classId @@ -23,8 +25,10 @@ import org.jetbrains.kotlin.fir.declarations.utils.isCompanion import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.dfa.unwrapSmartcastExpression import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnmatchedTypeArgumentsError import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer @@ -33,9 +37,7 @@ import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.fir.resolve.dfa.unwrapSmartcastExpression import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -237,7 +239,7 @@ internal object FirReferenceResolveHelper { // FirConstructor.originalConstructorIfTypeAlias but that doesn't seem to help here as it // is null for the constructors we get. val constructedType = fir.constructedTypeRef.coneType - val constructorReturnType = (fir.calleeReference.resolvedSymbol as? FirConstructorSymbol)?.resolvedReturnTypeRef?.type + val constructorReturnType = fir.calleeReference.toResolvedConstructorSymbol()?.resolvedReturnTypeRef?.type if (constructedType.classId != constructorReturnType?.classId) { return getSymbolsForResolvedTypeRef(fir.constructedTypeRef as FirResolvedTypeRef, expression, session, symbolBuilder) } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirSuperCallWithDefaultsChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirSuperCallWithDefaultsChecker.kt index 10e470304eb..175baefc3e1 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirSuperCallWithDefaultsChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirSuperCallWithDefaultsChecker.kt @@ -13,15 +13,14 @@ import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirFunctionCallChec import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList -import org.jetbrains.kotlin.fir.references.resolvedSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol object FirSuperCallWithDefaultsChecker : FirFunctionCallChecker() { override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) { if (expression.explicitReceiverIsNotSuperReference()) return - val functionSymbol = expression.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol ?: return + val functionSymbol = expression.calleeReference.toResolvedFunctionSymbol() ?: return if (!functionSymbol.valueParameterSymbols.any { it.hasDefaultValue }) return val arguments = expression.argumentList as? FirResolvedArgumentList ?: return if (arguments.arguments.size < functionSymbol.valueParameterSymbols.size) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt index 24ac57b5fb8..05571746d4a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt @@ -5,12 +5,12 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration -import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirValueParameter @@ -21,12 +21,11 @@ import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference +import org.jetbrains.kotlin.fir.references.toResolvedVariableSymbol import org.jetbrains.kotlin.fir.resolve.diagnostics.* -import org.jetbrains.kotlin.fir.references.resolvedSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.types.AbstractTypeChecker @@ -198,7 +197,7 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() { private val FirQualifiedAccessExpression.resolvedVariable: FirVariable? get() { - val symbol = calleeReference.resolvedSymbol as? FirVariableSymbol<*> ?: return null + val symbol = calleeReference.toResolvedVariableSymbol() ?: return null symbol.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE) @OptIn(SymbolInternals::class) return symbol.fir diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirFunctionParameterChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirFunctionParameterChecker.kt index 776808eb022..0ddd5c16d2a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirFunctionParameterChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirFunctionParameterChecker.kt @@ -7,22 +7,21 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtRealSourceElementKind +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.isValueClass import org.jetbrains.kotlin.fir.analysis.checkers.valOrVarKeyword -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirFunction -import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedValueParameterSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid @@ -89,17 +88,17 @@ object FirFunctionParameterChecker : FirFunctionChecker() { } override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) { + val referredParameter = qualifiedAccessExpression.calleeReference.toResolvedValueParameterSymbol() ?: return @OptIn(SymbolInternals::class) - val referredParameter = qualifiedAccessExpression.calleeReference.resolvedSymbol?.fir as? FirValueParameter ?: return - val referredParameterIndex = function.valueParameters.indexOf(referredParameter) + val referredParameterIndex = function.valueParameters.indexOf(referredParameter.fir) // Skip if the referred parameter is not declared in the same function. if (referredParameterIndex < 0) return if (index <= referredParameterIndex) { reporter.reportOn( qualifiedAccessExpression.source, FirErrors.UNINITIALIZED_PARAMETER, - referredParameter.symbol, + referredParameter, context ) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAssignmentOperatorCallChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAssignmentOperatorCallChecker.kt index 0750176a295..5c1338de8a2 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAssignmentOperatorCallChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAssignmentOperatorCallChecker.kt @@ -5,21 +5,20 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin import org.jetbrains.kotlin.fir.expressions.FirOperationNameConventions -import org.jetbrains.kotlin.fir.references.resolvedSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.isUnit object FirAssignmentOperatorCallChecker : FirFunctionCallChecker() { override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) { - val resolvedCalleeSymbol = expression.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol ?: return + val resolvedCalleeSymbol = expression.calleeReference.toResolvedFunctionSymbol() ?: return val resolvedCalleeName = resolvedCalleeSymbol.name if (expression.origin != FirFunctionCallOrigin.Operator || resolvedCalleeName !in FirOperationNameConventions.ASSIGNMENT_NAMES diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt index ddffa35874b..ad29285e43f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt @@ -6,20 +6,20 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.KtFakeSourceElementKind -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.getChild import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner import org.jetbrains.kotlin.fir.expressions.* -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedTypeParameterSymbol import org.jetbrains.kotlin.fir.scopes.impl.toConeType import org.jetbrains.kotlin.fir.symbols.SymbolInternals -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.lexer.KtTokens.QUEST import org.jetbrains.kotlin.resolve.checkers.OptInNames @@ -107,7 +107,7 @@ object FirClassLiteralChecker : FirGetClassCallChecker() { private val FirExpression.safeAsTypeParameterSymbol: FirTypeParameterSymbol? get() { - return (this as? FirQualifiedAccessExpression)?.calleeReference?.resolvedSymbol as? FirTypeParameterSymbol + return (this as? FirQualifiedAccessExpression)?.calleeReference?.toResolvedTypeParameterSymbol() } private fun ConeKotlinType.isAllowedInClassLiteral(context: CheckerContext): Boolean = diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirConstructorCallChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirConstructorCallChecker.kt index fdbbfbad073..d9d02198064 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirConstructorCallChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirConstructorCallChecker.kt @@ -7,22 +7,21 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.utils.isAbstract import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirFunctionCall -import org.jetbrains.kotlin.fir.references.resolvedSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol +import org.jetbrains.kotlin.fir.references.toResolvedConstructorSymbol import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.toRegularClassSymbol object FirConstructorCallChecker : FirFunctionCallChecker() { override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) { - val constructorSymbol = expression.calleeReference.resolvedSymbol as? FirConstructorSymbol ?: return + val constructorSymbol = expression.calleeReference.toResolvedConstructorSymbol() ?: return val declarationClass = constructorSymbol.resolvedReturnTypeRef.coneType.toRegularClassSymbol(context.session) if (declarationClass != null) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDivisionByZeroChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDivisionByZeroChecker.kt index b57b4ec5dd5..33a80b7c56f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDivisionByZeroChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDivisionByZeroChecker.kt @@ -5,15 +5,14 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.arguments -import org.jetbrains.kotlin.fir.references.resolvedSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -24,8 +23,7 @@ object FirDivisionByZeroChecker : FirFunctionCallChecker() { override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) { val firstValue = (expression.arguments.singleOrNull() as? FirConstExpression<*>)?.value if (firstValue != null && (firstValue == 0L || firstValue == 0.0f || firstValue == 0.0)) { - val callableId = - (expression.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol)?.callableId + val callableId = (expression.calleeReference.toResolvedFunctionSymbol())?.callableId if (callableId != null && callableId.packageName == defaultPackageName && callableId.callableName == defaultDivName) { reporter.reportOn(expression.source, FirErrors.DIVISION_BY_ZERO, context) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageAccessChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageAccessChecker.kt index a931d1c9e5e..a47d064c2a5 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageAccessChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageAccessChecker.kt @@ -6,13 +6,13 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.KtFakeSourceElementKind -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression +import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol import org.jetbrains.kotlin.fir.resolve.fullyExpandedType -import org.jetbrains.kotlin.fir.references.resolvedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.types.coneType @@ -22,7 +22,7 @@ object FirOptInUsageAccessChecker : FirQualifiedAccessChecker() { if (sourceKind is KtFakeSourceElementKind.DataClassGeneratedMembers || sourceKind is KtFakeSourceElementKind.PropertyFromParameter ) return - val resolvedSymbol = expression.calleeReference.resolvedSymbol ?: return + val resolvedSymbol = expression.calleeReference.toResolvedBaseSymbol() ?: return val dispatchReceiverType = expression.dispatchReceiver.takeIf { it !is FirNoReceiverExpression }?.typeRef?.coneType?.fullyExpandedType(context.session) with(FirOptInUsageBaseChecker) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReassignmentAndInvisibleSetterChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReassignmentAndInvisibleSetterChecker.kt index 29d324722d2..48fdf5dc424 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReassignmentAndInvisibleSetterChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReassignmentAndInvisibleSetterChecker.kt @@ -16,14 +16,13 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.expressions.FirSmartCastExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment -import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.originalForSubstitutionOverride import org.jetbrains.kotlin.fir.references.FirBackingFieldReference +import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol +import org.jetbrains.kotlin.fir.references.toResolvedValueParameterSymbol import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue -import org.jetbrains.kotlin.fir.references.resolvedSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.visibilityChecker object FirReassignmentAndInvisibleSetterChecker : FirVariableAssignmentChecker() { @@ -100,7 +99,7 @@ object FirReassignmentAndInvisibleSetterChecker : FirVariableAssignmentChecker() context: CheckerContext, reporter: DiagnosticReporter ) { - val valueParameter = expression.lValue.resolvedSymbol as? FirValueParameterSymbol ?: return + val valueParameter = expression.lValue.toResolvedValueParameterSymbol() ?: return reporter.reportOn(expression.lValue.source, FirErrors.VAL_REASSIGNMENT, valueParameter, context) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReturnSyntaxAndLabelChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReturnSyntaxAndLabelChecker.kt index cbf743aa1b8..7c5036c8769 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReturnSyntaxAndLabelChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReturnSyntaxAndLabelChecker.kt @@ -7,19 +7,18 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtRealSourceElementKind -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol object FirReturnSyntaxAndLabelChecker : FirReturnExpressionChecker() { override fun check(expression: FirReturnExpression, context: CheckerContext, reporter: DiagnosticReporter) { @@ -39,7 +38,7 @@ object FirReturnSyntaxAndLabelChecker : FirReturnExpressionChecker() { if (label?.source?.kind !is KtRealSourceElementKind) { val functionCall = context.qualifiedAccessOrAnnotationCalls.asReversed().find { it is FirFunctionCall && - (it.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol)?.callableId == + (it.calleeReference.toResolvedFunctionSymbol())?.callableId == FirSuspendCallChecker.KOTLIN_SUSPEND_BUILT_IN_FUNCTION_CALLABLE_ID } if (functionCall is FirFunctionCall && diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt index a7c43945065..e2a879f1e9f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt @@ -6,25 +6,25 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.KtFakeSourceElementKind +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isEnumEntryInitializer import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.analysis.checkers.outerClassSymbol -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.utils.isCompanion import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass import org.jetbrains.kotlin.fir.expressions.* -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol +import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() { // Initialization order: member property initializers, enum entries, companion object (including members in it). @@ -74,7 +74,7 @@ object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() { val source = expression.source ?: return if (source.kind is KtFakeSourceElementKind) return - val calleeSymbol = expression.calleeReference.resolvedSymbol ?: return + val calleeSymbol = expression.calleeReference.toResolvedBaseSymbol() ?: return val calleeContainingClassSymbol = calleeSymbol.getContainingClassSymbol(context.session) as? FirRegularClassSymbol ?: return // We're looking for members/entries/companion object in an enum class or members in companion object of an enum class. val calleeIsInsideEnum = calleeContainingClassSymbol.isEnumClass @@ -203,8 +203,7 @@ object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() { val property = this.fir if (property.delegate == null || property.delegate !is FirFunctionCall) return null val delegateCall = property.delegate as FirFunctionCall - val calleeSymbol = - delegateCall.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol ?: return null + val calleeSymbol = delegateCall.calleeReference.toResolvedFunctionSymbol() ?: return null if (calleeSymbol.callableId.asSingleFqName().asString() != "kotlin.lazy") return null val lazyCallArgument = delegateCall.argumentList.arguments.singleOrNull() as? FirLambdaArgumentExpression ?: return null return (lazyCallArgument.expression as? FirAnonymousFunctionExpression)?.anonymousFunction diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt index 436f2c5590a..2c7997928ca 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt @@ -6,21 +6,21 @@ package org.jetbrains.kotlin.fir.analysis.checkers.extended import org.jetbrains.kotlin.KtFakeSourceElementKind -import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtNodeTypes +import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker import org.jetbrains.kotlin.fir.analysis.cfa.util.PathAwarePropertyInitializationInfo import org.jetbrains.kotlin.fir.analysis.cfa.util.TraverseDirection import org.jetbrains.kotlin.fir.analysis.cfa.util.traverse import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.getChildren -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment +import org.jetbrains.kotlin.fir.references.toResolvedPropertySymbol import org.jetbrains.kotlin.fir.resolve.dfa.cfg.* -import org.jetbrains.kotlin.fir.references.resolvedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol object CanBeValChecker : AbstractFirPropertyInitializationChecker() { @@ -87,7 +87,7 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() { override fun visitUnionNode(node: T) where T : CFGNode<*>, T : UnionNodeMarker {} override fun visitVariableAssignmentNode(node: VariableAssignmentNode) { - val symbol = node.fir.calleeReference.resolvedSymbol as? FirPropertySymbol ?: return + val symbol = node.fir.calleeReference.toResolvedPropertySymbol() ?: return if (symbol !in localProperties) return unprocessedProperties.remove(symbol) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/UnusedChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/UnusedChecker.kt index 9437ca14ccd..a623b495456 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/UnusedChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/UnusedChecker.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.references.resolved -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedPropertySymbol import org.jetbrains.kotlin.fir.resolve.dfa.cfg.* import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol @@ -54,7 +54,7 @@ object UnusedChecker : FirControlFlowChecker() { override fun visitUnionNode(node: T) where T : CFGNode<*>, T : UnionNodeMarker {} override fun visitVariableAssignmentNode(node: VariableAssignmentNode) { - val variableSymbol = node.fir.calleeReference.resolvedSymbol ?: return + val variableSymbol = node.fir.calleeReference.toResolvedPropertySymbol() ?: return val dataPerNode = data[node] ?: return for (dataPerLabel in dataPerNode.values) { val data = dataPerLabel[variableSymbol] ?: continue @@ -233,7 +233,7 @@ object UnusedChecker : FirControlFlowChecker() { data: Collection> ): PathAwareVariableStatusInfo { val dataForNode = visitNode(node, data) - val symbol = node.fir.lValue.resolvedSymbol as? FirPropertySymbol ?: return dataForNode + val symbol = node.fir.lValue.toResolvedPropertySymbol() ?: return dataForNode return update(dataForNode, symbol) update@{ prev -> val toPut = when { symbol !in localProperties -> { @@ -282,8 +282,7 @@ object UnusedChecker : FirControlFlowChecker() { vararg qualifiedAccesses: FirQualifiedAccess, ): PathAwareVariableStatusInfo { fun retrieveSymbol(qualifiedAccess: FirQualifiedAccess): FirPropertySymbol? { - val symbol = qualifiedAccess.calleeReference.resolvedSymbol as? FirPropertySymbol ?: return null - return if (symbol !in localProperties) null else symbol + return qualifiedAccess.calleeReference.toResolvedPropertySymbol()?.takeIf { it in localProperties } } val symbols = qualifiedAccesses.mapNotNull { retrieveSymbol(it) }.toTypedArray() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/UselessCallOnNotNullChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/UselessCallOnNotNullChecker.kt index 733eca34a80..341c963bf4c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/UselessCallOnNotNullChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/UselessCallOnNotNullChecker.kt @@ -5,18 +5,18 @@ package org.jetbrains.kotlin.fir.analysis.checkers.extended +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression -import org.jetbrains.kotlin.fir.references.resolvedSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol import org.jetbrains.kotlin.fir.types.ConeNullability import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.name.CallableId object UselessCallOnNotNullChecker : FirQualifiedAccessExpressionChecker() { // todo: add 'call may be reduced' in cases like 's?.isNullOrEmpty()' where 's: String? = ""' @@ -32,11 +32,13 @@ object UselessCallOnNotNullChecker : FirQualifiedAccessExpressionChecker() { } } - private fun FirQualifiedAccessExpression.getCallableId() = - (calleeReference.resolvedSymbol as? FirNamedFunctionSymbol)?.callableId + private fun FirQualifiedAccessExpression.getCallableId(): CallableId? { + return calleeReference.toResolvedFunctionSymbol()?.callableId + } - private fun FirExpression.getPackage() = - typeRef.coneType.classId?.packageFqName.toString() + private fun FirExpression.getPackage(): String { + return typeRef.coneType.classId?.packageFqName.toString() + } private fun FirExpression.getNullability() = typeRef.coneType.nullability diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 31ef560f0ac..a04660a9cbc 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -26,7 +26,8 @@ import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyConstructor import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyProperty import org.jetbrains.kotlin.fir.lazy.Fir2IrLazySimpleFunction -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol +import org.jetbrains.kotlin.fir.references.toResolvedValueParameterSymbol import org.jetbrains.kotlin.fir.resolve.dfa.cfg.isLocalClassOrAnonymousObject import org.jetbrains.kotlin.fir.resolve.isKFunctionInvoke import org.jetbrains.kotlin.fir.resolve.providers.firProvider @@ -892,7 +893,7 @@ class Fir2IrDeclarationStorage( val setter = property.setter if (delegate != null || property.hasBackingField) { backingField = if (delegate != null) { - ((delegate as? FirQualifiedAccess)?.calleeReference?.resolvedSymbol?.fir as? FirTypeParameterRefsOwner)?.let { + ((delegate as? FirQualifiedAccess)?.calleeReference?.toResolvedBaseSymbol()?.fir as? FirTypeParameterRefsOwner)?.let { classifierStorage.preCacheTypeParameters(it, symbol) } createBackingField( @@ -1038,7 +1039,7 @@ class Fir2IrDeclarationStorage( private fun getOrCreateDelegateIrField(field: FirField, owner: FirClass, irClass: IrClass): IrField { val initializer = field.initializer if (initializer is FirQualifiedAccessExpression && initializer.explicitReceiver == null) { - val resolvedSymbol = initializer.calleeReference.resolvedSymbol as? FirValueParameterSymbol + val resolvedSymbol = initializer.calleeReference.toResolvedValueParameterSymbol() if (resolvedSymbol is FirValueParameterSymbol) { val name = resolvedSymbol.name val constructorProperty = owner.declarations.filterIsInstance().find { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt index 4ad78982f46..54fe3db3ccb 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt @@ -12,8 +12,7 @@ import org.jetbrains.kotlin.fir.expressions.impl.FirStubStatement import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.render -import org.jetbrains.kotlin.fir.references.resolvedSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.ir.IrBuiltIns @@ -278,7 +277,7 @@ class Fir2IrImplicitCastInserter( calleeReference: FirReference, conversionTypeContext: ConversionTypeContext, ): IrExpression { - val referencedDeclaration = (calleeReference.resolvedSymbol as? FirCallableSymbol<*>)?.unwrapCallRepresentative()?.fir + val referencedDeclaration = calleeReference.toResolvedCallableSymbol()?.unwrapCallRepresentative()?.fir val dispatchReceiverType = referencedDeclaration?.dispatchReceiverType as? ConeClassLikeType diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 7ae0a2f851c..6f5357f9767 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -326,7 +326,7 @@ class Fir2IrVisitor( } val initializer = variable.initializer val isNextVariable = initializer is FirFunctionCall && - (initializer.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol)?.callableId?.isIteratorNext() == true && + initializer.calleeReference.toResolvedFunctionSymbol()?.callableId?.isIteratorNext() == true && variable.source?.isChildOfForLoop == true val irVariable = declarationStorage.createIrVariable( variable, conversionScope.parentFromStack(), @@ -850,7 +850,7 @@ class Fir2IrVisitor( noArguments = true ) as IrDynamicOperatorExpression).apply { originalVararg?.arguments?.forEach { - val that = (it as? FirPropertyAccessExpression)?.calleeReference?.resolvedSymbol?.fir as? FirProperty + val that = (it as? FirPropertyAccessExpression)?.calleeReference?.toResolvedPropertySymbol()?.fir val initializer = that?.initializer ?: return@forEach arguments.add(convertToIrExpression(initializer)) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 6addde7181c..58a6a48b8be 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -6,15 +6,17 @@ package org.jetbrains.kotlin.fir.backend.generators import org.jetbrains.kotlin.KtFakeSourceElementKind -import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isCompanion +import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCall import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression +import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference +import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor @@ -378,7 +380,7 @@ class CallAndReferenceGenerator( val dispatchReceiver = qualifiedAccess.dispatchReceiver val calleeReference = qualifiedAccess.calleeReference - val firSymbol = calleeReference.resolvedSymbol + val firSymbol = calleeReference.toResolvedBaseSymbol() val isDynamicAccess = firSymbol?.origin == FirDeclarationOrigin.DynamicScope if (isDynamicAccess) { @@ -472,8 +474,8 @@ class CallAndReferenceGenerator( } is IrFieldSymbol -> if (annotationMode) { - val resolvedSymbol = calleeReference.resolvedSymbol ?: error("should have resolvedSymbol") - val returnType = (resolvedSymbol as FirCallableSymbol<*>).resolvedReturnTypeRef.toIrType() + val resolvedSymbol = calleeReference.toResolvedCallableSymbol() ?: error("should have resolvedSymbol") + val returnType = resolvedSymbol.resolvedReturnTypeRef.toIrType() val firConstExpression = (resolvedSymbol.fir as FirVariable).initializer as? FirConstExpression<*> ?: error("should be FirConstExpression") firConstExpression.toIrConst(returnType) @@ -539,7 +541,7 @@ class CallAndReferenceGenerator( val calleeReference = variableAssignment.calleeReference val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue) - val firSymbol = calleeReference.resolvedSymbol + val firSymbol = calleeReference.toResolvedBaseSymbol() val isDynamicAccess = firSymbol?.origin == FirDeclarationOrigin.DynamicScope if (isDynamicAccess) { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt index c83b966a089..f1b444232de 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt @@ -23,8 +23,8 @@ import org.jetbrains.kotlin.fir.extensions.declarationGenerators import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.generatedMembers import org.jetbrains.kotlin.fir.extensions.generatedNestedClassifiers +import org.jetbrains.kotlin.fir.references.toResolvedConstructorSymbol import org.jetbrains.kotlin.fir.resolve.fullyExpandedType -import org.jetbrains.kotlin.fir.references.resolvedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET @@ -334,7 +334,7 @@ internal class ClassMemberGenerator( internal fun FirDelegatedConstructorCall.toIrDelegatingConstructorCall(): IrExpression { val constructedIrType = constructedTypeRef.toIrType() - val referencedSymbol = calleeReference.resolvedSymbol as? FirConstructorSymbol + val referencedSymbol = calleeReference.toResolvedConstructorSymbol() ?: return convertWithOffsets { startOffset, endOffset -> IrErrorCallExpressionImpl( startOffset, endOffset, constructedIrType, "Cannot find delegated constructor call" diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt index 35e4723aa17..03e8f793f0b 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt @@ -13,10 +13,9 @@ import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.toSymbol -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -43,7 +42,7 @@ private fun FirAnnotation.toAnnotationClass(session: FirSession): FirRegularClas private val FirExpression.callableNameOfMetaAnnotationArgument: Name? get() = (this as? FirQualifiedAccessExpression)?.let { - val callableSymbol = it.calleeReference.resolvedSymbol as? FirCallableSymbol<*> + val callableSymbol = it.calleeReference.toResolvedCallableSymbol() callableSymbol?.callableId?.callableName } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index a965da65dec..559813a1bc9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedPropertySymbol import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue import org.jetbrains.kotlin.fir.resolve.dfa.cfg.* @@ -829,8 +829,8 @@ abstract class FirDataFlowAnalyzer( private fun processConditionalContract(flow: MutableFlow, qualifiedAccess: FirQualifiedAccess) { val callee = when (qualifiedAccess) { is FirFunctionCall -> qualifiedAccess.toResolvedCallableSymbol()?.fir as? FirSimpleFunction - is FirQualifiedAccessExpression -> (qualifiedAccess.calleeReference.resolvedSymbol?.fir as? FirProperty)?.getter - is FirVariableAssignment -> (qualifiedAccess.lValue.resolvedSymbol?.fir as? FirProperty)?.setter + is FirQualifiedAccessExpression -> qualifiedAccess.calleeReference.toResolvedPropertySymbol()?.fir?.getter + is FirVariableAssignment -> qualifiedAccess.lValue.toResolvedPropertySymbol()?.fir?.setter else -> null } ?: return @@ -891,7 +891,7 @@ abstract class FirDataFlowAnalyzer( fun exitVariableAssignment(assignment: FirVariableAssignment) { graphBuilder.exitVariableAssignment(assignment).mergeIncomingFlow { flow -> - val property = assignment.lValue.resolvedSymbol?.fir as? FirProperty ?: return@mergeIncomingFlow + val property = assignment.lValue.toResolvedPropertySymbol()?.fir ?: return@mergeIncomingFlow if (property.isLocal || property.isVal) { exitVariableInitialization(flow, assignment.rValue, property, assignment, hasExplicitType = false) } else { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 10c1558b539..54eb0efafb5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -37,7 +37,6 @@ import org.jetbrains.kotlin.fir.resolve.transformers.replaceLambdaArgumentInvoca import org.jetbrains.kotlin.fir.scopes.impl.isWrappedIntegerOperator import org.jetbrains.kotlin.fir.scopes.impl.isWrappedIntegerOperatorForUnsignedType import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef @@ -601,7 +600,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT val operatorReturnTypeMatches = operatorIsSuccessful && operatorReturnTypeMatches(operatorCallReference!!.candidate) val lhsReference = leftArgument.toReference() - val lhsSymbol = lhsReference?.resolvedSymbol as? FirVariableSymbol<*> + val lhsSymbol = lhsReference?.toResolvedVariableSymbol() val lhsVariable = lhsSymbol?.fir val lhsIsVar = lhsVariable?.isVar == true @@ -1283,7 +1282,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT } // prefer a "simpler" variant for dynamics - if (transformedLhsCall.calleeReference.resolvedSymbol?.origin == FirDeclarationOrigin.DynamicScope) { + if (transformedLhsCall.calleeReference.toResolvedBaseSymbol()?.origin == FirDeclarationOrigin.DynamicScope) { return chooseAssign() } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirDeclarationUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirDeclarationUtil.kt index 6544d68a7fa..5f60635816a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirDeclarationUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirDeclarationUtil.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.declarations.utils import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.coneTypeSafe @@ -32,7 +32,7 @@ val FirClass.delegateFields: List get() = declarations.filterIsInstance().filter { it.isSynthetic } val FirQualifiedAccess.referredVariableSymbol: FirVariableSymbol<*>? - get() = calleeReference.resolvedSymbol as? FirVariableSymbol<*> + get() = calleeReference.toResolvedVariableSymbol() val FirQualifiedAccess.referredPropertySymbol: FirPropertySymbol? get() = referredVariableSymbol as? FirPropertySymbol diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt index 410fa361158..aeed960e0e3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin -import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression @@ -19,7 +18,7 @@ import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.resolved -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef @@ -55,7 +54,7 @@ inline val FirCall.dynamicVarargArguments: List? get() = dynamicVararg?.arguments inline val FirFunctionCall.isCalleeDynamic: Boolean - get() = (calleeReference.resolvedSymbol?.fir as? FirFunction)?.origin == FirDeclarationOrigin.DynamicScope + get() = calleeReference.toResolvedFunctionSymbol()?.origin == FirDeclarationOrigin.DynamicScope inline val FirCall.resolvedArgumentMapping: LinkedHashMap? get() = when (val argumentList = argumentList) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirReferenceUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirReferenceUtils.kt index fa44dc6d76c..d0231cdce47 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirReferenceUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirReferenceUtils.kt @@ -6,11 +6,49 @@ package org.jetbrains.kotlin.fir.references import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.impl.* val FirReference.resolved: FirResolvedNamedReference? get() = this as? FirResolvedNamedReference -val FirReference.resolvedSymbol: FirBasedSymbol<*>? get() = resolved?.resolvedSymbol -fun FirReference.toResolvedCallableSymbol(): FirCallableSymbol<*>? { - return this.resolvedSymbol as? FirCallableSymbol<*> +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE",) +inline fun > FirReference.toResolvedSymbol( + discardErrorReference: Boolean = false +): @kotlin.internal.NoInfer T? { + val resolvedReference = resolved ?: return null + if (discardErrorReference && resolvedReference is FirResolvedErrorReference) { + return null + } + return resolvedReference.resolvedSymbol as? T +} + +fun FirReference.toResolvedBaseSymbol(discardErrorReference: Boolean = false): FirBasedSymbol<*>? { + return this.toResolvedSymbol>(discardErrorReference) +} + +fun FirReference.toResolvedCallableSymbol(discardErrorReference: Boolean = false): FirCallableSymbol<*>? { + return this.toResolvedSymbol>(discardErrorReference) +} + +fun FirReference.toResolvedTypeParameterSymbol(discardErrorReference: Boolean = false): FirTypeParameterSymbol? { + return this.toResolvedSymbol(discardErrorReference) +} + +fun FirReference.toResolvedVariableSymbol(discardErrorReference: Boolean = false): FirVariableSymbol<*>? { + return this.toResolvedSymbol>(discardErrorReference) +} + +fun FirReference.toResolvedPropertySymbol(discardErrorReference: Boolean = false): FirPropertySymbol? { + return this.toResolvedSymbol(discardErrorReference) +} + +fun FirReference.toResolvedValueParameterSymbol(discardErrorReference: Boolean = false): FirValueParameterSymbol? { + return this.toResolvedSymbol(discardErrorReference) +} + +fun FirReference.toResolvedFunctionSymbol(discardErrorReference: Boolean = false): FirNamedFunctionSymbol? { + return this.toResolvedSymbol(discardErrorReference) +} + +fun FirReference.toResolvedConstructorSymbol(discardErrorReference: Boolean = false): FirConstructorSymbol? { + return this.toResolvedSymbol(discardErrorReference) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt index e92d642fb79..e9a0cac7bbd 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedConstructorSymbol import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.name.* @@ -61,10 +61,7 @@ class FirConstructorSymbol( get() = fir.isPrimary val resolvedDelegatedConstructor: FirConstructorSymbol? - get() { - val delegatedConstructorCall = resolvedDelegatedConstructorCall ?: return null - return delegatedConstructorCall.calleeReference.resolvedSymbol as? FirConstructorSymbol - } + get() = resolvedDelegatedConstructorCall?.calleeReference?.toResolvedConstructorSymbol() val resolvedDelegatedConstructorCall: FirDelegatedConstructorCall? get() { diff --git a/plugins/assign-plugin/assign-plugin.k2/src/org/jetbrains/kotlin/assignment/plugin/k2/FirAssignmentPluginAssignAltererExtension.kt b/plugins/assign-plugin/assign-plugin.k2/src/org/jetbrains/kotlin/assignment/plugin/k2/FirAssignmentPluginAssignAltererExtension.kt index a5358c286ef..1d4a4c2c0cd 100644 --- a/plugins/assign-plugin/assign-plugin.k2/src/org/jetbrains/kotlin/assignment/plugin/k2/FirAssignmentPluginAssignAltererExtension.kt +++ b/plugins/assign-plugin/assign-plugin.k2/src/org/jetbrains/kotlin/assignment/plugin/k2/FirAssignmentPluginAssignAltererExtension.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildFunctionCall import org.jetbrains.kotlin.fir.expressions.builder.buildPropertyAccessExpression import org.jetbrains.kotlin.fir.extensions.FirAssignExpressionAltererExtension import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference -import org.jetbrains.kotlin.fir.references.resolvedSymbol +import org.jetbrains.kotlin.fir.references.toResolvedVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol @@ -34,7 +34,7 @@ class FirAssignmentPluginAssignAltererExtension( } private fun FirVariableAssignment.supportsTransformVariableAssignment(): Boolean { - return when (val lSymbol = lValue.resolvedSymbol as? FirVariableSymbol<*>) { + return when (val lSymbol = lValue.toResolvedVariableSymbol()) { is FirPropertySymbol -> lSymbol.isVal && !lSymbol.isLocal && lSymbol.hasSpecialAnnotation() is FirBackingFieldSymbol -> lSymbol.isVal && lSymbol.hasSpecialAnnotation() is FirFieldSymbol -> lSymbol.isVal && lSymbol.hasSpecialAnnotation() @@ -47,7 +47,7 @@ class FirAssignmentPluginAssignAltererExtension( private fun buildFunctionCall(variableAssignment: FirVariableAssignment): FirFunctionCall { val leftArgument = variableAssignment.lValue - val leftSymbol = leftArgument.resolvedSymbol as FirVariableSymbol<*> + val leftSymbol = leftArgument.toResolvedVariableSymbol()!! val leftResolvedType = leftSymbol.resolvedReturnTypeRef val rightArgument = variableAssignment.rValue return buildFunctionCall {