[Commonizer] ClassOrTypeAliasTypeCommonizer: Improve comments
^KT-48288
This commit is contained in:
committed by
Space
parent
7485d2529b
commit
de1ae970d7
+11
-4
@@ -92,7 +92,7 @@ internal class ClassOrTypeAliasTypeCommonizer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun substituteTypesIfNecessary(types: List<CirClassOrTypeAliasType>): List<CirClassOrTypeAliasType>? {
|
private fun substituteTypesIfNecessary(types: List<CirClassOrTypeAliasType>): List<CirClassOrTypeAliasType>? {
|
||||||
// Not necessary
|
/* No substitution is necessary if all types use the same classifierId */
|
||||||
if (types.singleDistinctValueOrNull { it.classifierId } != null) return types
|
if (types.singleDistinctValueOrNull { it.classifierId } != null) return types
|
||||||
val classifierId = selectSubstitutionClassifierId(types) ?: return null
|
val classifierId = selectSubstitutionClassifierId(types) ?: return null
|
||||||
return types.mapIndexed { targetIndex, type -> substituteIfNecessary(targetIndex, type, classifierId) ?: return null }
|
return types.mapIndexed { targetIndex, type -> substituteIfNecessary(targetIndex, type, classifierId) ?: return null }
|
||||||
@@ -138,11 +138,15 @@ internal class ClassOrTypeAliasTypeCommonizer(
|
|||||||
destinationTypeAliasId: CirEntityId,
|
destinationTypeAliasId: CirEntityId,
|
||||||
destinationTypeAlias: CirTypeAlias
|
destinationTypeAlias: CirTypeAlias
|
||||||
): CirTypeAliasType? {
|
): CirTypeAliasType? {
|
||||||
// Limitation: No backwards substitution with arguments
|
/*
|
||||||
|
Limitation: We do not support 'backwards' type substitution if either source or destination types are parameterized.
|
||||||
|
Selecting reasonable arguments for such types would be complicated and we do not know real life APIs that would indeed
|
||||||
|
benefit from support.
|
||||||
|
*/
|
||||||
if (sourceType.arguments.isNotEmpty()) return null
|
if (sourceType.arguments.isNotEmpty()) return null
|
||||||
if (destinationTypeAlias.typeParameters.isNotEmpty()) return null
|
if (destinationTypeAlias.typeParameters.isNotEmpty()) return null
|
||||||
|
|
||||||
// Check if any 'backward' type has arguments
|
/* Check if any type in the intermediate ta chain has arguments */
|
||||||
generateSequence(destinationTypeAlias.underlyingType) { type -> type.safeAs<CirTypeAliasType>()?.underlyingType }
|
generateSequence(destinationTypeAlias.underlyingType) { type -> type.safeAs<CirTypeAliasType>()?.underlyingType }
|
||||||
.takeWhile { type -> type.classifierId != sourceType.classifierId }
|
.takeWhile { type -> type.classifierId != sourceType.classifierId }
|
||||||
.forEach { type -> if (type.arguments.isNotEmpty()) return null } // limitation!
|
.forEach { type -> if (type.arguments.isNotEmpty()) return null } // limitation!
|
||||||
@@ -161,7 +165,10 @@ internal class ClassOrTypeAliasTypeCommonizer(
|
|||||||
destinationTypeAliasId: CirEntityId,
|
destinationTypeAliasId: CirEntityId,
|
||||||
destinationTypeAlias: CirProvided.TypeAlias
|
destinationTypeAlias: CirProvided.TypeAlias
|
||||||
): CirClassOrTypeAliasType? {
|
): CirClassOrTypeAliasType? {
|
||||||
// Limitation: No backwards substitution with arguments
|
/*
|
||||||
|
Limitation: We do not support 'backwards type substitution with arguments.
|
||||||
|
See 'backwardsSubstitute implementation for CirTypeAlias for more details.
|
||||||
|
*/
|
||||||
if (sourceType.arguments.isNotEmpty()) return null
|
if (sourceType.arguments.isNotEmpty()) return null
|
||||||
if (destinationTypeAlias.typeParameters.isNotEmpty()) return null
|
if (destinationTypeAlias.typeParameters.isNotEmpty()) return null
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user