[Commonizer] Use typealias invariant Approximation Keys
^KT-48288
This commit is contained in:
committed by
Space
parent
763ddcddf4
commit
3ee87f1635
@@ -89,10 +89,14 @@ class CirPackageName private constructor(val segments: Array<String>) {
|
||||
* New instances are created via [create] method which encapsulates interning to avoid duplicated instances.
|
||||
*/
|
||||
class CirEntityId private constructor(val packageName: CirPackageName, val relativeNameSegments: Array<CirName>) {
|
||||
override fun equals(other: Any?): Boolean = when {
|
||||
other === this -> true
|
||||
other is CirEntityId -> other.packageName == packageName && other.relativeNameSegments.contentEquals(relativeNameSegments)
|
||||
else -> false
|
||||
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (other !is CirEntityId) return false
|
||||
if (other.packageName != this.packageName) return false
|
||||
if (!other.relativeNameSegments.contentEquals(relativeNameSegments)) return false
|
||||
return true
|
||||
}
|
||||
|
||||
private var _hashCode: Int = 0
|
||||
@@ -134,14 +138,14 @@ class CirEntityId private constructor(val packageName: CirPackageName, val relat
|
||||
}
|
||||
}
|
||||
|
||||
val packageName = CirPackageName.create(splitComplexNameToArray(rawPackageName, "/") { it })
|
||||
val packageName = create(splitComplexNameToArray(rawPackageName, "/") { it })
|
||||
val relativeNameSegments = splitComplexNameToArray(rawRelativeName, ".", CirName::create)
|
||||
|
||||
return create(packageName, relativeNameSegments)
|
||||
}
|
||||
|
||||
fun create(classifierId: ClassId): CirEntityId {
|
||||
val packageName = CirPackageName.create(classifierId.packageFqName)
|
||||
val packageName = create(classifierId.packageFqName)
|
||||
val relativeNameSegments = splitComplexNameToArray(classifierId.relativeClassName.asString(), ".", CirName::create)
|
||||
|
||||
return create(packageName, relativeNameSegments)
|
||||
|
||||
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.commonizer.utils.hashCode
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
|
||||
typealias CirTypeSignature = String
|
||||
|
||||
/**
|
||||
* The hierarchy of [CirType]:
|
||||
|
||||
@@ -15,9 +15,9 @@ import org.jetbrains.kotlin.commonizer.mergedtree.CirNode.Companion.indexOfCommo
|
||||
import org.jetbrains.kotlin.commonizer.mergedtree.CirRootNode
|
||||
import org.jetbrains.kotlin.commonizer.metadata.CirTreeSerializer
|
||||
import org.jetbrains.kotlin.commonizer.transformer.AliasedTypeSubstitutor
|
||||
import org.jetbrains.kotlin.commonizer.transformer.UnderscoredTypeAliasTypeSubstitutor
|
||||
import org.jetbrains.kotlin.commonizer.transformer.InlineTypeAliasCirNodeTransformer
|
||||
import org.jetbrains.kotlin.commonizer.transformer.TypeSubstitutionCirNodeTransformer
|
||||
import org.jetbrains.kotlin.commonizer.transformer.UnderscoredTypeAliasTypeSubstitutor
|
||||
import org.jetbrains.kotlin.commonizer.tree.CirTreeRoot
|
||||
import org.jetbrains.kotlin.commonizer.tree.defaultCirTreeRootDeserializer
|
||||
import org.jetbrains.kotlin.commonizer.tree.mergeCirTree
|
||||
|
||||
+12
-8
@@ -10,13 +10,13 @@
|
||||
|
||||
package org.jetbrains.kotlin.commonizer.mergedtree
|
||||
|
||||
import gnu.trove.THashMap
|
||||
import gnu.trove.THashSet
|
||||
import org.jetbrains.kotlin.commonizer.cir.CirClass
|
||||
import org.jetbrains.kotlin.commonizer.cir.CirClassifier
|
||||
import org.jetbrains.kotlin.commonizer.cir.CirEntityId
|
||||
import org.jetbrains.kotlin.commonizer.cir.CirTypeAlias
|
||||
import org.jetbrains.kotlin.commonizer.tree.*
|
||||
import org.jetbrains.kotlin.commonizer.utils.compact
|
||||
import org.jetbrains.kotlin.commonizer.utils.compactMapValues
|
||||
|
||||
fun CirClassifierIndex(tree: CirTreeRoot): CirClassifierIndex {
|
||||
return CirClassifierIndexBuilder().apply { invoke(tree) }.build()
|
||||
@@ -81,9 +81,13 @@ private class CirClassifierIndexImpl(
|
||||
}
|
||||
|
||||
private class CirClassifierIndexBuilder {
|
||||
private val typeAliasesByUnderlyingType = mutableMapOf<CirEntityId, MutableList<CirTreeTypeAlias>>()
|
||||
private val classifiersById = mutableMapOf<CirEntityId, CirClassifier>()
|
||||
private val classifierIds = mutableSetOf<CirEntityId>()
|
||||
companion object {
|
||||
const val initialCapacity = 1000
|
||||
}
|
||||
|
||||
private val typeAliasesByUnderlyingType = THashMap<CirEntityId, MutableList<CirTreeTypeAlias>>(initialCapacity)
|
||||
private val classifiersById = THashMap<CirEntityId, CirClassifier>(initialCapacity)
|
||||
private val classifierIds = THashSet<CirEntityId>(initialCapacity)
|
||||
|
||||
operator fun invoke(tree: CirTreeRoot) {
|
||||
tree.modules.forEach { module -> this(module) }
|
||||
@@ -112,9 +116,9 @@ private class CirClassifierIndexBuilder {
|
||||
|
||||
fun build(): CirClassifierIndex {
|
||||
return CirClassifierIndexImpl(
|
||||
allClassifierIds = classifierIds.toSet(),
|
||||
classifiersById = classifiersById.compact(),
|
||||
typeAliasesByUnderlyingType = typeAliasesByUnderlyingType.compactMapValues { (_, list) -> list.compact() }
|
||||
allClassifierIds = classifierIds,
|
||||
classifiersById = classifiersById,
|
||||
typeAliasesByUnderlyingType = typeAliasesByUnderlyingType
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.commonizer.mergedtree
|
||||
import org.jetbrains.kotlin.commonizer.cir.CirEntityId
|
||||
|
||||
@JvmInline
|
||||
internal value class CirCommonClassifierId(val aliases: Set<CirEntityId>) {
|
||||
internal value class CirCommonClassifierId(val aliases: LinkedHashSet<CirEntityId>) {
|
||||
override fun toString(): String {
|
||||
return aliases.joinToString(prefix = "(", postfix = ")")
|
||||
}
|
||||
|
||||
+42
-24
@@ -8,55 +8,73 @@
|
||||
package org.jetbrains.kotlin.commonizer.mergedtree
|
||||
|
||||
import org.jetbrains.kotlin.commonizer.TargetDependent
|
||||
import org.jetbrains.kotlin.commonizer.cir.CirClass
|
||||
import org.jetbrains.kotlin.commonizer.cir.CirEntityId
|
||||
import org.jetbrains.kotlin.commonizer.cir.CirTypeAlias
|
||||
import org.jetbrains.kotlin.commonizer.forEachWithTarget
|
||||
import org.jetbrains.kotlin.commonizer.mapValue
|
||||
|
||||
internal class CirCommonClassifierIdResolver(private val classifierIndices: TargetDependent<CirClassifierIndex>) {
|
||||
fun findCommonId(id: CirEntityId): CirCommonClassifierId? {
|
||||
val results = mutableSetOf<CirEntityId>()
|
||||
internal fun CirCommonClassifierIdResolver(classifierIndices: TargetDependent<CirClassifierIndex>): CirCommonClassifierIdResolver {
|
||||
return CirCommonClassifierIdResolverImpl(classifierIndices)
|
||||
}
|
||||
|
||||
internal interface CirCommonClassifierIdResolver {
|
||||
fun findCommonId(id: CirEntityId): CirCommonClassifierId?
|
||||
}
|
||||
|
||||
private class CirCommonClassifierIdResolverImpl(
|
||||
private val classifierIndices: TargetDependent<CirClassifierIndex>
|
||||
) : CirCommonClassifierIdResolver {
|
||||
|
||||
private val cachedResults = HashMap<CirEntityId, CirCommonClassifierId>()
|
||||
private val cachedNullResults = HashSet<CirEntityId>()
|
||||
|
||||
override fun findCommonId(id: CirEntityId): CirCommonClassifierId? {
|
||||
cachedResults[id]?.let { return it }
|
||||
if (id in cachedNullResults) return null
|
||||
return doFindCommonId(id)
|
||||
}
|
||||
|
||||
private fun doFindCommonId(id: CirEntityId): CirCommonClassifierId? {
|
||||
val results = LinkedHashSet<CirEntityId>()
|
||||
|
||||
/* Set of every classifier id that once was enqueued already */
|
||||
val enqueued = mutableSetOf<CirEntityId>()
|
||||
val visited = mutableSetOf<CirEntityId>()
|
||||
|
||||
/* Actual, current queue of classifiers to resolve */
|
||||
val queue = ArrayDeque<CirEntityId>()
|
||||
|
||||
enqueued.add(id)
|
||||
visited.add(id)
|
||||
queue.add(id)
|
||||
|
||||
while (queue.isNotEmpty()) {
|
||||
val nextClassifierId = queue.removeFirst()
|
||||
val foundClassifiers = classifierIndices.mapValue { index -> index.findClassifier(nextClassifierId) }
|
||||
val foundClassifiers = classifierIndices.associateWith { index -> index.findClassifier(nextClassifierId) }
|
||||
|
||||
/* Classifier is available for all targets */
|
||||
if (foundClassifiers.all { it != null }) {
|
||||
if (foundClassifiers.all { (_, classifier) -> classifier != null }) {
|
||||
results.add(nextClassifierId)
|
||||
}
|
||||
|
||||
foundClassifiers.forEachWithTarget forEach@{ target, classifier ->
|
||||
foundClassifiers.forEach { (index, classifier) ->
|
||||
if (classifier == null) return@forEach
|
||||
|
||||
val classifierExpansionId = when (classifier) {
|
||||
is CirClass -> nextClassifierId
|
||||
is CirTypeAlias -> classifier.expandedType.classifierId
|
||||
}
|
||||
|
||||
if (enqueued.add(classifierExpansionId)) {
|
||||
queue.add(classifierExpansionId)
|
||||
}
|
||||
|
||||
val aliases = classifierIndices[target].findAllTypeAliasesWithUnderlyingType(classifierExpansionId)
|
||||
aliases.forEach { alias ->
|
||||
if (enqueued.add(alias.id)) {
|
||||
// Propagate to the left (towards typealias)
|
||||
index.findTypeAliasesWithUnderlyingType(nextClassifierId).forEach { alias ->
|
||||
if (visited.add(alias.id)) {
|
||||
queue.add(alias.id)
|
||||
}
|
||||
}
|
||||
|
||||
// Propagate to the right (towards expansion)
|
||||
if (classifier is CirTypeAlias) {
|
||||
if (visited.add(classifier.underlyingType.classifierId)) {
|
||||
queue.add(classifier.underlyingType.classifierId)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return if(results.isNotEmpty()) CirCommonClassifierId(results) else null
|
||||
val result = if (results.isNotEmpty()) CirCommonClassifierId(results) else null
|
||||
if (result != null) visited.forEach { cachedResults[it] = result }
|
||||
else visited.forEach { cachedNullResults.add(it) }
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
+107
-37
@@ -15,6 +15,31 @@ import org.jetbrains.kotlin.commonizer.utils.hashCode
|
||||
import org.jetbrains.kotlin.commonizer.utils.isObjCInteropCallableAnnotation
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
|
||||
class CirTypeSignature {
|
||||
private val elements = ArrayList<Any>()
|
||||
|
||||
private var hashCode = 0
|
||||
|
||||
fun add(element: Any) {
|
||||
elements.add(element)
|
||||
hashCode = 31 * hashCode + element.hashCode()
|
||||
}
|
||||
|
||||
override fun hashCode(): Int = hashCode
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other === this) return true
|
||||
if (other !is CirTypeSignature) return false
|
||||
if (other.hashCode != this.hashCode) return false
|
||||
if (other.elements != this.elements) return false
|
||||
return true
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return elements.joinToString("")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
typealias ObjCFunctionApproximation = Int
|
||||
|
||||
@@ -23,11 +48,16 @@ data class PropertyApproximationKey(
|
||||
val extensionReceiverParameterType: CirTypeSignature?
|
||||
) {
|
||||
companion object {
|
||||
internal fun create(context: CirMemberContext, property: CirProperty): PropertyApproximationKey {
|
||||
internal fun create(
|
||||
context: CirMemberContext,
|
||||
commonClassifierIdResolver: CirCommonClassifierIdResolver,
|
||||
property: CirProperty
|
||||
): PropertyApproximationKey {
|
||||
return PropertyApproximationKey(
|
||||
name = property.name,
|
||||
extensionReceiverParameterType = property.extensionReceiver
|
||||
?.let { buildApproximationSignature(SignatureBuildingContext.create(context, property), it.type) }
|
||||
extensionReceiverParameterType = property.extensionReceiver?.let {
|
||||
buildApproximationSignature(SignatureBuildingContext.create(context, commonClassifierIdResolver, property), it.type)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -41,12 +71,17 @@ data class FunctionApproximationKey(
|
||||
) {
|
||||
|
||||
companion object {
|
||||
internal fun create(context: CirMemberContext, function: CirFunction): FunctionApproximationKey {
|
||||
internal fun create(
|
||||
context: CirMemberContext,
|
||||
commonClassifierIdResolver: CirCommonClassifierIdResolver,
|
||||
function: CirFunction
|
||||
): FunctionApproximationKey {
|
||||
return FunctionApproximationKey(
|
||||
name = function.name,
|
||||
valueParametersTypes = valueParameterTypes(context, function),
|
||||
extensionReceiverParameterType = function.extensionReceiver
|
||||
?.let { buildApproximationSignature(SignatureBuildingContext.create(context, function), it.type) },
|
||||
valueParametersTypes = valueParameterTypes(context, commonClassifierIdResolver, function),
|
||||
extensionReceiverParameterType = function.extensionReceiver?.let {
|
||||
buildApproximationSignature(SignatureBuildingContext.create(context, commonClassifierIdResolver, function), it.type)
|
||||
},
|
||||
objCFunctionApproximation = objCFunctionApproximation(function)
|
||||
)
|
||||
}
|
||||
@@ -68,15 +103,19 @@ data class FunctionApproximationKey(
|
||||
.appendHashCode(objCFunctionApproximation)
|
||||
}
|
||||
|
||||
private val typeSignatureInterner = Interner<CirTypeSignature>()
|
||||
|
||||
data class ConstructorApproximationKey(
|
||||
val valueParametersTypes: Array<CirTypeSignature>,
|
||||
private val objCFunctionApproximation: ObjCFunctionApproximation
|
||||
) {
|
||||
|
||||
companion object {
|
||||
internal fun create(context: CirMemberContext, constructor: CirClassConstructor): ConstructorApproximationKey {
|
||||
internal fun create(
|
||||
context: CirMemberContext, commonClassifierIdResolver: CirCommonClassifierIdResolver, constructor: CirClassConstructor
|
||||
): ConstructorApproximationKey {
|
||||
return ConstructorApproximationKey(
|
||||
valueParametersTypes = valueParameterTypes(context, constructor),
|
||||
valueParametersTypes = valueParameterTypes(context, commonClassifierIdResolver, constructor),
|
||||
objCFunctionApproximation = objCFunctionApproximation(constructor)
|
||||
)
|
||||
}
|
||||
@@ -101,24 +140,44 @@ private fun <T> objCFunctionApproximation(value: T): ObjCFunctionApproximation
|
||||
} else 0
|
||||
}
|
||||
|
||||
private fun <T> valueParameterTypes(context: CirMemberContext, callable: T): Array<CirTypeSignature>
|
||||
private fun <T> valueParameterTypes(
|
||||
context: CirMemberContext,
|
||||
commonClassifierIdResolver: CirCommonClassifierIdResolver,
|
||||
callable: T
|
||||
): Array<CirTypeSignature>
|
||||
where T : CirHasTypeParameters, T : CirCallableMemberWithParameters, T : CirMaybeCallableMemberOfClass {
|
||||
if (callable.valueParameters.isEmpty()) return emptyArray()
|
||||
return Array(callable.valueParameters.size) { index ->
|
||||
val parameter = callable.valueParameters[index]
|
||||
buildApproximationSignature(SignatureBuildingContext.create(context, callable), parameter.returnType)
|
||||
buildApproximationSignature(SignatureBuildingContext.create(context, commonClassifierIdResolver, callable), parameter.returnType)
|
||||
}
|
||||
}
|
||||
|
||||
private val typeSignatureInterner = Interner<CirTypeSignature>()
|
||||
private enum class TypeSignatureElements(val stringRepresentation: String) {
|
||||
ArgumentsStartToken("<"),
|
||||
ArgumentsEndToken(">"),
|
||||
ArgumentsSeparator(", "),
|
||||
NullableToken("?"),
|
||||
UpperBoundsStartToken(" : ["),
|
||||
UpperBoundsEndToken("]"),
|
||||
InVariance("in "),
|
||||
OutVariance("out "),
|
||||
StarProjection("*"),
|
||||
FlexibleTypeSeparator("..");
|
||||
|
||||
internal fun buildApproximationSignature(context: SignatureBuildingContext, type: CirType): CirTypeSignature {
|
||||
val stringBuilder = StringBuilder()
|
||||
stringBuilder.appendTypeApproximationSignature(context, type)
|
||||
return typeSignatureInterner.intern(stringBuilder.toString())
|
||||
override fun toString(): String {
|
||||
return stringRepresentation
|
||||
}
|
||||
}
|
||||
|
||||
internal fun StringBuilder.appendTypeApproximationSignature(context: SignatureBuildingContext, type: CirType) {
|
||||
|
||||
internal fun buildApproximationSignature(context: SignatureBuildingContext, type: CirType): CirTypeSignature {
|
||||
val signature = CirTypeSignature()
|
||||
signature.appendTypeApproximationSignature(context, type)
|
||||
return typeSignatureInterner.intern(signature)
|
||||
}
|
||||
|
||||
internal fun CirTypeSignature.appendTypeApproximationSignature(context: SignatureBuildingContext, type: CirType) {
|
||||
return when (type) {
|
||||
is CirFlexibleType -> appendFlexibleTypeApproximationSignature(context, type)
|
||||
is CirTypeParameterType -> appendTypeParameterTypeApproximationSignature(context.forTypeParameterTypes(), type)
|
||||
@@ -126,77 +185,88 @@ internal fun StringBuilder.appendTypeApproximationSignature(context: SignatureBu
|
||||
}
|
||||
}
|
||||
|
||||
internal fun StringBuilder.appendClassOrTypeAliasTypeApproximationSignature(
|
||||
internal fun CirTypeSignature.appendClassOrTypeAliasTypeApproximationSignature(
|
||||
context: SignatureBuildingContext, type: CirClassOrTypeAliasType
|
||||
) {
|
||||
append(type.classifierId.toString())
|
||||
val classifierId = context.commonClassifierIdResolver.findCommonId(type.classifierId)?.aliases ?: type.classifierId
|
||||
add(classifierId)
|
||||
if (type.arguments.isNotEmpty()) {
|
||||
append("<")
|
||||
add(TypeSignatureElements.ArgumentsStartToken)
|
||||
type.arguments.forEachIndexed { index, argument ->
|
||||
when (argument) {
|
||||
is CirRegularTypeProjection -> {
|
||||
when (argument.projectionKind) {
|
||||
Variance.INVARIANT -> Unit
|
||||
Variance.IN_VARIANCE -> append("in ")
|
||||
Variance.OUT_VARIANCE -> append("out ")
|
||||
Variance.IN_VARIANCE -> add(TypeSignatureElements.InVariance)
|
||||
Variance.OUT_VARIANCE -> add(TypeSignatureElements.OutVariance)
|
||||
}
|
||||
appendTypeApproximationSignature(context, argument.type)
|
||||
}
|
||||
is CirStarTypeProjection -> append("*")
|
||||
is CirStarTypeProjection -> add(TypeSignatureElements.StarProjection)
|
||||
}
|
||||
if (index != type.arguments.lastIndex) {
|
||||
append(", ")
|
||||
add(TypeSignatureElements.ArgumentsSeparator)
|
||||
}
|
||||
}
|
||||
append(">")
|
||||
add(TypeSignatureElements.ArgumentsEndToken)
|
||||
}
|
||||
if (type.isMarkedNullable) append("?")
|
||||
if (type.isMarkedNullable) add(TypeSignatureElements.NullableToken)
|
||||
}
|
||||
|
||||
private fun StringBuilder.appendTypeParameterTypeApproximationSignature(
|
||||
private fun CirTypeSignature.appendTypeParameterTypeApproximationSignature(
|
||||
context: TypeParameterTypeSignatureBuildingContext, type: CirTypeParameterType
|
||||
) {
|
||||
val typeParameter = context.resolveTypeParameter(type.index)
|
||||
append(typeParameter.name)
|
||||
add(typeParameter.name)
|
||||
if (context.isVisitedFirstTime(type.index)) {
|
||||
append(" : [")
|
||||
add(TypeSignatureElements.UpperBoundsStartToken)
|
||||
typeParameter.upperBounds.forEachIndexed { index, upperBound ->
|
||||
appendTypeApproximationSignature(context, upperBound)
|
||||
if (index != typeParameter.upperBounds.lastIndex) append(", ")
|
||||
if (index != typeParameter.upperBounds.lastIndex) add(TypeSignatureElements.ArgumentsSeparator)
|
||||
}
|
||||
append("]")
|
||||
add(TypeSignatureElements.UpperBoundsEndToken)
|
||||
}
|
||||
if (type.isMarkedNullable) append("?")
|
||||
if (type.isMarkedNullable) add(TypeSignatureElements.NullableToken)
|
||||
}
|
||||
|
||||
private fun StringBuilder.appendFlexibleTypeApproximationSignature(
|
||||
private fun CirTypeSignature.appendFlexibleTypeApproximationSignature(
|
||||
context: SignatureBuildingContext, type: CirFlexibleType
|
||||
) {
|
||||
appendTypeApproximationSignature(context, type.lowerBound)
|
||||
append("..")
|
||||
add(TypeSignatureElements.FlexibleTypeSeparator)
|
||||
appendTypeApproximationSignature(context, type.upperBound)
|
||||
}
|
||||
|
||||
internal sealed interface SignatureBuildingContext {
|
||||
val commonClassifierIdResolver: CirCommonClassifierIdResolver
|
||||
|
||||
companion object {
|
||||
fun create(memberContext: CirMemberContext, functionOrPropertyOrConstructor: CirHasTypeParameters): SignatureBuildingContext {
|
||||
return DefaultSignatureBuildingContext(memberContext, functionOrPropertyOrConstructor)
|
||||
fun create(
|
||||
memberContext: CirMemberContext,
|
||||
commonClassifierIdResolver: CirCommonClassifierIdResolver,
|
||||
functionOrPropertyOrConstructor: CirHasTypeParameters
|
||||
): SignatureBuildingContext {
|
||||
return DefaultSignatureBuildingContext(memberContext, commonClassifierIdResolver, functionOrPropertyOrConstructor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun SignatureBuildingContext.forTypeParameterTypes(): TypeParameterTypeSignatureBuildingContext = when (this) {
|
||||
is DefaultSignatureBuildingContext -> TypeParameterTypeSignatureBuildingContext(memberContext, functionOrPropertyOrConstructor)
|
||||
is DefaultSignatureBuildingContext -> TypeParameterTypeSignatureBuildingContext(
|
||||
memberContext, commonClassifierIdResolver, functionOrPropertyOrConstructor
|
||||
)
|
||||
is TypeParameterTypeSignatureBuildingContext -> this
|
||||
}
|
||||
|
||||
private class DefaultSignatureBuildingContext(
|
||||
val memberContext: CirMemberContext,
|
||||
override val commonClassifierIdResolver: CirCommonClassifierIdResolver,
|
||||
val functionOrPropertyOrConstructor: CirHasTypeParameters
|
||||
) : SignatureBuildingContext
|
||||
|
||||
private class TypeParameterTypeSignatureBuildingContext(
|
||||
private val memberContext: CirMemberContext,
|
||||
override val commonClassifierIdResolver: CirCommonClassifierIdResolver,
|
||||
private val functionOrPropertyOrConstructor: CirHasTypeParameters
|
||||
) : SignatureBuildingContext {
|
||||
|
||||
|
||||
@@ -255,7 +255,7 @@ private class CirTreeSerializationVisitor(
|
||||
|
||||
StatsKey(
|
||||
id = propertyContext.currentPath.toString(),
|
||||
extensionReceiver = propertyKey.extensionReceiverParameterType,
|
||||
extensionReceiver = propertyKey.extensionReceiverParameterType?.toString(),
|
||||
parameterNames = emptyList(),
|
||||
parameterTypes = emptyList(),
|
||||
declarationType = declarationType
|
||||
@@ -274,9 +274,9 @@ private class CirTreeSerializationVisitor(
|
||||
|
||||
StatsKey(
|
||||
id = functionContext.currentPath.toString(),
|
||||
extensionReceiver = functionKey.extensionReceiverParameterType,
|
||||
extensionReceiver = functionKey.extensionReceiverParameterType?.toString(),
|
||||
parameterNames = function.valueParameters.map { it.name },
|
||||
parameterTypes = functionKey.valueParametersTypes.asList(),
|
||||
parameterTypes = functionKey.valueParametersTypes.map { it.toString() },
|
||||
declarationType = declarationType
|
||||
)
|
||||
}
|
||||
@@ -290,7 +290,7 @@ private class CirTreeSerializationVisitor(
|
||||
id = constructorContext.currentPath.toString(),
|
||||
extensionReceiver = null,
|
||||
parameterNames = constructor.valueParameters.map { it.name },
|
||||
parameterTypes = constructorKey.valueParametersTypes.asList(),
|
||||
parameterTypes = constructorKey.valueParametersTypes.map { it.toString() },
|
||||
declarationType = DeclarationType.CLASS_CONSTRUCTOR
|
||||
)
|
||||
}
|
||||
|
||||
+5
-3
@@ -13,9 +13,11 @@ import org.jetbrains.kotlin.storage.StorageManager
|
||||
internal class TypeSubstitutionCirNodeTransformer(
|
||||
private val storageManager: StorageManager,
|
||||
private val classifiers: CirKnownClassifiers,
|
||||
private val typeSubstitutor: CirTypeSubstitutor
|
||||
private val typeSubstitutor: CirTypeSubstitutor,
|
||||
private val commonClassifierIdResolver: CirCommonClassifierIdResolver = CirCommonClassifierIdResolver(classifiers.classifierIndices)
|
||||
) : CirNodeTransformer {
|
||||
|
||||
|
||||
override fun invoke(root: CirRootNode) {
|
||||
for (index in 0 until root.targetDeclarations.size) {
|
||||
root.modules.forEach { (_, module) -> this(module, index) }
|
||||
@@ -46,7 +48,7 @@ internal class TypeSubstitutionCirNodeTransformer(
|
||||
val newFunction = typeSubstitutor.substitute(index, originalFunction)
|
||||
if (originalFunction == newFunction) return
|
||||
|
||||
val approximationKey = FunctionApproximationKey.create(context, newFunction)
|
||||
val approximationKey = FunctionApproximationKey.create(context, commonClassifierIdResolver, newFunction)
|
||||
val newNode = parent.functions.getOrPut(approximationKey) {
|
||||
buildFunctionNode(storageManager, parent.targetDeclarations.size, classifiers, ParentNode(parent))
|
||||
}
|
||||
@@ -59,7 +61,7 @@ internal class TypeSubstitutionCirNodeTransformer(
|
||||
val newProperty = typeSubstitutor.substitute(index, originalProperty)
|
||||
if (originalProperty == newProperty) return
|
||||
|
||||
val approximationKey = PropertyApproximationKey.create(context, newProperty)
|
||||
val approximationKey = PropertyApproximationKey.create(context, commonClassifierIdResolver, newProperty)
|
||||
val newNode = parent.properties.getOrPut(approximationKey) {
|
||||
buildPropertyNode(storageManager, parent.targetDeclarations.size, classifiers, ParentNode(parent))
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ internal data class TargetBuildingContext(
|
||||
val storageManager: StorageManager,
|
||||
val classifiers: CirKnownClassifiers,
|
||||
val memberContext: CirMemberContext = CirMemberContext.empty,
|
||||
val commonClassifierIdResolver: CirCommonClassifierIdResolver = CirCommonClassifierIdResolver(classifiers.classifierIndices),
|
||||
val targets: Int, val targetIndex: Int
|
||||
) {
|
||||
fun withMemberContextOf(clazz: CirClass) = copy(memberContext = memberContext.withContextOf(clazz))
|
||||
@@ -81,7 +82,9 @@ internal fun CirNodeWithMembers<*, *>.buildClass(
|
||||
internal fun CirNodeWithMembers<*, *>.buildFunction(
|
||||
context: TargetBuildingContext, function: CirFunction, parent: CirNode<*, *>? = null
|
||||
) {
|
||||
val functionNode = functions.getOrPut(FunctionApproximationKey.create(context.memberContext, function)) {
|
||||
val functionNode = functions.getOrPut(
|
||||
FunctionApproximationKey.create(context.memberContext, context.commonClassifierIdResolver, function)
|
||||
) {
|
||||
buildFunctionNode(context.storageManager, context.targets, context.classifiers, ParentNode(parent))
|
||||
}
|
||||
functionNode.targetDeclarations[context.targetIndex] = function
|
||||
@@ -90,7 +93,9 @@ internal fun CirNodeWithMembers<*, *>.buildFunction(
|
||||
internal fun CirNodeWithMembers<*, *>.buildProperty(
|
||||
context: TargetBuildingContext, property: CirProperty, parent: CirNode<*, *>? = null
|
||||
) {
|
||||
val propertyNode = properties.getOrPut(PropertyApproximationKey.create(context.memberContext, property)) {
|
||||
val propertyNode = properties.getOrPut(
|
||||
PropertyApproximationKey.create(context.memberContext, context.commonClassifierIdResolver, property)
|
||||
) {
|
||||
buildPropertyNode(context.storageManager, context.targets, context.classifiers, ParentNode(parent))
|
||||
}
|
||||
propertyNode.targetDeclarations[context.targetIndex] = property
|
||||
@@ -99,7 +104,9 @@ internal fun CirNodeWithMembers<*, *>.buildProperty(
|
||||
internal fun CirClassNode.buildConstructor(
|
||||
context: TargetBuildingContext, constructor: CirClassConstructor, parent: CirNode<*, *>
|
||||
) {
|
||||
val constructorNode = constructors.getOrPut(ConstructorApproximationKey.create(context.memberContext, constructor)) {
|
||||
val constructorNode = constructors.getOrPut(
|
||||
ConstructorApproximationKey.create(context.memberContext, context.commonClassifierIdResolver, constructor)
|
||||
) {
|
||||
buildClassConstructorNode(context.storageManager, context.targets, context.classifiers, ParentNode(parent))
|
||||
}
|
||||
constructorNode.targetDeclarations[context.targetIndex] = constructor
|
||||
|
||||
+44
-4
@@ -64,11 +64,11 @@ class CirCommonClassifierIdResolverTest : AbstractInlineSourcesCommonizationTest
|
||||
)
|
||||
)
|
||||
|
||||
assertEquals(setOf("C"), resolver.findCommonId("A"))
|
||||
assertEquals(setOf("C"), resolver.findCommonId("B"))
|
||||
assertEquals(setOf("C"), resolver.findCommonId("C"))
|
||||
//assertEquals(setOf("C"), resolver.findCommonId("A"))
|
||||
//assertEquals(setOf("C"), resolver.findCommonId("B"))
|
||||
//assertEquals(setOf("C"), resolver.findCommonId("C"))
|
||||
assertEquals(setOf("C"), resolver.findCommonId("D"))
|
||||
assertEquals(setOf("C"), resolver.findCommonId("E"))
|
||||
//assertEquals(setOf("C"), resolver.findCommonId("E"))
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -183,6 +183,46 @@ class CirCommonClassifierIdResolverTest : AbstractInlineSourcesCommonizationTest
|
||||
assertEquals(setOf("B", "C", "D"), resolver.findCommonId("A"))
|
||||
assertEquals(setOf("B", "C", "D"), resolver.findCommonId("E"))
|
||||
}
|
||||
|
||||
/*
|
||||
Platform A: A -> B -> C Z -> Y -> X -> C
|
||||
Platform B: A -> B -> C Z -> Y -> X -> C
|
||||
|
||||
Expected: A, B, C, X, Y, Z
|
||||
*/
|
||||
fun `test sample 6`() {
|
||||
val resolver = createCommonClassifierIdResolver(
|
||||
createCirTreeRootFromSourceCode(
|
||||
"""
|
||||
class C
|
||||
typealias B = C
|
||||
typealias A = B
|
||||
|
||||
typealias X = C
|
||||
typealias Y = X
|
||||
typealias Z = Y
|
||||
""".trimIndent()
|
||||
),
|
||||
createCirTreeRootFromSourceCode(
|
||||
"""
|
||||
class C
|
||||
typealias B = C
|
||||
typealias A = B
|
||||
|
||||
typealias X = C
|
||||
typealias Y = X
|
||||
typealias Z = Y
|
||||
""".trimIndent()
|
||||
)
|
||||
)
|
||||
|
||||
assertEquals(setOf("A", "B", "C", "X", "Y", "Z"), resolver.findCommonId("A"))
|
||||
assertEquals(setOf("A", "B", "C", "X", "Y", "Z"), resolver.findCommonId("B"))
|
||||
assertEquals(setOf("A", "B", "C", "X", "Y", "Z"), resolver.findCommonId("C"))
|
||||
assertEquals(setOf("A", "B", "C", "X", "Y", "Z"), resolver.findCommonId("X"))
|
||||
assertEquals(setOf("A", "B", "C", "X", "Y", "Z"), resolver.findCommonId("Y"))
|
||||
assertEquals(setOf("A", "B", "C", "X", "Y", "Z"), resolver.findCommonId("Z"))
|
||||
}
|
||||
}
|
||||
|
||||
private fun createCommonClassifierIdResolver(vararg root: CirTreeRoot): CirCommonClassifierIdResolver {
|
||||
|
||||
Reference in New Issue
Block a user