[FIR2IR] Allow to get cached symbols in fake override generator

This commit is contained in:
Mikhail Glukhikh
2020-06-26 18:01:20 +03:00
parent c4d41f48a3
commit 69ec8f2d89
@@ -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)