@@ -97,7 +97,9 @@ class CheckUnused extends MiniPhase:
9797
9898 override def prepareForValDef (tree : tpd.ValDef )(using Context ): Context =
9999 _key.unusedDataApply{ud =>
100- ud.registerDef(tree)
100+ // do not register the ValDef generated for `object`
101+ if ! tree.symbol.is(Module ) then
102+ ud.registerDef(tree)
101103 ud.addIgnoredUsage(tree.symbol)
102104 }
103105
@@ -336,15 +338,11 @@ object CheckUnused:
336338
337339 /** Register a symbol that should be ignored */
338340 def addIgnoredUsage (sym : Symbol )(using Context ): Unit =
339- doNotRegister += sym
340- if sym.is(Flags .Module ) then
341- doNotRegister += sym.moduleClass
341+ doNotRegister ++= sym.everySymbol
342342
343343 /** Remove a symbol that shouldn't be ignored anymore */
344344 def removeIgnoredUsage (sym : Symbol )(using Context ): Unit =
345- doNotRegister -= sym
346- if sym.is(Flags .Module ) then
347- doNotRegister -= sym.moduleClass
345+ doNotRegister --= sym.everySymbol
348346
349347
350348 /** Register an import */
@@ -442,27 +440,37 @@ object CheckUnused:
442440 Nil
443441 val sortedLocalDefs =
444442 if ctx.settings.WunusedHas .locals then
445- localDefInScope.filter(d => ! usedDef(d.symbol)).map(d => d.namePos -> WarnTypes .LocalDefs ).toList
443+ localDefInScope
444+ .filterNot(d => d.symbol.usedDefContains)
445+ .map(d => d.namePos -> WarnTypes .LocalDefs ).toList
446446 else
447447 Nil
448448 val sortedExplicitParams =
449449 if ctx.settings.WunusedHas .explicits then
450- explicitParamInScope.filter(d => ! usedDef(d.symbol)).map(d => d.namePos -> WarnTypes .ExplicitParams ).toList
450+ explicitParamInScope
451+ .filterNot(d => d.symbol.usedDefContains)
452+ .map(d => d.namePos -> WarnTypes .ExplicitParams ).toList
451453 else
452454 Nil
453455 val sortedImplicitParams =
454456 if ctx.settings.WunusedHas .implicits then
455- implicitParamInScope.filter(d => ! usedDef(d.symbol)).map(d => d.namePos -> WarnTypes .ImplicitParams ).toList
457+ implicitParamInScope
458+ .filterNot(d => d.symbol.usedDefContains)
459+ .map(d => d.namePos -> WarnTypes .ImplicitParams ).toList
456460 else
457461 Nil
458462 val sortedPrivateDefs =
459463 if ctx.settings.WunusedHas .privates then
460- privateDefInScope.filter(d => ! usedDef(d.symbol)).map(d => d.namePos -> WarnTypes .PrivateMembers ).toList
464+ privateDefInScope
465+ .filterNot(d => d.symbol.usedDefContains)
466+ .map(d => d.namePos -> WarnTypes .PrivateMembers ).toList
461467 else
462468 Nil
463469 val sortedPatVars =
464470 if ctx.settings.WunusedHas .patvars then
465- patVarsInScope.filter(d => ! usedDef(d.symbol)).map(d => d.namePos -> WarnTypes .PatVars ).toList
471+ patVarsInScope
472+ .filterNot(d => d.symbol.usedDefContains)
473+ .map(d => d.namePos -> WarnTypes .PatVars ).toList
466474 else
467475 Nil
468476 val warnings = List (sortedImp, sortedLocalDefs, sortedExplicitParams, sortedImplicitParams, sortedPrivateDefs, sortedPatVars).flatten.sortBy { s =>
@@ -562,6 +570,14 @@ object CheckUnused:
562570 else
563571 false
564572
573+ private def usedDefContains (using Context ): Boolean =
574+ sym.everySymbol.exists(usedDef.apply)
575+
576+ private def everySymbol (using Context ): List [Symbol ] =
577+ List (sym, sym.companionClass, sym.companionModule, sym.moduleClass).filter(_.exists)
578+
579+ end extension
580+
565581 extension (defdef : tpd.DefDef )
566582 // so trivial that it never consumes params
567583 private def isTrivial (using Context ): Boolean =
0 commit comments