diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt index c18f88ac262..7c302a8aac7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.resolve.calls.tower import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirConstructor -import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.isInner import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.expressions.FirExpression @@ -17,7 +16,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.ProcessorAction -import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectClassId +import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectData import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* @@ -189,7 +188,8 @@ class ScopeTowerLevel( } private fun dispatchReceiverValue(candidate: FirCallableSymbol<*>): ReceiverValue? { - candidate.fir.importedFromObjectClassId?.let { objectClassId -> + candidate.fir.importedFromObjectData?.let { data -> + val objectClassId = data.objectClassId val symbol = session.firSymbolProvider.getClassLikeSymbolByFqName(objectClassId) if (symbol is FirRegularClassSymbol) { val resolvedQualifier = buildResolvedQualifier { @@ -223,9 +223,7 @@ class ScopeTowerLevel( ) { if (candidate.hasConsistentReceivers(extensionReceiver)) { val dispatchReceiverValue = dispatchReceiverValue(candidate) - val unwrappedCandidate = if (candidate.fir.origin == FirDeclarationOrigin.ImportedFromObject) { - candidate.overriddenSymbol!! - } else candidate + val unwrappedCandidate = candidate.fir.importedFromObjectData?.original?.symbol ?: candidate @Suppress("UNCHECKED_CAST") processor.consumeCandidate( unwrappedCandidate as T, dispatchReceiverValue, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirObjectImportedCallableScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirObjectImportedCallableScope.kt index 8842b30403e..4c7e6d35a15 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirObjectImportedCallableScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirObjectImportedCallableScope.kt @@ -31,7 +31,7 @@ class FirObjectImportedCallableScope( origin = FirDeclarationOrigin.ImportedFromObject this.symbol = FirNamedFunctionSymbol(CallableId(importedClassId, name), overriddenSymbol = symbol) }.apply { - importedFromObjectClassId = importedClassId + importedFromObjectData = ImportedFromObjectData(importedClassId, function) } processor(syntheticFunction.symbol) } @@ -49,7 +49,7 @@ class FirObjectImportedCallableScope( this.symbol = FirPropertySymbol(CallableId(importedClassId, name), overriddenSymbol = symbol) this.delegateFieldSymbol = null }.apply { - importedFromObjectClassId = importedClassId + importedFromObjectData = ImportedFromObjectData(importedClassId, property) } processor(syntheticFunction.symbol) } @@ -61,5 +61,11 @@ class FirObjectImportedCallableScope( } private object ImportedFromObjectClassIdKey : FirDeclarationDataKey() + +class ImportedFromObjectData>( + val objectClassId: ClassId, + val original: D, +) + var > - D.importedFromObjectClassId: ClassId? by FirDeclarationDataRegistry.data(ImportedFromObjectClassIdKey) + D.importedFromObjectData: ImportedFromObjectData? by FirDeclarationDataRegistry.data(ImportedFromObjectClassIdKey)