IR: compute file local signatures from descriptors

This commit is contained in:
Georgy Bronnikov
2021-11-16 17:43:49 +03:00
committed by TeamCityServer
parent b6ddd758ec
commit 4d2bcf7e66
8 changed files with 80 additions and 19 deletions
@@ -9,25 +9,37 @@ import org.jetbrains.kotlin.backend.common.serialization.mangle.SpecialDeclarati
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.KotlinMangler
import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.resolve.descriptorUtil.overriddenTreeAsSequence
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
import org.jetbrains.kotlin.types.typeUtil.contains
import org.jetbrains.kotlin.utils.addToStdlib.cast
class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMangler) : IdSignatureDescriptor(mangler) {
class JvmIdSignatureDescriptor(mangler: KotlinMangler.DescriptorMangler) : IdSignatureDescriptor(mangler) {
private inner class JvmDescriptorBasedSignatureBuilder(type: SpecialDeclarationType) :
DescriptorBasedSignatureBuilder(type) {
override val currentFileSignature: IdSignature.FileSignature?
get() = externallyGivenFileSignature ?: storedFileSignature
private inner class JvmDescriptorBasedSignatureBuilder(mangler: KotlinMangler.DescriptorMangler, type: SpecialDeclarationType) :
DescriptorBasedSignatureBuilder(mangler, type) {
override fun platformSpecificFunction(descriptor: FunctionDescriptor) {
keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor)
computeStoredFileSignature(descriptor)
}
override fun isKotlinPackage(descriptor: PackageFragmentDescriptor): Boolean {
return descriptor !is LazyJavaPackageFragment
return true
// return descriptor !is LazyJavaPackageFragment
}
override fun platformSpecificClass(descriptor: ClassDescriptor) {
computeStoredFileSignature(descriptor)
}
override fun platformSpecificProperty(descriptor: PropertyDescriptor) {
@@ -35,14 +47,21 @@ class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMang
setSpecialJavaProperty(descriptor is JavaForKotlinOverridePropertyDescriptor)
setSyntheticJavaProperty(descriptor is SyntheticJavaPropertyDescriptor)
keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor)
computeStoredFileSignature(descriptor)
}
override fun platformSpecificGetter(descriptor: PropertyGetterDescriptor) {
keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor)
computeStoredFileSignature(descriptor)
}
override fun platformSpecificSetter(descriptor: PropertySetterDescriptor) {
keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor)
computeStoredFileSignature(descriptor)
}
override fun platformSpecificAlias(descriptor: TypeAliasDescriptor) {
computeStoredFileSignature(descriptor)
}
override fun platformSpecificModule(descriptor: ModuleDescriptor) {
@@ -87,8 +106,26 @@ class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMang
val descriptor = it.constructor.declarationDescriptor
descriptor is TypeParameterDescriptor && descriptor.containingDeclaration is ClassDescriptor
}
private fun computeStoredFileSignature(descriptor: DeclarationDescriptorWithSource) {
storedFileSignature = IdSignature.FileSignature(
descriptor.source.containingFile,
descriptor.containingPackage() ?: FqName.ROOT,
descriptor.source.containingFile.name ?: "unknown"
)
}
var storedFileSignature: IdSignature.FileSignature? = null
}
override fun createSignatureBuilder(type: SpecialDeclarationType): DescriptorBasedSignatureBuilder =
JvmDescriptorBasedSignatureBuilder(mangler, type)
JvmDescriptorBasedSignatureBuilder(type)
override fun withFileSignature(fileSignature: IdSignature.FileSignature, body: () -> Unit) {
externallyGivenFileSignature = fileSignature
body()
externallyGivenFileSignature = null
}
private var externallyGivenFileSignature: IdSignature.FileSignature? = null
}
@@ -62,11 +62,13 @@ fun deserializeFromByteArray(
// Only needed for local signature computation.
val dummyIrFile = IrFileImpl(NaiveSourceBasedFileEntryImpl("<unknown>"), IrFileSymbolImpl(), toplevelParent.packageFqName!!)
val dummyFileSignature = IdSignature.FileSignature(Any(), toplevelParent.packageFqName!!, "<unknown>")
val symbolDeserializer = IrSymbolDeserializer(
symbolTable,
irLibraryFile,
fileSymbol = dummyIrFile.symbol,
fileSignature = dummyFileSignature,
/* TODO */ actuals = emptyList(),
enqueueLocalTopLevelDeclaration = {}, // just link to it in symbolTable
handleExpectActualMapping = { _, symbol -> symbol } no expect declarations
@@ -100,7 +102,9 @@ fun deserializeFromByteArray(
}
}
ExternalDependenciesGenerator(stubGenerator.symbolTable, listOf(stubGenerator)).generateUnboundSymbolsAsDependencies()
stubGenerator.symbolTable.signaturer.withFileSignature(dummyFileSignature) {
ExternalDependenciesGenerator(stubGenerator.symbolTable, listOf(stubGenerator)).generateUnboundSymbolsAsDependencies()
}
buildFakeOverridesForLocalClasses(stubGenerator.symbolTable, typeSystemContext, symbolDeserializer, toplevelParent)
}
@@ -59,7 +59,7 @@ object JvmIrMangler : IrBasedKotlinManglerImpl() {
class JvmDescriptorMangler(private val mainDetector: MainFunctionDetector?) : DescriptorBasedKotlinManglerImpl() {
private object ExportChecker : DescriptorExportCheckerVisitor() {
override fun DeclarationDescriptor.isPlatformSpecificExported() = false
override fun DeclarationDescriptor.isPlatformSpecificExported() = true
}
private class JvmDescriptorManglerComputer(