@@ -7,13 +7,13 @@ import dotty.tools.dotc.ast.untpd.ImportSelector
77import dotty .tools .dotc .config .ScalaSettings
88import dotty .tools .dotc .core .Contexts .*
99import dotty .tools .dotc .core .Decorators .{em , i }
10- import dotty .tools .dotc .core .Flags ._
10+ import dotty .tools .dotc .core .Flags .*
1111import dotty .tools .dotc .core .Phases .Phase
1212import dotty .tools .dotc .core .StdNames
1313import dotty .tools .dotc .report
1414import dotty .tools .dotc .reporting .Message
1515import dotty .tools .dotc .typer .ImportInfo
16- import dotty .tools .dotc .util .Property
16+ import dotty .tools .dotc .util .{ Property , SrcPos }
1717import dotty .tools .dotc .core .Mode
1818import dotty .tools .dotc .core .Types .TypeTraverser
1919import dotty .tools .dotc .core .Types .Type
@@ -302,6 +302,7 @@ object CheckUnused:
302302 * See the `isAccessibleAsIdent` extension method below in the file
303303 */
304304 private val usedInScope = MutStack (MutSet [(Symbol ,Boolean , Option [Name ])]())
305+ private val usedInPosition = MutSet [(SrcPos , Name )]()
305306 /* unused import collected during traversal */
306307 private val unusedImport = MutSet [ImportSelector ]()
307308
@@ -351,6 +352,7 @@ object CheckUnused:
351352 usedInScope.top += ((sym, sym.isAccessibleAsIdent, name))
352353 usedInScope.top += ((sym.companionModule, sym.isAccessibleAsIdent, name))
353354 usedInScope.top += ((sym.companionClass, sym.isAccessibleAsIdent, name))
355+ name.map(n => usedInPosition += ((sym.sourcePos, n)))
354356
355357 /** Register a symbol that should be ignored */
356358 def addIgnoredUsage (sym : Symbol )(using Context ): Unit =
@@ -455,6 +457,7 @@ object CheckUnused:
455457 if ctx.settings.WunusedHas .locals then
456458 localDefInScope
457459 .filterNot(d => d.symbol.usedDefContains)
460+ .filterNot(d => usedInPosition.exists { case (pos, name) => d.span.contains(pos.span) && name == d.symbol.name})
458461 .map(d => d.namePos -> WarnTypes .LocalDefs ).toList
459462 else
460463 Nil
@@ -483,6 +486,7 @@ object CheckUnused:
483486 if ctx.settings.WunusedHas .patvars then
484487 patVarsInScope
485488 .filterNot(d => d.symbol.usedDefContains)
489+ .filterNot(d => usedInPosition.exists { case (pos, name) => d.span.contains(pos.span) && name == d.symbol.name})
486490 .map(d => d.namePos -> WarnTypes .PatVars ).toList
487491 else
488492 Nil
0 commit comments