aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-02-27 16:51:10 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:14:12 +0100
commit60e520c73d20526f2cf21c90088480f0a971fbc3 (patch)
tree4b942de8a941491ef953279f9969790030f9d8a9 /src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala
parenta0c2d6c5ba6d190d183babb3941b3607b112b8fc (diff)
downloaddotty-60e520c73d20526f2cf21c90088480f0a971fbc3.tar.gz
dotty-60e520c73d20526f2cf21c90088480f0a971fbc3.tar.bz2
dotty-60e520c73d20526f2cf21c90088480f0a971fbc3.zip
Pickle trait flag and compute PureInterface and NoInits in unpickler.
1) Trait was missing, needs to be serialized. 2) The other two flags are not serialized, need to be reconstituted on unpickling.
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala')
-rw-r--r--src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala b/src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala
index 0c989cfdc..9a63c7038 100644
--- a/src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala
+++ b/src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala
@@ -259,8 +259,10 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table,
// ------ Reading definitions -----------------------------------------------------
- /** Create symbol of definition node and enter in symAtAddr map */
- def createSymbol()(implicit ctx: Context): Unit = {
+ /** Create symbol of definition node and enter in symAtAddr map
+ * @return flag set over PureInterface | NoInits according to form of definition
+ */
+ def createSymbol()(implicit ctx: Context): FlagSet = {
val start = currentAddr
val tag = readByte()
val end = readEnd()
@@ -317,6 +319,10 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table,
completer.withDecls(newScope)
forkAt(templateStart).indexTemplateParams()(ctx.fresh.setOwner(sym))
}
+ var resultFlags: FlagSet = EmptyFlags
+ if (tag != VALDEF || rhsIsEmpty) resultFlags |= NoInits
+ if (tag != VALDEF && tag != DEFDEF || rhsIsEmpty) resultFlags |= PureInterface
+ resultFlags
}
/** Read modifier list into triplet of flags, annotations and a privateWithin
@@ -346,6 +352,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table,
case ABSOVERRIDE => addFlag(AbsOverride)
case STATIC => addFlag(JavaStatic)
case MODULE => addFlag(Module)
+ case TRAIT => addFlag(Trait)
case LOCAL => addFlag(Local)
case SYNTHETIC => addFlag(Synthetic)
case ARTIFACT => addFlag(Artifact)
@@ -383,9 +390,19 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table,
/** Create symbols for a definitions in statement sequence between
* current address and `end`.
+ * @return flag set over PureInterface | NoInits according to forms of statements
*/
- def indexStats(end: Addr)(implicit ctx: Context) =
- until(end) { if (isDefTag(nextByte)) createSymbol() else skipTree() }
+ def indexStats(end: Addr)(implicit ctx: Context): FlagSet = {
+ val statFlags =
+ until(end) {
+ nextByte match {
+ case VALDEF | DEFDEF | TYPEDEF | TYPEPARAM | PARAM => createSymbol()
+ case EMPTYTREE | IMPORT => skipTree(); PureInterface | NoInits
+ case _ => skipTree(); EmptyFlags
+ }
+ }
+ ((PureInterface | NoInits) /: statFlags) (_ & _)
+ }
/** Create symbols the longest consecutive sequence of parameters with given
* `tag starting at current address.
@@ -467,6 +484,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table,
impl.parents.map(_.tpe.asInstanceOf[TypeRef]),
cls.unforcedDecls,
if (impl.self.isEmpty) NoType else impl.self.tpt.tpe)
+ if (!cls.is(Trait)) cls.resetFlag(PureInterface)
ta.assignType(untpd.TypeDef(sym.name.asTypeName, impl), sym)
}
else {
@@ -506,7 +524,8 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table,
untpd.ValDef(readName(), readTpt(), EmptyTree).withType(NoType)
}
else EmptyValDef
- fork.indexStats(end)
+ val additionalFlags = fork.indexStats(end) // PureInterface or NoInits
+ cls.setFlag(additionalFlags) // PureInterface will be reset later if cls is not a trait
val constr = readIndexedDef().asInstanceOf[DefDef]
val lazyStats = readLater(end, rdr => ctx => rdr.readIndexedStats(localDummy, end)(ctx))
setPos(start,