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.*
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,
@@ -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
} }
@@ -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
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// FULL_JDK // FULL_JDK
-1
View File
@@ -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