From b34d57ce447f819f258aad02030accca3906e845 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 9 Jun 2015 14:06:27 +0200 Subject: [PATCH 1/3] Don't keep SkolemTypes in TASTY SkolemTypes are no longer needed when Pickling because they exist only for checking type-safety. After the typer, we can safely eliminate them. Not having skolem types in TASTY simplifies the format and avoids having to explain a difficult concept. --- .../tools/dotc/core/tasty/TastyFormat.scala | 24 +++++++++---------- .../tools/dotc/core/tasty/TreePickler.scala | 1 - .../tools/dotc/core/tasty/TreeUnpickler.scala | 2 -- .../tools/dotc/printing/PlainPrinter.scala | 3 ++- .../tools/dotc/printing/RefinedPrinter.scala | 2 +- 5 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/dotty/tools/dotc/core/tasty/TastyFormat.scala b/src/dotty/tools/dotc/core/tasty/TastyFormat.scala index 1022fc4da825..630e25a32ac7 100644 --- a/src/dotty/tools/dotc/core/tasty/TastyFormat.scala +++ b/src/dotty/tools/dotc/core/tasty/TastyFormat.scala @@ -104,7 +104,6 @@ Standard-Section: "ASTs" TopLevelStat* TERMREF possiblySigned_NameRef qual_Type THIS clsRef_Type REFINEDthis refinedType_ASTRef - SKOLEMtype Type_ASTRef SHARED path_ASTRef Constant = UNITconst @@ -261,17 +260,16 @@ object TastyFormat { final val TYPEREFdirect = 66 final val TERMREFpkg = 67 final val TYPEREFpkg = 68 - final val SKOLEMtype = 69 - final val REFINEDthis = 70 - final val BYTEconst = 71 - final val SHORTconst = 72 - final val CHARconst = 73 - final val INTconst = 74 - final val LONGconst = 75 - final val FLOATconst = 76 - final val DOUBLEconst = 77 - final val STRINGconst = 78 - final val IMPORTED = 79 + final val REFINEDthis = 69 + final val BYTEconst = 70 + final val SHORTconst = 71 + final val CHARconst = 72 + final val INTconst = 73 + final val LONGconst = 74 + final val FLOATconst = 75 + final val DOUBLEconst = 76 + final val STRINGconst = 77 + final val IMPORTED = 78 final val THIS = 96 final val CLASSconst = 97 @@ -421,7 +419,7 @@ object TastyFormat { case TYPEREFdirect => "TYPEREFdirect" case TERMREFpkg => "TERMREFpkg" case TYPEREFpkg => "TYPEREFpkg" - case SKOLEMtype => "SKOLEMtype" + case REFINEDthis => "REFINEDthis" case BYTEconst => "BYTEconst" case SHORTconst => "SHORTconst" case CHARconst => "CHARconst" diff --git a/src/dotty/tools/dotc/core/tasty/TreePickler.scala b/src/dotty/tools/dotc/core/tasty/TreePickler.scala index cd49f7c5a989..99a5a587f3fb 100644 --- a/src/dotty/tools/dotc/core/tasty/TreePickler.scala +++ b/src/dotty/tools/dotc/core/tasty/TreePickler.scala @@ -202,7 +202,6 @@ class TreePickler(pickler: TastyPickler) { writeByte(REFINEDthis) writeRef(pickledTypes.get(tpe.binder).asInstanceOf[Addr]) case tpe: SkolemType => - writeByte(SKOLEMtype) pickleType(tpe.info) case tpe: RefinedType => val args = tpe.argInfos(interpolate = false) diff --git a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index d4260e679a00..5e77dd64737a 100644 --- a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -256,8 +256,6 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) { ThisType.raw(readType().asInstanceOf[TypeRef]) case REFINEDthis => RefinedThis(readTypeRef().asInstanceOf[RefinedType]) - case SKOLEMtype => - SkolemType(readTypeRef()) case SHARED => val ref = readAddr() typeAtAddr.getOrElseUpdate(ref, forkAt(ref).readType()) diff --git a/src/dotty/tools/dotc/printing/PlainPrinter.scala b/src/dotty/tools/dotc/printing/PlainPrinter.scala index a7b338be88c5..86dd3878c80a 100644 --- a/src/dotty/tools/dotc/printing/PlainPrinter.scala +++ b/src/dotty/tools/dotc/printing/PlainPrinter.scala @@ -231,7 +231,8 @@ class PlainPrinter(_ctx: Context) extends Printer { case tp: RefinedThis => s"${nameString(tp.binder.typeSymbol)}{...}.this" case tp: SkolemType => - "" + if (homogenizedView) toText(tp.info) + else "" } } diff --git a/src/dotty/tools/dotc/printing/RefinedPrinter.scala b/src/dotty/tools/dotc/printing/RefinedPrinter.scala index cf80969bf749..2288fe9c0c73 100644 --- a/src/dotty/tools/dotc/printing/RefinedPrinter.scala +++ b/src/dotty/tools/dotc/printing/RefinedPrinter.scala @@ -179,7 +179,7 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) { * * The body is simplified as follows * - if it is a TypeAlias, follow it - * - replace all references to of the form .HK$i by references + * - replace all references to of the form .HK$i by references * without a prefix, because the latter print nicer. * */ From 19ff3d64242f8260659d1f1e4a4e5492e9e75063 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 9 Jun 2015 16:24:55 +0200 Subject: [PATCH 2/3] Eliminate ABSOVERRIDE from TASTY Replace by ABSTRACT and OVERRIDE. No need to expose the representation detail that they are a single flag. --- .../tools/dotc/core/tasty/TastyFormat.scala | 34 ++++++++----------- .../tools/dotc/core/tasty/TreePickler.scala | 2 +- .../tools/dotc/core/tasty/TreeUnpickler.scala | 7 +++- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/dotty/tools/dotc/core/tasty/TastyFormat.scala b/src/dotty/tools/dotc/core/tasty/TastyFormat.scala index 630e25a32ac7..94ed9405276c 100644 --- a/src/dotty/tools/dotc/core/tasty/TastyFormat.scala +++ b/src/dotty/tools/dotc/core/tasty/TastyFormat.scala @@ -157,7 +157,6 @@ Standard-Section: "ASTs" TopLevelStat* LAZY OVERRIDE INLINE // macro - ABSOVERRIDE // abstract override STATIC // mapped to static Java member OBJECT // an object or its class TRAIT // a trait @@ -238,22 +237,21 @@ object TastyFormat { final val LAZY = 14 final val OVERRIDE = 15 final val INLINE = 16 - final val ABSOVERRIDE = 17 - final val STATIC = 18 - final val OBJECT = 19 - final val TRAIT = 20 - final val LOCAL = 21 - final val SYNTHETIC = 22 - final val ARTIFACT = 23 - final val MUTABLE = 24 - final val LABEL = 25 - final val FIELDaccessor = 26 - final val CASEaccessor = 27 - final val COVARIANT = 28 - final val CONTRAVARIANT = 29 - final val SCALA2X = 30 - final val DEFAULTparameterized = 31 - final val INSUPERCALL = 32 + final val STATIC = 17 + final val OBJECT = 18 + final val TRAIT = 19 + final val LOCAL = 20 + final val SYNTHETIC = 21 + final val ARTIFACT = 22 + final val MUTABLE = 23 + final val LABEL = 24 + final val FIELDaccessor = 25 + final val CASEaccessor = 26 + final val COVARIANT = 27 + final val CONTRAVARIANT = 28 + final val SCALA2X = 29 + final val DEFAULTparameterized = 30 + final val INSUPERCALL = 31 final val SHARED = 64 final val TERMREFdirect = 65 @@ -349,7 +347,6 @@ object TastyFormat { | LAZY | OVERRIDE | INLINE - | ABSOVERRIDE | STATIC | OBJECT | TRAIT @@ -397,7 +394,6 @@ object TastyFormat { case LAZY => "LAZY" case OVERRIDE => "OVERRIDE" case INLINE => "INLINE" - case ABSOVERRIDE => "ABSOVERRIDE" case STATIC => "STATIC" case OBJECT => "OBJECT" case TRAIT => "TRAIT" diff --git a/src/dotty/tools/dotc/core/tasty/TreePickler.scala b/src/dotty/tools/dotc/core/tasty/TreePickler.scala index 99a5a587f3fb..8847d2de3c40 100644 --- a/src/dotty/tools/dotc/core/tasty/TreePickler.scala +++ b/src/dotty/tools/dotc/core/tasty/TreePickler.scala @@ -522,7 +522,7 @@ class TreePickler(pickler: TastyPickler) { if (sym.isTerm) { if (flags is Implicit) writeByte(IMPLICIT) if ((flags is Lazy) && !(sym is Module)) writeByte(LAZY) - if (flags is AbsOverride) writeByte(ABSOVERRIDE) + if (flags is AbsOverride) { writeByte(ABSTRACT); writeByte(OVERRIDE) } if (flags is Mutable) writeByte(MUTABLE) if (flags is Accessor) writeByte(FIELDaccessor) if (flags is CaseAccessor) writeByte(CASEaccessor) diff --git a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index 5e77dd64737a..2730806ed451 100644 --- a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -427,7 +427,12 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) { case PRIVATE => addFlag(Private) case INTERNAL => ??? // addFlag(Internal) case PROTECTED => addFlag(Protected) - case ABSTRACT => addFlag(Abstract) + case ABSTRACT => + readByte() + nextByte match { + case OVERRIDE => addFlag(AbsOverride) + case _ => flags |= Abstract + } case FINAL => addFlag(Final) case SEALED => addFlag(Sealed) case CASE => addFlag(Case) From 815209e12e76c61fcf992a4966c976f4c2ec5597 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 10 Jun 2015 10:22:29 +0200 Subject: [PATCH 3/3] Fixed compilation error. --- src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index 2730806ed451..11f6d12c57ad 100644 --- a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -440,7 +440,6 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) { case LAZY => addFlag(Lazy) case OVERRIDE => addFlag(Override) case INLINE => addFlag(Inline) - case ABSOVERRIDE => addFlag(AbsOverride) case STATIC => addFlag(JavaStatic) case OBJECT => addFlag(Module) case TRAIT => addFlag(Trait)