JVM_IR: Supply fake file name to signatures of file local declarations

This commit is contained in:
Georgy Bronnikov
2021-06-29 13:40:07 +03:00
committed by TeamCityServer
parent 225705a237
commit 08b950fc2a
6 changed files with 74 additions and 20 deletions
@@ -7,7 +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.common.serialization.signature.PublicIdSignatureComputer
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
@@ -211,7 +211,7 @@ open class JvmGeneratorExtensionsImpl(
} }
override fun registerDeclarations(symbolTable: SymbolTable) { override fun registerDeclarations(symbolTable: SymbolTable) {
val signatureComputer = IdSignatureSerializer(JvmIrMangler) val signatureComputer = PublicIdSignatureComputer(JvmIrMangler)
specialAnnotationConstructors.forEach { constructor -> specialAnnotationConstructors.forEach { constructor ->
symbolTable.declareConstructorWithSignature(signatureComputer.composePublicIdSignature(constructor), constructor.symbol) symbolTable.declareConstructorWithSignature(signatureComputer.composePublicIdSignature(constructor), constructor.symbol)
} }
@@ -15,6 +15,7 @@ message XStatementOrExpression {
} }
message AuxTables { message AuxTables {
// TODO: optimize the representation.
repeated bytes type = 1; repeated bytes type = 1;
repeated bytes signature = 2; repeated bytes signature = 2;
repeated bytes string = 3; repeated bytes string = 3;
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.backend.jvm.serialization package org.jetbrains.kotlin.backend.jvm.serialization
import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
class JvmGlobalDeclarationTable : GlobalDeclarationTable(IdSignatureSerializer(JvmIrMangler), JvmIrMangler) class JvmGlobalDeclarationTable : GlobalDeclarationTable(JvmIrMangler)
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.IrMessageLogger import org.jetbrains.kotlin.ir.util.IrMessageLogger
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.protobuf.ByteString import org.jetbrains.kotlin.protobuf.ByteString
class JvmIrSerializerSession( class JvmIrSerializerSession(
@@ -9,25 +9,20 @@ import org.jetbrains.kotlin.backend.common.overrides.DefaultFakeOverrideClassFil
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideDeclarationTable import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideDeclarationTable
import org.jetbrains.kotlin.backend.common.overrides.FileLocalAwareLinker import org.jetbrains.kotlin.backend.common.overrides.FileLocalAwareLinker
import org.jetbrains.kotlin.backend.common.serialization.DescriptorByIdSignatureFinder import org.jetbrains.kotlin.backend.common.serialization.*
import org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer
import org.jetbrains.kotlin.backend.common.serialization.IrLibraryFile
import org.jetbrains.kotlin.backend.common.serialization.IrSymbolDeserializer
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
import org.jetbrains.kotlin.backend.jvm.serialization.proto.JvmIr import org.jetbrains.kotlin.backend.jvm.serialization.proto.JvmIr
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
import org.jetbrains.kotlin.ir.declarations.lazy.LazyIrFactory import org.jetbrains.kotlin.ir.declarations.lazy.LazyIrFactory
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator import org.jetbrains.kotlin.ir.symbols.impl.IrFileSymbolImpl
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.protobuf.ByteString import org.jetbrains.kotlin.protobuf.ByteString
@@ -53,9 +48,14 @@ fun deserializeClassFromByteArray(
JvmDescriptorMangler(null), JvmDescriptorMangler(null),
DescriptorByIdSignatureFinder.LookupMode.MODULE_WITH_DEPENDENCIES DescriptorByIdSignatureFinder.LookupMode.MODULE_WITH_DEPENDENCIES
) )
// Only needed for local signature computation.
val dummyIrFile = IrFileImpl(NaiveSourceBasedFileEntryImpl("<unknown>"), IrFileSymbolImpl(), irClass.packageFqName!!)
val symbolDeserializer = IrSymbolDeserializer( val symbolDeserializer = IrSymbolDeserializer(
symbolTable, symbolTable,
irLibraryFile, irLibraryFile,
fileSymbol = dummyIrFile.symbol,
/* TODO */ actuals = emptyList(), /* TODO */ actuals = emptyList(),
enqueueLocalTopLevelDeclaration = {}, // just link to it in symbolTable enqueueLocalTopLevelDeclaration = {}, // just link to it in symbolTable
handleExpectActualMapping = { _, _ -> TODO() }, handleExpectActualMapping = { _, _ -> TODO() },
@@ -103,9 +103,14 @@ fun deserializeIrFileFromByteArray(
JvmDescriptorMangler(null), JvmDescriptorMangler(null),
DescriptorByIdSignatureFinder.LookupMode.MODULE_WITH_DEPENDENCIES DescriptorByIdSignatureFinder.LookupMode.MODULE_WITH_DEPENDENCIES
) )
// Only needed for local signature computation.
val dummyIrFile = IrFileImpl(NaiveSourceBasedFileEntryImpl("<unknown>"), IrFileSymbolImpl(), facadeClass.packageFqName!!)
val symbolDeserializer = IrSymbolDeserializer( val symbolDeserializer = IrSymbolDeserializer(
symbolTable, symbolTable,
irLibraryFile, irLibraryFile,
fileSymbol = dummyIrFile.symbol,
/* TODO */ actuals = emptyList(), /* TODO */ actuals = emptyList(),
enqueueLocalTopLevelDeclaration = {}, // just link to it in symbolTable enqueueLocalTopLevelDeclaration = {}, // just link to it in symbolTable
handleExpectActualMapping = { _, _ -> TODO() }, handleExpectActualMapping = { _, _ -> TODO() },
@@ -193,7 +198,6 @@ fun makeSimpleFakeOverrideBuilder(
irBuiltIns: IrBuiltIns, irBuiltIns: IrBuiltIns,
symbolDeserializer: IrSymbolDeserializer symbolDeserializer: IrSymbolDeserializer
): FakeOverrideBuilder { ): FakeOverrideBuilder {
val signatureSerializer = IdSignatureSerializer(JvmIrMangler)
return FakeOverrideBuilder( return FakeOverrideBuilder(
object : FileLocalAwareLinker { object : FileLocalAwareLinker {
override fun tryReferencingPropertyByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrPropertySymbol = override fun tryReferencingPropertyByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrPropertySymbol =
@@ -205,9 +209,9 @@ fun makeSimpleFakeOverrideBuilder(
symbolDeserializer.referenceSimpleFunctionByLocalSignature(idSignature) symbolDeserializer.referenceSimpleFunctionByLocalSignature(idSignature)
}, },
symbolTable, symbolTable,
signatureSerializer, JvmIrMangler,
irBuiltIns, irBuiltIns,
fakeOverrideDeclarationTable = PrePopulatedDeclarationTable(symbolDeserializer.deserializedSymbols, signatureSerializer) fakeOverrideDeclarationTable = PrePopulatedDeclarationTable(symbolDeserializer.deserializedSymbols)
) )
} }
@@ -233,9 +237,8 @@ private fun buildFakeOverridesForLocalClasses(
} }
class PrePopulatedDeclarationTable( class PrePopulatedDeclarationTable(
sig2symbol: Map<IdSignature, IrSymbol>, sig2symbol: Map<IdSignature, IrSymbol>
signatureSerializer: IdSignatureSerializer ) : FakeOverrideDeclarationTable(JvmIrMangler) {
) : FakeOverrideDeclarationTable(signatureSerializer) {
private val symbol2Sig = sig2symbol.entries.associate { (x, y) -> y to x } private val symbol2Sig = sig2symbol.entries.associate { (x, y) -> y to x }
override fun tryComputeBackendSpecificSignature(declaration: IrDeclaration): IdSignature? { override fun tryComputeBackendSpecificSignature(declaration: IrDeclaration): IdSignature? {
@@ -599,14 +599,26 @@ public final class JvmIr {
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
java.util.List<org.jetbrains.kotlin.protobuf.ByteString> getTypeList(); java.util.List<org.jetbrains.kotlin.protobuf.ByteString> getTypeList();
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
int getTypeCount(); int getTypeCount();
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
org.jetbrains.kotlin.protobuf.ByteString getType(int index); org.jetbrains.kotlin.protobuf.ByteString getType(int index);
@@ -780,6 +792,10 @@ public final class JvmIr {
private java.util.List<org.jetbrains.kotlin.protobuf.ByteString> type_; private java.util.List<org.jetbrains.kotlin.protobuf.ByteString> type_;
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public java.util.List<org.jetbrains.kotlin.protobuf.ByteString> public java.util.List<org.jetbrains.kotlin.protobuf.ByteString>
getTypeList() { getTypeList() {
@@ -787,12 +803,20 @@ public final class JvmIr {
} }
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public int getTypeCount() { public int getTypeCount() {
return type_.size(); return type_.size();
} }
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public org.jetbrains.kotlin.protobuf.ByteString getType(int index) { public org.jetbrains.kotlin.protobuf.ByteString getType(int index) {
return type_.get(index); return type_.get(index);
@@ -1166,6 +1190,10 @@ public final class JvmIr {
} }
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public java.util.List<org.jetbrains.kotlin.protobuf.ByteString> public java.util.List<org.jetbrains.kotlin.protobuf.ByteString>
getTypeList() { getTypeList() {
@@ -1173,18 +1201,30 @@ public final class JvmIr {
} }
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public int getTypeCount() { public int getTypeCount() {
return type_.size(); return type_.size();
} }
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public org.jetbrains.kotlin.protobuf.ByteString getType(int index) { public org.jetbrains.kotlin.protobuf.ByteString getType(int index) {
return type_.get(index); return type_.get(index);
} }
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public Builder setType( public Builder setType(
int index, org.jetbrains.kotlin.protobuf.ByteString value) { int index, org.jetbrains.kotlin.protobuf.ByteString value) {
@@ -1198,6 +1238,10 @@ public final class JvmIr {
} }
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public Builder addType(org.jetbrains.kotlin.protobuf.ByteString value) { public Builder addType(org.jetbrains.kotlin.protobuf.ByteString value) {
if (value == null) { if (value == null) {
@@ -1210,6 +1254,10 @@ public final class JvmIr {
} }
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public Builder addAllType( public Builder addAllType(
java.lang.Iterable<? extends org.jetbrains.kotlin.protobuf.ByteString> values) { java.lang.Iterable<? extends org.jetbrains.kotlin.protobuf.ByteString> values) {
@@ -1221,6 +1269,10 @@ public final class JvmIr {
} }
/** /**
* <code>repeated bytes type = 1;</code> * <code>repeated bytes type = 1;</code>
*
* <pre>
* TODO: optimize the representation.
* </pre>
*/ */
public Builder clearType() { public Builder clearType() {
type_ = java.util.Collections.emptyList(); type_ = java.util.Collections.emptyList();