[FIR2IR] Use specific symbols for class declarations
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user