Skip to content

Conversation

@szeiger
Copy link
Contributor

@szeiger szeiger commented May 23, 2018

  • Provide a DefaultSerializationProxy for all collection kinds.

  • Remove List.SerializationProxy (the new default proxy is equally
    good for List).

  • Remove unnecessary SerialVersionUID annotations and Serializable
    mix-ins: All collections are Serializable (via Iterable) and
    use a serialization proxy by default.

  • Add missing toFactory and toBuildFrom conversion to some
    non-standard factory objects (e.g. IntMap). toFactory is needed
    for DefaultSerializationProxy.

  • Re-enable self-serialization (not using the default proxy) for
    Range, NumericRange, View, StringBuilder and both
    ArraySeqs.

  • Re-enable self-serialization for Enumeration.ValueSet to avoid some
    cyclic dependencies during deserialization which can make proxies
    leak and cause a ClassCastException. I was unable to come up with a
    solution to all such problems (see run/enums.scala).

  • Use an Array instead of a Seq in
    Manifest.IntersectionTypeManifest to avoid cyclic dependencies
    during deserialization.

  • Add a custom proxy to BitSet for compact serialization of the
    internal structure.

  • Add a custom proxy for mixed strict and lazy serialization of
    LazyList and Stream. A forced init is stored sequentially to
    prevent stack overflows, the unevaluated tail is serialized in
    structural form to preserve laziness.

  • Make iterators of IndexedSeqView, Range and NumericRange
    serializable.

Fixes scala/collection-strawman#523.
Fixes scala/collection-strawman#524.
Fixes scala/bug#7005.
Fixes scala/bug#6654.
Fixes scala/collection-strawman#541.
Fixes scala/bug#10679.
Fixes scala/collection-strawman#331.

Now I need to get a belt that reads "Seven at One Blow".

@scala-jenkins scala-jenkins added this to the 2.13.0-M5 milestone May 23, 2018

protected def newCons[T](hd: => T, tl: => Stream[T]): Stream[T] = new Stream.Cons(hd, tl)

//@SerialVersionUID(1L) //TODO Putting an annotation on Stream.empty causes a cyclic dependency in unpickling
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's an example of an exception thrown by the compiler when you add the annotation:

