From a8c2b0556db56ac85de3f2a078e169f7e4a1671a Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Thu, 10 Mar 2016 12:15:54 +0100 Subject: [PATCH 1/2] Pickle/unpickle SuperAccessor names Needed to restore the SuperAccessor flag in separate compilation. Fixes #1144. --- .../tools/dotc/core/tasty/TreePickler.scala | 21 ++++++++++++++----- .../tools/dotc/core/tasty/TreeUnpickler.scala | 11 +++++++--- tests/run/i1144/AB_1.scala | 6 ++++++ tests/run/i1144/C_2.scala | 3 +++ 4 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 tests/run/i1144/AB_1.scala create mode 100644 tests/run/i1144/C_2.scala diff --git a/src/dotty/tools/dotc/core/tasty/TreePickler.scala b/src/dotty/tools/dotc/core/tasty/TreePickler.scala index bb6c3cd2e8ec..7f8e5cef33af 100644 --- a/src/dotty/tools/dotc/core/tasty/TreePickler.scala +++ b/src/dotty/tools/dotc/core/tasty/TreePickler.scala @@ -55,11 +55,22 @@ class TreePickler(pickler: TastyPickler) { pickleName(TastyName.Signed(nameIndex(name), params.map(fullNameIndex), fullNameIndex(result))) } - private def pickleName(sym: Symbol)(implicit ctx: Context): Unit = - if (sym is Flags.ExpandedName) - pickleName(TastyName.Expanded( - nameIndex(sym.name.expandedPrefix), nameIndex(sym.name.unexpandedName))) - else pickleName(sym.name) + private def pickleName(sym: Symbol)(implicit ctx: Context): Unit = { + def encodeSuper(name: Name): TastyName.NameRef = + if (sym is Flags.SuperAccessor) { + val SuperAccessorName(n) = name + nameIndex(TastyName.SuperAccessor(nameIndex(n))) + } + else nameIndex(name) + val nameRef = + if (sym is Flags.ExpandedName) + nameIndex( + TastyName.Expanded( + nameIndex(sym.name.expandedPrefix), + encodeSuper(sym.name.unexpandedName))) + else encodeSuper(sym.name) + writeNat(nameRef.index) + } private def pickleSymRef(sym: Symbol)(implicit ctx: Context) = symRefs.get(sym) match { case Some(label) => diff --git a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index 16caac02e20b..2b13a9b1ca2d 100644 --- a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -78,7 +78,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) { case Shadowed(original) => toTermName(original).shadowedName case Expanded(prefix, original) => toTermName(original).expandedName(toTermName(prefix)) case ModuleClass(original) => toTermName(original).moduleClassName.toTermName - case SuperAccessor(accessed) => ??? + case SuperAccessor(accessed) => toTermName(accessed).superName case DefaultGetter(meth, num) => ??? } @@ -378,9 +378,14 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) { val rhsIsEmpty = noRhs(end) if (!rhsIsEmpty) skipTree() val (givenFlags, annots, privateWithin) = readModifiers(end) - val expandedFlag = if (rawName.isInstanceOf[TastyName.Expanded]) ExpandedName else EmptyFlags + def nameFlags(tname: TastyName): FlagSet = tname match { + case TastyName.Expanded(_, original) => ExpandedName | nameFlags(tastyName(original)) + case TastyName.SuperAccessor(_) => Flags.SuperAccessor + case _ => EmptyFlags + } + val superFlag = if (rawName.isInstanceOf) pickling.println(i"creating symbol $name at $start with flags $givenFlags") - val flags = normalizeFlags(tag, givenFlags | expandedFlag, name, isAbstractType, rhsIsEmpty) + val flags = normalizeFlags(tag, givenFlags | nameFlags(rawName), name, isAbstractType, rhsIsEmpty) def adjustIfModule(completer: LazyType) = if (flags is Module) ctx.adjustModuleCompleter(completer, name) else completer val sym = diff --git a/tests/run/i1144/AB_1.scala b/tests/run/i1144/AB_1.scala new file mode 100644 index 000000000000..ff37674dbcbd --- /dev/null +++ b/tests/run/i1144/AB_1.scala @@ -0,0 +1,6 @@ +trait A { + def x = 3 +} +trait B extends A { + override def x = super.x * 2 +} diff --git a/tests/run/i1144/C_2.scala b/tests/run/i1144/C_2.scala new file mode 100644 index 000000000000..855bcec96784 --- /dev/null +++ b/tests/run/i1144/C_2.scala @@ -0,0 +1,3 @@ +object Test extends B { + def main(args: Array[String]) = assert(x == 6, x) +} From ae49ebc8088cfe3493862234e86a29a0cbda9b91 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 12 Mar 2016 23:49:31 +0100 Subject: [PATCH 2/2] Delete unused line --- 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 2b13a9b1ca2d..016aa41de434 100644 --- a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -383,7 +383,6 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) { case TastyName.SuperAccessor(_) => Flags.SuperAccessor case _ => EmptyFlags } - val superFlag = if (rawName.isInstanceOf) pickling.println(i"creating symbol $name at $start with flags $givenFlags") val flags = normalizeFlags(tag, givenFlags | nameFlags(rawName), name, isAbstractType, rhsIsEmpty) def adjustIfModule(completer: LazyType) =