diff options
author | Martin Odersky <odersky@gmail.com> | 2015-02-12 20:29:11 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:11:05 +0100 |
commit | 0ed27cc87d1f080836b319f97cbf900c2ba2c234 (patch) | |
tree | b49ddea5d864140e6b7e64f2a61a409e348bd745 | |
parent | 5ae8b128eb3e694c3fbb83124371a9bbb9d698fe (diff) | |
download | dotty-0ed27cc87d1f080836b319f97cbf900c2ba2c234.tar.gz dotty-0ed27cc87d1f080836b319f97cbf900c2ba2c234.tar.bz2 dotty-0ed27cc87d1f080836b319f97cbf900c2ba2c234.zip |
Fix serialization of Bind-defined types in type patterns.
These are now represented as BIND nodes in pickled types.
-rw-r--r-- | src/dotty/tools/dotc/core/Flags.scala | 5 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/TreeBuffer.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/TreePickler.scala | 23 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Typer.scala | 3 |
4 files changed, 25 insertions, 8 deletions
diff --git a/src/dotty/tools/dotc/core/Flags.scala b/src/dotty/tools/dotc/core/Flags.scala index 3a174d95f..c2e7cd399 100644 --- a/src/dotty/tools/dotc/core/Flags.scala +++ b/src/dotty/tools/dotc/core/Flags.scala @@ -300,7 +300,7 @@ object Flags { /** Method is assumed to be stable */ final val Stable = termFlag(24, "<stable>") - + /** A case parameter accessor */ final val CaseAccessor = termFlag(25, "<caseaccessor>") @@ -318,6 +318,9 @@ object Flags { /** A method that has default params */ final val DefaultParameterized = termFlag(27, "<defaultparam>") + /** A type that is defined by a type bind */ + final val BindDefinedType = typeFlag(27, "<bind-defined>") + /** Symbol is initialized to the default value, e.g. var x: T = _ */ final val DefaultInit = termFlag(28, "<defaultinit>") diff --git a/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala b/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala index 41a08d2ca..287e2f334 100644 --- a/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala +++ b/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala @@ -154,7 +154,7 @@ class TreeBuffer extends TastyBuffer(1000000) { var saved = 0 do { saved = adjustDeltas() - println(s"adjusting deltas, saved = $saved") + pickling.println(s"adjusting deltas, saved = $saved") } while (saved > 0 && length / saved < 100) adjustOffsets() val wasted = compress() diff --git a/src/dotty/tools/dotc/core/pickling/TreePickler.scala b/src/dotty/tools/dotc/core/pickling/TreePickler.scala index 662637026..7855f5d3e 100644 --- a/src/dotty/tools/dotc/core/pickling/TreePickler.scala +++ b/src/dotty/tools/dotc/core/pickling/TreePickler.scala @@ -129,17 +129,30 @@ class TreePickler(pickler: TastyPickler, picklePositions: Boolean) { case ConstantType(value) => pickleConstant(value) case tpe: WithFixedSym => - if (tpe.symbol.isStatic) { + val sym = tpe.symbol + if (sym.isStatic) { writeByte(if (tpe.isType) TYPEREFstatic else TERMREFstatic) - pickleName(qualifiedName(tpe.symbol)) + pickleName(qualifiedName(sym)) } else if (tpe.prefix == NoPrefix) { - writeByte(if (tpe.isType) TYPEREFdirect else TERMREFdirect) - pickleSym(tpe.symbol) + def pickleRef() = { + writeByte(if (tpe.isType) TYPEREFdirect else TERMREFdirect) + pickleSym(sym) + } + if (sym is Flags.BindDefinedType) { + registerDef(sym) + writeByte(BIND) + withLength { + pickleName(sym.name) + pickleType(sym.info) + pickleRef() + } + } + else pickleRef() } else { writeByte(if (tpe.isType) TYPEREFsymbol else TERMREFsymbol) - pickleType(tpe.prefix); pickleSym(tpe.symbol) + pickleType(tpe.prefix); pickleSym(sym) } case tpe: TermRefWithSignature => writeByte(TERMREF) diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala index 331657e12..e98b73cae 100644 --- a/src/dotty/tools/dotc/typer/Typer.scala +++ b/src/dotty/tools/dotc/typer/Typer.scala @@ -842,7 +842,8 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit def typedBind(tree: untpd.Bind, pt: Type)(implicit ctx: Context): Bind = track("typedBind") { val body1 = typed(tree.body, pt) typr.println(i"typed bind $tree pt = $pt bodytpe = ${body1.tpe}") - val sym = ctx.newSymbol(ctx.owner, tree.name, EmptyFlags, body1.tpe, coord = tree.pos) + val flags = if (tree.isType) BindDefinedType else EmptyFlags + val sym = ctx.newSymbol(ctx.owner, tree.name, flags, body1.tpe, coord = tree.pos) assignType(cpy.Bind(tree)(tree.name, body1), sym) } |