Skip to content

Commit 94ff3f2

Browse files
committed
Add Serialize to companions of serializable classes in stdlib-bootsrapped
1 parent d0f9a51 commit 94ff3f2

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ object PostTyper {
6060
* mini-phase or subfunction of a macro phase equally well. But taken by themselves
6161
* they do not warrant their own group of miniphases before pickling.
6262
*/
63-
class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase =>
63+
class PostTyper extends MacroTransform with InfoTransformer { thisPhase =>
6464
import tpd._
6565

6666
override def phaseName: String = PostTyper.name
@@ -425,7 +425,7 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase
425425
if sym.isOpaqueAlias then
426426
VarianceChecker.checkLambda(rhs, TypeBounds.upper(sym.opaqueAlias))
427427
case _ =>
428-
processMemberDef(super.transform(tree))
428+
processMemberDef(super.transform(scala2LibPatch(tree)))
429429
case tree: Bind =>
430430
if tree.symbol.isType && !tree.symbol.name.is(WildcardParamName) then
431431
Checking.checkGoodBounds(tree.symbol)
@@ -534,5 +534,30 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase
534534
sym.addAnnotation(Annotation(defn.ExperimentalAnnot, sym.span))
535535
sym.companionModule.addAnnotation(Annotation(defn.ExperimentalAnnot, sym.span))
536536

537+
private def scala2LibPatch(tree: TypeDef)(using Context) =
538+
val sym = tree.symbol
539+
if ctx.settings.Yscala2Stdlib.value
540+
&& sym.is(ModuleClass) && !sym.derivesFrom(defn.SerializableClass)
541+
&& sym.companionClass.derivesFrom(defn.SerializableClass)
542+
then
543+
// Add Serializable to companion objects of serializable classes
544+
tree.rhs match
545+
case impl: Template =>
546+
val parents1 = impl.parents :+ TypeTree(defn.SerializableType)
547+
val impl1 = cpy.Template(impl)(parents = parents1)
548+
cpy.TypeDef(tree)(rhs = impl1)
549+
else tree
537550
}
551+
552+
protected override def infoMayChange(sym: Symbol)(using Context): Boolean =
553+
ctx.settings.Yscala2Stdlib.value && sym.isAllOf(ModuleClass, butNot = Package)
554+
555+
def transformInfo(tp: Type, sym: Symbol)(using Context): Type = tp match
556+
case info: ClassInfo =>
557+
if !sym.derivesFrom(defn.SerializableClass)
558+
&& sym.companionClass.derivesFrom(defn.SerializableClass)
559+
then
560+
info.derivedClassInfo(declaredParents = info.parents :+ defn.SerializableType)
561+
else tp
562+
case _ => tp
538563
}

project/MiMaFilters.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ object MiMaFilters {
5151

5252
// Companion module class
5353
ProblemFilters.exclude[FinalClassProblem]("scala.*$"),
54-
ProblemFilters.exclude[MissingTypesProblem]("scala.*$"),
54+
55+
// Missing types {scala.runtime.AbstractFunction1}
56+
ProblemFilters.exclude[MissingTypesProblem]("scala.ScalaReflectionException$"),
57+
ProblemFilters.exclude[MissingTypesProblem]("scala.UninitializedFieldError$"),
58+
ProblemFilters.exclude[MissingTypesProblem]("scala.collection.StringView$"),
5559

5660
// Tuples
5761
ProblemFilters.exclude[FinalClassProblem]("scala.Tuple1"),

project/TastyMiMaFilters.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,14 @@ object TastyMiMaFilters {
2020
ProblemMatcher.make(ProblemKind.RestrictedVisibilityChange, "scala.Char.<init>"),
2121
ProblemMatcher.make(ProblemKind.RestrictedVisibilityChange, "scala.Unit.<init>"),
2222

23-
// Problem: Missing Serializable in companions of serializable classes
24-
ProblemMatcher.make(ProblemKind.MissingParent, "scala.*$"),
23+
// Problem: Missing type {scala.runtime.AbstractFunction1}
24+
ProblemMatcher.make(ProblemKind.MissingParent, "scala.collection.Searching.Found$"),
25+
ProblemMatcher.make(ProblemKind.MissingParent, "scala.collection.Searching.InsertionPoint$"),
26+
ProblemMatcher.make(ProblemKind.MissingParent, "scala.collection.StringView$"),
27+
ProblemMatcher.make(ProblemKind.MissingParent, "scala.jdk.FunctionWrappers.AsJava*$"),
28+
ProblemMatcher.make(ProblemKind.MissingParent, "scala.jdk.FunctionWrappers.FromJava*$"),
29+
ProblemMatcher.make(ProblemKind.MissingParent, "scala.ScalaReflectionException$"),
30+
ProblemMatcher.make(ProblemKind.MissingParent, "scala.UninitializedFieldError$"),
2531

2632
// Problem: Class[T] or ClassTag[T] with `T` equal to wildcard `_ >: Nothing <: AnyVal` instead of a specific primitive type `T`
2733
ProblemMatcher.make(ProblemKind.IncompatibleTypeChange, "scala.reflect.ManifestFactory.*.runtimeClass"),

0 commit comments

Comments
 (0)