@@ -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)
@@ -168,11 +171,15 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
168
171
override def prepareForDefDef (tree : DefDef )(using Context ): Context =
169
172
def trivial = tree.symbol.is(Deferred ) || isUnconsuming(tree.rhs)
170
173
def nontrivial = tree.symbol.isConstructor || tree.symbol.isAnonymousFunction
171
- if ! nontrivial && trivial then refInfos.skip.addOne(tree.symbol)
174
+ if ! nontrivial && trivial then
175
+ refInfos.skip.addOne(tree.symbol)
172
176
if tree.symbol.is(Inline ) then
173
177
refInfos.inliners += 1
174
178
else if ! tree.symbol.is(Deferred ) && tree.rhs.symbol != defn.Predef_undefined then
175
179
refInfos.register(tree)
180
+ tree.tpt match
181
+ case RefinedTypeTree (_, refinements) => relax(tree.rhs, refinements)
182
+ case _ =>
176
183
ctx
177
184
override def transformDefDef (tree : DefDef )(using Context ): tree.type =
178
185
traverseAnnotations(tree.symbol)
@@ -447,7 +454,7 @@ object CheckUnused:
447
454
if ! tree.name.isInstanceOf [DerivedName ] then
448
455
pats.addOne((tree.symbol, tree.namePos))
449
456
case tree : NamedDefTree =>
450
- if (tree.symbol ne NoSymbol ) && ! tree.name.isWildcard then
457
+ if (tree.symbol ne NoSymbol ) && ! tree.name.isWildcard && ! tree.hasAttachment( NoWarn ) then
451
458
defs.addOne((tree.symbol, tree.namePos))
452
459
case _ =>
453
460
if tree.symbol ne NoSymbol then
@@ -843,6 +850,17 @@ object CheckUnused:
843
850
args.foreach(traverse)
844
851
case tree => traverseChildren(tree)
845
852
853
+ // NoWarn members in tree that correspond to refinements; currently uses only names.
854
+ def relax (tree : Tree , refinements : List [Tree ])(using Context ): Unit =
855
+ val names = refinements.collect { case named : NamedDefTree => named.name }.toSet
856
+ val relaxer = new TreeTraverser :
857
+ def traverse (tree : Tree )(using Context ) =
858
+ tree match
859
+ case tree : NamedDefTree if names(tree.name) => tree.withAttachment(NoWarn , ())
860
+ case _ =>
861
+ traverseChildren(tree)
862
+ relaxer.traverse(tree)
863
+
846
864
extension (nm : Name )
847
865
inline def exists (p : Name => Boolean ): Boolean = nm.ne(nme.NO_NAME ) && p(nm)
848
866
inline def isWildcard : Boolean = nm == nme.WILDCARD || nm.is(WildcardParamName )
0 commit comments