Optimal type mapping modes for UAST

As shown in (DEFALUT | GENERIC_ARGUMENT)_UAST, UAST's PsiType mapping
needs an automatic expansion of type alias. This commit makes utils that
generate optimal type mapping modes for return / parameter to consider
if this is used for UAST. In that case, utils will set `mapTypeAliases`
true so that typealias (even inside type arguments) can be expanded
properly.
This commit is contained in:
Jinseong Jeon
2022-12-06 10:07:54 -08:00
committed by Ilya Kirillov
parent 485fad1951
commit e89a387cd4
@@ -9,23 +9,26 @@ import org.jetbrains.kotlin.types.TypeSystemCommonBackendContext
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
fun TypeSystemCommonBackendContext.getOptimalModeForValueParameter(
type: KotlinTypeMarker
): TypeMappingMode = getOptimalModeForSignaturePart(type, canBeUsedInSupertypePosition = true)
type: KotlinTypeMarker,
isForUast: Boolean = false,
): TypeMappingMode = getOptimalModeForSignaturePart(type, canBeUsedInSupertypePosition = true, isForUast)
fun TypeSystemCommonBackendContext.getOptimalModeForReturnType(
type: KotlinTypeMarker,
isAnnotationMethod: Boolean
isAnnotationMethod: Boolean,
isForUast: Boolean = false,
): TypeMappingMode {
return if (isAnnotationMethod)
TypeMappingMode.VALUE_FOR_ANNOTATION
else
getOptimalModeForSignaturePart(type, canBeUsedInSupertypePosition = false)
getOptimalModeForSignaturePart(type, canBeUsedInSupertypePosition = false, isForUast)
}
@OptIn(TypeMappingModeInternals::class)
private fun TypeSystemCommonBackendContext.getOptimalModeForSignaturePart(
type: KotlinTypeMarker,
canBeUsedInSupertypePosition: Boolean
canBeUsedInSupertypePosition: Boolean,
isForUast: Boolean = false,
): TypeMappingMode {
if (type.argumentsCount() == 0) return TypeMappingMode.DEFAULT
@@ -33,7 +36,7 @@ private fun TypeSystemCommonBackendContext.getOptimalModeForSignaturePart(
if (isInlineClassType && shouldUseUnderlyingType(type)) {
val underlyingType = computeUnderlyingType(type)
if (underlyingType != null) {
return getOptimalModeForSignaturePart(underlyingType, canBeUsedInSupertypePosition).dontWrapInlineClassesMode()
return getOptimalModeForSignaturePart(underlyingType, canBeUsedInSupertypePosition, isForUast).dontWrapInlineClassesMode()
}
}
@@ -45,15 +48,17 @@ private fun TypeSystemCommonBackendContext.getOptimalModeForSignaturePart(
val invariantArgumentMode =
if (canBeUsedInSupertypePosition)
getOptimalModeForSignaturePart(type, canBeUsedInSupertypePosition = false)
getOptimalModeForSignaturePart(type, canBeUsedInSupertypePosition = false, isForUast)
else
null
return TypeMappingMode(
skipDeclarationSiteWildcards = !canBeUsedInSupertypePosition,
skipDeclarationSiteWildcardsIfPossible = true,
genericArgumentMode = if (isForUast) TypeMappingMode.GENERIC_ARGUMENT_UAST else null,
genericContravariantArgumentMode = contravariantArgumentMode,
genericInvariantArgumentMode = invariantArgumentMode,
needInlineClassWrapping = !isInlineClassType
needInlineClassWrapping = !isInlineClassType,
mapTypeAliases = isForUast
)
}