[FIR2IR] Replace getIrClassSymbol with getOrCreateIrClass in Fir2IrClassifierStorage
Effectively, `getIrClassSymbol` always created `IrClass` if it was needed and returned its symbol. So to avoid potentially unsafe access of `IrClassSymbol.owner` it's more convenient to return directly `IrClass` ^KT-60924
This commit is contained in:
committed by
Space Team
parent
063835488f
commit
e7b95d1288
+1
-1
@@ -21,7 +21,7 @@ class FirJvmBackendClassResolver(val components: Fir2IrComponents) : JvmBackendC
|
|||||||
|
|
||||||
val symbol = components.session.symbolProvider.getClassLikeSymbolByClassId(type.classId) ?: return emptyList()
|
val symbol = components.session.symbolProvider.getClassLikeSymbolByClassId(type.classId) ?: return emptyList()
|
||||||
require(symbol is FirClassSymbol<*>)
|
require(symbol is FirClassSymbol<*>)
|
||||||
return listOf(components.classifierStorage.getIrClassSymbol(symbol).descriptor)
|
return listOf(components.classifierStorage.getOrCreateIrClass(symbol).symbol.descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ fun FirClassifierSymbol<*>.toSymbol(
|
|||||||
}
|
}
|
||||||
|
|
||||||
is FirClassSymbol -> {
|
is FirClassSymbol -> {
|
||||||
classifierStorage.getIrClassSymbol(this)
|
classifierStorage.getOrCreateIrClass(this).symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> error("Unknown symbol: $this")
|
else -> error("Unknown symbol: $this")
|
||||||
|
|||||||
@@ -228,11 +228,7 @@ class Fir2IrClassifierStorage(
|
|||||||
return localStorage[lookupTag.toSymbol(session)!!.fir as FirClass]
|
return localStorage[lookupTag.toSymbol(session)!!.fir as FirClass]
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getIrClassSymbol(firClassSymbol: FirClassSymbol<*>): IrClassSymbol {
|
fun getOrCreateIrClass(firClassSymbol: FirClassSymbol<*>): IrClass {
|
||||||
return getOrCreateIrClass(firClassSymbol).symbol
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getOrCreateIrClass(firClassSymbol: FirClassSymbol<*>): IrClass {
|
|
||||||
val firClass = firClassSymbol.fir
|
val firClass = firClassSymbol.fir
|
||||||
classifierStorage.getCachedIrClass(firClass)?.let { return it }
|
classifierStorage.getCachedIrClass(firClass)?.let { return it }
|
||||||
if (firClass is FirAnonymousObject || firClass is FirRegularClass && firClass.visibility == Visibilities.Local) {
|
if (firClass is FirAnonymousObject || firClass is FirRegularClass && firClass.visibility == Visibilities.Local) {
|
||||||
|
|||||||
+2
-4
@@ -1068,11 +1068,10 @@ class Fir2IrDeclarationStorage(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(IrSymbolInternals::class)
|
|
||||||
private fun generateLazyFakeOverrides(name: Name, fakeOverrideOwnerLookupTag: ConeClassLikeLookupTag?) {
|
private fun generateLazyFakeOverrides(name: Name, fakeOverrideOwnerLookupTag: ConeClassLikeLookupTag?) {
|
||||||
val firClassSymbol = fakeOverrideOwnerLookupTag?.toSymbol(session) as? FirClassSymbol
|
val firClassSymbol = fakeOverrideOwnerLookupTag?.toSymbol(session) as? FirClassSymbol
|
||||||
if (firClassSymbol != null) {
|
if (firClassSymbol != null) {
|
||||||
val irClass = classifierStorage.getIrClassSymbol(firClassSymbol).owner
|
val irClass = classifierStorage.getOrCreateIrClass(firClassSymbol)
|
||||||
if (irClass is Fir2IrLazyClass) {
|
if (irClass is Fir2IrLazyClass) {
|
||||||
irClass.getFakeOverridesByName(name)
|
irClass.getFakeOverridesByName(name)
|
||||||
}
|
}
|
||||||
@@ -1305,12 +1304,11 @@ class Fir2IrDeclarationStorage(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(IrSymbolInternals::class)
|
|
||||||
private inline fun <reified S : IrSymbol, reified D : IrOverridableDeclaration<S>> ConeClassLookupTagWithFixedSymbol.findIrFakeOverride(
|
private inline fun <reified S : IrSymbol, reified D : IrOverridableDeclaration<S>> ConeClassLookupTagWithFixedSymbol.findIrFakeOverride(
|
||||||
name: Name, originalDeclaration: IrOverridableDeclaration<S>
|
name: Name, originalDeclaration: IrOverridableDeclaration<S>
|
||||||
): IrSymbol? {
|
): IrSymbol? {
|
||||||
val dispatchReceiverIrClass =
|
val dispatchReceiverIrClass =
|
||||||
classifierStorage.getIrClassSymbol(toSymbol(session) as FirClassSymbol).owner
|
classifierStorage.getOrCreateIrClass(toSymbol(session) as FirClassSymbol)
|
||||||
return dispatchReceiverIrClass.declarations.find {
|
return dispatchReceiverIrClass.declarations.find {
|
||||||
it is D && it.isFakeOverride && it.name == name && it.overrides(originalDeclaration)
|
it is D && it.isFakeOverride && it.name == name && it.overrides(originalDeclaration)
|
||||||
}?.symbol
|
}?.symbol
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ class Fir2IrPluginContext(
|
|||||||
|
|
||||||
override fun referenceClass(classId: ClassId): IrClassSymbol? {
|
override fun referenceClass(classId: ClassId): IrClassSymbol? {
|
||||||
val firSymbol = symbolProvider.getClassLikeSymbolByClassId(classId) as? FirClassSymbol<*> ?: return null
|
val firSymbol = symbolProvider.getClassLikeSymbolByClassId(classId) as? FirClassSymbol<*> ?: return null
|
||||||
return components.classifierStorage.getIrClassSymbol(firSymbol)
|
return components.classifierStorage.getOrCreateIrClass(firSymbol).symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun referenceTypeAlias(classId: ClassId): IrTypeAliasSymbol? {
|
override fun referenceTypeAlias(classId: ClassId): IrTypeAliasSymbol? {
|
||||||
|
|||||||
@@ -723,7 +723,7 @@ class Fir2IrVisitor(
|
|||||||
* val x: Int = foo() // this: Base.Companion
|
* val x: Int = foo() // this: Base.Companion
|
||||||
* ) : Base()
|
* ) : Base()
|
||||||
*/
|
*/
|
||||||
classifierStorage.getIrClassSymbol(firClassSymbol)
|
classifierStorage.getOrCreateIrClass(firClassSymbol).symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firClass.classKind.isObject && shouldGenerateReceiverAsSingletonReference(irClassSymbol)) {
|
if (firClass.classKind.isObject && shouldGenerateReceiverAsSingletonReference(irClassSymbol)) {
|
||||||
@@ -1533,7 +1533,7 @@ class Fir2IrVisitor(
|
|||||||
is FirResolvedQualifier -> {
|
is FirResolvedQualifier -> {
|
||||||
when (val symbol = argument.symbol) {
|
when (val symbol = argument.symbol) {
|
||||||
is FirClassSymbol -> {
|
is FirClassSymbol -> {
|
||||||
classifierStorage.getIrClassSymbol(symbol)
|
classifierStorage.getOrCreateIrClass(symbol).symbol
|
||||||
}
|
}
|
||||||
is FirTypeAliasSymbol -> {
|
is FirTypeAliasSymbol -> {
|
||||||
symbol.fir.fullyExpandedConeType(session).toIrClassSymbol()
|
symbol.fir.fullyExpandedConeType(session).toIrClassSymbol()
|
||||||
@@ -1567,7 +1567,7 @@ class Fir2IrVisitor(
|
|||||||
|
|
||||||
private fun ConeClassLikeType?.toIrClassSymbol(): IrClassSymbol? =
|
private fun ConeClassLikeType?.toIrClassSymbol(): IrClassSymbol? =
|
||||||
(this?.lookupTag?.toSymbol(session) as? FirClassSymbol<*>)?.let {
|
(this?.lookupTag?.toSymbol(session) as? FirClassSymbol<*>)?.let {
|
||||||
classifierStorage.getIrClassSymbol(it)
|
classifierStorage.getOrCreateIrClass(it).symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun convertToArrayLiteral(arrayLiteral: FirArrayLiteral): IrVararg {
|
private fun convertToArrayLiteral(arrayLiteral: FirArrayLiteral): IrVararg {
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ class FirIrProvider(val components: Fir2IrComponents) : IrProvider {
|
|||||||
val scope = with(components) { firClass.unsubstitutedScope() }
|
val scope = with(components) { firClass.unsubstitutedScope() }
|
||||||
|
|
||||||
fun findIrClass(firClass: FirRegularClass): IrClass {
|
fun findIrClass(firClass: FirRegularClass): IrClass {
|
||||||
val irClassSymbol = classifierStorage.getIrClassSymbol(firClass.symbol)
|
val irClassSymbol = classifierStorage.getOrCreateIrClass(firClass.symbol).symbol
|
||||||
return getDeclaration(irClassSymbol) as IrClass
|
return getDeclaration(irClassSymbol) as IrClass
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,9 +164,7 @@ class FirIrProvider(val components: Fir2IrComponents) : IrProvider {
|
|||||||
|
|
||||||
return when (kind) {
|
return when (kind) {
|
||||||
SymbolKind.CLASS_SYMBOL -> {
|
SymbolKind.CLASS_SYMBOL -> {
|
||||||
// TODO: effectively call getIrClassSymbol should be replaced with getOrCreateClass (KT-61348)
|
classifierStorage.getOrCreateIrClass((firDeclaration as FirRegularClass).symbol)
|
||||||
@OptIn(IrSymbolInternals::class)
|
|
||||||
classifierStorage.getIrClassSymbol((firDeclaration as FirRegularClass).symbol).owner
|
|
||||||
}
|
}
|
||||||
SymbolKind.ENUM_ENTRY_SYMBOL -> classifierStorage.getIrEnumEntry(
|
SymbolKind.ENUM_ENTRY_SYMBOL -> classifierStorage.getIrEnumEntry(
|
||||||
firDeclaration as FirEnumEntry, parent as IrClass
|
firDeclaration as FirEnumEntry, parent as IrClass
|
||||||
|
|||||||
@@ -561,7 +561,7 @@ class IrBuiltInsOverFir(
|
|||||||
|
|
||||||
private fun loadClassSafe(classId: ClassId): IrClassSymbol? {
|
private fun loadClassSafe(classId: ClassId): IrClassSymbol? {
|
||||||
val firClassSymbol = symbolProvider.getClassLikeSymbolByClassId(classId) as? FirRegularClassSymbol ?: return null
|
val firClassSymbol = symbolProvider.getClassLikeSymbolByClassId(classId) as? FirRegularClassSymbol ?: return null
|
||||||
return components.classifierStorage.getIrClassSymbol(firClassSymbol)
|
return components.classifierStorage.getOrCreateIrClass(firClassSymbol).symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(IrSymbolInternals::class)
|
@OptIn(IrSymbolInternals::class)
|
||||||
|
|||||||
+1
-1
@@ -283,7 +283,7 @@ class CallAndReferenceGenerator(
|
|||||||
val coneSuperType = superTypeRef.coneTypeSafe<ConeClassLikeType>() ?: return null
|
val coneSuperType = superTypeRef.coneTypeSafe<ConeClassLikeType>() ?: return null
|
||||||
val firClassSymbol = coneSuperType.fullyExpandedType(session).lookupTag.toSymbol(session) as? FirClassSymbol<*>
|
val firClassSymbol = coneSuperType.fullyExpandedType(session).lookupTag.toSymbol(session) as? FirClassSymbol<*>
|
||||||
if (firClassSymbol != null) {
|
if (firClassSymbol != null) {
|
||||||
return classifierStorage.getIrClassSymbol(firClassSymbol)
|
return classifierStorage.getOrCreateIrClass(firClassSymbol).symbol
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-8
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.*
|
|||||||
import org.jetbrains.kotlin.fir.backend.*
|
import org.jetbrains.kotlin.fir.backend.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
import org.jetbrains.kotlin.fir.scopes.*
|
import org.jetbrains.kotlin.fir.scopes.*
|
||||||
@@ -427,7 +426,7 @@ class FakeOverrideGenerator(
|
|||||||
overridden.containingClassLookupTag()?.toSymbol(session)?.fir as? FirClass ?: return emptyList()
|
overridden.containingClassLookupTag()?.toSymbol(session)?.fir as? FirClass ?: return emptyList()
|
||||||
|
|
||||||
val overriddenContainingIrClass =
|
val overriddenContainingIrClass =
|
||||||
declarationStorage.classifierStorage.getIrClassSymbol(overriddenContainingClass.symbol).owner as? IrClass
|
declarationStorage.classifierStorage.getOrCreateIrClass(overriddenContainingClass.symbol).symbol.owner as? IrClass
|
||||||
?: return emptyList()
|
?: return emptyList()
|
||||||
|
|
||||||
return superClasses.mapNotNull { superClass ->
|
return superClasses.mapNotNull { superClass ->
|
||||||
@@ -513,7 +512,7 @@ internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirC
|
|||||||
val scope = containingClass.unsubstitutedScope()
|
val scope = containingClass.unsubstitutedScope()
|
||||||
scope.processPropertiesByName(name) {}
|
scope.processPropertiesByName(name) {}
|
||||||
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
|
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
|
||||||
val superClasses = containingClass.getSuperTypesAsIrClasses() ?: return emptyList()
|
val superClasses = containingClass.getSuperTypesAsIrClasses()
|
||||||
|
|
||||||
scope.processOverriddenPropertiesFromSuperClasses(symbol, containingClass) { overriddenSymbol ->
|
scope.processOverriddenPropertiesFromSuperClasses(symbol, containingClass) { overriddenSymbol ->
|
||||||
if (!session.visibilityChecker.isVisibleForOverriding(
|
if (!session.visibilityChecker.isVisibleForOverriding(
|
||||||
@@ -539,7 +538,7 @@ internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirC
|
|||||||
|
|
||||||
context(Fir2IrComponents)
|
context(Fir2IrComponents)
|
||||||
internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirClass): List<IrPropertySymbol> {
|
internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirClass): List<IrPropertySymbol> {
|
||||||
val superClasses = containingClass.getSuperTypesAsIrClasses() ?: return emptyList()
|
val superClasses = containingClass.getSuperTypesAsIrClasses()
|
||||||
val overriddenSet = mutableSetOf<IrPropertySymbol>()
|
val overriddenSet = mutableSetOf<IrPropertySymbol>()
|
||||||
|
|
||||||
processOverriddenPropertySymbols(containingClass) {
|
processOverriddenPropertySymbols(containingClass) {
|
||||||
@@ -554,7 +553,7 @@ internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirC
|
|||||||
|
|
||||||
context(Fir2IrComponents)
|
context(Fir2IrComponents)
|
||||||
internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(containingClass: FirClass): List<IrSimpleFunctionSymbol> {
|
internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(containingClass: FirClass): List<IrSimpleFunctionSymbol> {
|
||||||
val superClasses = containingClass.getSuperTypesAsIrClasses() ?: return emptyList()
|
val superClasses = containingClass.getSuperTypesAsIrClasses()
|
||||||
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
|
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
|
||||||
|
|
||||||
processOverriddenFunctionSymbols(containingClass) {
|
processOverriddenFunctionSymbols(containingClass) {
|
||||||
@@ -569,9 +568,8 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(containingClass
|
|||||||
|
|
||||||
context(Fir2IrComponents)
|
context(Fir2IrComponents)
|
||||||
@OptIn(IrSymbolInternals::class)
|
@OptIn(IrSymbolInternals::class)
|
||||||
private fun FirClass.getSuperTypesAsIrClasses(): Set<IrClass>? {
|
private fun FirClass.getSuperTypesAsIrClasses(): Set<IrClass> {
|
||||||
val irClass =
|
val irClass = declarationStorage.classifierStorage.getOrCreateIrClass(symbol)
|
||||||
declarationStorage.classifierStorage.getIrClassSymbol(symbol).owner as? IrClass ?: return null
|
|
||||||
|
|
||||||
return irClass.superTypes.mapNotNull { it.classifierOrNull?.owner as? IrClass }.toSet()
|
return irClass.superTypes.mapNotNull { it.classifierOrNull?.owner as? IrClass }.toSet()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ class Fir2IrLazyClass(
|
|||||||
scope.processClassifiersByName(name) {
|
scope.processClassifiersByName(name) {
|
||||||
val declaration = it.fir as? FirRegularClass ?: return@processClassifiersByName
|
val declaration = it.fir as? FirRegularClass ?: return@processClassifiersByName
|
||||||
if (declaration.classId.outerClassId == fir.classId && shouldBuildStub(declaration)) {
|
if (declaration.classId.outerClassId == fir.classId && shouldBuildStub(declaration)) {
|
||||||
val nestedSymbol = classifierStorage.getIrClassSymbol(declaration.symbol)
|
val nestedSymbol = classifierStorage.getOrCreateIrClass(declaration.symbol).symbol
|
||||||
result += nestedSymbol.owner
|
result += nestedSymbol.owner
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user