Skip to content

Commit 9467cda

Browse files
committed
Warn for top level private
1 parent 75ea482 commit 9467cda

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -697,10 +697,12 @@ object CheckUnused:
697697
!sym.shouldNotReportParamOwner
698698

699699
private def shouldReportPrivateDef(using Context): Boolean =
700+
val sym = memDef.symbol
700701
peekScopeType == ScopeType.Template
701-
&& !memDef.symbol.isConstructor
702-
&& memDef.symbol.is(Private, butNot = SelfName | Synthetic | CaseAccessor)
703-
&& !ignoredSignature(memDef.symbol)
702+
&& !sym.isConstructor
703+
&& (sym.is(Private, butNot = SelfName | Synthetic | CaseAccessor)
704+
|| sym.effectiveOwner.is(PackageClass) && sym.denot.privateWithin == sym.effectiveOwner)
705+
&& !ignoredSignature(sym)
704706

705707
private def isUnsetVarDef(using Context): Boolean =
706708
val sym = memDef.symbol

tests/warn/unused-privates.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,13 @@ class `absolve ONLY serial framework`:
285285
private def readObjectNoData(): Unit = () // warn
286286
@throws(classOf[ObjectStreamException])
287287
private def readResolve(): Object = ??? // warn
288+
289+
@throws(classOf[java.io.ObjectStreamException])
290+
private def readResolve(): Object = ??? // warn
291+
private def print() = println() // warn
292+
private val printed = false // warn
293+
294+
package locked:
295+
private[locked] def locker(): Unit = () // warn as we cannot distinguish unqualified private at top level
296+
package basement:
297+
private[locked] def shackle(): Unit = () // no warn as it is not top level at boundary

0 commit comments

Comments
 (0)