Skip to content

Commit de492fc

Browse files
committed
Fix false positive in WUnused for renamed path-dependent imports (attempt 2)
1 parent 982c91b commit de492fc

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

compiler/src/dotty/tools/dotc/core/StdNames.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ object StdNames {
5353
protected def kw(name: N): N = { kws += name; name }
5454

5555
final val keywords: collection.Set[N] = kws
56-
}
56+
}
5757

5858
abstract class ScalaNames[N <: Name] extends DefinedNames[N] {
5959
protected def encode(s: String): N = fromName(fromString(s).encode)

compiler/src/dotty/tools/dotc/transform/CheckUnused.scala

+7-5
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ object CheckUnused:
337337
* - usage
338338
*/
339339
private class UnusedData:
340-
import collection.mutable.{Set => MutSet, Map => MutMap, Stack => MutStack}
340+
import collection.mutable.{Set => MutSet, Map => MutMap, Stack => MutStack, ListBuffer => MutList}
341341
import UnusedData.*
342342

343343
/** The current scope during the tree traversal */
@@ -346,7 +346,7 @@ object CheckUnused:
346346
var unusedAggregate: Option[UnusedResult] = None
347347

348348
/* IMPORTS */
349-
private val impInScope = MutStack(MutSet[tpd.Import]())
349+
private val impInScope = MutStack(MutList[tpd.Import]())
350350
/**
351351
* We store the symbol along with their accessibility without import.
352352
* Accessibility to their definition in outer context/scope
@@ -449,7 +449,7 @@ object CheckUnused:
449449
def pushScope(newScopeType: ScopeType): Unit =
450450
// unused imports :
451451
currScopeType.push(newScopeType)
452-
impInScope.push(MutSet())
452+
impInScope.push(MutList())
453453
usedInScope.push(MutSet())
454454

455455
def registerSetVar(sym: Symbol): Unit =
@@ -669,8 +669,10 @@ object CheckUnused:
669669
val simpleSelections = qual.tpe.member(sym.name).alternatives
670670
val typeSelections = sels.flatMap(n => qual.tpe.member(n.name.toTypeName).alternatives)
671671
val termSelections = sels.flatMap(n => qual.tpe.member(n.name.toTermName).alternatives)
672+
val sameTermPath = qual.isTerm && sym.exists && sym.owner.isType && qual.tpe.typeSymbol == sym.owner.asType
672673
val selectionsToDealias = typeSelections ::: termSelections
673-
val qualHasSymbol = simpleSelections.map(_.symbol).contains(sym) || (simpleSelections ::: selectionsToDealias).map(_.symbol).map(dealias).contains(dealiasedSym)
674+
val renamedSelection = if sameTermPath then sels.find(sel => sel.imported.name == sym.name) else None
675+
val qualHasSymbol = simpleSelections.map(_.symbol).contains(sym) || (simpleSelections ::: selectionsToDealias).map(_.symbol).map(dealias).contains(dealiasedSym) || renamedSelection.isDefined
674676
def selector = sels.find(sel => (sel.name.toTermName == sym.name || sel.name.toTypeName == sym.name) && symName.map(n => n.toTermName == sel.rename).getOrElse(true))
675677
def dealiasedSelector = if(isDerived) sels.flatMap(sel => selectionsToDealias.map(m => (sel, m.symbol))).collect {
676678
case (sel, sym) if dealias(sym) == dealiasedSym => sel
@@ -680,7 +682,7 @@ object CheckUnused:
680682
else None
681683
def wildcard = sels.find(sel => sel.isWildcard && ((sym.is(Given) == sel.isGiven && sel.bound.isEmpty) || sym.is(Implicit)))
682684
if qualHasSymbol && (!isAccessible || sym.isRenamedSymbol(symName)) && sym.exists then
683-
selector.orElse(dealiasedSelector).orElse(givenSelector).orElse(wildcard) // selector with name or wildcard (or given)
685+
selector.orElse(dealiasedSelector).orElse(givenSelector).orElse(wildcard).orElse(renamedSelection) // selector with name or wildcard (or given)
684686
else
685687
None
686688

tests/pos/i18366.scala

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//> using options -Xfatal-warnings -Wunused:all
2+
3+
trait Builder {
4+
def foo(): Unit
5+
}
6+
7+
def repro =
8+
val builder: Builder = ???
9+
import builder.{foo => bar}
10+
bar()

0 commit comments

Comments
 (0)