[FIR2IR] Use specific symbols for class declarations

This commit is contained in:
Mikhail Glukhikh
2020-06-01 11:12:12 +03:00
parent 85801ea62c
commit de2980e9e5
3 changed files with 26 additions and 11 deletions
@@ -25,6 +25,7 @@ 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.symbols.AccessorSymbol
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.ir.IrElement
@@ -302,9 +303,10 @@ internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes(
visited: MutableSet<IrClass> = mutableSetOf()
): List<IrSymbol> {
for (superType in superTypes) {
val superTypeClass = superType.classOrNull
if (superTypeClass is IrClassSymbolImpl || superTypeClass is IrClassPublicSymbolImpl) {
superTypeClass.owner.findMatchingOverriddenSymbolsFromThisAndSupertypes(irBuiltIns, target, result, visited)
when (val superTypeClass = superType.classOrNull) {
is IrClassSymbolImpl, is IrClassPublicSymbolImpl, is Fir2IrClassSymbol -> {
superTypeClass.owner.findMatchingOverriddenSymbolsFromThisAndSupertypes(irBuiltIns, target, result, visited)
}
}
}
return result
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
@@ -159,15 +160,15 @@ class Fir2IrClassifierStorage(
parent: IrDeclarationParent? = null,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
): IrClass {
val descriptor = WrappedClassDescriptor()
val visibility = regularClass.visibility
val modality = if (regularClass.classKind == ClassKind.ENUM_CLASS) {
regularClass.enumClassModality()
} else {
regularClass.modality ?: Modality.FINAL
}
val signature = signatureComposer.composeSignature(regularClass)
val irClass = regularClass.convertWithOffsets { startOffset, endOffset ->
symbolTable.declareClass(descriptor) { symbol ->
symbolTable.declareClass(signature, { Fir2IrClassSymbol(signature) }) { symbol ->
IrClassImpl(
startOffset,
endOffset,
@@ -185,8 +186,8 @@ class Fir2IrClassifierStorage(
isExpect = regularClass.isExpect,
isFun = regularClass.isFun
).apply {
metadata = FirMetadataSource.Class(regularClass, descriptor)
descriptor.bind(this)
val descriptor = symbol.descriptor
metadata = FirMetadataSource.Class(regularClass, descriptor as WrappedClassDescriptor)
}
}
}
@@ -207,19 +208,19 @@ class Fir2IrClassifierStorage(
name: Name = Name.special("<no name provided>"),
irParent: IrDeclarationParent? = null
): IrClass {
val descriptor = WrappedClassDescriptor()
val origin = IrDeclarationOrigin.DEFINED
val modality = Modality.FINAL
val signature = signatureComposer.composeSignature(anonymousObject)
val result = anonymousObject.convertWithOffsets { startOffset, endOffset ->
symbolTable.declareClass(descriptor) { symbol ->
symbolTable.declareClass(signature, { Fir2IrClassSymbol(signature) }) { symbol ->
IrClassImpl(
startOffset, endOffset, origin, symbol, name,
// NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects
anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS,
visibility, modality
).apply {
metadata = FirMetadataSource.Class(anonymousObject, descriptor)
descriptor.bind(this)
val descriptor = symbol.descriptor
metadata = FirMetadataSource.Class(anonymousObject, descriptor as WrappedClassDescriptor)
setThisReceiver(anonymousObject.typeParameters)
if (irParent != null) {
this.parent = irParent
@@ -398,6 +398,18 @@ open class SymbolTable(
)
}
fun declareClass(
sig: IdSignature,
symbolFactory: () -> IrClassSymbol,
classFactory: (IrClassSymbol) -> IrClass
): IrClass {
return classSymbolTable.declare(
sig,
symbolFactory,
classFactory
)
}
fun declareClassIfNotExists(descriptor: ClassDescriptor, classFactory: (IrClassSymbol) -> IrClass): IrClass {
return classSymbolTable.declareIfNotExists(descriptor, { createClassSymbol(descriptor) }, classFactory)
}