@@ -72,9 +72,6 @@ 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
-
78
75
def transformType (tp : Type , inferred : Boolean )(using Context ): Type = tp
79
76
80
77
object transformTypes extends TreeTraverser :
@@ -83,7 +80,7 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
83
80
tree match
84
81
case tree : TypeTree =>
85
82
transformType(tree.tpe, tree.isInstanceOf [InferredTypeTree ]).rememberFor(tree)
86
- case tree : ValOrDefDef if needsRecompletion(tree) =>
83
+ case tree : ValOrDefDef =>
87
84
val sym = tree.symbol
88
85
def integrateRT (restp : Type , info : Type , psymss : List [List [Symbol ]]): Type = info match
89
86
case info : MethodOrPoly =>
@@ -93,13 +90,15 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
93
90
info.derivedExprType(resType = restp)
94
91
case _ =>
95
92
restp
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)
93
+ if tree.tpt.hasAttachment(RecheckedType ) && ! sym.isConstructor then
94
+ val newInfo = integrateRT(knownType(tree.tpt), sym.info, sym.paramSymss)
95
+ .showing(i " update info $sym: ${sym.info} --> $result" , recheckr)
96
+ if newInfo ne sym.info then
97
+ val completer = new LazyType :
98
+ def complete (denot : SymDenotation )(using Context ) =
99
+ denot.info = newInfo
100
+ recheckDef(tree, sym)
101
+ sym.updateInfo(completer)
103
102
case tree : Bind =>
104
103
val sym = tree.symbol
105
104
sym.updateInfo(transformType(sym.info, inferred = true ))
@@ -307,7 +306,10 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
307
306
case tree : ValOrDefDef =>
308
307
if tree.isEmpty then NoType
309
308
else
310
- if needsRecompletion(tree) then sym.ensureCompleted()
309
+ val isUpdated =
310
+ val symd = sym.denot
311
+ symd.validFor.firstPhaseId == thisPhase.id && (sym.originDenotation ne symd)
312
+ if isUpdated then sym.ensureCompleted()
311
313
else recheckDef(tree, sym)
312
314
sym.termRef
313
315
case tree : TypeDef =>
0 commit comments