[FIR2IR] Remove or approve some of left usages of IrSymbol.owner

This commit is contained in:
Dmitriy Novozhilov
2023-08-31 11:20:37 +03:00
committed by Space Team
parent 8fb7ea1126
commit 58e8dfc23b
5 changed files with 20 additions and 14 deletions
@@ -150,7 +150,7 @@ fun FirClassifierSymbol<*>.toSymbol(
val coneClassLikeType = fir.expandedTypeRef.coneType as ConeClassLikeType
coneClassLikeType.lookupTag.toSymbol(session)
?.toSymbol(typeOrigin, handleAnnotations)
?: classifiersGenerator.createIrClassSymbolForNotFoundClass(coneClassLikeType.lookupTag)
?: classifiersGenerator.createIrClassForNotFoundClass(coneClassLikeType.lookupTag).symbol
}
is FirClassSymbol -> {
@@ -198,14 +198,13 @@ class Fir2IrClassifierStorage(
}
}
@OptIn(IrSymbolInternals::class)
fun findIrClass(lookupTag: ConeClassLikeLookupTag): IrClass? {
return if (lookupTag.classId.isLocal) {
getCachedLocalClass(lookupTag)
} else {
val firSymbol = lookupTag.toSymbol(session)
if (firSymbol is FirClassSymbol) {
getIrClassSymbol(firSymbol).owner
getOrCreateIrClass(firSymbol)
} else {
null
}
@@ -217,10 +216,14 @@ class Fir2IrClassifierStorage(
}
fun getIrClassSymbol(firClassSymbol: FirClassSymbol<*>): IrClassSymbol {
return getOrCreateIrClass(firClassSymbol).symbol
}
private fun getOrCreateIrClass(firClassSymbol: FirClassSymbol<*>): IrClass {
val firClass = firClassSymbol.fir
classifierStorage.getCachedIrClass(firClass)?.let { return it.symbol }
classifierStorage.getCachedIrClass(firClass)?.let { return it }
if (firClass is FirAnonymousObject || firClass is FirRegularClass && firClass.visibility == Visibilities.Local) {
return createAndCacheLocalIrClassOnTheFly(firClass).symbol
return createAndCacheLocalIrClassOnTheFly(firClass)
}
firClass as FirRegularClass
val classId = firClassSymbol.classId
@@ -229,14 +232,15 @@ class Fir2IrClassifierStorage(
val irParent = declarationStorage.findIrParent(classId.packageFqName, parentClass?.toLookupTag(), firClassSymbol, firClass.origin)!!
// firClass may be referenced by some parent's type parameters as a bound. In that case, getIrClassSymbol will be called recursively.
classifierStorage.getCachedIrClass(firClass)?.let { return it.symbol }
classifierStorage.getCachedIrClass(firClass)?.let { return it }
val irClass = lazyDeclarationsGenerator.createIrLazyClass(firClass, irParent)
classCache[firClass] = irClass
// NB: this is needed to prevent recursions in case of self bounds
(irClass as Fir2IrLazyClass).prepareTypeParameters()
return irClass.symbol
return irClass
}
fun getFieldsWithContextReceiversForClass(irClass: IrClass, klass: FirClass): List<IrField> {
@@ -84,12 +84,14 @@ class Fir2IrConversionScope(val configuration: Fir2IrConfiguration) {
error("Accessor of property ${property.render()} not found on parent stack")
}
@OptIn(IrSymbolInternals::class)
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
inline fun <reified D : IrDeclaration> findDeclarationInParentsStack(symbol: IrSymbol): @kotlin.internal.NoInfer D {
// This is an unsafe fast path for production
if (!AbstractTypeChecker.RUN_SLOW_ASSERTIONS) {
@OptIn(IrSymbolInternals::class)
return symbol.owner as D
}
// With slow assertions the following code guarantees that taking owner from symbol is safe
for (parent in parentStack.asReversed()) {
if ((parent as? IrDeclaration)?.symbol == symbol) {
return parent as D
@@ -100,6 +102,7 @@ class Fir2IrConversionScope(val configuration: Fir2IrConfiguration) {
* for which we have Fir2IrLazyClass in symbol
*/
if (configuration.allowNonCachedDeclarations) {
@OptIn(IrSymbolInternals::class)
return symbol.owner as D
}
error("Declaration with symbol $symbol is not found in parents stack")
@@ -124,7 +124,7 @@ class Fir2IrTypeConverter(
?: lookupTag.toSymbol(session)?.toSymbol(typeOrigin) {
typeAnnotations += with(annotationGenerator) { it.toIrAnnotations() }
}
?: (lookupTag as? ConeClassLikeLookupTag)?.let(classifiersGenerator::createIrClassSymbolForNotFoundClass)
?: (lookupTag as? ConeClassLikeLookupTag)?.let(classifiersGenerator::createIrClassForNotFoundClass)?.symbol
?: return createErrorType()
when {
@@ -456,8 +456,7 @@ class Fir2IrClassifiersGenerator(val components: Fir2IrComponents) : Fir2IrCompo
}
}
@OptIn(IrSymbolInternals::class)
fun createIrClassSymbolForNotFoundClass(classLikeLookupTag: ConeClassLikeLookupTag): IrClassSymbol {
fun createIrClassForNotFoundClass(classLikeLookupTag: ConeClassLikeLookupTag): IrClass {
val classId = classLikeLookupTag.classId
val signature = IdSignature.CommonSignature(
packageFqName = classId.packageFqName.asString(),
@@ -468,10 +467,10 @@ class Fir2IrClassifiersGenerator(val components: Fir2IrComponents) : Fir2IrCompo
)
val parentId = classId.outerClassId
val parentClass = parentId?.let { createIrClassSymbolForNotFoundClass(it.toLookupTag()) }
val irParent = parentClass?.owner ?: declarationStorage.getIrExternalPackageFragment(classId.packageFqName)
val parentClass = parentId?.let { createIrClassForNotFoundClass(it.toLookupTag()) }
val irParent = parentClass ?: declarationStorage.getIrExternalPackageFragment(classId.packageFqName)
return symbolTable.referenceClass(signature, { IrClassPublicSymbolImpl(signature) }) {
return symbolTable.declareClassIfNotExists(signature, { IrClassPublicSymbolImpl(signature) }) {
irFactory.createClass(
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,