FIR: Do not use overriddenSymbol for imported from object

This commit is contained in:
Denis Zharkov
2020-10-29 12:32:44 +03:00
parent 65119adb6a
commit 317d981472
2 changed files with 13 additions and 9 deletions
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.resolve.calls.tower
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirConstructor 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.declarations.isInner
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
import org.jetbrains.kotlin.fir.expressions.FirExpression 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.resolve.transformers.body.resolve.resultType
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction 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.scopes.processClassifiersByName
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -189,7 +188,8 @@ class ScopeTowerLevel(
} }
private fun dispatchReceiverValue(candidate: FirCallableSymbol<*>): ReceiverValue? { 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) val symbol = session.firSymbolProvider.getClassLikeSymbolByFqName(objectClassId)
if (symbol is FirRegularClassSymbol) { if (symbol is FirRegularClassSymbol) {
val resolvedQualifier = buildResolvedQualifier { val resolvedQualifier = buildResolvedQualifier {
@@ -223,9 +223,7 @@ class ScopeTowerLevel(
) { ) {
if (candidate.hasConsistentReceivers(extensionReceiver)) { if (candidate.hasConsistentReceivers(extensionReceiver)) {
val dispatchReceiverValue = dispatchReceiverValue(candidate) val dispatchReceiverValue = dispatchReceiverValue(candidate)
val unwrappedCandidate = if (candidate.fir.origin == FirDeclarationOrigin.ImportedFromObject) { val unwrappedCandidate = candidate.fir.importedFromObjectData?.original?.symbol ?: candidate
candidate.overriddenSymbol!!
} else candidate
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
processor.consumeCandidate( processor.consumeCandidate(
unwrappedCandidate as T, dispatchReceiverValue, unwrappedCandidate as T, dispatchReceiverValue,
@@ -31,7 +31,7 @@ class FirObjectImportedCallableScope(
origin = FirDeclarationOrigin.ImportedFromObject origin = FirDeclarationOrigin.ImportedFromObject
this.symbol = FirNamedFunctionSymbol(CallableId(importedClassId, name), overriddenSymbol = symbol) this.symbol = FirNamedFunctionSymbol(CallableId(importedClassId, name), overriddenSymbol = symbol)
}.apply { }.apply {
importedFromObjectClassId = importedClassId importedFromObjectData = ImportedFromObjectData(importedClassId, function)
} }
processor(syntheticFunction.symbol) processor(syntheticFunction.symbol)
} }
@@ -49,7 +49,7 @@ class FirObjectImportedCallableScope(
this.symbol = FirPropertySymbol(CallableId(importedClassId, name), overriddenSymbol = symbol) this.symbol = FirPropertySymbol(CallableId(importedClassId, name), overriddenSymbol = symbol)
this.delegateFieldSymbol = null this.delegateFieldSymbol = null
}.apply { }.apply {
importedFromObjectClassId = importedClassId importedFromObjectData = ImportedFromObjectData(importedClassId, property)
} }
processor(syntheticFunction.symbol) processor(syntheticFunction.symbol)
} }
@@ -61,5 +61,11 @@ class FirObjectImportedCallableScope(
} }
private object ImportedFromObjectClassIdKey : FirDeclarationDataKey() private object ImportedFromObjectClassIdKey : FirDeclarationDataKey()
class ImportedFromObjectData<D : FirCallableDeclaration<*>>(
val objectClassId: ClassId,
val original: D,
)
var <D : FirCallableDeclaration<*>> var <D : FirCallableDeclaration<*>>
D.importedFromObjectClassId: ClassId? by FirDeclarationDataRegistry.data(ImportedFromObjectClassIdKey) D.importedFromObjectData: ImportedFromObjectData<D>? by FirDeclarationDataRegistry.data(ImportedFromObjectClassIdKey)