@@ -72,6 +72,9 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
72
72
def knownType (tree : Tree ) =
73
73
tree.attachmentOrElse(RecheckedType , tree.tpe)
74
74
75
+ def needsRecompletion (tree : ValOrDefDef )(using Context ): Boolean =
76
+ tree.tpt.hasAttachment(RecheckedType ) && ! tree.symbol.isConstructor
77
+
75
78
def transformType (tp : Type , inferred : Boolean )(using Context ): Type = tp
76
79
77
80
object transformTypes extends TreeTraverser :
@@ -80,7 +83,7 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
80
83
tree match
81
84
case tree : TypeTree =>
82
85
transformType(tree.tpe, tree.isInstanceOf [InferredTypeTree ]).rememberFor(tree)
83
- case tree : ValOrDefDef if tree.tpt.hasAttachment( RecheckedType ) =>
86
+ case tree : ValOrDefDef if needsRecompletion(tree ) =>
84
87
val sym = tree.symbol
85
88
def integrateRT (restp : Type , info : Type , psymss : List [List [Symbol ]]): Type = info match
86
89
case info : MethodOrPoly =>
@@ -90,10 +93,13 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
90
93
info.derivedExprType(resType = restp)
91
94
case _ =>
92
95
restp
93
- if ! sym.isConstructor then
94
- val info1 = integrateRT(knownType(tree.tpt), sym.info, sym.paramSymss)
95
- recheckr.println(i " update info $sym: ${sym.info} --> $info1" )
96
- sym.updateInfo(info1)
96
+ val newInfo = integrateRT(knownType(tree.tpt), sym.info, sym.paramSymss)
97
+ .showing(i " update info $sym: ${sym.info} --> $result" , recheckr)
98
+ val completer = new LazyType :
99
+ def complete (denot : SymDenotation )(using Context ) =
100
+ denot.info = newInfo
101
+ recheckDef(tree, sym)
102
+ sym.updateInfo(completer)
97
103
case tree : Bind =>
98
104
val sym = tree.symbol
99
105
sym.updateInfo(transformType(sym.info, inferred = true ))
@@ -133,15 +139,13 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
133
139
val exprType = recheck(expr, defn.UnitType )
134
140
bindType
135
141
136
- def recheckValDef (tree : ValDef , sym : Symbol )(using Context ): Type =
142
+ def recheckValDef (tree : ValDef , sym : Symbol )(using Context ): Unit =
137
143
if ! tree.rhs.isEmpty then recheck(tree.rhs, sym.info)
138
- sym.termRef
139
144
140
- def recheckDefDef (tree : DefDef , sym : Symbol )(using Context ): Type =
145
+ def recheckDefDef (tree : DefDef , sym : Symbol )(using Context ): Unit =
141
146
val rhsCtx = linkConstructorParams(sym)
142
147
if ! tree.rhs.isEmpty && ! sym.isInlineMethod && ! sym.isEffectivelyErased then
143
148
inContext(rhsCtx) { recheck(tree.rhs, recheck(tree.tpt)) }
144
- sym.termRef
145
149
146
150
def recheckTypeDef (tree : TypeDef , sym : Symbol )(using Context ): Type =
147
151
recheck(tree.rhs)
@@ -281,6 +285,13 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
281
285
def recheckStats (stats : List [Tree ])(using Context ): Unit =
282
286
stats.foreach(recheck(_))
283
287
288
+ def recheckDef (tree : ValOrDefDef , sym : Symbol )(using Context ): Unit =
289
+ inContext(ctx.localContext(tree, sym)) {
290
+ tree match
291
+ case tree : ValDef => recheckValDef(tree, sym)
292
+ case tree : DefDef => recheckDefDef(tree, sym)
293
+ }
294
+
284
295
/** Recheck tree without adapting it, returning its new type.
285
296
* @param tree the original tree
286
297
* @param pt the expected result type
@@ -293,11 +304,12 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
293
304
case tree : Ident => recheckIdent(tree)
294
305
case tree : Select => recheckSelect(tree)
295
306
case tree : Bind => recheckBind(tree, pt)
296
- case tree : ValDef =>
307
+ case tree : ValOrDefDef =>
297
308
if tree.isEmpty then NoType
298
- else recheckValDef(tree, sym)(using ctx.localContext(tree, sym))
299
- case tree : DefDef =>
300
- recheckDefDef(tree, sym)(using ctx.localContext(tree, sym))
309
+ else
310
+ if needsRecompletion(tree) then sym.ensureCompleted()
311
+ else recheckDef(tree, sym)
312
+ sym.termRef
301
313
case tree : TypeDef =>
302
314
tree.rhs match
303
315
case impl : Template =>
0 commit comments