[FIR] Introduce some typed FirReference.toResolvedXXXSymbol utilities
This commit is contained in:
committed by
Space Team
parent
cffc32ec76
commit
b53c4a6353
+2
-5
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
|
|||||||
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
|
||||||
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.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
@@ -67,10 +67,7 @@ internal object FirCompileTimeConstantEvaluator {
|
|||||||
evaluateFunctionCall(fir, mode)
|
evaluateFunctionCall(fir, mode)
|
||||||
}
|
}
|
||||||
is FirNamedReference -> {
|
is FirNamedReference -> {
|
||||||
when (val resolvedSymbol = fir.resolvedSymbol) {
|
fir.toResolvedPropertySymbol()?.toConstExpression(mode)
|
||||||
is FirPropertySymbol -> resolvedSymbol.toConstExpression(mode)
|
|
||||||
else -> null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-4
@@ -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.api.symbols.KtSymbol
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
|
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.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.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
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.isLocal
|
||||||
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.psi
|
||||||
import org.jetbrains.kotlin.fir.references.*
|
import org.jetbrains.kotlin.fir.references.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
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.diagnostics.ConeUnmatchedTypeArgumentsError
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
|
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.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
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.types.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.dfa.unwrapSmartcastExpression
|
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
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
|
// FirConstructor.originalConstructorIfTypeAlias but that doesn't seem to help here as it
|
||||||
// is null for the constructors we get.
|
// is null for the constructors we get.
|
||||||
val constructedType = fir.constructedTypeRef.coneType
|
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) {
|
if (constructedType.classId != constructorReturnType?.classId) {
|
||||||
return getSymbolsForResolvedTypeRef(fir.constructedTypeRef as FirResolvedTypeRef, expression, session, symbolBuilder)
|
return getSymbolsForResolvedTypeRef(fir.constructedTypeRef as FirResolvedTypeRef, expression, session, symbolBuilder)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -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.analysis.diagnostics.jvm.FirJvmErrors
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList
|
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList
|
||||||
import org.jetbrains.kotlin.fir.references.resolvedSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
|
||||||
|
|
||||||
object FirSuperCallWithDefaultsChecker : FirFunctionCallChecker() {
|
object FirSuperCallWithDefaultsChecker : FirFunctionCallChecker() {
|
||||||
|
|
||||||
override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
|
override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
if (expression.explicitReceiverIsNotSuperReference()) return
|
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
|
if (!functionSymbol.valueParameterSymbols.any { it.hasDefaultValue }) return
|
||||||
val arguments = expression.argumentList as? FirResolvedArgumentList ?: return
|
val arguments = expression.argumentList as? FirResolvedArgumentList ?: return
|
||||||
if (arguments.arguments.size < functionSymbol.valueParameterSymbols.size) {
|
if (arguments.arguments.size < functionSymbol.valueParameterSymbols.size) {
|
||||||
|
|||||||
+6
-7
@@ -5,12 +5,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtSourceElement
|
|
||||||
import org.jetbrains.kotlin.KtNodeTypes
|
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.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
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.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference
|
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.resolve.diagnostics.*
|
||||||
import org.jetbrains.kotlin.fir.references.resolvedSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
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.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.fir.types.*
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
|
|
||||||
@@ -198,7 +197,7 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() {
|
|||||||
|
|
||||||
private val FirQualifiedAccessExpression.resolvedVariable: FirVariable?
|
private val FirQualifiedAccessExpression.resolvedVariable: FirVariable?
|
||||||
get() {
|
get() {
|
||||||
val symbol = calleeReference.resolvedSymbol as? FirVariableSymbol<*> ?: return null
|
val symbol = calleeReference.toResolvedVariableSymbol() ?: return null
|
||||||
symbol.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE)
|
symbol.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE)
|
||||||
@OptIn(SymbolInternals::class)
|
@OptIn(SymbolInternals::class)
|
||||||
return symbol.fir
|
return symbol.fir
|
||||||
|
|||||||
+6
-7
@@ -7,22 +7,21 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.KtRealSourceElementKind
|
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.FirElement
|
||||||
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.isValueClass
|
import org.jetbrains.kotlin.fir.analysis.checkers.isValueClass
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.valOrVarKeyword
|
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.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
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.ConeSimpleDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
|
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
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.symbols.SymbolInternals
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||||
@@ -89,17 +88,17 @@ object FirFunctionParameterChecker : FirFunctionChecker() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) {
|
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) {
|
||||||
|
val referredParameter = qualifiedAccessExpression.calleeReference.toResolvedValueParameterSymbol() ?: return
|
||||||
|
|
||||||
@OptIn(SymbolInternals::class)
|
@OptIn(SymbolInternals::class)
|
||||||
val referredParameter = qualifiedAccessExpression.calleeReference.resolvedSymbol?.fir as? FirValueParameter ?: return
|
val referredParameterIndex = function.valueParameters.indexOf(referredParameter.fir)
|
||||||
val referredParameterIndex = function.valueParameters.indexOf(referredParameter)
|
|
||||||
// Skip if the referred parameter is not declared in the same function.
|
// Skip if the referred parameter is not declared in the same function.
|
||||||
if (referredParameterIndex < 0) return
|
if (referredParameterIndex < 0) return
|
||||||
|
|
||||||
if (index <= referredParameterIndex) {
|
if (index <= referredParameterIndex) {
|
||||||
reporter.reportOn(
|
reporter.reportOn(
|
||||||
qualifiedAccessExpression.source, FirErrors.UNINITIALIZED_PARAMETER,
|
qualifiedAccessExpression.source, FirErrors.UNINITIALIZED_PARAMETER,
|
||||||
referredParameter.symbol,
|
referredParameter,
|
||||||
context
|
context
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-5
@@ -5,21 +5,20 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
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.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirOperationNameConventions
|
import org.jetbrains.kotlin.fir.expressions.FirOperationNameConventions
|
||||||
import org.jetbrains.kotlin.fir.references.resolvedSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.types.coneType
|
import org.jetbrains.kotlin.fir.types.coneType
|
||||||
import org.jetbrains.kotlin.fir.types.isUnit
|
import org.jetbrains.kotlin.fir.types.isUnit
|
||||||
|
|
||||||
object FirAssignmentOperatorCallChecker : FirFunctionCallChecker() {
|
object FirAssignmentOperatorCallChecker : FirFunctionCallChecker() {
|
||||||
override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
|
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
|
val resolvedCalleeName = resolvedCalleeSymbol.name
|
||||||
if (expression.origin != FirFunctionCallOrigin.Operator ||
|
if (expression.origin != FirFunctionCallOrigin.Operator ||
|
||||||
resolvedCalleeName !in FirOperationNameConventions.ASSIGNMENT_NAMES
|
resolvedCalleeName !in FirOperationNameConventions.ASSIGNMENT_NAMES
|
||||||
|
|||||||
+5
-5
@@ -6,20 +6,20 @@
|
|||||||
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.analysis.getChild
|
import org.jetbrains.kotlin.fir.analysis.getChild
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
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.scopes.impl.toConeType
|
||||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
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.impl.FirTypeParameterSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens.QUEST
|
import org.jetbrains.kotlin.lexer.KtTokens.QUEST
|
||||||
import org.jetbrains.kotlin.resolve.checkers.OptInNames
|
import org.jetbrains.kotlin.resolve.checkers.OptInNames
|
||||||
@@ -107,7 +107,7 @@ object FirClassLiteralChecker : FirGetClassCallChecker() {
|
|||||||
|
|
||||||
private val FirExpression.safeAsTypeParameterSymbol: FirTypeParameterSymbol?
|
private val FirExpression.safeAsTypeParameterSymbol: FirTypeParameterSymbol?
|
||||||
get() {
|
get() {
|
||||||
return (this as? FirQualifiedAccessExpression)?.calleeReference?.resolvedSymbol as? FirTypeParameterSymbol
|
return (this as? FirQualifiedAccessExpression)?.calleeReference?.toResolvedTypeParameterSymbol()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun ConeKotlinType.isAllowedInClassLiteral(context: CheckerContext): Boolean =
|
private fun ConeKotlinType.isAllowedInClassLiteral(context: CheckerContext): Boolean =
|
||||||
|
|||||||
+4
-5
@@ -7,22 +7,21 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
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.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isAbstract
|
import org.jetbrains.kotlin.fir.declarations.utils.isAbstract
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.references.resolvedSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedConstructorSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.types.coneType
|
import org.jetbrains.kotlin.fir.types.coneType
|
||||||
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
|
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
|
||||||
|
|
||||||
object FirConstructorCallChecker : FirFunctionCallChecker() {
|
object FirConstructorCallChecker : FirFunctionCallChecker() {
|
||||||
override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
|
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)
|
val declarationClass = constructorSymbol.resolvedReturnTypeRef.coneType.toRegularClassSymbol(context.session)
|
||||||
|
|
||||||
if (declarationClass != null) {
|
if (declarationClass != null) {
|
||||||
|
|||||||
+4
-6
@@ -5,15 +5,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
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.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
||||||
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.resolvedSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
@@ -24,8 +23,7 @@ object FirDivisionByZeroChecker : FirFunctionCallChecker() {
|
|||||||
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? FirConstExpression<*>)?.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 =
|
val callableId = (expression.calleeReference.toResolvedFunctionSymbol())?.callableId
|
||||||
(expression.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol)?.callableId
|
|
||||||
if (callableId != null && callableId.packageName == defaultPackageName && callableId.callableName == defaultDivName) {
|
if (callableId != null && callableId.packageName == defaultPackageName && callableId.callableName == defaultDivName) {
|
||||||
reporter.reportOn(expression.source, FirErrors.DIVISION_BY_ZERO, context)
|
reporter.reportOn(expression.source, FirErrors.DIVISION_BY_ZERO, context)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -6,13 +6,13 @@
|
|||||||
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
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.FirQualifiedAccess
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
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.resolve.fullyExpandedType
|
||||||
import org.jetbrains.kotlin.fir.references.resolvedSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.types.coneType
|
import org.jetbrains.kotlin.fir.types.coneType
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ object FirOptInUsageAccessChecker : FirQualifiedAccessChecker() {
|
|||||||
if (sourceKind is KtFakeSourceElementKind.DataClassGeneratedMembers ||
|
if (sourceKind is KtFakeSourceElementKind.DataClassGeneratedMembers ||
|
||||||
sourceKind is KtFakeSourceElementKind.PropertyFromParameter
|
sourceKind is KtFakeSourceElementKind.PropertyFromParameter
|
||||||
) return
|
) return
|
||||||
val resolvedSymbol = expression.calleeReference.resolvedSymbol ?: return
|
val resolvedSymbol = expression.calleeReference.toResolvedBaseSymbol() ?: return
|
||||||
val dispatchReceiverType =
|
val dispatchReceiverType =
|
||||||
expression.dispatchReceiver.takeIf { it !is FirNoReceiverExpression }?.typeRef?.coneType?.fullyExpandedType(context.session)
|
expression.dispatchReceiver.takeIf { it !is FirNoReceiverExpression }?.typeRef?.coneType?.fullyExpandedType(context.session)
|
||||||
with(FirOptInUsageBaseChecker) {
|
with(FirOptInUsageBaseChecker) {
|
||||||
|
|||||||
+3
-4
@@ -16,14 +16,13 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
|||||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirSmartCastExpression
|
import org.jetbrains.kotlin.fir.expressions.FirSmartCastExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
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.originalForSubstitutionOverride
|
||||||
import org.jetbrains.kotlin.fir.references.FirBackingFieldReference
|
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.resolve.calls.ExpressionReceiverValue
|
||||||
import org.jetbrains.kotlin.fir.references.resolvedSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.visibilityChecker
|
import org.jetbrains.kotlin.fir.visibilityChecker
|
||||||
|
|
||||||
object FirReassignmentAndInvisibleSetterChecker : FirVariableAssignmentChecker() {
|
object FirReassignmentAndInvisibleSetterChecker : FirVariableAssignmentChecker() {
|
||||||
@@ -100,7 +99,7 @@ object FirReassignmentAndInvisibleSetterChecker : FirVariableAssignmentChecker()
|
|||||||
context: CheckerContext,
|
context: CheckerContext,
|
||||||
reporter: DiagnosticReporter
|
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)
|
reporter.reportOn(expression.lValue.source, FirErrors.VAL_REASSIGNMENT, valueParameter, context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-5
@@ -7,19 +7,18 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.KtRealSourceElementKind
|
import org.jetbrains.kotlin.KtRealSourceElementKind
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
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.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
|
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.FirAnonymousFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
|
||||||
|
|
||||||
object FirReturnSyntaxAndLabelChecker : FirReturnExpressionChecker() {
|
object FirReturnSyntaxAndLabelChecker : FirReturnExpressionChecker() {
|
||||||
override fun check(expression: FirReturnExpression, context: CheckerContext, reporter: DiagnosticReporter) {
|
override fun check(expression: FirReturnExpression, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
@@ -39,7 +38,7 @@ object FirReturnSyntaxAndLabelChecker : FirReturnExpressionChecker() {
|
|||||||
if (label?.source?.kind !is KtRealSourceElementKind) {
|
if (label?.source?.kind !is KtRealSourceElementKind) {
|
||||||
val functionCall = context.qualifiedAccessOrAnnotationCalls.asReversed().find {
|
val functionCall = context.qualifiedAccessOrAnnotationCalls.asReversed().find {
|
||||||
it is FirFunctionCall &&
|
it is FirFunctionCall &&
|
||||||
(it.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol)?.callableId ==
|
(it.calleeReference.toResolvedFunctionSymbol())?.callableId ==
|
||||||
FirSuspendCallChecker.KOTLIN_SUSPEND_BUILT_IN_FUNCTION_CALLABLE_ID
|
FirSuspendCallChecker.KOTLIN_SUSPEND_BUILT_IN_FUNCTION_CALLABLE_ID
|
||||||
}
|
}
|
||||||
if (functionCall is FirFunctionCall &&
|
if (functionCall is FirFunctionCall &&
|
||||||
|
|||||||
+7
-8
@@ -6,25 +6,25 @@
|
|||||||
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
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.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isEnumEntryInitializer
|
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isEnumEntryInitializer
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
|
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.outerClassSymbol
|
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.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
|
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
|
import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
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.SymbolInternals
|
||||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol
|
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.FirPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||||
|
|
||||||
object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() {
|
object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() {
|
||||||
// Initialization order: member property initializers, enum entries, companion object (including members in it).
|
// 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
|
val source = expression.source ?: return
|
||||||
if (source.kind is KtFakeSourceElementKind) 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
|
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.
|
// 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
|
val calleeIsInsideEnum = calleeContainingClassSymbol.isEnumClass
|
||||||
@@ -203,8 +203,7 @@ object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() {
|
|||||||
val property = this.fir
|
val property = this.fir
|
||||||
if (property.delegate == null || property.delegate !is FirFunctionCall) return null
|
if (property.delegate == null || property.delegate !is FirFunctionCall) return null
|
||||||
val delegateCall = property.delegate as FirFunctionCall
|
val delegateCall = property.delegate as FirFunctionCall
|
||||||
val calleeSymbol =
|
val calleeSymbol = delegateCall.calleeReference.toResolvedFunctionSymbol() ?: return null
|
||||||
delegateCall.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol ?: return null
|
|
||||||
if (calleeSymbol.callableId.asSingleFqName().asString() != "kotlin.lazy") return null
|
if (calleeSymbol.callableId.asSingleFqName().asString() != "kotlin.lazy") return null
|
||||||
val lazyCallArgument = delegateCall.argumentList.arguments.singleOrNull() as? FirLambdaArgumentExpression ?: return null
|
val lazyCallArgument = delegateCall.argumentList.arguments.singleOrNull() as? FirLambdaArgumentExpression ?: return null
|
||||||
return (lazyCallArgument.expression as? FirAnonymousFunctionExpression)?.anonymousFunction
|
return (lazyCallArgument.expression as? FirAnonymousFunctionExpression)?.anonymousFunction
|
||||||
|
|||||||
+5
-5
@@ -6,21 +6,21 @@
|
|||||||
package org.jetbrains.kotlin.fir.analysis.checkers.extended
|
package org.jetbrains.kotlin.fir.analysis.checkers.extended
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.KtSourceElement
|
|
||||||
import org.jetbrains.kotlin.KtNodeTypes
|
import org.jetbrains.kotlin.KtNodeTypes
|
||||||
|
import org.jetbrains.kotlin.KtSourceElement
|
||||||
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
|
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.AbstractFirPropertyInitializationChecker
|
||||||
import org.jetbrains.kotlin.fir.analysis.cfa.util.PathAwarePropertyInitializationInfo
|
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.TraverseDirection
|
||||||
import org.jetbrains.kotlin.fir.analysis.cfa.util.traverse
|
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.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.getChildren
|
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.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
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.resolve.dfa.cfg.*
|
||||||
import org.jetbrains.kotlin.fir.references.resolvedSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
|
|
||||||
object CanBeValChecker : AbstractFirPropertyInitializationChecker() {
|
object CanBeValChecker : AbstractFirPropertyInitializationChecker() {
|
||||||
@@ -87,7 +87,7 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() {
|
|||||||
override fun <T> visitUnionNode(node: T) where T : CFGNode<*>, T : UnionNodeMarker {}
|
override fun <T> visitUnionNode(node: T) where T : CFGNode<*>, T : UnionNodeMarker {}
|
||||||
|
|
||||||
override fun visitVariableAssignmentNode(node: VariableAssignmentNode) {
|
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
|
if (symbol !in localProperties) return
|
||||||
unprocessedProperties.remove(symbol)
|
unprocessedProperties.remove(symbol)
|
||||||
|
|
||||||
|
|||||||
+4
-5
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
|
||||||
import org.jetbrains.kotlin.fir.references.resolved
|
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.resolve.dfa.cfg.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
@@ -54,7 +54,7 @@ object UnusedChecker : FirControlFlowChecker() {
|
|||||||
override fun <T> visitUnionNode(node: T) where T : CFGNode<*>, T : UnionNodeMarker {}
|
override fun <T> visitUnionNode(node: T) where T : CFGNode<*>, T : UnionNodeMarker {}
|
||||||
|
|
||||||
override fun visitVariableAssignmentNode(node: VariableAssignmentNode) {
|
override fun visitVariableAssignmentNode(node: VariableAssignmentNode) {
|
||||||
val variableSymbol = node.fir.calleeReference.resolvedSymbol ?: return
|
val variableSymbol = node.fir.calleeReference.toResolvedPropertySymbol() ?: return
|
||||||
val dataPerNode = data[node] ?: return
|
val dataPerNode = data[node] ?: return
|
||||||
for (dataPerLabel in dataPerNode.values) {
|
for (dataPerLabel in dataPerNode.values) {
|
||||||
val data = dataPerLabel[variableSymbol] ?: continue
|
val data = dataPerLabel[variableSymbol] ?: continue
|
||||||
@@ -233,7 +233,7 @@ object UnusedChecker : FirControlFlowChecker() {
|
|||||||
data: Collection<Pair<EdgeLabel, PathAwareVariableStatusInfo>>
|
data: Collection<Pair<EdgeLabel, PathAwareVariableStatusInfo>>
|
||||||
): PathAwareVariableStatusInfo {
|
): PathAwareVariableStatusInfo {
|
||||||
val dataForNode = visitNode(node, data)
|
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 ->
|
return update(dataForNode, symbol) update@{ prev ->
|
||||||
val toPut = when {
|
val toPut = when {
|
||||||
symbol !in localProperties -> {
|
symbol !in localProperties -> {
|
||||||
@@ -282,8 +282,7 @@ object UnusedChecker : FirControlFlowChecker() {
|
|||||||
vararg qualifiedAccesses: FirQualifiedAccess,
|
vararg qualifiedAccesses: FirQualifiedAccess,
|
||||||
): PathAwareVariableStatusInfo {
|
): PathAwareVariableStatusInfo {
|
||||||
fun retrieveSymbol(qualifiedAccess: FirQualifiedAccess): FirPropertySymbol? {
|
fun retrieveSymbol(qualifiedAccess: FirQualifiedAccess): FirPropertySymbol? {
|
||||||
val symbol = qualifiedAccess.calleeReference.resolvedSymbol as? FirPropertySymbol ?: return null
|
return qualifiedAccess.calleeReference.toResolvedPropertySymbol()?.takeIf { it in localProperties }
|
||||||
return if (symbol !in localProperties) null else symbol
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val symbols = qualifiedAccesses.mapNotNull { retrieveSymbol(it) }.toTypedArray()
|
val symbols = qualifiedAccesses.mapNotNull { retrieveSymbol(it) }.toTypedArray()
|
||||||
|
|||||||
+10
-8
@@ -5,18 +5,18 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.analysis.checkers.extended
|
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.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker
|
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.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
|
||||||
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.references.resolvedSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.types.ConeNullability
|
import org.jetbrains.kotlin.fir.types.ConeNullability
|
||||||
import org.jetbrains.kotlin.fir.types.classId
|
import org.jetbrains.kotlin.fir.types.classId
|
||||||
import org.jetbrains.kotlin.fir.types.coneType
|
import org.jetbrains.kotlin.fir.types.coneType
|
||||||
|
import org.jetbrains.kotlin.name.CallableId
|
||||||
|
|
||||||
object UselessCallOnNotNullChecker : FirQualifiedAccessExpressionChecker() {
|
object UselessCallOnNotNullChecker : FirQualifiedAccessExpressionChecker() {
|
||||||
// todo: add 'call may be reduced' in cases like 's?.isNullOrEmpty()' where 's: String? = ""'
|
// 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() =
|
private fun FirQualifiedAccessExpression.getCallableId(): CallableId? {
|
||||||
(calleeReference.resolvedSymbol as? FirNamedFunctionSymbol)?.callableId
|
return calleeReference.toResolvedFunctionSymbol()?.callableId
|
||||||
|
}
|
||||||
|
|
||||||
private fun FirExpression.getPackage() =
|
private fun FirExpression.getPackage(): String {
|
||||||
typeRef.coneType.classId?.packageFqName.toString()
|
return typeRef.coneType.classId?.packageFqName.toString()
|
||||||
|
}
|
||||||
|
|
||||||
private fun FirExpression.getNullability() = typeRef.coneType.nullability
|
private fun FirExpression.getNullability() = typeRef.coneType.nullability
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -26,7 +26,8 @@ import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass
|
|||||||
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyConstructor
|
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyConstructor
|
||||||
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyProperty
|
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyProperty
|
||||||
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazySimpleFunction
|
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.dfa.cfg.isLocalClassOrAnonymousObject
|
||||||
import org.jetbrains.kotlin.fir.resolve.isKFunctionInvoke
|
import org.jetbrains.kotlin.fir.resolve.isKFunctionInvoke
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
||||||
@@ -892,7 +893,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
val setter = property.setter
|
val setter = property.setter
|
||||||
if (delegate != null || property.hasBackingField) {
|
if (delegate != null || property.hasBackingField) {
|
||||||
backingField = if (delegate != null) {
|
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)
|
classifierStorage.preCacheTypeParameters(it, symbol)
|
||||||
}
|
}
|
||||||
createBackingField(
|
createBackingField(
|
||||||
@@ -1038,7 +1039,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
private fun getOrCreateDelegateIrField(field: FirField, owner: FirClass, irClass: IrClass): IrField {
|
private fun getOrCreateDelegateIrField(field: FirField, owner: FirClass, irClass: IrClass): IrField {
|
||||||
val initializer = field.initializer
|
val initializer = field.initializer
|
||||||
if (initializer is FirQualifiedAccessExpression && initializer.explicitReceiver == null) {
|
if (initializer is FirQualifiedAccessExpression && initializer.explicitReceiver == null) {
|
||||||
val resolvedSymbol = initializer.calleeReference.resolvedSymbol as? FirValueParameterSymbol
|
val resolvedSymbol = initializer.calleeReference.toResolvedValueParameterSymbol()
|
||||||
if (resolvedSymbol is FirValueParameterSymbol) {
|
if (resolvedSymbol is FirValueParameterSymbol) {
|
||||||
val name = resolvedSymbol.name
|
val name = resolvedSymbol.name
|
||||||
val constructorProperty = owner.declarations.filterIsInstance<FirProperty>().find {
|
val constructorProperty = owner.declarations.filterIsInstance<FirProperty>().find {
|
||||||
|
|||||||
+2
-3
@@ -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.expressions.impl.FirUnitExpression
|
||||||
import org.jetbrains.kotlin.fir.references.FirReference
|
import org.jetbrains.kotlin.fir.references.FirReference
|
||||||
import org.jetbrains.kotlin.fir.render
|
import org.jetbrains.kotlin.fir.render
|
||||||
import org.jetbrains.kotlin.fir.references.resolvedSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
||||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||||
@@ -278,7 +277,7 @@ class Fir2IrImplicitCastInserter(
|
|||||||
calleeReference: FirReference,
|
calleeReference: FirReference,
|
||||||
conversionTypeContext: ConversionTypeContext,
|
conversionTypeContext: ConversionTypeContext,
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
val referencedDeclaration = (calleeReference.resolvedSymbol as? FirCallableSymbol<*>)?.unwrapCallRepresentative()?.fir
|
val referencedDeclaration = calleeReference.toResolvedCallableSymbol()?.unwrapCallRepresentative()?.fir
|
||||||
|
|
||||||
val dispatchReceiverType =
|
val dispatchReceiverType =
|
||||||
referencedDeclaration?.dispatchReceiverType as? ConeClassLikeType
|
referencedDeclaration?.dispatchReceiverType as? ConeClassLikeType
|
||||||
|
|||||||
@@ -326,7 +326,7 @@ class Fir2IrVisitor(
|
|||||||
}
|
}
|
||||||
val initializer = variable.initializer
|
val initializer = variable.initializer
|
||||||
val isNextVariable = initializer is FirFunctionCall &&
|
val isNextVariable = initializer is FirFunctionCall &&
|
||||||
(initializer.calleeReference.resolvedSymbol as? FirNamedFunctionSymbol)?.callableId?.isIteratorNext() == true &&
|
initializer.calleeReference.toResolvedFunctionSymbol()?.callableId?.isIteratorNext() == true &&
|
||||||
variable.source?.isChildOfForLoop == true
|
variable.source?.isChildOfForLoop == true
|
||||||
val irVariable = declarationStorage.createIrVariable(
|
val irVariable = declarationStorage.createIrVariable(
|
||||||
variable, conversionScope.parentFromStack(),
|
variable, conversionScope.parentFromStack(),
|
||||||
@@ -850,7 +850,7 @@ class Fir2IrVisitor(
|
|||||||
noArguments = true
|
noArguments = true
|
||||||
) as IrDynamicOperatorExpression).apply {
|
) as IrDynamicOperatorExpression).apply {
|
||||||
originalVararg?.arguments?.forEach {
|
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
|
val initializer = that?.initializer ?: return@forEach
|
||||||
arguments.add(convertToIrExpression(initializer))
|
arguments.add(convertToIrExpression(initializer))
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-5
@@ -6,15 +6,17 @@
|
|||||||
package org.jetbrains.kotlin.fir.backend.generators
|
package org.jetbrains.kotlin.fir.backend.generators
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.fir.*
|
|
||||||
import org.jetbrains.kotlin.fir.backend.*
|
import org.jetbrains.kotlin.fir.backend.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
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.calls.FirSyntheticFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||||
@@ -378,7 +380,7 @@ class CallAndReferenceGenerator(
|
|||||||
val dispatchReceiver = qualifiedAccess.dispatchReceiver
|
val dispatchReceiver = qualifiedAccess.dispatchReceiver
|
||||||
val calleeReference = qualifiedAccess.calleeReference
|
val calleeReference = qualifiedAccess.calleeReference
|
||||||
|
|
||||||
val firSymbol = calleeReference.resolvedSymbol
|
val firSymbol = calleeReference.toResolvedBaseSymbol()
|
||||||
val isDynamicAccess = firSymbol?.origin == FirDeclarationOrigin.DynamicScope
|
val isDynamicAccess = firSymbol?.origin == FirDeclarationOrigin.DynamicScope
|
||||||
|
|
||||||
if (isDynamicAccess) {
|
if (isDynamicAccess) {
|
||||||
@@ -472,8 +474,8 @@ class CallAndReferenceGenerator(
|
|||||||
}
|
}
|
||||||
|
|
||||||
is IrFieldSymbol -> if (annotationMode) {
|
is IrFieldSymbol -> if (annotationMode) {
|
||||||
val resolvedSymbol = calleeReference.resolvedSymbol ?: error("should have resolvedSymbol")
|
val resolvedSymbol = calleeReference.toResolvedCallableSymbol() ?: error("should have resolvedSymbol")
|
||||||
val returnType = (resolvedSymbol as FirCallableSymbol<*>).resolvedReturnTypeRef.toIrType()
|
val returnType = resolvedSymbol.resolvedReturnTypeRef.toIrType()
|
||||||
val firConstExpression = (resolvedSymbol.fir as FirVariable).initializer as? FirConstExpression<*>
|
val firConstExpression = (resolvedSymbol.fir as FirVariable).initializer as? FirConstExpression<*>
|
||||||
?: error("should be FirConstExpression")
|
?: error("should be FirConstExpression")
|
||||||
firConstExpression.toIrConst(returnType)
|
firConstExpression.toIrConst(returnType)
|
||||||
@@ -539,7 +541,7 @@ class CallAndReferenceGenerator(
|
|||||||
val calleeReference = variableAssignment.calleeReference
|
val calleeReference = variableAssignment.calleeReference
|
||||||
val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue)
|
val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue)
|
||||||
|
|
||||||
val firSymbol = calleeReference.resolvedSymbol
|
val firSymbol = calleeReference.toResolvedBaseSymbol()
|
||||||
val isDynamicAccess = firSymbol?.origin == FirDeclarationOrigin.DynamicScope
|
val isDynamicAccess = firSymbol?.origin == FirDeclarationOrigin.DynamicScope
|
||||||
|
|
||||||
if (isDynamicAccess) {
|
if (isDynamicAccess) {
|
||||||
|
|||||||
+2
-2
@@ -23,8 +23,8 @@ import org.jetbrains.kotlin.fir.extensions.declarationGenerators
|
|||||||
import org.jetbrains.kotlin.fir.extensions.extensionService
|
import org.jetbrains.kotlin.fir.extensions.extensionService
|
||||||
import org.jetbrains.kotlin.fir.extensions.generatedMembers
|
import org.jetbrains.kotlin.fir.extensions.generatedMembers
|
||||||
import org.jetbrains.kotlin.fir.extensions.generatedNestedClassifiers
|
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.resolve.fullyExpandedType
|
||||||
import org.jetbrains.kotlin.fir.references.resolvedSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
@@ -334,7 +334,7 @@ internal class ClassMemberGenerator(
|
|||||||
|
|
||||||
internal fun FirDelegatedConstructorCall.toIrDelegatingConstructorCall(): IrExpression {
|
internal fun FirDelegatedConstructorCall.toIrDelegatingConstructorCall(): IrExpression {
|
||||||
val constructedIrType = constructedTypeRef.toIrType()
|
val constructedIrType = constructedTypeRef.toIrType()
|
||||||
val referencedSymbol = calleeReference.resolvedSymbol as? FirConstructorSymbol
|
val referencedSymbol = calleeReference.toResolvedConstructorSymbol()
|
||||||
?: return convertWithOffsets { startOffset, endOffset ->
|
?: return convertWithOffsets { startOffset, endOffset ->
|
||||||
IrErrorCallExpressionImpl(
|
IrErrorCallExpressionImpl(
|
||||||
startOffset, endOffset, constructedIrType, "Cannot find delegated constructor call"
|
startOffset, endOffset, constructedIrType, "Cannot find delegated constructor call"
|
||||||
|
|||||||
+2
-3
@@ -13,10 +13,9 @@ import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
|||||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
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.ConeClassLikeLookupTag
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
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.fir.types.*
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -43,7 +42,7 @@ private fun FirAnnotation.toAnnotationClass(session: FirSession): FirRegularClas
|
|||||||
private val FirExpression.callableNameOfMetaAnnotationArgument: Name?
|
private val FirExpression.callableNameOfMetaAnnotationArgument: Name?
|
||||||
get() =
|
get() =
|
||||||
(this as? FirQualifiedAccessExpression)?.let {
|
(this as? FirQualifiedAccessExpression)?.let {
|
||||||
val callableSymbol = it.calleeReference.resolvedSymbol as? FirCallableSymbol<*>
|
val callableSymbol = it.calleeReference.toResolvedCallableSymbol()
|
||||||
callableSymbol?.callableId?.callableName
|
callableSymbol?.callableId?.callableName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isLocal
|
|||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue
|
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue
|
||||||
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.*
|
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.*
|
||||||
@@ -829,8 +829,8 @@ abstract class FirDataFlowAnalyzer(
|
|||||||
private fun processConditionalContract(flow: MutableFlow, qualifiedAccess: FirQualifiedAccess) {
|
private fun processConditionalContract(flow: MutableFlow, qualifiedAccess: FirQualifiedAccess) {
|
||||||
val callee = when (qualifiedAccess) {
|
val callee = when (qualifiedAccess) {
|
||||||
is FirFunctionCall -> qualifiedAccess.toResolvedCallableSymbol()?.fir as? FirSimpleFunction
|
is FirFunctionCall -> qualifiedAccess.toResolvedCallableSymbol()?.fir as? FirSimpleFunction
|
||||||
is FirQualifiedAccessExpression -> (qualifiedAccess.calleeReference.resolvedSymbol?.fir as? FirProperty)?.getter
|
is FirQualifiedAccessExpression -> qualifiedAccess.calleeReference.toResolvedPropertySymbol()?.fir?.getter
|
||||||
is FirVariableAssignment -> (qualifiedAccess.lValue.resolvedSymbol?.fir as? FirProperty)?.setter
|
is FirVariableAssignment -> qualifiedAccess.lValue.toResolvedPropertySymbol()?.fir?.setter
|
||||||
else -> null
|
else -> null
|
||||||
} ?: return
|
} ?: return
|
||||||
|
|
||||||
@@ -891,7 +891,7 @@ abstract class FirDataFlowAnalyzer(
|
|||||||
|
|
||||||
fun exitVariableAssignment(assignment: FirVariableAssignment) {
|
fun exitVariableAssignment(assignment: FirVariableAssignment) {
|
||||||
graphBuilder.exitVariableAssignment(assignment).mergeIncomingFlow { flow ->
|
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) {
|
if (property.isLocal || property.isVal) {
|
||||||
exitVariableInitialization(flow, assignment.rValue, property, assignment, hasExplicitType = false)
|
exitVariableInitialization(flow, assignment.rValue, property, assignment, hasExplicitType = false)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+2
-3
@@ -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.isWrappedIntegerOperator
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.isWrappedIntegerOperatorForUnsignedType
|
import org.jetbrains.kotlin.fir.scopes.impl.isWrappedIntegerOperatorForUnsignedType
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||||
@@ -601,7 +600,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
val operatorReturnTypeMatches = operatorIsSuccessful && operatorReturnTypeMatches(operatorCallReference!!.candidate)
|
val operatorReturnTypeMatches = operatorIsSuccessful && operatorReturnTypeMatches(operatorCallReference!!.candidate)
|
||||||
|
|
||||||
val lhsReference = leftArgument.toReference()
|
val lhsReference = leftArgument.toReference()
|
||||||
val lhsSymbol = lhsReference?.resolvedSymbol as? FirVariableSymbol<*>
|
val lhsSymbol = lhsReference?.toResolvedVariableSymbol()
|
||||||
val lhsVariable = lhsSymbol?.fir
|
val lhsVariable = lhsSymbol?.fir
|
||||||
val lhsIsVar = lhsVariable?.isVar == true
|
val lhsIsVar = lhsVariable?.isVar == true
|
||||||
|
|
||||||
@@ -1283,7 +1282,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
}
|
}
|
||||||
|
|
||||||
// prefer a "simpler" variant for dynamics
|
// prefer a "simpler" variant for dynamics
|
||||||
if (transformedLhsCall.calleeReference.resolvedSymbol?.origin == FirDeclarationOrigin.DynamicScope) {
|
if (transformedLhsCall.calleeReference.toResolvedBaseSymbol()?.origin == FirDeclarationOrigin.DynamicScope) {
|
||||||
return chooseAssign()
|
return chooseAssign()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.declarations.utils
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
|
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.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||||
@@ -32,7 +32,7 @@ val FirClass.delegateFields: List<FirField>
|
|||||||
get() = declarations.filterIsInstance<FirField>().filter { it.isSynthetic }
|
get() = declarations.filterIsInstance<FirField>().filter { it.isSynthetic }
|
||||||
|
|
||||||
val FirQualifiedAccess.referredVariableSymbol: FirVariableSymbol<*>?
|
val FirQualifiedAccess.referredVariableSymbol: FirVariableSymbol<*>?
|
||||||
get() = calleeReference.resolvedSymbol as? FirVariableSymbol<*>
|
get() = calleeReference.toResolvedVariableSymbol()
|
||||||
|
|
||||||
val FirQualifiedAccess.referredPropertySymbol: FirPropertySymbol?
|
val FirQualifiedAccess.referredPropertySymbol: FirPropertySymbol?
|
||||||
get() = referredVariableSymbol as? FirPropertySymbol
|
get() = referredVariableSymbol as? FirPropertySymbol
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.expressions
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.KtSourceElement
|
import org.jetbrains.kotlin.KtSourceElement
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
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.declarations.FirValueParameter
|
||||||
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.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.FirReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.resolved
|
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.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||||
@@ -55,7 +54,7 @@ inline val FirCall.dynamicVarargArguments: List<FirExpression>?
|
|||||||
get() = dynamicVararg?.arguments
|
get() = dynamicVararg?.arguments
|
||||||
|
|
||||||
inline val FirFunctionCall.isCalleeDynamic: Boolean
|
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<FirExpression, FirValueParameter>?
|
inline val FirCall.resolvedArgumentMapping: LinkedHashMap<FirExpression, FirValueParameter>?
|
||||||
get() = when (val argumentList = argumentList) {
|
get() = when (val argumentList = argumentList) {
|
||||||
|
|||||||
@@ -6,11 +6,49 @@
|
|||||||
package org.jetbrains.kotlin.fir.references
|
package org.jetbrains.kotlin.fir.references
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
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.resolved: FirResolvedNamedReference? get() = this as? FirResolvedNamedReference
|
||||||
val FirReference.resolvedSymbol: FirBasedSymbol<*>? get() = resolved?.resolvedSymbol
|
|
||||||
|
|
||||||
fun FirReference.toResolvedCallableSymbol(): FirCallableSymbol<*>? {
|
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE",)
|
||||||
return this.resolvedSymbol as? FirCallableSymbol<*>
|
inline fun <reified T : FirBasedSymbol<*>> 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<FirBasedSymbol<*>>(discardErrorReference)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun FirReference.toResolvedCallableSymbol(discardErrorReference: Boolean = false): FirCallableSymbol<*>? {
|
||||||
|
return this.toResolvedSymbol<FirCallableSymbol<*>>(discardErrorReference)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun FirReference.toResolvedTypeParameterSymbol(discardErrorReference: Boolean = false): FirTypeParameterSymbol? {
|
||||||
|
return this.toResolvedSymbol<FirTypeParameterSymbol>(discardErrorReference)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun FirReference.toResolvedVariableSymbol(discardErrorReference: Boolean = false): FirVariableSymbol<*>? {
|
||||||
|
return this.toResolvedSymbol<FirVariableSymbol<*>>(discardErrorReference)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun FirReference.toResolvedPropertySymbol(discardErrorReference: Boolean = false): FirPropertySymbol? {
|
||||||
|
return this.toResolvedSymbol<FirPropertySymbol>(discardErrorReference)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun FirReference.toResolvedValueParameterSymbol(discardErrorReference: Boolean = false): FirValueParameterSymbol? {
|
||||||
|
return this.toResolvedSymbol<FirValueParameterSymbol>(discardErrorReference)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun FirReference.toResolvedFunctionSymbol(discardErrorReference: Boolean = false): FirNamedFunctionSymbol? {
|
||||||
|
return this.toResolvedSymbol<FirNamedFunctionSymbol>(discardErrorReference)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun FirReference.toResolvedConstructorSymbol(discardErrorReference: Boolean = false): FirConstructorSymbol? {
|
||||||
|
return this.toResolvedSymbol<FirConstructorSymbol>(discardErrorReference)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
|
|||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
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.fir.symbols.lazyResolveToPhase
|
||||||
import org.jetbrains.kotlin.name.*
|
import org.jetbrains.kotlin.name.*
|
||||||
|
|
||||||
@@ -61,10 +61,7 @@ class FirConstructorSymbol(
|
|||||||
get() = fir.isPrimary
|
get() = fir.isPrimary
|
||||||
|
|
||||||
val resolvedDelegatedConstructor: FirConstructorSymbol?
|
val resolvedDelegatedConstructor: FirConstructorSymbol?
|
||||||
get() {
|
get() = resolvedDelegatedConstructorCall?.calleeReference?.toResolvedConstructorSymbol()
|
||||||
val delegatedConstructorCall = resolvedDelegatedConstructorCall ?: return null
|
|
||||||
return delegatedConstructorCall.calleeReference.resolvedSymbol as? FirConstructorSymbol
|
|
||||||
}
|
|
||||||
|
|
||||||
val resolvedDelegatedConstructorCall: FirDelegatedConstructorCall?
|
val resolvedDelegatedConstructorCall: FirDelegatedConstructorCall?
|
||||||
get() {
|
get() {
|
||||||
|
|||||||
+3
-3
@@ -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.expressions.builder.buildPropertyAccessExpression
|
||||||
import org.jetbrains.kotlin.fir.extensions.FirAssignExpressionAltererExtension
|
import org.jetbrains.kotlin.fir.extensions.FirAssignExpressionAltererExtension
|
||||||
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
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.FirBackingFieldSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
@@ -34,7 +34,7 @@ class FirAssignmentPluginAssignAltererExtension(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun FirVariableAssignment.supportsTransformVariableAssignment(): Boolean {
|
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 FirPropertySymbol -> lSymbol.isVal && !lSymbol.isLocal && lSymbol.hasSpecialAnnotation()
|
||||||
is FirBackingFieldSymbol -> lSymbol.isVal && lSymbol.hasSpecialAnnotation()
|
is FirBackingFieldSymbol -> lSymbol.isVal && lSymbol.hasSpecialAnnotation()
|
||||||
is FirFieldSymbol -> lSymbol.isVal && lSymbol.hasSpecialAnnotation()
|
is FirFieldSymbol -> lSymbol.isVal && lSymbol.hasSpecialAnnotation()
|
||||||
@@ -47,7 +47,7 @@ class FirAssignmentPluginAssignAltererExtension(
|
|||||||
|
|
||||||
private fun buildFunctionCall(variableAssignment: FirVariableAssignment): FirFunctionCall {
|
private fun buildFunctionCall(variableAssignment: FirVariableAssignment): FirFunctionCall {
|
||||||
val leftArgument = variableAssignment.lValue
|
val leftArgument = variableAssignment.lValue
|
||||||
val leftSymbol = leftArgument.resolvedSymbol as FirVariableSymbol<*>
|
val leftSymbol = leftArgument.toResolvedVariableSymbol()!!
|
||||||
val leftResolvedType = leftSymbol.resolvedReturnTypeRef
|
val leftResolvedType = leftSymbol.resolvedReturnTypeRef
|
||||||
val rightArgument = variableAssignment.rValue
|
val rightArgument = variableAssignment.rValue
|
||||||
return buildFunctionCall {
|
return buildFunctionCall {
|
||||||
|
|||||||
Reference in New Issue
Block a user