@@ -150,6 +150,9 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
150
150
override def prepareForValDef (tree : ValDef )(using Context ): Context =
151
151
if ! tree.symbol.is(Deferred ) && tree.rhs.symbol != defn.Predef_undefined then
152
152
refInfos.register(tree)
153
+ tree.tpt match
154
+ case RefinedTypeTree (_, refinements) => relax(tree.rhs, refinements)
155
+ case _ =>
153
156
ctx
154
157
override def transformValDef (tree : ValDef )(using Context ): tree.type =
155
158
traverseAnnotations(tree.symbol)
@@ -170,11 +173,15 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
170
173
override def prepareForDefDef (tree : DefDef )(using Context ): Context =
171
174
def trivial = tree.symbol.is(Deferred ) || isUnconsuming(tree.rhs)
172
175
def nontrivial = tree.symbol.isConstructor || tree.symbol.isAnonymousFunction
173
- if ! nontrivial && trivial then refInfos.skip.addOne(tree.symbol)
176
+ if ! nontrivial && trivial then
177
+ refInfos.skip.addOne(tree.symbol)
174
178
if tree.symbol.is(Inline ) then
175
179
refInfos.inliners += 1
176
180
else if ! tree.symbol.is(Deferred ) && tree.rhs.symbol != defn.Predef_undefined then
177
181
refInfos.register(tree)
182
+ tree.tpt match
183
+ case RefinedTypeTree (_, refinements) => relax(tree.rhs, refinements)
184
+ case _ =>
178
185
ctx
179
186
override def transformDefDef (tree : DefDef )(using Context ): tree.type =
180
187
traverseAnnotations(tree.symbol)
@@ -456,7 +463,7 @@ object CheckUnused:
456
463
if ! tree.name.isInstanceOf [DerivedName ] then
457
464
pats.addOne((tree.symbol, tree.namePos))
458
465
case tree : NamedDefTree =>
459
- if (tree.symbol ne NoSymbol ) && ! tree.name.isWildcard then
466
+ if (tree.symbol ne NoSymbol ) && ! tree.name.isWildcard && ! tree.hasAttachment( NoWarn ) then
460
467
defs.addOne((tree.symbol, tree.namePos))
461
468
case _ =>
462
469
if tree.symbol ne NoSymbol then
@@ -851,6 +858,17 @@ object CheckUnused:
851
858
args.foreach(traverse)
852
859
case tree => traverseChildren(tree)
853
860
861
+ // NoWarn members in tree that correspond to refinements; currently uses only names.
862
+ def relax (tree : Tree , refinements : List [Tree ])(using Context ): Unit =
863
+ val names = refinements.collect { case named : NamedDefTree => named.name }.toSet
864
+ val relaxer = new TreeTraverser :
865
+ def traverse (tree : Tree )(using Context ) =
866
+ tree match
867
+ case tree : NamedDefTree if names(tree.name) => tree.withAttachment(NoWarn , ())
868
+ case _ =>
869
+ traverseChildren(tree)
870
+ relaxer.traverse(tree)
871
+
854
872
extension (nm : Name )
855
873
inline def exists (p : Name => Boolean ): Boolean = nm.ne(nme.NO_NAME ) && p(nm)
856
874
inline def isWildcard : Boolean = nm == nme.WILDCARD || nm.is(WildcardParamName )
0 commit comments