@@ -331,11 +331,12 @@ extends tpd.TreeTraverser:
331
331
else expandAbbreviations(tp1)
332
332
333
333
/** Transform type of type tree, and remember the transformed type as the type the tree */
334
- private def transformTT (tree : TypeTree , boxed : Boolean )(using Context ): Unit =
335
- tree.rememberType(
336
- if tree.isInstanceOf [InferredTypeTree ]
337
- then transformInferredType(tree.tpe, boxed)
338
- else transformExplicitType(tree.tpe, boxed))
334
+ private def transformTT (tree : TypeTree , boxed : Boolean , exact : Boolean )(using Context ): Unit =
335
+ if ! tree.hasRememberedType then
336
+ tree.rememberType(
337
+ if tree.isInstanceOf [InferredTypeTree ] && ! exact
338
+ then transformInferredType(tree.tpe, boxed)
339
+ else transformExplicitType(tree.tpe, boxed))
339
340
340
341
/** Substitute parameter symbols in `from` to paramRefs in corresponding
341
342
* method or poly types `to`. We use a single BiTypeMap to do everything.
@@ -376,20 +377,34 @@ extends tpd.TreeTraverser:
376
377
377
378
def traverse (tree : Tree )(using Context ): Unit =
378
379
tree match
379
- case tree : DefDef if isExcluded(tree.symbol) =>
380
- return
381
- case tree @ ValDef (_, tpt : TypeTree , _) if tree.symbol.is(Mutable ) =>
382
- transformTT(tpt, boxed = true ) // types of mutable variables are boxed
383
- traverse(tree.rhs)
380
+ case tree : DefDef =>
381
+ if isExcluded(tree.symbol) then
382
+ return
383
+ tree.tpt match
384
+ case tpt : TypeTree if tree.symbol.allOverriddenSymbols.hasNext =>
385
+ transformTT(tpt, boxed = false , exact = true )
386
+ // println(i"TYPE of ${tree.symbol.showLocated} = ${tpt.knownType}")
387
+ case _ =>
388
+ traverseChildren(tree)
389
+ case tree @ ValDef (_, tpt : TypeTree , _) =>
390
+ val isVar = tree.symbol.is(Mutable )
391
+ val overrides = tree.symbol.allOverriddenSymbols.hasNext
392
+ // if overrides then println(i"transforming overriding ${tree.symbol}")
393
+ if isVar || overrides then
394
+ transformTT(tpt,
395
+ boxed = isVar, // types of mutable variables are boxed
396
+ exact = overrides // types of symbols that override a parent don't get a capture set
397
+ )
398
+ traverseChildren(tree)
384
399
case tree @ TypeApply (fn, args) =>
385
400
traverse(fn)
386
401
for case arg : TypeTree <- args do
387
- transformTT(arg, boxed = true ) // type arguments in type applications are boxed
402
+ transformTT(arg, boxed = true , exact = false ) // type arguments in type applications are boxed
388
403
case _ =>
389
404
traverseChildren(tree)
390
405
tree match
391
406
case tree : TypeTree =>
392
- transformTT(tree, boxed = false ) // other types are not boxed
407
+ transformTT(tree, boxed = false , exact = false ) // other types are not boxed
393
408
case tree : ValOrDefDef =>
394
409
val sym = tree.symbol
395
410
0 commit comments