diff --git a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt index c29a93cd146..b500946fe51 100644 --- a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt +++ b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.jvm import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor import org.jetbrains.kotlin.backend.common.ir.createParameterDeclarations +import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer import org.jetbrains.kotlin.backend.jvm.lower.SingletonObjectJvmStaticTransformer import org.jetbrains.kotlin.backend.jvm.serialization.deserializeClassFromByteArray import org.jetbrains.kotlin.backend.jvm.serialization.deserializeIrFileFromByteArray @@ -15,6 +16,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.FilteredAnnotations import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI +import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.ir.builders.declarations.addConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildClass import org.jetbrains.kotlin.ir.declarations.* @@ -184,6 +186,8 @@ open class JvmGeneratorExtensionsImpl(private val generateFacades: Boolean = tru private val kotlinJvmInternalPackage = IrExternalPackageFragmentImpl(DescriptorlessExternalPackageFragmentSymbol(), JvmAnnotationNames.KOTLIN_JVM_INTERNAL) + private val specialAnnotationConstructors = mutableListOf() + private fun createSpecialAnnotationClass(fqn: FqName, parent: IrPackageFragment) = IrFactoryImpl.buildClass { kind = ClassKind.ANNOTATION_CLASS @@ -193,6 +197,8 @@ open class JvmGeneratorExtensionsImpl(private val generateFacades: Boolean = tru this.parent = parent addConstructor { isPrimary = true + }.also { constructor -> + specialAnnotationConstructors.add(constructor) } } @@ -218,6 +224,14 @@ open class JvmGeneratorExtensionsImpl(private val generateFacades: Boolean = tru ) } + override fun registerDeclarations(symbolTable: SymbolTable) { + val signatureComputer = IdSignatureSerializer(JvmIrMangler) + specialAnnotationConstructors.forEach { constructor -> + symbolTable.declareConstructorWithSignature(signatureComputer.composePublicIdSignature(constructor), constructor.symbol) + } + super.registerDeclarations(symbolTable) + } + override val shouldPreventDeprecatedIntegerValueTypeLiteralConversion: Boolean get() = true diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 91a6d3a7471..004b029ec49 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -47,6 +47,10 @@ abstract class DeclarationStubGenerator( ) : IrProvider { protected val lazyTable = symbolTable.lazyWrapper + init { + extensions.registerDeclarations(symbolTable) + } + val lock: IrLock get() = symbolTable.lock diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/StubGeneratorExtensions.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/StubGeneratorExtensions.kt index 2d30f49d4fa..4db269daba4 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/StubGeneratorExtensions.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/StubGeneratorExtensions.kt @@ -69,6 +69,8 @@ open class StubGeneratorExtensions { open val rawTypeAnnotationConstructor: IrConstructor? get() = null + open fun registerDeclarations(symbolTable: SymbolTable) {} + companion object { @JvmField val EMPTY = StubGeneratorExtensions() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index db3df47cdd1..d333aa851df 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -77,6 +77,7 @@ class SymbolTable( abstract fun get(d: D): S? abstract fun set(s: S) abstract fun get(sig: IdSignature): S? + abstract fun set(sig: IdSignature, s: S) inline fun declare(d: D, createSymbol: () -> S, createOwner: (S) -> B): B { synchronized(lock) { @@ -217,6 +218,10 @@ class SymbolTable( } override fun get(sig: IdSignature): S? = idSigToSymbol[sig] + + override fun set(sig: IdSignature, s: S) { + idSigToSymbol[sig] = s + } } private inner class EnumEntrySymbolTable : FlatSymbolTable() { @@ -265,6 +270,10 @@ class SymbolTable( operator fun get(sig: IdSignature): S? = idSigToSymbol[sig] ?: parent?.get(sig) + operator fun set(sig: IdSignature, s: S) { + idSigToSymbol[sig] = s + } + fun dumpTo(stringBuilder: StringBuilder): StringBuilder = stringBuilder.also { it.append("owner=") @@ -296,6 +305,11 @@ class SymbolTable( return scope[sig] } + override fun set(sig: IdSignature, s: S) { + val scope = currentScope ?: throw AssertionError("No active scope") + scope[sig] = s + } + inline fun declareLocal(d: D, createSymbol: () -> S, createOwner: (S) -> B): B { val scope = currentScope ?: throw AssertionError("No active scope") val symbol = scope.getLocal(d) ?: createSymbol().also { scope[d] = it } @@ -514,6 +528,10 @@ class SymbolTable( constructorFactory ) + fun declareConstructorWithSignature(sig: IdSignature, symbol: IrConstructorSymbol) { + constructorSymbolTable.set(sig, symbol) + } + override fun referenceConstructor(descriptor: ClassConstructorDescriptor) = constructorSymbolTable.referenced(descriptor) { createConstructorSymbol(descriptor) } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrDeclarationDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrDeclarationDeserializer.kt index 2c09e8293ce..3b1605f7dfc 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrDeclarationDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrDeclarationDeserializer.kt @@ -303,6 +303,7 @@ class IrDeclarationDeserializer( val flags = ClassFlags.decode(fcode) symbolTable.declareClass(signature, { symbol as IrClassSymbol }) { + assert(it === symbol) irFactory.createClass( startOffset, endOffset, origin, it,