Skip to content

Commit 6c6bdd4

Browse files
committed
Tighten allowance for serialization methods
1 parent 1b77bab commit 6c6bdd4

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ object CheckUnused:
716716
peekScopeType == ScopeType.Template
717717
&& !memDef.symbol.isConstructor
718718
&& memDef.symbol.is(Private, butNot = SelfName | Synthetic | CaseAccessor)
719-
&& !ignoredNames(memDef.symbol.name.toTermName)
719+
&& !ignoredSignature(memDef.symbol)
720720

721721
private def isUnsetVarDef(using Context): Boolean =
722722
val sym = memDef.symbol
@@ -747,7 +747,12 @@ object CheckUnused:
747747
case _: Block => Local
748748
case _ => Other
749749

750-
val ignoredNames: Set[TermName] = Set("readResolve", "readObject", "writeObject", "writeReplace").map(termName(_))
750+
val ignoredNames: Set[TermName] =
751+
Set("readResolve", "readObject", "readObjectNoData", "writeObject", "writeReplace").map(termName(_))
752+
753+
def ignoredSignature(m: Symbol)(using Context): Boolean =
754+
m.is(Method) && ignoredNames(m.name.toTermName) && m.owner.isClass
755+
&& m.owner.asClass.classDenot.parentSyms.contains(defn.JavaSerializableClass)
751756

752757
final case class ImportSelectorData(val qualTpe: Type, val selector: ImportSelector):
753758
private var myUsed: Boolean = false

tests/warn/unused-privates.scala

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ trait Forever {
187187
}
188188

189189
trait Ignorance {
190-
private val readResolve = 42 // no warn special members
190+
private val readResolve = 42 // warn wrong signatured for special members
191191
}
192192

193193
trait CaseyKasem {
@@ -257,3 +257,31 @@ class `recursive reference is not a usage` {
257257
def f() = new P()
258258
}
259259
}
260+
261+
class `absolve serial framework` extends Serializable:
262+
import java.io.{IOException, ObjectInputStream, ObjectOutputStream, ObjectStreamException}
263+
@throws(classOf[IOException])
264+
private def writeObject(stream: ObjectOutputStream): Unit = ()
265+
@throws(classOf[ObjectStreamException])
266+
private def writeReplace(): Object = ???
267+
@throws(classOf[ClassNotFoundException])
268+
@throws(classOf[IOException])
269+
private def readObject(stream: ObjectInputStream): Unit = ()
270+
@throws(classOf[ObjectStreamException])
271+
private def readObjectNoData(): Unit = ()
272+
@throws(classOf[ObjectStreamException])
273+
private def readResolve(): Object = ???
274+
275+
class `absolve ONLY serial framework`:
276+
import java.io.{IOException, ObjectInputStream, ObjectOutputStream, ObjectStreamException}
277+
@throws(classOf[IOException])
278+
private def writeObject(stream: ObjectOutputStream): Unit = () // warn
279+
@throws(classOf[ObjectStreamException])
280+
private def writeReplace(): Object = ??? // warn
281+
@throws(classOf[ClassNotFoundException])
282+
@throws(classOf[IOException])
283+
private def readObject(stream: ObjectInputStream): Unit = () // warn
284+
@throws(classOf[ObjectStreamException])
285+
private def readObjectNoData(): Unit = () // warn
286+
@throws(classOf[ObjectStreamException])
287+
private def readResolve(): Object = ??? // warn

0 commit comments

Comments
 (0)