Fir2IrLazySimpleFunction: generate overridden symbols via FirTypeScope
This commit is contained in:
@@ -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,
|
||||
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
|
||||
+4
-13
@@ -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,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
|
||||
// FULL_JDK
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
|
||||
// java.lang.NoSuchMethodError: java.util.TreeMap.remove
|
||||
// IGNORE_BACKEND: ANDROID
|
||||
|
||||
Reference in New Issue
Block a user