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