@@ -25,22 +25,22 @@ class Variance(pipelineContext: PipelineContext) {
25
25
val id = Id (remoteId.name, remoteId.arity)
26
26
DbApi .getType(remoteId.module, id) match {
27
27
case Some (tDecl) =>
28
- tDecl.params.map(varType => varianceOf(tDecl.body, varType.n, isPositivePosition = true ).get )
28
+ tDecl.params.map(varType => varianceOf(tDecl.body, varType.n, isPositivePosition = true ))
29
29
case None =>
30
30
// Opaques are covariant
31
31
DbApi .getPrivateOpaque(remoteId.module, id).get.params.map(_ => Covariant )
32
32
}
33
33
}
34
34
35
- private def varianceOf (ty : Type , tv : Var , isPositivePosition : Boolean ): Option [ Variance .Variance ] =
35
+ private def varianceOf (ty : Type , tv : Var , isPositivePosition : Boolean ): Variance .Variance =
36
36
getVarianceOf(ty, tv, isPositivePosition)(history = Set ())
37
37
38
38
private def getVarianceOf (ty : Type , tv : Var , isPositivePosition : Boolean )(implicit
39
39
history : Set [(RemoteType , Boolean )]
40
- ): Option [ Variance .Variance ] = ty match {
40
+ ): Variance .Variance = ty match {
41
41
case VarType (n) if tv == n =>
42
- if (isPositivePosition) Some ( Covariant )
43
- else Some ( Contravariant )
42
+ if (isPositivePosition) Covariant
43
+ else Contravariant
44
44
case FunType (forall, argTys, resTy) =>
45
45
// forall can only be non-empty only for top-level fun types
46
46
// corresponding to generic specs
@@ -49,7 +49,7 @@ class Variance(pipelineContext: PipelineContext) {
49
49
combineVariances(variances)
50
50
case t @ RemoteType (rid, args) =>
51
51
if (history((t, isPositivePosition))) {
52
- Some ( Constant )
52
+ Constant
53
53
} else {
54
54
val body = util.getTypeDeclBody(rid, args)
55
55
getVarianceOf(body, tv, isPositivePosition)(history + ((t, isPositivePosition)))
@@ -61,27 +61,24 @@ class Variance(pipelineContext: PipelineContext) {
61
61
62
62
private def toTopLevelVariance (ft : FunType , tv : Var ): Variance .Variance =
63
63
varianceOf(ft.resTy, tv, isPositivePosition = true ) match {
64
- case Some (variance) =>
65
- variance
66
- case None =>
67
- combineVariances(ft.argTys.map(varianceOf(_, tv, isPositivePosition = false ))).getOrElse(Constant ) match {
64
+ case Constant =>
65
+ combineVariances(ft.argTys.map(varianceOf(_, tv, isPositivePosition = false ))) match {
68
66
case Constant | Covariant | Invariant =>
69
67
Covariant
70
68
case Contravariant =>
71
69
Contravariant
72
70
}
71
+ case variance =>
72
+ variance
73
73
}
74
74
75
- private def combineVariances (variances : List [Option [ Variance .Variance ]] ): Option [ Variance .Variance ] =
76
- variances.foldLeft(None : Option [ Variance .Variance ] )((v1Opt, v2Opt) =>
75
+ private def combineVariances (variances : List [Variance .Variance ]): Variance .Variance =
76
+ variances.foldLeft(Constant : Variance .Variance )((v1Opt, v2Opt) =>
77
77
(v1Opt, v2Opt) match {
78
- case (None , Some (v)) => Some (v)
79
- case (Some (v), None ) => Some (v)
80
- case (v, Some (Constant )) => v
81
- case (Some (Constant ), v) => v
82
- case (None , None ) => None
83
- case (Some (v1), Some (v2)) if v1 == v2 => Some (v1)
84
- case (Some (_), Some (_)) => Some (Invariant )
78
+ case (v, Constant ) => v
79
+ case (Constant , v) => v
80
+ case (v1, v2) if v1 == v2 => v1
81
+ case (_, _) => Invariant
85
82
}
86
83
)
87
84
}
0 commit comments