aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-02-12 20:29:11 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:11:05 +0100
commit0ed27cc87d1f080836b319f97cbf900c2ba2c234 (patch)
treeb49ddea5d864140e6b7e64f2a61a409e348bd745 /src/dotty/tools
parent5ae8b128eb3e694c3fbb83124371a9bbb9d698fe (diff)
downloaddotty-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.
Diffstat (limited to 'src/dotty/tools')
-rw-r--r--src/dotty/tools/dotc/core/Flags.scala5
-rw-r--r--src/dotty/tools/dotc/core/pickling/TreeBuffer.scala2
-rw-r--r--src/dotty/tools/dotc/core/pickling/TreePickler.scala23
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala3
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)
}