[FIR] Resolve arguments of error types during type resolution

This commit is contained in:
Dmitriy Novozhilov
2022-09-23 14:46:01 +03:00
committed by Space Team
parent bc93556dbb
commit bd26c29229
13 changed files with 109 additions and 63 deletions
@@ -59,7 +59,6 @@ import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
import org.jetbrains.kotlin.resolve.descriptorUtil.isPublishedApi
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.DEFAULT_CONSTRUCTOR_MARKER
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE
import org.jetbrains.kotlin.resolve.jvm.JAVA_LANG_RECORD_FQ_NAME
@@ -76,6 +75,7 @@ import org.jetbrains.kotlin.types.checker.convertVariance
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.*
import org.jetbrains.kotlin.types.model.*
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.addToStdlib.zipWithNulls
import org.jetbrains.org.objectweb.asm.Opcodes.*
import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.org.objectweb.asm.commons.Method
@@ -1446,10 +1446,10 @@ class KotlinTypeMapper @JvmOverloads constructor(
SimpleClassicTypeSystemContext.getVarianceForWildcard(parameter, projection, mode)
private fun TypeSystemCommonBackendContext.getVarianceForWildcard(
parameter: TypeParameterMarker, projection: TypeArgumentMarker, mode: TypeMappingMode
parameter: TypeParameterMarker?, projection: TypeArgumentMarker, mode: TypeMappingMode
): Variance {
val projectionKind = projection.getVariance().convertVariance()
val parameterVariance = parameter.getVariance().convertVariance()
val parameterVariance = parameter?.getVariance()?.convertVariance() ?: Variance.INVARIANT
if (parameterVariance == Variance.INVARIANT) {
return projectionKind
@@ -1465,7 +1465,7 @@ class KotlinTypeMapper @JvmOverloads constructor(
return Variance.INVARIANT
}
if (parameterVariance == Variance.IN_VARIANCE && isMostPreciseContravariantArgument(projection.getType(), parameter)) {
if (parameterVariance == Variance.IN_VARIANCE && isMostPreciseContravariantArgument(projection.getType())) {
return Variance.INVARIANT
}
}
@@ -1484,10 +1484,11 @@ class KotlinTypeMapper @JvmOverloads constructor(
mode: TypeMappingMode,
mapType: (KotlinTypeMarker, JvmSignatureWriter, TypeMappingMode) -> Type
) {
for ((parameter, argument) in parameters.zip(arguments)) {
for ((parameter, argument) in parameters.zipWithNulls(arguments)) {
if (argument == null) break
if (argument.isStarProjection() ||
// In<Nothing, Foo> == In<*, Foo> -> In<?, Foo>
argument.getType().isNothing() && parameter.getVariance() == TypeVariance.IN
argument.getType().isNothing() && parameter?.getVariance() == TypeVariance.IN
) {
signatureVisitor.writeUnboundedWildcard()
} else {
@@ -1496,10 +1497,11 @@ class KotlinTypeMapper @JvmOverloads constructor(
signatureVisitor.writeTypeArgument(projectionKind)
val parameterVariance = parameter?.getVariance()?.convertVariance() ?: Variance.INVARIANT
mapType(
argument.getType(), signatureVisitor,
argumentMode.toGenericArgumentMode(
getEffectiveVariance(parameter.getVariance().convertVariance(), argument.getVariance().convertVariance())
getEffectiveVariance(parameterVariance, argument.getVariance().convertVariance())
)
)
@@ -37,11 +37,8 @@ import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext
import org.jetbrains.kotlin.types.checker.convertVariance
import org.jetbrains.kotlin.types.getEffectiveVariance
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
import org.jetbrains.kotlin.types.model.TypeParameterMarker
// TODO: probably class upper bound should be used
@Suppress("UNUSED_PARAMETER")
fun TypeSystemCommonBackendContext.isMostPreciseContravariantArgument(type: KotlinTypeMarker, parameter: TypeParameterMarker): Boolean =
fun TypeSystemCommonBackendContext.isMostPreciseContravariantArgument(type: KotlinTypeMarker): Boolean =
type.typeConstructor().isAnyConstructor()
fun TypeSystemCommonBackendContext.isMostPreciseCovariantArgument(type: KotlinTypeMarker): Boolean =
@@ -62,7 +59,7 @@ private fun TypeSystemCommonBackendContext.canHaveSubtypesIgnoringNullability(ko
val effectiveVariance = getEffectiveVariance(parameter.getVariance().convertVariance(), projectionKind)
if (effectiveVariance == Variance.OUT_VARIANCE && !isMostPreciseCovariantArgument(type)) return true
if (effectiveVariance == Variance.IN_VARIANCE && !isMostPreciseContravariantArgument(type, parameter)) return true
if (effectiveVariance == Variance.IN_VARIANCE && !isMostPreciseContravariantArgument(type)) return true
}
return false