Skip to content

Commit 5d7c3ab

Browse files
committed
remove EnumValueSerializationProxy
1 parent b077100 commit 5d7c3ab

File tree

3 files changed

+26
-48
lines changed

3 files changed

+26
-48
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,7 @@ object StdNames {
554554
val productIterator: N = "productIterator"
555555
val productPrefix: N = "productPrefix"
556556
val raw_ : N = "raw"
557+
val readResolve: N = "readResolve"
557558
val refl: N = "refl"
558559
val reflect: N = "reflect"
559560
val reflectiveSelectable: N = "reflectiveSelectable"

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

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -356,14 +356,26 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
356356
}
357357

358358
private def hasWriteReplace(clazz: ClassSymbol)(using Context): Boolean =
359-
clazz.membersNamed(nme.writeReplace)
360-
.filterWithPredicate(s => s.signature == Signature(defn.AnyRefType, isJava = false))
361-
.exists
359+
hasAnyRefDef(clazz, nme.writeReplace)
362360

363361
private def writeReplaceDef(clazz: ClassSymbol)(using Context): TermSymbol =
364-
newSymbol(clazz, nme.writeReplace, Method | Private | Synthetic,
362+
privateAnyRefDef(clazz, nme.writeReplace)
363+
364+
private def readResolveDef(clazz: ClassSymbol)(using Context): TermSymbol =
365+
privateAnyRefDef(clazz, nme.readResolve)
366+
367+
private def hasReadResolve(clazz: ClassSymbol)(using Context): Boolean =
368+
hasAnyRefDef(clazz, nme.readResolve)
369+
370+
private def privateAnyRefDef(clazz: ClassSymbol, name: TermName)(using Context): TermSymbol =
371+
newSymbol(clazz, name, Method | Private | Synthetic,
365372
MethodType(Nil, defn.AnyRefType), coord = clazz.coord).entered.asTerm
366373

374+
private def hasAnyRefDef(clazz: ClassSymbol, name: TermName)(using Context): Boolean =
375+
clazz.membersNamed(name)
376+
.filterWithPredicate(s => s.signature == Signature(defn.AnyRefType, isJava = false))
377+
.exists
378+
367379
/** If this is a serializable static object `Foo`, add the method:
368380
*
369381
* private def writeReplace(): AnyRef =
@@ -389,23 +401,24 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
389401
/** If this the class backing a serializable singleton enum value with base class `MyEnum`,
390402
* and not deriving from `java.lang.Enum` add the method:
391403
*
392-
* private def writeReplace(): AnyRef =
393-
* new scala.runtime.EnumValueSerializationProxy(classOf[MyEnum], this.ordinal)
404+
* private def readResolve(): AnyRef =
405+
* MyEnum.values(this.ordinal)
394406
*
395407
* unless an implementation already exists, otherwise do nothing.
396408
*/
397409
def serializableEnumValueMethod(clazz: ClassSymbol)(using Context): List[Tree] =
398410
if clazz.isEnumValueImplementation
399411
&& !clazz.derivesFrom(defn.JavaEnumClass)
400412
&& clazz.isSerializable
401-
&& !hasWriteReplace(clazz)
413+
&& !hasReadResolve(clazz)
402414
then
403415
List(
404-
DefDef(writeReplaceDef(clazz),
405-
_ => New(defn.EnumValueSerializationProxyClass.typeRef,
406-
defn.EnumValueSerializationProxyConstructor,
407-
List(Literal(Constant(clazz.classParents.head)), This(clazz).select(nme.ordinal).ensureApplied)))
408-
.withSpan(ctx.owner.span.focus))
416+
DefDef(readResolveDef(clazz),
417+
_ => ref(clazz.classParents.head.typeSymbol.companionModule)
418+
.select(nme.values).ensureApplied // `.values` must exist if `isEnumValueImplementation` is true
419+
.select(nme.apply).appliedTo(This(clazz).select(nme.ordinal).ensureApplied)
420+
).withSpan(ctx.owner.span.focus)
421+
)
409422
else
410423
Nil
411424

library/src/scala/runtime/EnumValueSerializationProxy.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)