JVM_IR: register builtin annotation constructors in SymbolTable

When deserializing IR, these annotations need to be visible.
This commit is contained in:
Georgy Bronnikov
2021-05-26 00:20:44 +03:00
committed by TeamCityServer
parent 8d15a1d13d
commit ec1c97c684
5 changed files with 39 additions and 0 deletions
@@ -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.createImplicitParameterDeclarationWithWrappedDescriptor
import org.jetbrains.kotlin.backend.common.ir.createParameterDeclarations 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.lower.SingletonObjectJvmStaticTransformer
import org.jetbrains.kotlin.backend.jvm.serialization.deserializeClassFromByteArray import org.jetbrains.kotlin.backend.jvm.serialization.deserializeClassFromByteArray
import org.jetbrains.kotlin.backend.jvm.serialization.deserializeIrFileFromByteArray 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.descriptors.annotations.FilteredAnnotations
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI 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.addConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildClass import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
@@ -184,6 +186,8 @@ open class JvmGeneratorExtensionsImpl(private val generateFacades: Boolean = tru
private val kotlinJvmInternalPackage = private val kotlinJvmInternalPackage =
IrExternalPackageFragmentImpl(DescriptorlessExternalPackageFragmentSymbol(), JvmAnnotationNames.KOTLIN_JVM_INTERNAL) IrExternalPackageFragmentImpl(DescriptorlessExternalPackageFragmentSymbol(), JvmAnnotationNames.KOTLIN_JVM_INTERNAL)
private val specialAnnotationConstructors = mutableListOf<IrConstructor>()
private fun createSpecialAnnotationClass(fqn: FqName, parent: IrPackageFragment) = private fun createSpecialAnnotationClass(fqn: FqName, parent: IrPackageFragment) =
IrFactoryImpl.buildClass { IrFactoryImpl.buildClass {
kind = ClassKind.ANNOTATION_CLASS kind = ClassKind.ANNOTATION_CLASS
@@ -193,6 +197,8 @@ open class JvmGeneratorExtensionsImpl(private val generateFacades: Boolean = tru
this.parent = parent this.parent = parent
addConstructor { addConstructor {
isPrimary = true 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 override val shouldPreventDeprecatedIntegerValueTypeLiteralConversion: Boolean
get() = true get() = true
@@ -47,6 +47,10 @@ abstract class DeclarationStubGenerator(
) : IrProvider { ) : IrProvider {
protected val lazyTable = symbolTable.lazyWrapper protected val lazyTable = symbolTable.lazyWrapper
init {
extensions.registerDeclarations(symbolTable)
}
val lock: IrLock val lock: IrLock
get() = symbolTable.lock get() = symbolTable.lock
@@ -69,6 +69,8 @@ open class StubGeneratorExtensions {
open val rawTypeAnnotationConstructor: IrConstructor? open val rawTypeAnnotationConstructor: IrConstructor?
get() = null get() = null
open fun registerDeclarations(symbolTable: SymbolTable) {}
companion object { companion object {
@JvmField @JvmField
val EMPTY = StubGeneratorExtensions() val EMPTY = StubGeneratorExtensions()
@@ -77,6 +77,7 @@ class SymbolTable(
abstract fun get(d: D): S? abstract fun get(d: D): S?
abstract fun set(s: S) abstract fun set(s: S)
abstract fun get(sig: IdSignature): 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 { inline fun declare(d: D, createSymbol: () -> S, createOwner: (S) -> B): B {
synchronized(lock) { synchronized(lock) {
@@ -217,6 +218,10 @@ class SymbolTable(
} }
override fun get(sig: IdSignature): S? = idSigToSymbol[sig] override fun get(sig: IdSignature): S? = idSigToSymbol[sig]
override fun set(sig: IdSignature, s: S) {
idSigToSymbol[sig] = s
}
} }
private inner class EnumEntrySymbolTable : FlatSymbolTable<ClassDescriptor, IrEnumEntry, IrEnumEntrySymbol>() { private inner class EnumEntrySymbolTable : FlatSymbolTable<ClassDescriptor, IrEnumEntry, IrEnumEntrySymbol>() {
@@ -265,6 +270,10 @@ class SymbolTable(
operator fun get(sig: IdSignature): S? = idSigToSymbol[sig] ?: parent?.get(sig) 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 = fun dumpTo(stringBuilder: StringBuilder): StringBuilder =
stringBuilder.also { stringBuilder.also {
it.append("owner=") it.append("owner=")
@@ -296,6 +305,11 @@ class SymbolTable(
return scope[sig] 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 { inline fun declareLocal(d: D, createSymbol: () -> S, createOwner: (S) -> B): B {
val scope = currentScope ?: throw AssertionError("No active scope") val scope = currentScope ?: throw AssertionError("No active scope")
val symbol = scope.getLocal(d) ?: createSymbol().also { scope[d] = it } val symbol = scope.getLocal(d) ?: createSymbol().also { scope[d] = it }
@@ -514,6 +528,10 @@ class SymbolTable(
constructorFactory constructorFactory
) )
fun declareConstructorWithSignature(sig: IdSignature, symbol: IrConstructorSymbol) {
constructorSymbolTable.set(sig, symbol)
}
override fun referenceConstructor(descriptor: ClassConstructorDescriptor) = override fun referenceConstructor(descriptor: ClassConstructorDescriptor) =
constructorSymbolTable.referenced(descriptor) { createConstructorSymbol(descriptor) } constructorSymbolTable.referenced(descriptor) { createConstructorSymbol(descriptor) }
@@ -303,6 +303,7 @@ class IrDeclarationDeserializer(
val flags = ClassFlags.decode(fcode) val flags = ClassFlags.decode(fcode)
symbolTable.declareClass(signature, { symbol as IrClassSymbol }) { symbolTable.declareClass(signature, { symbol as IrClassSymbol }) {
assert(it === symbol)
irFactory.createClass( irFactory.createClass(
startOffset, endOffset, origin, startOffset, endOffset, origin,
it, it,