aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc
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
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')
-rw-r--r--src/dotty/tools/dotc/core/Flags.scala6
-rw-r--r--src/dotty/tools/dotc/core/pickling/PickleFormat.scala36
-rw-r--r--src/dotty/tools/dotc/core/pickling/TreePickler.scala1
-rw-r--r--src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala29
-rw-r--r--src/dotty/tools/dotc/transform/FirstTransform.scala2
5 files changed, 46 insertions, 28 deletions
diff --git a/src/dotty/tools/dotc/core/Flags.scala b/src/dotty/tools/dotc/core/Flags.scala
index e57ba066e..4a016ba72 100644
--- a/src/dotty/tools/dotc/core/Flags.scala
+++ b/src/dotty/tools/dotc/core/Flags.scala
@@ -335,8 +335,8 @@ object Flags {
final val JavaStaticTerm = JavaStatic.toTermFlags
final val JavaStaticType = JavaStatic.toTypeFlags
- /** Trait is not an interface, but does not have fields or intialization code */
- final val NoInits = typeFlag(32, "<noInits>") // TODO when unpickling, reconstitute from context
+ /** Trait is not an interface, but does not have fields or initialization code */
+ final val NoInits = typeFlag(32, "<noInits>")
/** Variable is accessed from nested function. */
final val Captured = termFlag(32, "<captured>")
@@ -367,7 +367,7 @@ object Flags {
/** Symbol always defines a fresh named type */
final val Fresh = commonFlag(45, "<fresh>")
- /** Symbol is defined in a super call */ // TODO when unpickling, reconstitute from context
+ /** Symbol is defined in a super call */
final val InSuperCall = commonFlag(46, "<in supercall>")
/** Symbol with private access is accessed outside its private scope */
diff --git a/src/dotty/tools/dotc/core/pickling/PickleFormat.scala b/src/dotty/tools/dotc/core/pickling/PickleFormat.scala
index 557a45f8c..a03da3a79 100644
--- a/src/dotty/tools/dotc/core/pickling/PickleFormat.scala
+++ b/src/dotty/tools/dotc/core/pickling/PickleFormat.scala
@@ -158,6 +158,7 @@ Standard-Section: "ASTs" TopLevelStat*
ABSOVERRIDE // abstract override
STATIC // mapped to static Java member
MODULE // an object or its class
+ TRAIT
LOCAL // private[this] or protected[this]
SYNTHETIC // generated by Scala compiler
ARTIFACT // to be tagged Java Synthetic
@@ -237,20 +238,21 @@ object PickleFormat {
final val ABSOVERRIDE = 17
final val STATIC = 18
final val MODULE = 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 PARAMaccessor = 26
- final val CASEaccessor = 27
- final val COVARIANT = 28
- final val CONTRAVARIANT = 29
- final val SCALA2X = 30
- final val DEFAULTparameterized = 31
- final val DEFAULTinit = 32
- final val INSUPERCALL = 33
+ 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 PARAMaccessor = 27
+ final val CASEaccessor = 28
+ final val COVARIANT = 29
+ final val CONTRAVARIANT = 30
+ final val SCALA2X = 31
+ final val DEFAULTparameterized = 32
+ final val DEFAULTinit = 33
+ final val INSUPERCALL = 34
final val SHARED = 64
final val TERMREFdirect = 65
@@ -332,11 +334,6 @@ object PickleFormat {
final val firstNatASTTreeTag = IDENT
final val firstLengthTreeTag = PACKAGE
- def isDefTag(tag: Int) = tag match {
- case VALDEF | DEFDEF | TYPEDEF | TYPEPARAM | PARAM => true
- case _ => false
- }
-
def isParamTag(tag: Int) = tag == PARAM || tag == TYPEPARAM
def nameTagToString(tag: Int): String = tag match {
@@ -370,6 +367,7 @@ object PickleFormat {
case ABSOVERRIDE => "ABSOVERRIDE"
case STATIC => "STATIC"
case MODULE => "MODULE"
+ case TRAIT => "TRAIT"
case LOCAL => "LOCAL"
case SYNTHETIC => "SYNTHETIC"
case ARTIFACT => "ARTIFACT"
diff --git a/src/dotty/tools/dotc/core/pickling/TreePickler.scala b/src/dotty/tools/dotc/core/pickling/TreePickler.scala
index 16c1ebd02..3212894c4 100644
--- a/src/dotty/tools/dotc/core/pickling/TreePickler.scala
+++ b/src/dotty/tools/dotc/core/pickling/TreePickler.scala
@@ -462,6 +462,7 @@ class TreePickler(pickler: TastyPickler) {
} else {
if (flags is Sealed) writeByte(SEALED)
if (flags is Abstract) writeByte(ABSTRACT)
+ if (flags is Trait) writeByte(TRAIT)
if (flags is Covariant) writeByte(COVARIANT)
if (flags is Contravariant) writeByte(CONTRAVARIANT)
}
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,
diff --git a/src/dotty/tools/dotc/transform/FirstTransform.scala b/src/dotty/tools/dotc/transform/FirstTransform.scala
index bde17c854..0de261149 100644
--- a/src/dotty/tools/dotc/transform/FirstTransform.scala
+++ b/src/dotty/tools/dotc/transform/FirstTransform.scala
@@ -119,7 +119,7 @@ class FirstTransform extends MiniPhaseTransform with IdentityDenotTransformer wi
/*
A this reference hide in a self ident, and be subsequently missed
when deciding on whether outer accessors are needed and computing outer paths.
- sWe do this normalization directly after Typer, because during typer the
+ We do this normalization directly after Typer, because during typer the
ident should rest available for hyperlinking.*/
This(tpe.cls).withPos(tree.pos)
case _ => normalizeType(tree)