@@ -163,6 +163,11 @@ class TreeUnpickler(reader: TastyReader,
163163 def forkAt (start : Addr ): TreeReader = new TreeReader (subReader(start, endAddr))
164164 def fork : TreeReader = forkAt(currentAddr)
165165
166+ def skipParentTree (tag : Int ): Unit = {
167+ if tag == SPLITCLAUSE then ()
168+ else skipTree(tag)
169+ }
170+ def skipParentTree (): Unit = skipParentTree(readByte())
166171 def skipTree (tag : Int ): Unit = {
167172 if (tag >= firstLengthTreeTag) goto(readEnd())
168173 else if (tag >= firstNatASTTreeTag) { readNat(); skipTree() }
@@ -1011,7 +1016,7 @@ class TreeUnpickler(reader: TastyReader,
10111016 * parsed in this way as InferredTypeTrees.
10121017 */
10131018 def readParents (withArgs : Boolean )(using Context ): List [Tree ] =
1014- collectWhile(nextByte != SELFDEF && nextByte != DEFDEF ) {
1019+ collectWhile({ val tag = nextByte; tag != SELFDEF && tag != DEFDEF && tag != SPLITCLAUSE } ) {
10151020 nextUnsharedTag match
10161021 case APPLY | TYPEAPPLY | BLOCK =>
10171022 if withArgs then readTree()
@@ -1038,7 +1043,8 @@ class TreeUnpickler(reader: TastyReader,
10381043 val bodyFlags = {
10391044 val bodyIndexer = fork
10401045 // The first DEFDEF corresponds to the primary constructor
1041- while (bodyIndexer.reader.nextByte != DEFDEF ) bodyIndexer.skipTree()
1046+ while ({val tag = bodyIndexer.reader.nextByte; tag != DEFDEF && tag != SPLITCLAUSE }) do
1047+ bodyIndexer.skipParentTree()
10421048 bodyIndexer.indexStats(end)
10431049 }
10441050 val parentReader = fork
@@ -1057,7 +1063,38 @@ class TreeUnpickler(reader: TastyReader,
10571063 cls.owner.thisType, cls, parentTypes, cls.unforcedDecls,
10581064 selfInfo = if (self.isEmpty) NoType else self.tpt.tpe
10591065 ).integrateOpaqueMembers
1060- val constr = readIndexedDef().asInstanceOf [DefDef ]
1066+
1067+ val (constr, stats0) =
1068+ if nextByte == SPLITCLAUSE then
1069+ assert(unpicklingJava, s " unexpected SPLITCLAUSE at $start" )
1070+ val tag = readByte()
1071+ def ta = ctx.typeAssigner
1072+ val flags = Flags .JavaDefined | Flags .PrivateLocal | Flags .Invisible
1073+ val pflags = Flags .JavaDefined | Flags .Param
1074+ val tdefRefs = tparams.map(_.symbol.asType)
1075+ val ctorCompleter = new LazyType {
1076+ def complete (denot : SymDenotation )(using Context ) =
1077+ val sym = denot.symbol
1078+ lazy val tparamSyms : List [TypeSymbol ] = tparams.map: tdef =>
1079+ val completer = new LazyType {
1080+ def complete (denot : SymDenotation )(using Context ) =
1081+ denot.info = tdef.symbol.asType.info.subst(tdefRefs, tparamSyms.map(_.typeRef))
1082+ }
1083+ newSymbol(sym, tdef.name, pflags, completer, coord = cls.coord)
1084+ val paramSym =
1085+ newSymbol(sym, nme.syntheticParamName(1 ), pflags, defn.UnitType , coord = cls.coord)
1086+ val paramSymss = tparamSyms :: List (paramSym) :: Nil
1087+ val res = effectiveResultType(sym, paramSymss)
1088+ denot.info = methodType(paramSymss, res)
1089+ denot.setParamss(paramSymss)
1090+ }
1091+ val ctorSym = newSymbol(ctx.owner, nme.CONSTRUCTOR , flags, ctorCompleter, coord = coordAt(start))
1092+ val accSym = newSymbol(cls, nme.syntheticParamName(1 ), flags, defn.UnitType , coord = ctorSym.coord)
1093+ val ctorDef = tpd.DefDef (ctorSym, EmptyTree )
1094+ val accessor = tpd.ValDef (accSym, ElidedTree (accSym.info))
1095+ (ctorDef.setDefTree, accessor.setDefTree :: Nil )
1096+ else
1097+ readIndexedDef().asInstanceOf [DefDef ] -> Nil
10611098 val mappedParents : LazyTreeList =
10621099 if parents.exists(_.isInstanceOf [InferredTypeTree ]) then
10631100 // parents were not read fully, will need to be read again later on demand
@@ -1068,7 +1105,7 @@ class TreeUnpickler(reader: TastyReader,
10681105
10691106 val lazyStats = readLater(end, rdr => {
10701107 val stats = rdr.readIndexedStats(localDummy, end)
1071- tparams ++ vparams ++ stats
1108+ tparams ++ vparams ++ stats0 ++ stats
10721109 })
10731110 defn.patchStdLibClass(cls)
10741111 NamerOps .addConstructorProxies(cls)
@@ -1178,6 +1215,9 @@ class TreeUnpickler(reader: TastyReader,
11781215
11791216// ------ Reading trees -----------------------------------------------------
11801217
1218+ private def ElidedTree (tpe : Type )(using Context ): Tree =
1219+ untpd.Ident (nme.WILDCARD ).withType(tpe)
1220+
11811221 def readTree ()(using Context ): Tree = {
11821222 val sctx = sourceChangeContext()
11831223 if (sctx `ne` ctx) return readTree()(using sctx)
@@ -1234,7 +1274,7 @@ class TreeUnpickler(reader: TastyReader,
12341274 val msg =
12351275 s " Illegal elided tree in unpickler at $start without ${attributeTagToString(OUTLINEattr )}, ${ctx.source}"
12361276 report.error(msg)
1237- untpd. Ident (nme. WILDCARD ).withType (readType())
1277+ ElidedTree (readType())
12381278 case IDENTtpt =>
12391279 untpd.Ident (readName().toTypeName).withType(readType())
12401280 case SELECT =>
0 commit comments