[FIR] Resolve arguments of error types during type resolution
This commit is contained in:
committed by
Space Team
parent
bc93556dbb
commit
bd26c29229
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user