@@ -97,7 +97,8 @@ class CheckUnused private (phaseMode: CheckUnused.PhaseMode, suffix: String, _ke
97
97
ctx
98
98
99
99
override def prepareForSelect (tree : tpd.Select )(using Context ): Context =
100
- unusedDataApply(_.registerUsed(tree.symbol, Some (tree.name)))
100
+ val name = tree.removeAttachment(OriginalName ).orElse(Some (tree.name))
101
+ unusedDataApply(_.registerUsed(tree.symbol, name))
101
102
102
103
override def prepareForBlock (tree : tpd.Block )(using Context ): Context =
103
104
pushInBlockTemplatePackageDef(tree)
@@ -328,6 +329,8 @@ object CheckUnused:
328
329
*/
329
330
private val _key = Property .StickyKey [UnusedData ]
330
331
332
+ val OriginalName = Property .StickyKey [Name ]
333
+
331
334
class PostTyper extends CheckUnused (PhaseMode .Aggregate , " PostTyper" , _key)
332
335
333
336
class PostInlining extends CheckUnused (PhaseMode .Report , " PostInlining" , _key)
@@ -680,36 +683,39 @@ object CheckUnused:
680
683
}
681
684
682
685
/** Given an import and accessibility, return selector that matches import<->symbol */
683
- private def isInImport (imp : tpd.Import , isAccessible : Boolean , symName : Option [Name ], isDerived : Boolean )(using Context ): Option [ImportSelector ] =
686
+ private def isInImport (imp : tpd.Import , isAccessible : Boolean , altName : Option [Name ], isDerived : Boolean )(using Context ): Option [ImportSelector ] =
684
687
val tpd .Import (qual, sels) = imp
685
- val dealiasedSym = dealias(sym)
686
- val simpleSelections = qual.tpe.member(sym.name).alternatives
687
- val typeSelections = sels.flatMap(n => qual.tpe.member(n.name.toTypeName).alternatives)
688
- val termSelections = sels.flatMap(n => qual.tpe.member(n.name.toTermName).alternatives)
689
- val sameTermPath = qual.isTerm && sym.exists && sym.owner.isType && qual.tpe.typeSymbol == sym.owner.asType
690
- val selectionsToDealias = typeSelections ::: termSelections
691
- val renamedSelection = if sameTermPath then sels.find(sel => sel.imported.name == sym.name) else None
692
- val qualHasSymbol = simpleSelections.map(_.symbol).contains(sym) || (simpleSelections ::: selectionsToDealias).map(_.symbol).map(dealias).contains(dealiasedSym) || renamedSelection.isDefined
693
- def selector = sels.find(sel => (sel.name.toTermName == sym.name || sel.name.toTypeName == sym.name) && symName.map(n => n.toTermName == sel.rename).getOrElse(true ))
694
- def dealiasedSelector = if (isDerived) sels.flatMap(sel => selectionsToDealias.map(m => (sel, m.symbol))).collect {
695
- case (sel, sym) if dealias(sym) == dealiasedSym => sel
696
- }.headOption else None
688
+ val qualTpe = qual.tpe
689
+ val dealiasedSym = sym.dealias
690
+ val simpleSelections = qualTpe.member(sym.name).alternatives
691
+ val selectionsToDealias = sels.flatMap(sel =>
692
+ qualTpe.member(sel.name.toTypeName).alternatives
693
+ ::: qualTpe.member(sel.name.toTermName).alternatives)
694
+ def qualHasSymbol = simpleSelections.map(_.symbol).contains(sym) || (simpleSelections ::: selectionsToDealias).map(_.symbol).map(_.dealias).contains(dealiasedSym)
695
+ def selector = sels.find(sel => (sel.name.toTermName == sym.name || sel.name.toTypeName == sym.name) && altName.map(n => n.toTermName == sel.rename).getOrElse(true ))
696
+ def dealiasedSelector =
697
+ if isDerived then
698
+ sels.flatMap(sel => selectionsToDealias.map(m => (sel, m.symbol))).collect {
699
+ case (sel, sym) if sym.dealias == dealiasedSym => sel
700
+ }.headOption
701
+ else None
697
702
def givenSelector = if sym.is(Given ) || sym.is(Implicit )
698
703
then sels.filter(sel => sel.isGiven && ! sel.bound.isEmpty).find(sel => sel.boundTpe =:= sym.info)
699
704
else None
700
705
def wildcard = sels.find(sel => sel.isWildcard && ((sym.is(Given ) == sel.isGiven && sel.bound.isEmpty) || sym.is(Implicit )))
701
- if qualHasSymbol && (! isAccessible || sym.isRenamedSymbol(symName)) && sym.exists then
702
- selector.orElse(dealiasedSelector).orElse(givenSelector).orElse(wildcard).orElse(renamedSelection) // selector with name or wildcard (or given)
706
+ if sym.exists && qualHasSymbol && (! isAccessible || sym.isRenamedSymbol(altName)) then
707
+ selector.orElse(dealiasedSelector).orElse(givenSelector).orElse(wildcard) // selector with name or wildcard (or given)
703
708
else
704
709
None
705
710
706
711
private def isRenamedSymbol (symNameInScope : Option [Name ])(using Context ) =
707
712
sym.name != nme.NO_NAME && symNameInScope.exists(_.toSimpleName != sym.name.toSimpleName)
708
713
709
- private def dealias (symbol : Symbol )(using Context ): Symbol =
710
- if (symbol.isType && symbol.asType.denot.isAliasType) then
711
- symbol.asType.typeRef.dealias.typeSymbol
712
- else symbol
714
+ private def dealias (using Context ): Symbol =
715
+ if sym.isType && sym.asType.denot.isAliasType then
716
+ sym.asType.typeRef.dealias.typeSymbol
717
+ else sym
718
+
713
719
/** Annotated with @unused */
714
720
private def isUnusedAnnot (using Context ): Boolean =
715
721
sym.annotations.exists(a => a.symbol == ctx.definitions.UnusedAnnot )
0 commit comments