aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-04-04 19:53:31 +0200
committerMartin Odersky <odersky@gmail.com>2015-04-07 23:53:58 +0200
commit6d2a2b1dede589c2d3b183d5ac109cab9100d618 (patch)
treef31770e3241d0cd9dd8559e75fd4daa14544ca52 /src/dotty/tools/dotc
parentaf90fc5dd6606992763206929596bbcb6d5cba3c (diff)
downloaddotty-6d2a2b1dede589c2d3b183d5ac109cab9100d618.tar.gz
dotty-6d2a2b1dede589c2d3b183d5ac109cab9100d618.tar.bz2
dotty-6d2a2b1dede589c2d3b183d5ac109cab9100d618.zip
Produce expanded names.
In the absence of semantic names, this is kludgey. But we need to do it because otherwise the ExpandedName flag is not correctly set.
Diffstat (limited to 'src/dotty/tools/dotc')
-rw-r--r--src/dotty/tools/dotc/core/NameOps.scala10
-rw-r--r--src/dotty/tools/dotc/core/pickling/NameBuffer.scala4
-rw-r--r--src/dotty/tools/dotc/core/pickling/TastyName.scala2
-rw-r--r--src/dotty/tools/dotc/core/pickling/TastyPrinter.scala3
-rw-r--r--src/dotty/tools/dotc/core/pickling/TastyUnpickler.scala2
-rw-r--r--src/dotty/tools/dotc/core/pickling/TreePickler.scala15
-rw-r--r--src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala11
7 files changed, 32 insertions, 15 deletions
diff --git a/src/dotty/tools/dotc/core/NameOps.scala b/src/dotty/tools/dotc/core/NameOps.scala
index 60e429bb3..13ff92a8a 100644
--- a/src/dotty/tools/dotc/core/NameOps.scala
+++ b/src/dotty/tools/dotc/core/NameOps.scala
@@ -147,20 +147,26 @@ object NameOps {
/** The superaccessor for method with given name */
def superName: TermName = (nme.SUPER_PREFIX ++ name).toTermName
- /** The expanded name of `name` relative to this class `base` with given `separator`
+ /** The expanded name of `name` relative to given class `base`.
*/
def expandedName(base: Symbol)(implicit ctx: Context): N =
expandedName(if (base is Flags.ExpandedName) base.name else base.fullNameSeparated('$'))
/** The expanded name of `name` relative to `basename` with given `separator`
*/
- def expandedName(prefix: Name)(implicit ctx: Context): N =
+ def expandedName(prefix: Name): N =
name.fromName(prefix ++ nme.EXPAND_SEPARATOR ++ name).asInstanceOf[N]
def unexpandedName: N = {
val idx = name.lastIndexOfSlice(nme.EXPAND_SEPARATOR)
if (idx < 0) name else (name drop (idx + nme.EXPAND_SEPARATOR.length)).asInstanceOf[N]
}
+
+ def expandedPrefix: N = {
+ val idx = name.lastIndexOfSlice(nme.EXPAND_SEPARATOR)
+ assert(idx >= 0)
+ name.take(idx).asInstanceOf[N]
+ }
def shadowedName: N = likeTyped(nme.SHADOWED ++ name)
diff --git a/src/dotty/tools/dotc/core/pickling/NameBuffer.scala b/src/dotty/tools/dotc/core/pickling/NameBuffer.scala
index be557f0b1..a60767fe6 100644
--- a/src/dotty/tools/dotc/core/pickling/NameBuffer.scala
+++ b/src/dotty/tools/dotc/core/pickling/NameBuffer.scala
@@ -65,9 +65,9 @@ class NameBuffer extends TastyBuffer(100000) {
case Signed(original, params, result) =>
writeByte(SIGNED)
withLength { writeNameRef(original); writeNameRef(result); params.foreach(writeNameRef) }
- case Expanded(original) =>
+ case Expanded(prefix, original) =>
writeByte(EXPANDED)
- withLength { writeNameRef(original) }
+ withLength { writeNameRef(prefix); writeNameRef(original) }
case ModuleClass(module) =>
writeByte(OBJECTCLASS)
withLength { writeNameRef(module) }
diff --git a/src/dotty/tools/dotc/core/pickling/TastyName.scala b/src/dotty/tools/dotc/core/pickling/TastyName.scala
index 8508d7ffa..e8f30a234 100644
--- a/src/dotty/tools/dotc/core/pickling/TastyName.scala
+++ b/src/dotty/tools/dotc/core/pickling/TastyName.scala
@@ -15,7 +15,7 @@ object TastyName {
case class Simple(name: TermName) extends TastyName
case class Qualified(qualified: NameRef, selector: NameRef) extends TastyName
case class Signed(original: NameRef, params: List[NameRef], result: NameRef) extends TastyName
- case class Expanded(original: NameRef) extends TastyName
+ case class Expanded(prefix: NameRef, original: NameRef) extends TastyName
case class ModuleClass(module: NameRef) extends TastyName
case class SuperAccessor(accessed: NameRef) extends TastyName
case class DefaultGetter(method: NameRef, num: Int) extends TastyName
diff --git a/src/dotty/tools/dotc/core/pickling/TastyPrinter.scala b/src/dotty/tools/dotc/core/pickling/TastyPrinter.scala
index 91cc168ea..a3d30b9b2 100644
--- a/src/dotty/tools/dotc/core/pickling/TastyPrinter.scala
+++ b/src/dotty/tools/dotc/core/pickling/TastyPrinter.scala
@@ -5,6 +5,7 @@ package pickling
import Contexts._, Decorators._
import printing.Texts._
import TastyName._
+import StdNames._
import TastyUnpickler._
import TastyBuffer.Addr
import util.Positions.{Position, offsetToInt}
@@ -20,7 +21,7 @@ class TastyPrinter(bytes: Array[Byte])(implicit ctx: Context) {
case Qualified(qual, name) => nameRefToString(qual) + "." + nameRefToString(name)
case Signed(original, params, result) =>
i"${nameRefToString(original)}@${params.map(nameRefToString)}%,%:${nameRefToString(result)}"
- case Expanded(original) => nameRefToString(original) + "/EXPANDED"
+ case Expanded(prefix, original) => s"$prefix${nme.EXPAND_SEPARATOR}$original"
case ModuleClass(original) => nameRefToString(original) + "/MODULECLASS"
case SuperAccessor(accessed) => nameRefToString(accessed) + "/SUPERACCESSOR"
case DefaultGetter(meth, num) => nameRefToString(meth) + "/DEFAULTGETTER" + num
diff --git a/src/dotty/tools/dotc/core/pickling/TastyUnpickler.scala b/src/dotty/tools/dotc/core/pickling/TastyUnpickler.scala
index e5eabaf36..b5e978afa 100644
--- a/src/dotty/tools/dotc/core/pickling/TastyUnpickler.scala
+++ b/src/dotty/tools/dotc/core/pickling/TastyUnpickler.scala
@@ -51,7 +51,7 @@ class TastyUnpickler(reader: TastyReader) {
val params = until(end)(readNameRef())
Signed(original, params, result)
case EXPANDED =>
- Expanded(readNameRef())
+ Expanded(readNameRef(), readNameRef())
case OBJECTCLASS =>
ModuleClass(readNameRef())
case SUPERACCESSOR =>
diff --git a/src/dotty/tools/dotc/core/pickling/TreePickler.scala b/src/dotty/tools/dotc/core/pickling/TreePickler.scala
index c5e07ffa9..14a92e8e6 100644
--- a/src/dotty/tools/dotc/core/pickling/TreePickler.scala
+++ b/src/dotty/tools/dotc/core/pickling/TreePickler.scala
@@ -8,6 +8,7 @@ import PickleFormat._
import core._
import Contexts._, Symbols._, Types._, Names._, Constants._, Decorators._, Annotations._, StdNames.tpnme, NameOps._
import collection.mutable
+import NameOps._
import TastyBuffer._
class TreePickler(pickler: TastyPickler) {
@@ -61,13 +62,19 @@ class TreePickler(pickler: TastyPickler) {
}
}
- private def pickleName(name: Name) = writeNat(nameIndex(name).index)
- private def pickleName(name: TastyName) = writeNat(nameIndex(name).index)
+ private def pickleName(name: Name): Unit = writeNat(nameIndex(name).index)
+ private def pickleName(name: TastyName): Unit = writeNat(nameIndex(name).index)
private def pickleNameAndSig(name: Name, sig: Signature) = {
val Signature(params, result) = sig
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 pickleSymRef(sym: Symbol)(implicit ctx: Context) = symRefs.get(sym) match {
case Some(label) =>
if (label != NoAddr) writeRef(label) else pickleForwardSymRef(sym)
@@ -464,7 +471,7 @@ class TreePickler(pickler: TastyPickler) {
registerDef(sym)
writeByte(tag)
withLength {
- pickleName(sym.name)
+ pickleName(sym)
pickleParams
tpt match {
case tpt: TypeTree => pickleTpt(tpt)
diff --git a/src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala b/src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala
index 3d4ac4684..ed0841e3a 100644
--- a/src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala
+++ b/src/dotty/tools/dotc/core/pickling/TreeUnpickler.scala
@@ -70,7 +70,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) {
case Qualified(qual, name) => toTermName(qual) ++ "." ++ toTermName(name)
case Signed(original, params, result) => toTermName(original)
case Shadowed(original) => toTermName(original).shadowedName
- case Expanded(original) => ???
+ case Expanded(prefix, original) => toTermName(original).expandedName(toTermName(prefix))
case ModuleClass(original) => toTermName(original).moduleClassName.toTermName
case SuperAccessor(accessed) => ???
case DefaultGetter(meth, num) => ???
@@ -334,7 +334,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) {
flags = flags | (if (tag == VALDEF) ModuleCreationFlags else ModuleClassCreationFlags)
if (ctx.mode.is(Mode.InSuperCall) && !flags.is(ParamOrAccessor)) flags |= InSuperCall
if (ctx.owner.isClass) {
- if (tag == TYPEPARAM) flags |= Param | ExpandedName // TODO check name to determine ExpandedName
+ if (tag == TYPEPARAM) flags |= Param
else if (tag == PARAM) flags |= ParamAccessor
}
else if (isParamTag(tag)) flags |= Param
@@ -348,7 +348,9 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) {
val start = currentAddr
val tag = readByte()
val end = readEnd()
- val name = if (tag == TYPEDEF || tag == TYPEPARAM) readName().toTypeName else readName()
+ val rawName = tastyName(readNameRef())
+ var name: Name = toTermName(rawName)
+ if (tag == TYPEDEF || tag == TYPEPARAM) name = name.toTypeName
skipParams()
val isAbstractType = nextByte == TYPEBOUNDS
val isClass = nextByte == TEMPLATE
@@ -357,8 +359,9 @@ 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
pickling.println(i"creating symbol $name at $start with flags $givenFlags")
- val flags = normalizeFlags(tag, givenFlags, name, isAbstractType, rhsIsEmpty)
+ val flags = normalizeFlags(tag, givenFlags | expandedFlag, name, isAbstractType, rhsIsEmpty)
def adjustIfModule(completer: LazyType) =
if (flags is Module) ctx.adjustModuleCompleter(completer, name) else completer
val sym =