IR: compute file local signatures from descriptors
This commit is contained in:
committed by
TeamCityServer
parent
b6ddd758ec
commit
4d2bcf7e66
+42
-5
@@ -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
|
||||
}
|
||||
|
||||
+5
-1
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user