[IR] Made signature nullable (#3860)
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
+2
-5
@@ -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 =
|
||||||
|
|||||||
+2
-2
@@ -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 {
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-4
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user