[IR] Made signature nullable (#3860)

This commit is contained in:
LepilkinaElena
2020-10-20 21:13:40 +03:00
committed by GitHub
parent 6a9c72e77c
commit b786cf7559
16 changed files with 33 additions and 39 deletions
@@ -32,8 +32,6 @@ abstract class Fir2IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolO
} }
} }
override val isPublicApi: Boolean = true
override val isBound: Boolean override val isBound: Boolean
get() = _owner != null get() = _owner != null
@@ -59,11 +59,8 @@ private class DescriptorlessIrFileSymbol : IrFileSymbol {
override val isBound get() = _owner != null override val isBound get() = _owner != null
override val isPublicApi: Boolean override val signature: IdSignature?
get() = error("Operation is unsupported") get() = null
override val signature: IdSignature
get() = error("Operation is unsupported")
} }
private fun isBuiltInClass(declaration: IrDeclaration): Boolean = private fun isBuiltInClass(declaration: IrDeclaration): Boolean =
@@ -14,8 +14,8 @@ interface IrClassifierEqualityChecker {
object FqNameEqualityChecker : IrClassifierEqualityChecker { object FqNameEqualityChecker : IrClassifierEqualityChecker {
override fun areEqual(left: IrClassifierSymbol, right: IrClassifierSymbol): Boolean = override fun areEqual(left: IrClassifierSymbol, right: IrClassifierSymbol): Boolean =
left === right || left === right ||
left.isPublicApi && right.isPublicApi && left.signature == right.signature left.signature != null && left.signature == right.signature
override fun getHashCode(symbol: IrClassifierSymbol): Int = override fun getHashCode(symbol: IrClassifierSymbol): Int =
if (symbol.isPublicApi) symbol.signature.hashCode() else symbol.hashCode() symbol.signature?.hashCode() ?: symbol.hashCode()
} }
@@ -18,10 +18,8 @@ abstract class IrDelegatingSymbol<S : IrBindableSymbol<D, B>, B : IrSymbolOwner,
override val descriptor: D get() = delegate.descriptor override val descriptor: D get() = delegate.descriptor
override val isBound: Boolean get() = delegate.isBound override val isBound: Boolean get() = delegate.isBound
override val isPublicApi: Boolean
get() = delegate.isPublicApi
override val signature: IdSignature override val signature: IdSignature?
get() = delegate.signature get() = delegate.signature
override fun bind(owner: B) = delegate.bind(owner) override fun bind(owner: B) = delegate.bind(owner)
@@ -32,9 +32,10 @@ interface IrSymbol {
val isBound: Boolean val isBound: Boolean
val signature: IdSignature val signature: IdSignature?
val isPublicApi: Boolean val isPublicApi: Boolean
get() = signature != null
} }
interface IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolOwner> : IrSymbol { interface IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolOwner> : IrSymbol {
@@ -22,7 +22,7 @@ class DescriptorlessExternalPackageFragmentSymbol : IrExternalPackageFragmentSym
override val isPublicApi: Boolean override val isPublicApi: Boolean
get() = TODO("Not yet implemented") get() = TODO("Not yet implemented")
override val signature: IdSignature override val signature: IdSignature?
get() = TODO("Not yet implemented") get() = TODO("Not yet implemented")
override val isBound get() = _owner != null override val isBound get() = _owner != null
@@ -69,10 +69,8 @@ abstract class IrBindableSymbolBase<out D : DeclarationDescriptor, B : IrSymbolO
} }
} }
override val isPublicApi: Boolean = false override val signature: IdSignature?
get() = null
override val signature: IdSignature
get() = error("IdSignature is allowed only for PublicApi symbols")
override val isBound: Boolean override val isBound: Boolean
get() = _owner != null get() = _owner != null
@@ -52,8 +52,6 @@ abstract class IrBindablePublicSymbolBase<out D : DeclarationDescriptor, B : IrS
} }
} }
override val isPublicApi: Boolean = true
override val isBound: Boolean override val isBound: Boolean
get() = _owner != null get() = _owner != null
} }
@@ -345,18 +345,18 @@ interface IrTypeSystemContext : TypeSystemContext, TypeSystemCommonSuperTypesCon
} }
override fun TypeConstructorMarker.getPrimitiveType(): PrimitiveType? { override fun TypeConstructorMarker.getPrimitiveType(): PrimitiveType? {
if (this !is IrClassSymbol || !isPublicApi) return null if (this !is IrClassSymbol) return null
val signature = signature.asPublic() val signature = signature?.asPublic()
if (signature == null || signature.packageFqName != "kotlin") return null if (signature == null || signature.packageFqName != "kotlin") return null
return PrimitiveType.getByShortName(signature.declarationFqName) return PrimitiveType.getByShortName(signature.declarationFqName)
} }
override fun TypeConstructorMarker.getPrimitiveArrayType(): PrimitiveType? { override fun TypeConstructorMarker.getPrimitiveArrayType(): PrimitiveType? {
if (this !is IrClassSymbol || !isPublicApi) return null if (this !is IrClassSymbol) return null
val signature = signature.asPublic() val signature = signature?.asPublic()
if (signature == null || signature.packageFqName != "kotlin") return null if (signature == null || signature.packageFqName != "kotlin") return null
return PrimitiveType.getByShortArrayName(signature.declarationFqName) return PrimitiveType.getByShortArrayName(signature.declarationFqName)
@@ -57,7 +57,6 @@ fun getPublicSignature(packageFqName: FqName, name: String) =
private fun IrType.isClassType(signature: IdSignature.PublicSignature, hasQuestionMark: Boolean? = null): Boolean { private fun IrType.isClassType(signature: IdSignature.PublicSignature, hasQuestionMark: Boolean? = null): Boolean {
if (this !is IrSimpleType) return false if (this !is IrSimpleType) return false
if (hasQuestionMark != null && this.hasQuestionMark != hasQuestionMark) return false if (hasQuestionMark != null && this.hasQuestionMark != hasQuestionMark) return false
if (!classifier.isPublicApi || !classifier.signature.isPublic) return false
return signature == classifier.signature return signature == classifier.signature
} }
@@ -86,7 +86,7 @@ private val IrConstructorCall.annotationClass
get() = this.symbol.owner.constructedClass get() = this.symbol.owner.constructedClass
val IrClass.packageFqName: FqName? val IrClass.packageFqName: FqName?
get() = if (symbol.isPublicApi) symbol.signature.packageFqName() else parent.getPackageFragment()?.fqName get() = symbol.signature?.packageFqName() ?: parent.getPackageFragment()?.fqName
fun IrDeclarationWithName.hasEqualFqName(fqName: FqName): Boolean = fun IrDeclarationWithName.hasEqualFqName(fqName: FqName): Boolean =
name == fqName.shortName() && when (val parent = parent) { name == fqName.shortName() && when (val parent = parent) {
@@ -77,7 +77,10 @@ class DeclarationStubGenerator(
return generateStubBySymbol(symbol, symbol.descriptor) return generateStubBySymbol(symbol, symbol.descriptor)
} }
val descriptor = if (symbol.descriptor is WrappedDeclarationDescriptor<*>) val descriptor = if (symbol.descriptor is WrappedDeclarationDescriptor<*>)
findDescriptorBySignature(symbol.signature) findDescriptorBySignature(
symbol.signature
?: error("Symbol is not public API. Expected signature for symbol: ${symbol.descriptor}")
)
else else
symbol.descriptor symbol.descriptor
if (descriptor == null) return null if (descriptor == null) return null
@@ -216,9 +216,9 @@ class SymbolTable(
} }
override fun set(d: D, s: S) { override fun set(d: D, s: S) {
if (s.isPublicApi) { s.signature?.let {
idSigToSymbol[s.signature] = s idSigToSymbol[it] = s
} else { } ?: run {
descriptorToSymbol[d] = s descriptorToSymbol[d] = s
} }
} }
@@ -264,10 +264,10 @@ class SymbolTable(
fun getLocal(d: D) = descriptorToSymbol[d] fun getLocal(d: D) = descriptorToSymbol[d]
operator fun set(d: D, s: S) { operator fun set(d: D, s: S) {
if (s.isPublicApi) { s.signature?.let {
require(d is TypeParameterDescriptor) require(d is TypeParameterDescriptor)
idSigToSymbol[s.signature] = s idSigToSymbol[it] = s
} else { } ?: run {
descriptorToSymbol[d] = s descriptorToSymbol[d] = s
} }
} }
@@ -36,7 +36,7 @@ abstract class GlobalDeclarationTable(
protected fun loadKnownBuiltins(builtIns: IrBuiltIns) { protected fun loadKnownBuiltins(builtIns: IrBuiltIns) {
builtIns.knownBuiltins.forEach { builtIns.knownBuiltins.forEach {
val symbol = (it as IrSymbolOwner).symbol val symbol = (it as IrSymbolOwner).symbol
table[it] = symbol.signature.also { id -> clashTracker.commit(it, id) } table[it] = symbol.signature!!.also { id -> clashTracker.commit(it, id) }
} }
} }
@@ -119,7 +119,7 @@ class CurrentModuleWithICDeserializer(
symbolTable.forEachPublicSymbol { symbolTable.forEachPublicSymbol {
if (it.descriptor.isDirtyDescriptor()) { // public && non-deserialized should be dirty symbol if (it.descriptor.isDirtyDescriptor()) { // public && non-deserialized should be dirty symbol
if (it !in knownBuiltIns) { if (it !in knownBuiltIns) {
dirtyDeclarations[it.signature] = it dirtyDeclarations[it.signature!!] = it
} }
} }
} }
@@ -37,9 +37,10 @@ abstract class IrModuleDeserializer(val moduleDescriptor: ModuleDescriptor) {
abstract fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol abstract fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol
open fun declareIrSymbol(symbol: IrSymbol) { open fun declareIrSymbol(symbol: IrSymbol) {
assert(symbol.isPublicApi) { "Symbol is not public API: ${symbol.descriptor}" } val signature = symbol.signature
require(signature != null) { "Symbol is not public API: ${symbol.descriptor}" }
assert(symbol.descriptor !is WrappedDeclarationDescriptor<*>) assert(symbol.descriptor !is WrappedDeclarationDescriptor<*>)
deserializeIrSymbol(symbol.signature, symbol.kind()) deserializeIrSymbol(signature, symbol.kind())
} }
open val klib: IrLibrary get() = error("Unsupported operation") open val klib: IrLibrary get() = error("Unsupported operation")
@@ -166,8 +167,9 @@ class IrModuleDeserializerWithBuiltIns(
} }
override fun declareIrSymbol(symbol: IrSymbol) { override fun declareIrSymbol(symbol: IrSymbol) {
if (symbol.isPublicApi && checkIsFunctionInterface(symbol.signature)) val signature = symbol.signature
resolveFunctionalInterface(symbol.signature, symbol.kind()) if (signature != null && checkIsFunctionInterface(signature))
resolveFunctionalInterface(signature, symbol.kind())
else delegate.declareIrSymbol(symbol) else delegate.declareIrSymbol(symbol)
} }