@@ -96,29 +96,28 @@ class CheckCaptures extends RefineTypes:
96
96
97
97
inline val disallowGlobal = true
98
98
99
- def checkRelativeVariance (mt : MethodType , whole : Type , pos : SrcPos )(using Context ) = new TypeTraverser :
100
- def traverse (tp : Type ): Unit = tp match
101
- case CapturingType (parent, ref @ TermParamRef (`mt`, _)) =>
102
- if variance <= 0 then
103
- val direction = if variance < 0 then " contra" else " in"
104
- report.error(em " captured reference $ref appears ${direction}variantly in type $whole" , pos)
105
- traverse(parent)
106
- case _ =>
107
- traverseChildren(tp)
108
-
109
99
def checkWellFormed (whole : Type , pos : SrcPos )(using Context ): Unit =
100
+ def checkRelativeVariance (mt : MethodType ) = new TypeTraverser :
101
+ def traverse (tp : Type ): Unit = tp match
102
+ case CapturingType (parent, ref @ TermParamRef (`mt`, _)) =>
103
+ if variance <= 0 then
104
+ val direction = if variance < 0 then " contra" else " in"
105
+ report.error(em " captured reference $ref appears ${direction}variantly in type $whole" , pos)
106
+ traverse(parent)
107
+ case _ =>
108
+ traverseChildren(tp)
110
109
val checkVariance = new TypeTraverser :
111
110
def traverse (tp : Type ): Unit = tp match
112
111
case mt : MethodType if mt.isResultDependent =>
113
- checkRelativeVariance(mt, whole, pos ).traverse(mt)
112
+ checkRelativeVariance(mt).traverse(mt)
114
113
case _ =>
115
114
traverseChildren(tp)
116
115
checkVariance.traverse(whole)
117
116
118
117
object PostRefinerCheck extends TreeTraverser :
119
118
def traverse (tree : Tree )(using Context ) =
120
119
tree match
121
- case tree1 @ TypeApply (fn, args) =>
120
+ case tree1 @ TypeApply (fn, args) if disallowGlobal =>
122
121
for arg <- args do
123
122
// println(i"checking $arg in $tree: ${arg.tpe.captureSet}")
124
123
for ref <- arg.tpe.captureSet.elems do
@@ -137,22 +136,17 @@ class CheckCaptures extends RefineTypes:
137
136
report.error(msg, arg.srcPos)
138
137
case tree : TypeTree =>
139
138
// it's inferred, no need to check
140
- case tree : TypTree =>
139
+ case _ : TypTree | _ : Closure =>
141
140
checkWellFormed(tree.tpe, tree.srcPos)
142
141
case tree : DefDef =>
143
142
def check (tp : Type ): Unit = tp match
144
- case tp : PolyType =>
145
- check(tp.resType)
146
- case mt : MethodType =>
147
- if mt.isResultDependent then
148
- checkRelativeVariance(mt, tree.symbol.info, ctx.source.atSpan(tree.nameSpan)).traverse(mt)
149
- check(mt.resType)
143
+ case tp : MethodOrPoly => check(tp.resType)
150
144
case _ =>
151
145
check(tree.symbol.info)
152
146
case _ =>
153
147
traverseChildren(tree)
154
148
155
149
def postRefinerCheck (tree : tpd.Tree )(using Context ): Unit =
156
- if disallowGlobal then PostRefinerCheck .traverse(tree)
150
+ PostRefinerCheck .traverse(tree)
157
151
158
152
end CheckCaptures
0 commit comments