java.lang.AssertionError: unsafe symbol Nothing (child of package scala) in runtime reflection universe
         at scala.reflect.internal.Symbols$Symbol.<init>(Symbols.scala:224)
         at scala.reflect.internal.Symbols$TypeSymbol.<init>(Symbols.scala:3053)
         at scala.reflect.internal.Symbols$ClassSymbol.<init>(Symbols.scala:3244)
         at scala.reflect.internal.Symbols$StubClassSymbol.<init>(Symbols.scala:3522)
         at scala.reflect.internal.Symbols.newStubSymbol(Symbols.scala:208)
         at scala.reflect.internal.Symbols.newStubSymbol$(Symbols.scala:204)
         at scala.reflect.internal.SymbolTable.newStubSymbol(SymbolTable.scala:18)
         at scala.reflect.internal.Symbols$Symbol.newStubSymbol(Symbols.scala:528)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readSymbol$6(UnPickler.scala:266)
         at scala.reflect.internal.Symbols$Symbol.orElse(Symbols.scala:2552)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readSymbol$5(UnPickler.scala:253)
         at scala.reflect.internal.Symbols$Symbol.orElse(Symbols.scala:2552)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readSymbol$4(UnPickler.scala:253)
         at scala.reflect.internal.Symbols$Symbol.orElse(Symbols.scala:2552)
         at scala.reflect.internal.pickling.UnPickler$Scan.readExtSymbol$1(UnPickler.scala:251)
         at scala.reflect.internal.pickling.UnPickler$Scan.readSymbol(UnPickler.scala:274)
         at scala.reflect.internal.pickling.UnPickler$Scan.readSymbolRef(UnPickler.scala:639)
         at scala.reflect.internal.pickling.UnPickler$Scan.readType(UnPickler.scala:406)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readTypeRef$1(UnPickler.scala:648)
         at scala.reflect.internal.pickling.UnPickler$Scan.at(UnPickler.scala:183)
         at scala.reflect.internal.pickling.UnPickler$Scan.readTypeRef(UnPickler.scala:648)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readType$1(UnPickler.scala:368)
         at scala.reflect.internal.pickling.PickleBuffer.until(PickleBuffer.scala:154)
         at scala.reflect.internal.pickling.UnPickler$Scan.all$1(UnPickler.scala:366)
         at scala.reflect.internal.pickling.UnPickler$Scan.readTypes$1(UnPickler.scala:368)
         at scala.reflect.internal.pickling.UnPickler$Scan.readType(UnPickler.scala:406)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readTypeRef$1(UnPickler.scala:648)
         at scala.reflect.internal.pickling.UnPickler$Scan.at(UnPickler.scala:183)
         at scala.reflect.internal.pickling.UnPickler$Scan.readTypeRef(UnPickler.scala:648)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readType$1(UnPickler.scala:368)
         at scala.reflect.internal.pickling.PickleBuffer.until(PickleBuffer.scala:154)
         at scala.reflect.internal.pickling.UnPickler$Scan.all$1(UnPickler.scala:366)
         at scala.reflect.internal.pickling.UnPickler$Scan.readTypes$1(UnPickler.scala:368)
         at scala.reflect.internal.pickling.UnPickler$Scan.readType(UnPickler.scala:408)
         at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.$anonfun$completeInternal$1(UnPickler.scala:716)
         at scala.reflect.internal.pickling.UnPickler$Scan.at(UnPickler.scala:183)
         at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.completeInternal(UnPickler.scala:716)
         at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.complete(UnPickler.scala:743)
         at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1534)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$2.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:176)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.$anonfun$info$1(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:125)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe$(SynchronizedSymbols.scala:121)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$2.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:176)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$2.info(SynchronizedSymbols.scala:176)
         at scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1682)
         at scala.reflect.internal.Symbols$Symbol.annotations(Symbols.scala:1852)
         at scala.reflect.internal.Symbols$Symbol.addAnnotation(Symbols.scala:1871)
         at scala.reflect.internal.pickling.UnPickler$Scan.readSymbolAnnotation(UnPickler.scala:505)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$run$2(UnPickler.scala:101)
         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
         at scala.reflect.internal.pickling.UnPickler$Scan.runAtIndex(UnPickler.scala:83)
         at scala.reflect.internal.pickling.UnPickler$Scan.run(UnPickler.scala:101)
         at scala.reflect.internal.pickling.UnPickler.unpickle(UnPickler.scala:40)
         at scala.reflect.runtime.JavaMirrors$JavaMirror.unpickleClass(JavaMirrors.scala:621)
         at scala.reflect.runtime.SymbolLoaders$TopClassCompleter.$anonfun$complete$2(SymbolLoaders.scala:25)
         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
         at scala.reflect.internal.SymbolTable.slowButSafeEnteringPhaseNotLaterThan(SymbolTable.scala:313)
         at scala.reflect.runtime.SymbolLoaders$TopClassCompleter.complete(SymbolLoaders.scala:22)
         at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1534)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:191)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.$anonfun$info$1(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:125)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe$(SynchronizedSymbols.scala:121)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:191)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.info(SynchronizedSymbols.scala:191)
         at scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1682)
         at scala.reflect.internal.Symbols$Symbol.hasFlag(Symbols.scala:742)
         at scala.reflect.internal.HasFlags.isMutable(HasFlags.scala:108)
         at scala.reflect.internal.HasFlags.isMutable$(HasFlags.scala:108)
         at scala.reflect.internal.Symbols$Symbol.isMutable(Symbols.scala:214)
         at scala.reflect.internal.Symbols$Symbol.isStable(Symbols.scala:953)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readType$4(UnPickler.scala:403)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readType$4$adapted(UnPickler.scala:403)
         at scala.reflect.internal.Symbols$Symbol.filter(Symbols.scala:1968)
         at scala.reflect.internal.pickling.UnPickler$Scan.readType(UnPickler.scala:403)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readTypeRef$1(UnPickler.scala:648)
         at scala.reflect.internal.pickling.UnPickler$Scan.at(UnPickler.scala:183)
         at scala.reflect.internal.pickling.UnPickler$Scan.readTypeRef(UnPickler.scala:648)
         at scala.reflect.internal.pickling.UnPickler$Scan.readType(UnPickler.scala:410)
         at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.$anonfun$completeInternal$1(UnPickler.scala:716)
         at scala.reflect.internal.pickling.UnPickler$Scan.at(UnPickler.scala:183)
         at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.completeInternal(UnPickler.scala:716)
         at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.complete(UnPickler.scala:743)
         at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1534)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$8.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:188)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.$anonfun$info$1(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:125)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe$(SynchronizedSymbols.scala:121)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$8.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:188)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$8.info(SynchronizedSymbols.scala:188)
         at scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1682)
         at scala.reflect.internal.Symbols$Symbol.annotations(Symbols.scala:1852)
         at scala.reflect.internal.Symbols$Symbol.addAnnotation(Symbols.scala:1871)
         at scala.reflect.internal.pickling.UnPickler$Scan.readSymbolAnnotation(UnPickler.scala:505)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$run$2(UnPickler.scala:101)
         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
         at scala.reflect.internal.pickling.UnPickler$Scan.runAtIndex(UnPickler.scala:83)
         at scala.reflect.internal.pickling.UnPickler$Scan.run(UnPickler.scala:101)
         at scala.reflect.internal.pickling.UnPickler.unpickle(UnPickler.scala:40)
         at scala.reflect.runtime.JavaMirrors$JavaMirror.unpickleClass(JavaMirrors.scala:621)
         at scala.reflect.runtime.SymbolLoaders$TopClassCompleter.$anonfun$complete$2(SymbolLoaders.scala:25)
         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
         at scala.reflect.internal.SymbolTable.slowButSafeEnteringPhaseNotLaterThan(SymbolTable.scala:313)
         at scala.reflect.runtime.SymbolLoaders$TopClassCompleter.complete(SymbolLoaders.scala:22)
         at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1534)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:191)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.$anonfun$info$1(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:125)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe$(SynchronizedSymbols.scala:121)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:191)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.info(SynchronizedSymbols.scala:191)
         at scala.reflect.internal.SymbolTable.openPackageModule(SymbolTable.scala:336)
         at scala.reflect.internal.SymbolTable.openPackageModule(SymbolTable.scala:391)
         at scala.reflect.runtime.SymbolLoaders$LazyPackageType.$anonfun$complete$3(SymbolLoaders.scala:71)
         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
         at scala.reflect.internal.SymbolTable.slowButSafeEnteringPhaseNotLaterThan(SymbolTable.scala:313)
         at scala.reflect.runtime.SymbolLoaders$LazyPackageType.complete(SymbolLoaders.scala:68)
         at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1534)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:179)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.$anonfun$info$1(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:125)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe$(SynchronizedSymbols.scala:121)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:179)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:129)
         at scala.reflect.runtim[info] Test scala.OptionTest.testNoneZipNil startede.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1.info(SynchronizedSymbols.scala:179)
         at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2383)
         at scala.reflect.internal.tpe.FindMembers$FindMemberBase.<init>(FindMembers.scala:17)
         at scala.reflect.internal.tpe.FindMembers$FindMember.<init>(FindMembers.scala:219)
         at scala.reflect.internal.Types$Type.findMemberInternal$1(Types.scala:1032)
         at scala.reflect.internal.Types$Type.findMember(Types.scala:1034)
         at scala.reflect.internal.Types$Type.memberBasedOnName(Types.scala:660)
         at scala.reflect.internal.Types$Type.member(Types.scala:624)
         at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
         at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66)
         at scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:172)
         at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage$lzycompute(Definitions.scala:170)
         at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage(Definitions.scala:170)
         at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass$lzycompute(Definitions.scala:171)
         at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass(Definitions.scala:171)
         at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr$lzycompute(Definitions.scala:1206)
         at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr(Definitions.scala:1205)
         at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses$lzycompute(Definitions.scala:1335)
         at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses(Definitions.scala:1334)
         at scala.reflect.internal.Mirrors$RootsBase.init(Mirrors.scala:232)
         at scala.reflect.runtime.JavaMirrors.createMirror(JavaMirrors.scala:34)
         at scala.reflect.runtime.JavaMirrors.$anonfun$runtimeMirror$1(JavaMirrors.scala:51)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.JavaMirrors.runtimeMirror(JavaMirrors.scala:49)
         at scala.reflect.runtime.JavaMirrors.runtimeMirror$(JavaMirrors.scala:48)
         at scala.reflect.runtime.JavaUniverse.runtimeMirror(JavaUniverse.scala:18)
         at scala.reflect.runtime.JavaMirrors$JavaMirror.mirrorDefining(JavaMirrors.scala:568)
         at scala.reflect.runtime.SymbolLoaders$PackageScope.$anonfun$lookupEntry$1(SymbolLoaders.scala:136)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SymbolLoaders$PackageScope.syncLockSynchronized(SymbolLoaders.scala:121)
         at scala.reflect.runtime.SymbolLoaders$PackageScope.lookupEntry(SymbolLoaders.scala:123)
         at scala.reflect.internal.tpe.FindMembers$FindMemberBase.walkBaseClasses(FindMembers.scala:88)
         at scala.reflect.internal.tpe.FindMembers$FindMemberBase.searchConcreteThenDeferred(FindMembers.scala:56)
         at scala.reflect.internal.tpe.FindMembers$FindMemberBase.apply(FindMembers.scala:48)
         at scala.reflect.internal.Types$Type.findMemberInternal$1(Types.scala:1032)
         at scala.reflect.internal.Types$Type.findMember(Types.scala:1034)
         at scala.reflect.internal.Types$Type.memberBasedOnName(Types.scala:660)
         at scala.reflect.internal.Types$Type.member(Types.scala:624)
         at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
         at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66)
         at scala.reflect.internal.Mirrors$RootsBase.getClassByName(Mirrors.scala:101)
         at scala.reflect.internal.Mirrors$RootsBase.getRequiredClass(Mirrors.scala:104)
         at scala.reflect.internal.Definitions$DefinitionsClass.ObjectClass$lzycompute(Definitions.scala:266)
         at scala.reflect.internal.Definitions$DefinitionsClass.ObjectClass(Definitions.scala:266)
         at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1431)
         at scala.reflect.runtime.JavaUniverse.init(JavaUniverse.scala:142)
         at scala.reflect.runtime.JavaUniverse.<init>(JavaUniverse.scala:81)
         at scala.reflect.runtime.package$.universe$lzycompute(package.scala:17)
         at scala.reflect.runtime.package$.universe(package.scala:17)
         at scala.tools.testing.Runner$.make(RunTesting.scala:16)
         at scala.tools.testing.RunTesting.$anonfun$runner$1(RunTesting.scala:8)
         at scala.tools.testing.ClearAfterClass.lambda$cached$1(ClearAfterClass.java:51)
         at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
         at scala.tools.testing.ClearAfterClass.cached(ClearAfterClass.java:51)
         at scala.tools.testing.RunTesting.$init$(RunTesting.scala:8)
         at scala.OptionTest.<init>(OptionTest.scala:8)
         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
         at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:195)
         at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:244)
         at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
         at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:241)
         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
         at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
         at scala.tools.testing.ClearAfterClass$1.evaluate(ClearAfterClass.java:29)
         at org.junit.rules.RunRules.evaluate(RunRules.java:20)
         at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
         at org.junit.runners.Suite.runChild(Suite.java:127)
         at org.junit.runners.Suite.runChild(Suite.java:26)
         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
         at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
         at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
         at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
         at org.junit.runner.JUnitCore.run(JUnitCore.java:138)
         at com.novocode.junit.JUnitRunner$1.execute(JUnitRunner.java:132)
         at sbt.ForkMain$Run$2.call(ForkMain.java:296)
         at sbt.ForkMain$Run$2.call(ForkMain.java:286)
         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
         at java.lang.Thread.run(Thread.java:748)
