@@ -172,9 +172,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
172172  override  def  prepareForValDef (tree : ValDef )(using  Context ):  Context  = 
173173    if  ! tree.symbol.is(Deferred ) &&  tree.rhs.symbol !=  defn.Predef_undefined  then 
174174      refInfos.register(tree)
175-     tree.tpt match 
176-     case  RefinedTypeTree (_, refinements) =>  relax(tree.rhs, refinements)
177-     case  _ => 
175+     relax(tree.rhs, tree.tpt.tpe)
178176    ctx
179177  override  def  transformValDef (tree : ValDef )(using  Context ):  tree.type  = 
180178    traverseAnnotations(tree.symbol)
@@ -198,9 +196,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
198196      refInfos.inliners +=  1 
199197    else  if  ! tree.symbol.is(Deferred ) &&  tree.rhs.symbol !=  defn.Predef_undefined  then 
200198      refInfos.register(tree)
201-     tree.tpt match 
202-     case  RefinedTypeTree (_, refinements) =>  relax(tree.rhs, refinements)
203-     case  _ => 
199+     relax(tree.rhs, tree.tpt.tpe)
204200    ctx
205201  override  def  transformDefDef (tree : DefDef )(using  Context ):  tree.type  = 
206202    traverseAnnotations(tree.symbol)
@@ -864,15 +860,21 @@ object CheckUnused:
864860      case  tree =>  traverseChildren(tree)
865861
866862  //  NoWarn members in tree that correspond to refinements; currently uses only names.
867-   def  relax (tree : Tree , refinements : List [Tree ])(using  Context ):  Unit  = 
868-     val  names  =  refinements.collect { case  named : NamedDefTree  =>  named.name }.toSet
869-     val  relaxer  =  new  TreeTraverser : 
870-       def  traverse (tree : Tree )(using  Context ) = 
871-         tree match 
872-         case  tree : NamedDefTree  if  names(tree.name) =>  tree.withAttachment(NoWarn , ())
873-         case  _ => 
874-         traverseChildren(tree)
875-     relaxer.traverse(tree)
863+   def  relax (tree : Tree , tpe : Type )(using  Context ):  Unit  = 
864+     def  refinements (tpe : Type , names : List [Name ]):  List [Name ] = 
865+       tpe match 
866+       case  RefinedType (parent, refinedName, refinedInfo) =>  refinedName ::  refinements(parent, names)
867+       case  _ =>  names
868+     val  refinedNames  =  refinements(tpe, Nil )
869+     if  ! refinedNames.isEmpty then 
870+       val  names  =  refinedNames.toSet
871+       val  relaxer  =  new  TreeTraverser : 
872+         def  traverse (tree : Tree )(using  Context ) = 
873+           tree match 
874+           case  tree : NamedDefTree  if  names(tree.name) =>  tree.withAttachment(NoWarn , ())
875+           case  _ => 
876+           traverseChildren(tree)
877+       relaxer.traverse(tree)
876878
877879  extension  (nm : Name )
878880    inline  def  exists (p : Name  =>  Boolean ):  Boolean  =  nm.ne(nme.NO_NAME ) &&  p(nm)
0 commit comments