IR: removing WrappedDescriptors from symbols
This commit is contained in:
+7
-9
@@ -21,8 +21,6 @@ import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
|
||||
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
|
||||
import org.jetbrains.kotlin.ir.overrides.FakeOverrideBuilderStrategy
|
||||
import org.jetbrains.kotlin.ir.overrides.IrOverridingUtil
|
||||
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||
@@ -113,7 +111,7 @@ class FakeOverrideBuilder(
|
||||
// But to create and link that symbol we should already have the signature computed.
|
||||
// To break this loop we use temp symbol in correspondingProperty.
|
||||
|
||||
val tempSymbol = IrPropertySymbolImpl(WrappedPropertyDescriptor()).also {
|
||||
val tempSymbol = IrPropertySymbolImpl().also {
|
||||
it.bind(declaration as IrProperty)
|
||||
}
|
||||
declaration.getter?.let {
|
||||
@@ -142,9 +140,9 @@ class FakeOverrideBuilder(
|
||||
private fun declareFunctionFakeOverride(declaration: IrFakeOverrideFunction, signature: IdSignature) {
|
||||
val parent = declaration.parentAsClass
|
||||
val symbol = linker.tryReferencingSimpleFunctionByLocalSignature(parent, signature)
|
||||
val descriptor = symbol?.descriptor ?: WrappedSimpleFunctionDescriptor()
|
||||
symbolTable.declareSimpleFunctionFromLinker(descriptor, signature) {
|
||||
assert(it === symbol || symbol == null)
|
||||
?: symbolTable.referenceSimpleFunctionFromLinker(signature)
|
||||
symbolTable.declareSimpleFunction(signature, { symbol }) {
|
||||
assert(it === symbol)
|
||||
declaration.acquireSymbol(it)
|
||||
}
|
||||
}
|
||||
@@ -152,9 +150,9 @@ class FakeOverrideBuilder(
|
||||
private fun declarePropertyFakeOverride(declaration: IrFakeOverrideProperty, signature: IdSignature) {
|
||||
val parent = declaration.parentAsClass
|
||||
val symbol = linker.tryReferencingPropertyByLocalSignature(parent, signature)
|
||||
val descriptor = symbol?.descriptor ?: WrappedPropertyDescriptor()
|
||||
symbolTable.declarePropertyFromLinker(descriptor, signature) {
|
||||
assert(it === symbol || symbol == null)
|
||||
?: symbolTable.referencePropertyFromLinker(signature)
|
||||
symbolTable.declareProperty(signature, { symbol }) {
|
||||
assert(it === symbol)
|
||||
declaration.acquireSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
+16
-27
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrPublicSymbolBase
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl
|
||||
import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.types.impl.*
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
@@ -1009,21 +1010,17 @@ abstract class IrFileDeserializer(
|
||||
val result = symbolTable.run {
|
||||
if (isGlobal) {
|
||||
val p = deserializeIrSymbolToDeclare(proto.base.symbol)
|
||||
val symbol = p.first
|
||||
val symbol = p.first as IrTypeParameterSymbol
|
||||
sig = p.second
|
||||
val descriptor = (symbol as IrTypeParameterSymbol).descriptor
|
||||
declareGlobalTypeParameterFromLinker(descriptor, sig, factory)
|
||||
declareGlobalTypeParameter(sig, { symbol }, factory)
|
||||
} else {
|
||||
val symbolData = BinarySymbolData
|
||||
.decode(proto.base.symbol)
|
||||
sig = deserializeIdSignature(symbolData.signatureId)
|
||||
val descriptor = WrappedTypeParameterDescriptor()
|
||||
declareScopedTypeParameterFromLinker(descriptor, sig, factory)
|
||||
declareScopedTypeParameter(sig, { IrTypeParameterSymbolImpl() }, factory)
|
||||
}
|
||||
}
|
||||
|
||||
(result.descriptor as? WrappedTypeParameterDescriptor)?.bind(result)
|
||||
|
||||
// make sure this symbol is known to linker
|
||||
referenceIrSymbol(result.symbol, sig)
|
||||
result.annotations += deserializeAnnotations(proto.base.annotationList)
|
||||
@@ -1059,7 +1056,7 @@ abstract class IrFileDeserializer(
|
||||
withDeserializedIrDeclarationBase(proto.base) { symbol, signature, startOffset, endOffset, origin, fcode ->
|
||||
val flags = ClassFlags.decode(fcode)
|
||||
|
||||
symbolTable.declareClassFromLinker((symbol as IrClassSymbol).descriptor, signature) {
|
||||
symbolTable.declareClass(signature, { symbol as IrClassSymbol }) {
|
||||
irFactory.createClass(
|
||||
startOffset, endOffset, origin,
|
||||
it,
|
||||
@@ -1086,15 +1083,14 @@ abstract class IrFileDeserializer(
|
||||
|
||||
thisReceiver = deserializeIrValueParameter(proto.thisReceiver, -1)
|
||||
|
||||
(descriptor as? WrappedClassDescriptor)?.bind(this)
|
||||
|
||||
fakeOverrideBuilder.enqueueClass(this, signature)
|
||||
}
|
||||
}
|
||||
|
||||
private fun deserializeIrTypeAlias(proto: ProtoTypeAlias): IrTypeAlias =
|
||||
withDeserializedIrDeclarationBase(proto.base) { symbol, uniqId, startOffset, endOffset, origin, fcode ->
|
||||
symbolTable.declareTypeAliasFromLinker((symbol as IrTypeAliasSymbol).descriptor, uniqId) {
|
||||
require(symbol is IrTypeAliasSymbol)
|
||||
symbolTable.declareTypeAlias(uniqId, { symbol }) {
|
||||
val flags = TypeAliasFlags.decode(fcode)
|
||||
val nameType = BinaryNameAndType.decode(proto.nameType)
|
||||
irFactory.createTypeAlias(
|
||||
@@ -1108,8 +1104,6 @@ abstract class IrFileDeserializer(
|
||||
)
|
||||
}.usingParent {
|
||||
typeParameters = deserializeTypeParameters(proto.typeParameterList, true)
|
||||
|
||||
(descriptor as? WrappedTypeAliasDescriptor)?.bind(this)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1204,7 +1198,7 @@ abstract class IrFileDeserializer(
|
||||
proto: ProtoFunctionBase,
|
||||
block: (IrFunctionSymbol, IdSignature, Int, Int, IrDeclarationOrigin, Long) -> T
|
||||
): T = withDeserializedIrDeclarationBase(proto.base) { symbol, idSig, startOffset, endOffset, origin, fcode ->
|
||||
symbolTable.withScope(symbol.descriptor) {
|
||||
symbolTable.withScope(symbol) {
|
||||
block(symbol as IrFunctionSymbol, idSig, startOffset, endOffset, origin, fcode).usingParent {
|
||||
typeParameters = deserializeTypeParameters(proto.typeParameterList, false)
|
||||
val nameType = BinaryNameAndType.decode(proto.nameType)
|
||||
@@ -1227,7 +1221,7 @@ abstract class IrFileDeserializer(
|
||||
private fun deserializeIrFunction(proto: ProtoFunction): IrSimpleFunction {
|
||||
return withDeserializedIrFunctionBase(proto.base) { symbol, idSig, startOffset, endOffset, origin, fcode ->
|
||||
val flags = FunctionFlags.decode(fcode)
|
||||
symbolTable.declareSimpleFunctionFromLinker(symbol.descriptor, idSig) {
|
||||
symbolTable.declareSimpleFunction(idSig, { symbol as IrSimpleFunctionSymbol }) {
|
||||
val nameType = BinaryNameAndType.decode(proto.base.nameType)
|
||||
irFactory.createFunction(
|
||||
startOffset, endOffset, origin,
|
||||
@@ -1275,15 +1269,13 @@ abstract class IrFileDeserializer(
|
||||
|
||||
private fun deserializeIrEnumEntry(proto: ProtoEnumEntry): IrEnumEntry =
|
||||
withDeserializedIrDeclarationBase(proto.base) { symbol, uniqId, startOffset, endOffset, origin, _ ->
|
||||
symbolTable.declareEnumEntryFromLinker((symbol as IrEnumEntrySymbol).descriptor, uniqId) {
|
||||
symbolTable.declareEnumEntry(uniqId, { symbol as IrEnumEntrySymbol }) {
|
||||
irFactory.createEnumEntry(startOffset, endOffset, origin, it, deserializeName(proto.name))
|
||||
}.apply {
|
||||
if (proto.hasCorrespondingClass())
|
||||
correspondingClass = deserializeIrClass(proto.correspondingClass)
|
||||
if (proto.hasInitializer())
|
||||
initializerExpression = irFactory.createExpressionBody(deserializeExpressionBody(proto.initializer))
|
||||
|
||||
(descriptor as? WrappedEnumEntryDescriptor)?.bind(this)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1292,16 +1284,15 @@ abstract class IrFileDeserializer(
|
||||
irFactory.createAnonymousInitializer(startOffset, endOffset, origin, symbol as IrAnonymousInitializerSymbol).apply {
|
||||
// body = deserializeBlockBody(proto.body.blockBody, startOffset, endOffset)
|
||||
body = deserializeStatementBody(proto.body) as IrBlockBody
|
||||
|
||||
(descriptor as? WrappedClassDescriptor)?.bind(parentsStack.peek() as IrClass)
|
||||
}
|
||||
}
|
||||
|
||||
private fun deserializeIrConstructor(proto: ProtoConstructor): IrConstructor =
|
||||
withDeserializedIrFunctionBase(proto.base) { symbol, idSig, startOffset, endOffset, origin, fcode ->
|
||||
require(symbol is IrConstructorSymbol)
|
||||
val flags = FunctionFlags.decode(fcode)
|
||||
val nameType = BinaryNameAndType.decode(proto.base.nameType)
|
||||
symbolTable.declareConstructorFromLinker((symbol as IrConstructorSymbol).descriptor, idSig) {
|
||||
symbolTable.declareConstructor(idSig, { symbol }) {
|
||||
irFactory.createConstructor(
|
||||
startOffset, endOffset, origin,
|
||||
it,
|
||||
@@ -1313,8 +1304,6 @@ abstract class IrFileDeserializer(
|
||||
flags.isPrimary,
|
||||
flags.isExpect
|
||||
)
|
||||
}.apply {
|
||||
(descriptor as? WrappedClassConstructorDescriptor)?.bind(this)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1322,10 +1311,11 @@ abstract class IrFileDeserializer(
|
||||
|
||||
private fun deserializeIrField(proto: ProtoField): IrField =
|
||||
withDeserializedIrDeclarationBase(proto.base) { symbol, uniqId, startOffset, endOffset, origin, fcode ->
|
||||
require(symbol is IrFieldSymbol)
|
||||
val nameType = BinaryNameAndType.decode(proto.nameType)
|
||||
val type = deserializeIrType(nameType.typeIndex)
|
||||
val flags = FieldFlags.decode(fcode)
|
||||
symbolTable.declareFieldFromLinker((symbol as IrFieldSymbol).descriptor, uniqId) {
|
||||
symbolTable.declareField(uniqId, { symbol }) {
|
||||
irFactory.createField(
|
||||
startOffset, endOffset, origin,
|
||||
it,
|
||||
@@ -1342,8 +1332,6 @@ abstract class IrFileDeserializer(
|
||||
initializer = irFactory.createExpressionBody(deserializeExpressionBody(proto.initializer))
|
||||
}
|
||||
}
|
||||
|
||||
(descriptor as? WrappedFieldDescriptor)?.bind(this)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1369,8 +1357,9 @@ abstract class IrFileDeserializer(
|
||||
|
||||
private fun deserializeIrProperty(proto: ProtoProperty): IrProperty =
|
||||
withDeserializedIrDeclarationBase(proto.base) { symbol, uniqId, startOffset, endOffset, origin, fcode ->
|
||||
require(symbol is IrPropertySymbol)
|
||||
val flags = PropertyFlags.decode(fcode)
|
||||
symbolTable.declarePropertyFromLinker((symbol as IrPropertySymbol).descriptor, uniqId) {
|
||||
symbolTable.declareProperty(uniqId, { symbol }) {
|
||||
irFactory.createProperty(
|
||||
startOffset, endOffset, origin,
|
||||
it,
|
||||
|
||||
+16
-14
@@ -502,21 +502,21 @@ abstract class KotlinIrLinker(
|
||||
|
||||
private fun referenceDeserializedSymbol(symbolKind: BinarySymbolData.SymbolKind, idSig: IdSignature): IrSymbol = symbolTable.run {
|
||||
when (symbolKind) {
|
||||
BinarySymbolData.SymbolKind.ANONYMOUS_INIT_SYMBOL -> IrAnonymousInitializerSymbolImpl(WrappedClassDescriptor())
|
||||
BinarySymbolData.SymbolKind.CLASS_SYMBOL -> referenceClassFromLinker(WrappedClassDescriptor(), idSig)
|
||||
BinarySymbolData.SymbolKind.CONSTRUCTOR_SYMBOL -> referenceConstructorFromLinker(WrappedClassConstructorDescriptor(), idSig)
|
||||
BinarySymbolData.SymbolKind.TYPE_PARAMETER_SYMBOL -> referenceTypeParameterFromLinker(WrappedTypeParameterDescriptor(), idSig)
|
||||
BinarySymbolData.SymbolKind.ENUM_ENTRY_SYMBOL -> referenceEnumEntryFromLinker(WrappedEnumEntryDescriptor(), idSig)
|
||||
BinarySymbolData.SymbolKind.STANDALONE_FIELD_SYMBOL -> referenceFieldFromLinker(WrappedFieldDescriptor(), idSig)
|
||||
BinarySymbolData.SymbolKind.FIELD_SYMBOL -> referenceFieldFromLinker(WrappedPropertyDescriptor(), idSig)
|
||||
BinarySymbolData.SymbolKind.FUNCTION_SYMBOL -> referenceSimpleFunctionFromLinker(WrappedSimpleFunctionDescriptor(), idSig)
|
||||
BinarySymbolData.SymbolKind.TYPEALIAS_SYMBOL -> referenceTypeAliasFromLinker(WrappedTypeAliasDescriptor(), idSig)
|
||||
BinarySymbolData.SymbolKind.PROPERTY_SYMBOL -> referencePropertyFromLinker(WrappedPropertyDescriptor(), idSig)
|
||||
BinarySymbolData.SymbolKind.VARIABLE_SYMBOL -> IrVariableSymbolImpl(WrappedVariableDescriptor())
|
||||
BinarySymbolData.SymbolKind.VALUE_PARAMETER_SYMBOL -> IrValueParameterSymbolImpl(WrappedValueParameterDescriptor())
|
||||
BinarySymbolData.SymbolKind.RECEIVER_PARAMETER_SYMBOL -> IrValueParameterSymbolImpl(WrappedReceiverParameterDescriptor())
|
||||
BinarySymbolData.SymbolKind.ANONYMOUS_INIT_SYMBOL -> IrAnonymousInitializerSymbolImpl()
|
||||
BinarySymbolData.SymbolKind.CLASS_SYMBOL -> referenceClassFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.CONSTRUCTOR_SYMBOL -> referenceConstructorFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.TYPE_PARAMETER_SYMBOL -> referenceTypeParameterFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.ENUM_ENTRY_SYMBOL -> referenceEnumEntryFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.STANDALONE_FIELD_SYMBOL -> referenceFieldFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.FIELD_SYMBOL -> referenceFieldFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.FUNCTION_SYMBOL -> referenceSimpleFunctionFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.TYPEALIAS_SYMBOL -> referenceTypeAliasFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.PROPERTY_SYMBOL -> referencePropertyFromLinker(idSig)
|
||||
BinarySymbolData.SymbolKind.VARIABLE_SYMBOL -> IrVariableSymbolImpl()
|
||||
BinarySymbolData.SymbolKind.VALUE_PARAMETER_SYMBOL -> IrValueParameterSymbolImpl()
|
||||
BinarySymbolData.SymbolKind.RECEIVER_PARAMETER_SYMBOL -> IrValueParameterSymbolImpl()
|
||||
BinarySymbolData.SymbolKind.LOCAL_DELEGATED_PROPERTY_SYMBOL ->
|
||||
IrLocalDelegatedPropertySymbolImpl(WrappedVariableDescriptorWithAccessor())
|
||||
IrLocalDelegatedPropertySymbolImpl()
|
||||
else -> error("Unexpected classifier symbol kind: $symbolKind for signature $idSig")
|
||||
}
|
||||
}
|
||||
@@ -553,6 +553,8 @@ abstract class KotlinIrLinker(
|
||||
protected open fun platformSpecificSymbol(symbol: IrSymbol): Boolean = false
|
||||
|
||||
private fun tryResolveCustomDeclaration(symbol: IrSymbol): IrDeclaration? {
|
||||
if (!symbol.hasDescriptor) return null
|
||||
|
||||
val descriptor = symbol.descriptor
|
||||
|
||||
if (descriptor is WrappedDeclarationDescriptor<*>) return null
|
||||
|
||||
Reference in New Issue
Block a user