Skip to content

Commit b35eeb0

Browse files
committed
Only recomplete symbols if their info changes
1 parent 674f5a8 commit b35eeb0

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

compiler/src/dotty/tools/dotc/transform/Recheck.scala

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,6 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
7272
def knownType(tree: Tree) =
7373
tree.attachmentOrElse(RecheckedType, tree.tpe)
7474

75-
def needsRecompletion(tree: ValOrDefDef)(using Context): Boolean =
76-
tree.tpt.hasAttachment(RecheckedType) && !tree.symbol.isConstructor
77-
7875
def transformType(tp: Type, inferred: Boolean)(using Context): Type = tp
7976

8077
object transformTypes extends TreeTraverser:
@@ -83,7 +80,7 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
8380
tree match
8481
case tree: TypeTree =>
8582
transformType(tree.tpe, tree.isInstanceOf[InferredTypeTree]).rememberFor(tree)
86-
case tree: ValOrDefDef if needsRecompletion(tree) =>
83+
case tree: ValOrDefDef =>
8784
val sym = tree.symbol
8885
def integrateRT(restp: Type, info: Type, psymss: List[List[Symbol]]): Type = info match
8986
case info: MethodOrPoly =>
@@ -93,13 +90,15 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
9390
info.derivedExprType(resType = restp)
9491
case _ =>
9592
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)
103102
case tree: Bind =>
104103
val sym = tree.symbol
105104
sym.updateInfo(transformType(sym.info, inferred = true))
@@ -307,7 +306,10 @@ abstract class Recheck extends Phase, IdentityDenotTransformer:
307306
case tree: ValOrDefDef =>
308307
if tree.isEmpty then NoType
309308
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()
311313
else recheckDef(tree, sym)
312314
sym.termRef
313315
case tree: TypeDef =>

0 commit comments

Comments
 (0)