java.lang.RuntimeException: error reading Scala signature of scala.collection.immutable.Stream: unsafe symbol Nothing (child of package scala) in runtime reflection universe
         at scala.reflect.internal.pickling.UnPickler.unpickle(UnPickler.scala:44)
         at scala.reflect.runtime.JavaMirrors$JavaMirror.unpickleClass(JavaMirrors.scala:621)
         at scala.reflect.runtime.SymbolLoaders$TopClassCompleter.$anonfun$complete$2(SymbolLoaders.scala:25)
         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
         at scala.reflect.internal.SymbolTable.slowButSafeEnteringPhaseNotLaterThan(SymbolTable.scala:313)
         at scala.reflect.runtime.SymbolLoaders$TopClassCompleter.complete(SymbolLoaders.scala:22)
         at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1534)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:191)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.$anonfun$info$1(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:125)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe$(SynchronizedSymbols.scala:121)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:191)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.info(SynchronizedSymbols.scala:191)
         at scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1682)
         at scala.reflect.internal.Symbols$Symbol.hasFlag(Symbols.scala:742)
         at scala.reflect.internal.HasFlags.isMutable(HasFlags.scala:108)
         at scala.reflect.internal.HasFlags.isMutable$(HasFlags.scala:108)
         at scala.reflect.internal.Symbols$Symbol.isMutable(Symbols.scala:214)
         at scala.reflect.internal.Symbols$Symbol.isStable(Symbols.scala:953)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readType$4(UnPickler.scala:403)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readType$4$adapted(UnPickler.scala:403)
         at scala.reflect.internal.Symbols$Symbol.filter(Symbols.scala:1968)
         at scala.reflect.internal.pickling.UnPickler$Scan.readType(UnPickler.scala:403)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$readTypeRef$1(UnPickler.scala:648)
         at scala.reflect.internal.pickling.UnPickler$Scan.at(UnPickler.scala:183)
         at scala.reflect.internal.pickling.UnPickler$Scan.readTypeRef(UnPickler.scala:648)
         at scala.reflect.internal.pickling.UnPickler$Scan.readType(UnPickler.scala:410)
         at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.$anonfun$completeInternal$1(UnPickler.scala:716)
         at scala.reflect.internal.pickling.UnPickler$Scan.at(UnPickler.scala:183)
         at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.completeInternal(UnPickler.scala:716)
         at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.complete(UnPickler.scala:743)
         at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1534)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$8.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:188)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.$anonfun$info$1(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:125)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe$(SynchronizedSymbols.scala:121)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$8.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:188)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$8.info(SynchronizedSymbols.scala:188)
         at scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1682)
         at scala.reflect.internal.Symbols$Symbol.annotations(Symbols.scala:1852)
         at scala.reflect.internal.Symbols$Symbol.addAnnotation(Symbols.scala:1871)
         at scala.reflect.internal.pickling.UnPickler$Scan.readSymbolAnnotation(UnPickler.scala:505)
         at scala.reflect.internal.pickling.UnPickler$Scan.$anonfun$run$2(UnPickler.scala:101)
         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
         at scala.reflect.internal.pickling.UnPickler$Scan.runAtIndex(UnPickler.scala:83)
         at scala.reflect.internal.pickling.UnPickler$Scan.run(UnPickler.scala:101)
         at scala.reflect.internal.pickling.UnPickler.unpickle(UnPickler.scala:40)
         at scala.reflect.runtime.JavaMirrors$JavaMirror.unpickleClass(JavaMirrors.scala:621)
         at scala.reflect.runtime.SymbolLoaders$TopClassCompleter.$anonfun$complete$2(SymbolLoaders.scala:25)
         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
         at scala.reflect.internal.SymbolTable.slowButSafeEnteringPhaseNotLaterThan(SymbolTable.scala:313)
         at scala.reflect.runtime.SymbolLoaders$TopClassCompleter.complete(SymbolLoaders.scala:22)
         at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1534)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:191)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.$anonfun$info$1(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:125)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe$(SynchronizedSymbols.scala:121)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:191)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.info(SynchronizedSymbols.scala:191)
         at scala.reflect.internal.SymbolTable.openPackageModule(SymbolTable.scala:336)
         at scala.reflect.internal.SymbolTable.openPackageModule(SymbolTable.scala:391)
         at scala.reflect.runtime.SymbolLoaders$LazyPackageType.$anonfun$complete$3(SymbolLoaders.scala:71)
         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
         at scala.reflect.internal.SymbolTable.slowButSafeEnteringPhaseNotLaterThan(SymbolTable.scala:313)
         at scala.reflect.runtime.SymbolLoaders$LazyPackageType.complete(SymbolLoaders.scala:68)
         at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1534)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:179)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.$anonfun$info$1(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:125)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.gilSynchronizedIfNotThreadsafe$(SynchronizedSymbols.scala:121)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:179)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:129)
         at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1.info(SynchronizedSymbols.scala:179)
         at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2383)
         at scala.reflect.internal.tpe.FindMembers$FindMemberBase.<init>(FindMembers.scala:17)
         at scala.reflect.internal.tpe.FindMembers$FindMember.<init>(FindMembers.scala:219)
         at scala.reflect.internal.Types$Type.findMemberInternal$1(Types.scala:1032)
         at scala.reflect.internal.Types$Type.findMember(Types.scala:1034)
         at scala.reflect.internal.Types$Type.memberBasedOnName(Types.scala:660)
         at scala.reflect.internal.Types$Type.member(Types.scala:624)
         at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
         at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66)
         at scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:172)
         at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage$lzycompute(Definitions.scala:170)
         at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage(Definitions.scala:170)
         at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass$lzycompute(Definitions.scala:171)
         at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass(Definitions.scala:171)
         at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr$lzycompute(Definitions.scala:1206)
         at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr(Definitions.scala:1205)
         at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses$lzycompute(Definitions.scala:1335)
         at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses(Definitions.scala:1334)
         at scala.reflect.internal.Mirrors$RootsBase.init(Mirrors.scala:232)
         at scala.reflect.runtime.JavaMirrors.createMirror(JavaMirrors.scala:34)
         at scala.reflect.runtime.JavaMirrors.$anonfun$runtimeMirror$1(JavaMirrors.scala:51)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.JavaMirrors.runtimeMirror(JavaMirrors.scala:49)
         at scala.reflect.runtime.JavaMirrors.runtimeMirror$(JavaMirrors.scala:48)
         at scala.reflect.runtime.JavaUniverse.runtimeMirror(JavaUniverse.scala:18)
         at scala.reflect.runtime.JavaMirrors$JavaMirror.mirrorDefining(JavaMirrors.scala:568)
         at scala.reflect.runtime.SymbolLoaders$PackageScope.$anonfun$lookupEntry$1(SymbolLoaders.scala:136)
         at scala.reflect.runtime.Gil.gilSynchronized(Gil.scala:19)
         at scala.reflect.runtime.Gil.gilSynchronized$(Gil.scala:14)
         at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:18)
         at scala.reflect.runtime.SymbolLoaders$PackageScope.syncLockSynchronized(SymbolLoaders.scala:121)
         at scala.reflect.runtime.SymbolLoaders$PackageScope.lookupEntry(SymbolLoaders.scala:123)
         at scala.reflect.internal.tpe.FindMembers$FindMemberBase.walkBaseClasses(FindMembers.scala:88)
         at scala.reflect.internal.tpe.FindMembers$FindMemberBase.searchConcreteThenDeferred(FindMembers.scala:56)
         at scala.reflect.internal.tpe.FindMembers$FindMemberBase.apply(FindMembers.scala:48)
         at scala.reflect.internal.Types$Type.findMemberInternal$1(Types.scala:1032)
         at scala.reflect.internal.Types$Type.findMember(Types.scala:1034)
         at scala.reflect.internal.Types$Type.memberBasedOnName(Types.scala:660)
         at scala.reflect.internal.Types$Type.member(Types.scala:624)
         at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
         at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66)
         at scala.reflect.internal.Mirrors$RootsBase.getClassByName(Mirrors.scala:101)
         at scala.reflect.internal.Mirrors$RootsBase.getRequiredClass(Mirrors.scala:104)
         at scala.reflect.internal.Definitions$DefinitionsClass.ObjectClass$lzycompute(Definitions.scala:266)
         at scala.reflect.internal.Definitions$DefinitionsClass.ObjectClass(Definitions.scala:266)
         at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1431)
         at scala.reflect.runtime.JavaUniverse.init(JavaUniverse.scala:142)
         at scala.reflect.runtime.JavaUniverse.<init>(JavaUniverse.scala:81)
         at scala.reflect.runtime.package$.universe$lzycompute(package.scala:17)
         at scala.reflect.runtime.package$.universe(package.scala:17)
         at scala.tools.testing.Runner$.make(RunTesting.scala:16)
         at scala.tools.testing.RunTesting.$anonfun$runner$1(RunTesting.scala:8)
         at scala.tools.testing.ClearAfterClass.lambda$cached$1(ClearAfterClass.java:51)
         at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
         at scala.tools.testing.ClearAfterClass.cached(ClearAfterClass.java:51)
         at scala.tools.testing.RunTesting.$init$(RunTesting.scala:8)
         at scala.OptionTest.<init>(OptionTest.scala:8)
         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
         at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:195)
         at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:244)
         at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
         at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:241)
         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
         at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
         at scala.tools.testing.ClearAfterClass$1.evaluate(ClearAfterClass.java:29)
         at org.junit.rules.RunRules.evaluate(RunRules.java:20)
         at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
         at org.junit.runners.Suite.runChild(Suite.java:127)
         at org.junit.runners.Suite.runChild(Suite.java:26)
         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
         at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
         at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
         at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
         at org.junit.runner.JUnitCore.run(JUnitCore.java:138)
         at com.novocode.junit.JUnitRunner$1.execute(JUnitRunner.java:132)
         at sbt.ForkMain$Run$2.call(ForkMain.java:296)
         at sbt.ForkMain$Run$2.call(ForkMain.java:286)
         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
         at java.lang.Thread.run(Thread.java:748)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That problem might be limited to runtime reflection. Still needs investigation of course.

