diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala index 44305412e09c..f082765d6cb7 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala @@ -198,6 +198,7 @@ Standard-Section: "ASTs" TopLevelStat* SCALA2X // Imported from Scala2.x DEFAULTparameterized // Method with default parameters STABLE // Method that is assumed to be stable + PARAMsetter // A setter without a body named `x_=` where `x` is pickled as a PARAM Annotation Annotation = ANNOTATION Length tycon_Type fullAnnotation_Term @@ -226,8 +227,8 @@ Standard Section: "Positions" Assoc* object TastyFormat { final val header = Array(0x5C, 0xA1, 0xAB, 0x1F) - val MajorVersion = 5 - val MinorVersion = 1 + val MajorVersion = 6 + val MinorVersion = 0 /** Tags used to serialize names */ class NameTags { @@ -268,6 +269,7 @@ object TastyFormat { // AST tags // Cat. 1: tag + final val firstSimpleTreeTag = UNITconst final val UNITconst = 2 final val FALSEconst = 3 final val TRUEconst = 4 @@ -300,6 +302,7 @@ object TastyFormat { final val STABLE = 31 final val MACRO = 32 final val ERASED = 33 + final val PARAMsetter = 34 // Cat. 2: tag Nat @@ -417,7 +420,6 @@ object TastyFormat { final val HOLE = 255 - final val firstSimpleTreeTag = UNITconst final val firstNatTreeTag = SHAREDterm final val firstASTTreeTag = THIS final val firstNatASTTreeTag = IDENT @@ -425,7 +427,7 @@ object TastyFormat { /** Useful for debugging */ def isLegalTag(tag: Int) = - firstSimpleTreeTag <= tag && tag <= ERASED || + firstSimpleTreeTag <= tag && tag <= PARAMsetter || firstNatTreeTag <= tag && tag <= SYMBOLconst || firstASTTreeTag <= tag && tag <= SINGLETONtpt || firstNatASTTreeTag <= tag && tag <= NAMEDARG || @@ -463,6 +465,7 @@ object TastyFormat { | SCALA2X | DEFAULTparameterized | STABLE + | PARAMsetter | ANNOTATION | PRIVATEqualified | PROTECTEDqualified => true @@ -518,6 +521,7 @@ object TastyFormat { case SCALA2X => "SCALA2X" case DEFAULTparameterized => "DEFAULTparameterized" case STABLE => "STABLE" + case PARAMsetter => "PARAMsetter" case SHAREDterm => "SHAREDterm" case SHAREDtype => "SHAREDtype" diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala index 7fd249d9f260..f7d942b4bdad 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala @@ -601,6 +601,7 @@ class TreePickler(pickler: TastyPickler) { if (flags is CaseAccessor) writeByte(CASEaccessor) if (flags is DefaultParameterized) writeByte(DEFAULTparameterized) if (flags is Stable) writeByte(STABLE) + if ((flags is ParamAccessor) && sym.isSetter) writeByte(PARAMsetter) } else { if (flags is Sealed) writeByte(SEALED) if (flags is Abstract) writeByte(ABSTRACT) diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index e33da8eabba1..ddf3ef7ed765 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -424,7 +424,11 @@ class TreeUnpickler(reader: TastyReader, flags = flags | (if (tag == VALDEF) ModuleValCreationFlags else ModuleClassCreationFlags) if (ctx.owner.isClass) { if (tag == TYPEPARAM) flags |= Param - else if (tag == PARAM) flags |= ParamAccessor + else if (tag == PARAM) { + flags |= ParamAccessor + if (!rhsIsEmpty) // param alias + flags |= Method + } } else if (isParamTag(tag)) flags |= Param flags @@ -585,6 +589,8 @@ class TreeUnpickler(reader: TastyReader, case SCALA2X => addFlag(Scala2x) case DEFAULTparameterized => addFlag(DefaultParameterized) case STABLE => addFlag(Stable) + case PARAMsetter => + addFlag(ParamAccessor) case PRIVATEqualified => readByte() privateWithin = readType().typeSymbol @@ -728,11 +734,6 @@ class TreeUnpickler(reader: TastyReader, vparamss.nestedMap(_.symbol), name == nme.CONSTRUCTOR) val resType = ctx.effectiveResultType(sym, typeParams, tpt.tpe) sym.info = ctx.methodType(typeParams, valueParamss, resType) - if (sym.isSetter && sym.accessedFieldOrGetter.is(ParamAccessor)) { - // reconstitute ParamAccessor flag of setters for var parameters, which is not pickled - sym.setFlag(ParamAccessor) - sym.resetFlag(Deferred) - } DefDef(tparams, vparamss, tpt) case VALDEF => val tpt = readTpt()(localCtx) @@ -775,7 +776,6 @@ class TreeUnpickler(reader: TastyReader, ValDef(tpt) } else { - sym.setFlag(Method) sym.info = ExprType(tpt.tpe) pickling.println(i"reading param alias $name -> $currentAddr") DefDef(Nil, Nil, tpt)