JVM_IR KT-42020 special IdSignature for some fake override members

This commit is contained in:
Dmitry Petrov
2020-12-14 11:53:13 +03:00
parent 12cfba9ca9
commit b0f6461fa9
22 changed files with 1487 additions and 20 deletions
@@ -14,6 +14,7 @@ abstract class IdSignatureBuilder<D> {
protected val classFqnSegments = mutableListOf<String>()
protected var hashId: Long? = null
protected var hashIdAcc: Long? = null
protected var overridden: List<D>? = null
protected var mask = 0L
protected abstract fun accept(d: D)
@@ -23,19 +24,30 @@ abstract class IdSignatureBuilder<D> {
this.classFqnSegments.clear()
this.hashId = null
this.mask = 0L
this.overridden = null
}
protected fun build(): IdSignature {
val packageFqName = packageFqn.asString()
val classFqName = classFqnSegments.joinToString(".")
return if (hashIdAcc == null) {
IdSignature.PublicSignature(packageFqName, classFqName, hashId, mask)
} else {
val accessorSignature = IdSignature.PublicSignature(packageFqName, classFqName, hashIdAcc, mask)
hashIdAcc = null
classFqnSegments.run { removeAt(lastIndex) }
val propertySignature = build()
IdSignature.AccessorSignature(propertySignature, accessorSignature)
return when {
overridden != null -> {
val preserved = overridden!!
overridden = null
val memberSignature = build()
val overriddenSignatures = preserved.map { buildSignature(it) }
return IdSignature.SpecialFakeOverrideSignature(memberSignature, overriddenSignatures)
}
hashIdAcc == null -> {
IdSignature.PublicSignature(packageFqName, classFqName, hashId, mask)
}
else -> {
val accessorSignature = IdSignature.PublicSignature(packageFqName, classFqName, hashIdAcc, mask)
hashIdAcc = null
classFqnSegments.run { removeAt(lastIndex) }
val propertySignature = build()
IdSignature.AccessorSignature(propertySignature, accessorSignature)
}
}
}