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.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
|
import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
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.AccessorSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
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.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrClassPublicSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrClassPublicSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
@@ -293,6 +293,26 @@ internal tailrec fun FirCallableSymbol<*>.deepestMatchingOverriddenSymbol(root:
|
|||||||
return overriddenSymbol.deepestMatchingOverriddenSymbol(this)
|
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(
|
internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes(
|
||||||
irBuiltIns: IrBuiltIns,
|
irBuiltIns: IrBuiltIns,
|
||||||
target: IrDeclaration,
|
target: IrDeclaration,
|
||||||
|
|||||||
+1
-1
@@ -927,7 +927,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
firFunctionSymbol is FirNamedFunctionSymbol && firFunctionSymbol.isFakeOverride &&
|
firFunctionSymbol is FirNamedFunctionSymbol && firFunctionSymbol.isFakeOverride &&
|
||||||
firFunctionSymbol.callableId != firFunctionSymbol.overriddenSymbol?.callableId
|
firFunctionSymbol.callableId != firFunctionSymbol.overriddenSymbol?.callableId
|
||||||
Fir2IrLazySimpleFunction(
|
Fir2IrLazySimpleFunction(
|
||||||
components, startOffset, endOffset, parentOrigin, firDeclaration, symbol, isFakeOverride
|
components, startOffset, endOffset, parentOrigin, firDeclaration, irParent.fir, symbol, isFakeOverride
|
||||||
).apply {
|
).apply {
|
||||||
parent = irParent
|
parent = irParent
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-13
@@ -174,19 +174,10 @@ internal class ClassMemberGenerator(
|
|||||||
// Scope for primary constructor should be left after class declaration
|
// Scope for primary constructor should be left after class declaration
|
||||||
declarationStorage.leaveScope(irFunction)
|
declarationStorage.leaveScope(irFunction)
|
||||||
}
|
}
|
||||||
if (irFunction is IrSimpleFunction && firFunction != null && containingClass != null) {
|
if (irFunction is IrSimpleFunction && firFunction is FirSimpleFunction && containingClass != null) {
|
||||||
val scope = containingClass.unsubstitutedScope(session, scopeSession)
|
irFunction.overriddenSymbols = firFunction.generateOverriddenFunctionSymbols(
|
||||||
scope.processFunctionsByName(name) {}
|
containingClass, session, scopeSession, declarationStorage
|
||||||
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()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return irFunction
|
return irFunction
|
||||||
|
|||||||
@@ -7,12 +7,15 @@ package org.jetbrains.kotlin.fir.lazy
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
||||||
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
|
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.backend.toIrType
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
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.fir.symbols.Fir2IrSimpleFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -29,6 +32,7 @@ class Fir2IrLazySimpleFunction(
|
|||||||
endOffset: Int,
|
endOffset: Int,
|
||||||
origin: IrDeclarationOrigin,
|
origin: IrDeclarationOrigin,
|
||||||
fir: FirSimpleFunction,
|
fir: FirSimpleFunction,
|
||||||
|
firParent: FirRegularClass,
|
||||||
symbol: Fir2IrSimpleFunctionSymbol,
|
symbol: Fir2IrSimpleFunctionSymbol,
|
||||||
override val isFakeOverride: Boolean
|
override val isFakeOverride: Boolean
|
||||||
) : AbstractFir2IrLazyDeclaration<FirSimpleFunction, IrSimpleFunction>(
|
) : AbstractFir2IrLazyDeclaration<FirSimpleFunction, IrSimpleFunction>(
|
||||||
@@ -130,9 +134,7 @@ class Fir2IrLazySimpleFunction(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar {
|
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar {
|
||||||
val containingClass = parent as? IrClass
|
fir.generateOverriddenFunctionSymbols(firParent, session, scopeSession, declarationStorage)
|
||||||
containingClass?.findMatchingOverriddenSymbolsFromSupertypes(irBuiltIns, this)
|
|
||||||
?.filterIsInstance<IrSimpleFunctionSymbol>().orEmpty()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override var metadata: MetadataSource?
|
override var metadata: MetadataSource?
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
class MyList: List<String> {
|
class MyList: List<String> {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// WITH_COROUTINES
|
// WITH_COROUTINES
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
|
|
||||||
// java.lang.NoSuchMethodError: java.util.TreeMap.remove
|
// java.lang.NoSuchMethodError: java.util.TreeMap.remove
|
||||||
// IGNORE_BACKEND: ANDROID
|
// IGNORE_BACKEND: ANDROID
|
||||||
|
|||||||
Reference in New Issue
Block a user