def run: Unit = {
serialize(new B())
/* This is no longer possible with the proxy-based serialization for collections: */
//serialize(new B())
Copy link
Contributor Author

@szeiger szeiger May 23, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've given up on playing whack-a-mole with Enumeration. If anyone else has an idea, have a go at it. The cyclic dependency problem with deserialized collections is not entirely new. List already used the serialization proxy pattern, so any List-based code was affected. Now we have more instances because most other collection types (in particular for this case, the default Set implementation) do the same.

Copy link
Member

@lrytz lrytz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really nice!!!

A few comments

  • There are some redundant extends Serializable left (e.g., immutable.ArraySeq.ofX, mutable.ArraySeq)
  • There are some self-serializing classes without @SVUID annotation (e.g., immutable.ArraySeq, RangeIterator)
  • For classes using self-serialization, we need to make sure that all parent classes have an @SVUID annotation.
    • For example, AbstractIterable, AbstractSeq
  • There are @SVUID annotations left on classes that use the serialization proxy (e.g., List). Should we remove them?
  • Should we use 3L for the SVUID uniformly? See scala/collection-strawman#418.

I'll try to fix the issue in reflection when annotation Stream.Empty.

* extending this class.
*/
@SerialVersionUID(1L)
class DefaultSerializationProxy[A](val factory: Factory[A, Any], @transient protected val coll: Iterable[A]) extends Serializable {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this class be final? Then we could also simplify the scaladoc comment above.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It makes sense to subclass it in order to store additional data that is used in readResolve. You only need to put that data into the factory if you need it to create the Builder.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't have any such case in the standard library though. It's not really how Builders are used. Making it final would not be big restriction.

}

@SerialVersionUID(1L)
private[collection] final case object SerializeEnd
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

redundant final

@plokhotnyuk
Copy link
Contributor

plokhotnyuk commented May 24, 2018

@szeiger Anybody still use Java-serialization?
These days it is the most inefficient (and insecure) option to serialize binary: dkomanov/scala-serialization#8

Instead, I would add a package viewability to all collection internals and provide efficient type-classes for the most popular binary serializers in the separated projects and jars.

- Provide a `DefaultSerializationProxy` for all collection kinds.

- Remove `List.SerializationProxy` (the new default proxy is equally
  good for `List`).

- Remove unnecessary `SerialVersionUID` annotations and `Serializable`
  mix-ins: All collections are `Serializable` (via `Iterable`) and
  use a serialization proxy by default.

- Add missing `toFactory` and `toBuildFrom` conversion to some
  non-standard factory objects (e.g. `IntMap`). `toFactory` is needed
  for `DefaultSerializationProxy`.

- Re-enable self-serialization (not using the default proxy) for
  `Range`, `NumericRange`, `View`, `StringBuilder` and both
  `ArraySeq`s.

- Re-enable self-serialization for `Enumeration.ValueSet` to avoid some
  cyclic dependencies during deserialization which can make proxies
  leak and cause a `ClassCastException`. I was unable to come up with a
  solution to all such problems (see `run/enums.scala`).

- Use an `Array` instead of a `Seq` in
  `Manifest.IntersectionTypeManifest` to avoid cyclic dependencies
  during deserialization.

- Add a custom proxy to `BitSet` for compact serialization of the
  internal structure.

- Add a custom proxy for mixed strict and lazy serialization of
  `LazyList` and `Stream`. A forced init is stored sequentially to
  prevent stack overflows, the unevaluated tail is serialized in
  structural form to preserve laziness.

- Make iterators of `IndexedSeqView`, `Range` and `NumericRange`
  serializable.
@szeiger szeiger force-pushed the wip/collection-serialization branch from e396aac to 5d56f69 Compare May 24, 2018 18:33
@szeiger
Copy link
Contributor Author

szeiger commented May 24, 2018

Addressed the review comments, in particular:

  • Made DefaultSerializationProxy final
  • Changed all cases of SerialVersionUID = 1 to 3
  • Added missing SerialVersionUID annotations, in particular to all abstract serializable classes
  • Removed some unnecessary SerialVersionUID annotations
  • Removed unnecessary "extends Serializable" clauses

@lrytz
Copy link
Member

lrytz commented May 25, 2018

@plokhotnyuk Java serialization is certainly still used, so we need to support it. That doesn't exclude other serialization frameworks of course.

@lrytz
Copy link
Member

lrytz commented May 25, 2018

Merging this now, I'll look into the unpickler crash.

@lrytz
Copy link
Member

lrytz commented May 25, 2018

Diagnosis of the reflection issue: scala/bug#10903

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants