[IR] Introduce new IdSignatures

FileSignature, CompositeSignature, LocalSignature

They are needed to make possible reference any non-local declaration via
 signature, including private signature, type parameters and so on.

- Support those new signatures in proto and klibs
- Rename `isPublic` -> `isPubliclyVisible` due to changed semantic
- Fix FIR
- clean up code
This commit is contained in:
Roman Artemev
2021-05-26 19:26:08 +03:00
committed by TeamCityServer
parent 7139785036
commit 6cdac22a23
58 changed files with 3271 additions and 1330 deletions
@@ -5,28 +5,35 @@
package org.jetbrains.kotlin.backend.jvm.serialization
import org.jetbrains.kotlin.backend.common.serialization.mangle.SpecialDeclarationType
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.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.resolve.descriptorUtil.overriddenTreeAsSequence
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.contains
import org.jetbrains.kotlin.utils.addToStdlib.cast
class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMangler) : IdSignatureDescriptor(mangler) {
private class JvmDescriptorBasedSignatureBuilder(mangler: KotlinMangler.DescriptorMangler) : DescriptorBasedSignatureBuilder(mangler) {
private inner class JvmDescriptorBasedSignatureBuilder(mangler: KotlinMangler.DescriptorMangler, type: SpecialDeclarationType) : DescriptorBasedSignatureBuilder(mangler, type) {
override fun platformSpecificFunction(descriptor: FunctionDescriptor) {
keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor)
}
override fun isKotlinPackage(descriptor: PackageFragmentDescriptor): Boolean {
return descriptor !is LazyJavaPackageFragment
}
override fun platformSpecificProperty(descriptor: PropertyDescriptor) {
// See KT-31646
setSpecialJavaProperty(descriptor is JavaForKotlinOverridePropertyDescriptor)
setSyntheticJavaProperty(descriptor is SyntheticJavaPropertyDescriptor)
keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor)
}
@@ -38,6 +45,10 @@ class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMang
keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor)
}
override fun platformSpecificModule(descriptor: ModuleDescriptor) {
}
private fun keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor: CallableMemberDescriptor) {
if (descriptor.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) return
val containingClass = descriptor.containingDeclaration as? ClassDescriptor ?: return
@@ -95,19 +106,6 @@ class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMang
}
}
override fun createSignatureBuilder(): DescriptorBasedSignatureBuilder = JvmDescriptorBasedSignatureBuilder(mangler)
/* In multi-threaded environment, we cannot afford to cache a signature builder, as in IdSignatureBuilder. */
override fun composeSignature(descriptor: DeclarationDescriptor): IdSignature? {
return if (mangler.run { descriptor.isExported() }) {
createSignatureBuilder().buildSignature(descriptor)
} else null
}
override fun composeEnumEntrySignature(descriptor: ClassDescriptor): IdSignature? {
return if (mangler.run { descriptor.isExportEnumEntry() }) {
createSignatureBuilder().buildSignature(descriptor)
} else null
}
override fun createSignatureBuilder(type: SpecialDeclarationType): DescriptorBasedSignatureBuilder =
JvmDescriptorBasedSignatureBuilder(mangler, type)
}
@@ -155,7 +155,6 @@ class JvmIrLinker(
}
override fun declareIrSymbol(symbol: IrSymbol) {
assert(symbol.isPublicApi || symbol.descriptor.isJavaDescriptor())
if (symbol is IrFieldSymbol) {
declareJavaFieldStub(symbol)
} else {
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrExportCheck
import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrMangleComputer
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
@@ -87,6 +88,8 @@ abstract class AbstractJvmDescriptorMangler(private val mainDetector: MainFuncti
// For more details see JvmPlatformOverloadsSpecificityComparator.kt
return if (isJavaField) MangleConstant.JAVA_FIELD_SUFFIX else null
}
override fun visitModuleDeclaration(descriptor: ModuleDescriptor, data: Nothing?) {} // SKIP in case of synthetic properties
}
override fun getExportChecker(): KotlinExportChecker<DeclarationDescriptor> = exportChecker