@@ -159,9 +159,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
159159 override def prepareForValDef (tree : ValDef )(using Context ): Context =
160160 if ! tree.symbol.is(Deferred ) && tree.rhs.symbol != defn.Predef_undefined then
161161 refInfos.register(tree)
162- tree.tpt match
163- case RefinedTypeTree (_, refinements) => relax(tree.rhs, refinements)
164- case _ =>
162+ relax(tree.rhs, tree.tpt.tpe)
165163 ctx
166164 override def transformValDef (tree : ValDef )(using Context ): tree.type =
167165 traverseAnnotations(tree.symbol)
@@ -183,9 +181,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
183181 refInfos.inliners += 1
184182 else if ! tree.symbol.is(Deferred ) && tree.rhs.symbol != defn.Predef_undefined then
185183 refInfos.register(tree)
186- tree.tpt match
187- case RefinedTypeTree (_, refinements) => relax(tree.rhs, refinements)
188- case _ =>
184+ relax(tree.rhs, tree.tpt.tpe)
189185 ctx
190186 override def transformDefDef (tree : DefDef )(using Context ): tree.type =
191187 traverseAnnotations(tree.symbol)
@@ -902,15 +898,21 @@ object CheckUnused:
902898 case tree => traverseChildren(tree)
903899
904900 // NoWarn members in tree that correspond to refinements; currently uses only names.
905- def relax (tree : Tree , refinements : List [Tree ])(using Context ): Unit =
906- val names = refinements.collect { case named : NamedDefTree => named.name }.toSet
907- val relaxer = new TreeTraverser :
908- def traverse (tree : Tree )(using Context ) =
909- tree match
910- case tree : NamedDefTree if names(tree.name) => tree.withAttachment(NoWarn , ())
911- case _ =>
912- traverseChildren(tree)
913- relaxer.traverse(tree)
901+ def relax (tree : Tree , tpe : Type )(using Context ): Unit =
902+ def refinements (tpe : Type , names : List [Name ]): List [Name ] =
903+ tpe match
904+ case RefinedType (parent, refinedName, refinedInfo) => refinedName :: refinements(parent, names)
905+ case _ => names
906+ val refinedNames = refinements(tpe, Nil )
907+ if ! refinedNames.isEmpty then
908+ val names = refinedNames.toSet
909+ val relaxer = new TreeTraverser :
910+ def traverse (tree : Tree )(using Context ) =
911+ tree match
912+ case tree : NamedDefTree if names(tree.name) => tree.withAttachment(NoWarn , ())
913+ case _ =>
914+ traverseChildren(tree)
915+ relaxer.traverse(tree)
914916
915917 extension (nm : Name )
916918 inline def exists (p : Name => Boolean ): Boolean = nm.ne(nme.NO_NAME ) && p(nm)
0 commit comments