@@ -331,11 +331,12 @@ extends tpd.TreeTraverser:
331331 else expandAbbreviations(tp1)
332332
333333 /** 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))
339340
340341 /** Substitute parameter symbols in `from` to paramRefs in corresponding
341342 * method or poly types `to`. We use a single BiTypeMap to do everything.
@@ -376,20 +377,34 @@ extends tpd.TreeTraverser:
376377
377378 def traverse (tree : Tree )(using Context ): Unit =
378379 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)
384399 case tree @ TypeApply (fn, args) =>
385400 traverse(fn)
386401 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
388403 case _ =>
389404 traverseChildren(tree)
390405 tree match
391406 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
393408 case tree : ValOrDefDef =>
394409 val sym = tree.symbol
395410
0 commit comments