@@ -172,9 +172,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
172
172
override def prepareForValDef (tree : ValDef )(using Context ): Context =
173
173
if ! tree.symbol.is(Deferred ) && tree.rhs.symbol != defn.Predef_undefined then
174
174
refInfos.register(tree)
175
- tree.tpt match
176
- case RefinedTypeTree (_, refinements) => relax(tree.rhs, refinements)
177
- case _ =>
175
+ relax(tree.rhs, tree.tpt.tpe)
178
176
ctx
179
177
override def transformValDef (tree : ValDef )(using Context ): tree.type =
180
178
traverseAnnotations(tree.symbol)
@@ -198,9 +196,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
198
196
refInfos.inliners += 1
199
197
else if ! tree.symbol.is(Deferred ) && tree.rhs.symbol != defn.Predef_undefined then
200
198
refInfos.register(tree)
201
- tree.tpt match
202
- case RefinedTypeTree (_, refinements) => relax(tree.rhs, refinements)
203
- case _ =>
199
+ relax(tree.rhs, tree.tpt.tpe)
204
200
ctx
205
201
override def transformDefDef (tree : DefDef )(using Context ): tree.type =
206
202
traverseAnnotations(tree.symbol)
@@ -864,15 +860,21 @@ object CheckUnused:
864
860
case tree => traverseChildren(tree)
865
861
866
862
// 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)
876
878
877
879
extension (nm : Name )
878
880
inline def exists (p : Name => Boolean ): Boolean = nm.ne(nme.NO_NAME ) && p(nm)
0 commit comments