Fir2IrLazySimpleFunction: generate overridden symbols via FirTypeScope

This commit is contained in:
Mikhail Glukhikh
2020-07-23 10:29:25 +03:00
parent 52c01abb83
commit f1356a809e
9 changed files with 35 additions and 27 deletions
@@ -24,6 +24,8 @@ import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolved
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.AccessorSymbol
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -37,10 +39,8 @@ import org.jetbrains.kotlin.ir.expressions.IrConstKind
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.IrClassPublicSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.ir.types.*
@@ -293,6 +293,26 @@ internal tailrec fun FirCallableSymbol<*>.deepestMatchingOverriddenSymbol(root:
return overriddenSymbol.deepestMatchingOverriddenSymbol(this)
}
internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(
containingClass: FirClass<*>,
session: FirSession,
scopeSession: ScopeSession,
declarationStorage: Fir2IrDeclarationStorage
): List<IrSimpleFunctionSymbol> {
val scope = containingClass.unsubstitutedScope(session, scopeSession)
scope.processFunctionsByName(name) {}
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
scope.processDirectlyOverriddenFunctions(symbol) {
if ((it.fir as FirSimpleFunction).visibility == Visibilities.PRIVATE) {
return@processDirectlyOverriddenFunctions ProcessorAction.NEXT
}
val overridden = declarationStorage.getIrFunctionSymbol(it)
overriddenSet += overridden as IrSimpleFunctionSymbol
ProcessorAction.NEXT
}
return overriddenSet.toList()
}
internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes(
irBuiltIns: IrBuiltIns,
target: IrDeclaration,
@@ -927,7 +927,7 @@ class Fir2IrDeclarationStorage(
firFunctionSymbol is FirNamedFunctionSymbol && firFunctionSymbol.isFakeOverride &&
firFunctionSymbol.callableId != firFunctionSymbol.overriddenSymbol?.callableId
Fir2IrLazySimpleFunction(
components, startOffset, endOffset, parentOrigin, firDeclaration, symbol, isFakeOverride
components, startOffset, endOffset, parentOrigin, firDeclaration, irParent.fir, symbol, isFakeOverride
).apply {
parent = irParent
}
@@ -174,19 +174,10 @@ internal class ClassMemberGenerator(
// Scope for primary constructor should be left after class declaration
declarationStorage.leaveScope(irFunction)
}
if (irFunction is IrSimpleFunction && firFunction != null && containingClass != null) {
val scope = containingClass.unsubstitutedScope(session, scopeSession)
scope.processFunctionsByName(name) {}
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
scope.processDirectlyOverriddenFunctions(firFunction.symbol) {
if ((it.fir as FirSimpleFunction).visibility == Visibilities.PRIVATE) {
return@processDirectlyOverriddenFunctions ProcessorAction.NEXT
}
val overridden = declarationStorage.getIrFunctionSymbol(it)
overriddenSet += overridden as IrSimpleFunctionSymbol
ProcessorAction.NEXT
}
irFunction.overriddenSymbols = overriddenSet.toList()
if (irFunction is IrSimpleFunction && firFunction is FirSimpleFunction && containingClass != null) {
irFunction.overriddenSymbols = firFunction.generateOverriddenFunctionSymbols(
containingClass, session, scopeSession, declarationStorage
)
}
}
return irFunction
@@ -7,12 +7,15 @@ package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
import org.jetbrains.kotlin.fir.backend.findMatchingOverriddenSymbolsFromSupertypes
import org.jetbrains.kotlin.fir.backend.generateOverriddenFunctionSymbols
import org.jetbrains.kotlin.fir.backend.toIrType
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
@@ -29,6 +32,7 @@ class Fir2IrLazySimpleFunction(
endOffset: Int,
origin: IrDeclarationOrigin,
fir: FirSimpleFunction,
firParent: FirRegularClass,
symbol: Fir2IrSimpleFunctionSymbol,
override val isFakeOverride: Boolean
) : AbstractFir2IrLazyDeclaration<FirSimpleFunction, IrSimpleFunction>(
@@ -130,9 +134,7 @@ class Fir2IrLazySimpleFunction(
}
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar {
val containingClass = parent as? IrClass
containingClass?.findMatchingOverriddenSymbolsFromSupertypes(irBuiltIns, this)
?.filterIsInstance<IrSimpleFunctionSymbol>().orEmpty()
fir.generateOverriddenFunctionSymbols(firParent, session, scopeSession, declarationStorage)
}
override var metadata: MetadataSource?
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
class MyList: List<String> {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
import java.util.ArrayList
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// WITH_COROUTINES
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// FULL_JDK
-1
View File
@@ -1,5 +1,4 @@
// TARGET_BACKEND: JVM
// IGNORE_BACKEND_FIR: JVM_IR
// java.lang.NoSuchMethodError: java.util.TreeMap.remove
// IGNORE_BACKEND: ANDROID