[FIR2IR] Allow to get cached symbols in fake override generator
This commit is contained in:
+20
-10
@@ -79,11 +79,19 @@ class FakeOverrideGenerator(
|
|||||||
(functionSymbol.callableId.classId == klass.symbol.classId || fakeOverrideMode == FakeOverrideMode.SUBSTITUTION)
|
(functionSymbol.callableId.classId == klass.symbol.classId || fakeOverrideMode == FakeOverrideMode.SUBSTITUTION)
|
||||||
) {
|
) {
|
||||||
// Substitution case
|
// Substitution case
|
||||||
val irFunction = declarationStorage.createIrFunction(
|
// NB: we can get same substituted FIR fake override in a different class, if it derives the same genetic type
|
||||||
originalFunction, irParent = this,
|
// open class Base<T> {
|
||||||
thisReceiverOwner = declarationStorage.findIrParent(baseSymbol.fir) as? IrClass,
|
// fun foo(): T
|
||||||
origin = origin
|
// }
|
||||||
)
|
// class Derived1 : Base<String>() {}
|
||||||
|
// class Derived2 : Base<String>() {}
|
||||||
|
// That's why we must check parent during caching...
|
||||||
|
val irFunction = declarationStorage.getCachedIrFunction(originalFunction)?.takeIf { it.parent == this }
|
||||||
|
?: declarationStorage.createIrFunction(
|
||||||
|
originalFunction, irParent = this,
|
||||||
|
thisReceiverOwner = declarationStorage.findIrParent(baseSymbol.fir) as? IrClass,
|
||||||
|
origin = origin
|
||||||
|
)
|
||||||
// In fake overrides, parent logic is a bit specific, because
|
// In fake overrides, parent logic is a bit specific, because
|
||||||
// parent of *original* function (base class) is used for dispatch receiver,
|
// parent of *original* function (base class) is used for dispatch receiver,
|
||||||
// but fake override itself uses parent from its containing (derived) class
|
// but fake override itself uses parent from its containing (derived) class
|
||||||
@@ -127,11 +135,13 @@ class FakeOverrideGenerator(
|
|||||||
(propertySymbol.callableId.classId == klass.symbol.classId || fakeOverrideMode == FakeOverrideMode.SUBSTITUTION)
|
(propertySymbol.callableId.classId == klass.symbol.classId || fakeOverrideMode == FakeOverrideMode.SUBSTITUTION)
|
||||||
) {
|
) {
|
||||||
// Substitution case
|
// Substitution case
|
||||||
val irProperty = declarationStorage.createIrProperty(
|
// NB: see comment above about substituted function' parent
|
||||||
originalProperty, irParent = this,
|
val irProperty = declarationStorage.getCachedIrProperty(originalProperty)?.takeIf { it.parent == this}
|
||||||
thisReceiverOwner = declarationStorage.findIrParent(baseSymbol.fir) as? IrClass,
|
?: declarationStorage.createIrProperty(
|
||||||
origin = origin
|
originalProperty, irParent = this,
|
||||||
)
|
thisReceiverOwner = declarationStorage.findIrParent(baseSymbol.fir) as? IrClass,
|
||||||
|
origin = origin
|
||||||
|
)
|
||||||
irProperty.parent = this
|
irProperty.parent = this
|
||||||
result += irProperty.withProperty {
|
result += irProperty.withProperty {
|
||||||
setOverriddenSymbolsForAccessors(declarationStorage, originalProperty, firOverriddenSymbol = baseSymbol)
|
setOverriddenSymbolsForAccessors(declarationStorage, originalProperty, firOverriddenSymbol = baseSymbol)
|
||||||
|
|||||||
Reference in New Issue
Block a user