aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/core/tasty
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/src/dotty/tools/dotc/core/tasty')
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala6
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala115
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TastyBuffer.scala3
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala35
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TastyName.scala30
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TastyPickler.scala5
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala26
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TastyReader.scala1
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala72
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala46
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala59
11 files changed, 172 insertions, 226 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala
index 2c93819d5..28916a781 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala
@@ -19,12 +19,12 @@ object DottyUnpickler {
class TreeSectionUnpickler(posUnpickler: Option[PositionUnpickler])
extends SectionUnpickler[TreeUnpickler]("ASTs") {
- def unpickle(reader: TastyReader, tastyName: TastyName.Table) =
- new TreeUnpickler(reader, tastyName, posUnpickler)
+ def unpickle(reader: TastyReader, nameAtRef: NameTable) =
+ new TreeUnpickler(reader, nameAtRef, posUnpickler)
}
class PositionsSectionUnpickler extends SectionUnpickler[PositionUnpickler]("Positions") {
- def unpickle(reader: TastyReader, tastyName: TastyName.Table) =
+ def unpickle(reader: TastyReader, nameAtRef: NameTable) =
new PositionUnpickler(reader)
}
}
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala b/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala
index 3ff7298ce..270d6be56 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala
@@ -4,84 +4,83 @@ package core
package tasty
import collection.mutable
-import Names.{Name, chrs}
-import Decorators._, NameOps._
+import Names.{Name, chrs, SimpleTermName, DerivedTermName}
+import NameOps.NameDecorator
+import NameKinds._
+import Decorators._
import TastyBuffer._
import scala.io.Codec
-import TastyName._
import TastyFormat._
class NameBuffer extends TastyBuffer(10000) {
import NameBuffer._
- private val nameRefs = new mutable.LinkedHashMap[TastyName, NameRef]
+ private val nameRefs = new mutable.LinkedHashMap[Name, NameRef]
- def nameIndex(name: TastyName): NameRef = nameRefs.get(name) match {
- case Some(ref) =>
- ref
- case None =>
- val ref = NameRef(nameRefs.size)
- nameRefs(name) = ref
- ref
- }
def nameIndex(name: Name): NameRef = {
- val tname =
- if (name.isShadowedName) Shadowed(nameIndex(name.revertShadowed))
- else Simple(name.toTermName)
- nameIndex(tname)
- }
-
- def nameIndex(str: String): NameRef = nameIndex(str.toTermName)
-
- def fullNameIndex(name: Name): NameRef = {
- val pos = name.lastIndexOf('.')
- if (pos > 0)
- nameIndex(Qualified(fullNameIndex(name.take(pos)), nameIndex(name.drop(pos + 1))))
- else
- nameIndex(name)
+ val name1 = name.toTermName
+ nameRefs.get(name1) match {
+ case Some(ref) =>
+ ref
+ case None =>
+ name1 match {
+ case SignedName(original, Signature(params, result)) =>
+ nameIndex(original); nameIndex(result); params.foreach(nameIndex)
+ case AnyQualifiedName(prefix, name) =>
+ nameIndex(prefix); nameIndex(name)
+ case AnyUniqueName(original, separator, num) =>
+ nameIndex(separator.toTermName)
+ if (!original.isEmpty) nameIndex(original)
+ case DerivedTermName(original, _) =>
+ nameIndex(original)
+ case _ =>
+ }
+ val ref = NameRef(nameRefs.size)
+ nameRefs(name1) = ref
+ ref
+ }
}
private def withLength(op: => Unit, lengthWidth: Int = 1): Unit = {
val lengthAddr = currentAddr
for (i <- 0 until lengthWidth) writeByte(0)
op
- val length = currentAddr.index - lengthAddr.index - 1
+ val length = currentAddr.index - lengthAddr.index - lengthWidth
putNat(lengthAddr, length, lengthWidth)
}
- def writeNameRef(ref: NameRef) = writeNat(ref.index)
+ def writeNameRef(ref: NameRef): Unit = writeNat(ref.index)
+ def writeNameRef(name: Name): Unit = writeNameRef(nameRefs(name.toTermName))
- def pickleName(name: TastyName): Unit = name match {
- case Simple(name) =>
- val bytes =
- if (name.length == 0) new Array[Byte](0)
- else Codec.toUTF8(chrs, name.start, name.length)
- writeByte(UTF8)
- writeNat(bytes.length)
- writeBytes(bytes, bytes.length)
- case Qualified(qualified, selector) =>
- writeByte(QUALIFIED)
- withLength { writeNameRef(qualified); writeNameRef(selector) }
- case Signed(original, params, result) =>
- writeByte(SIGNED)
- withLength(
+ def pickleNameContents(name: Name): Unit = {
+ val tag = name.toTermName.info.kind.tag
+ writeByte(tag)
+ name.toTermName match {
+ case name: SimpleTermName =>
+ val bytes =
+ if (name.length == 0) new Array[Byte](0)
+ else Codec.toUTF8(chrs, name.start, name.length)
+ writeNat(bytes.length)
+ writeBytes(bytes, bytes.length)
+ case AnyQualifiedName(prefix, name) =>
+ withLength { writeNameRef(prefix); writeNameRef(name) }
+ case AnyUniqueName(original, separator, num) =>
+ withLength {
+ writeNameRef(separator.toTermName)
+ writeNat(num)
+ if (!original.isEmpty) writeNameRef(original)
+ }
+ case VariantName(original, sign) =>
+ withLength { writeNameRef(original); writeNat(sign + 1) }
+ case AnyNumberedName(original, num) =>
+ withLength { writeNameRef(original); writeNat(num) }
+ case SignedName(original, Signature(params, result)) =>
+ withLength(
{ writeNameRef(original); writeNameRef(result); params.foreach(writeNameRef) },
if ((params.length + 2) * maxIndexWidth <= maxNumInByte) 1 else 2)
- case Expanded(prefix, original) =>
- writeByte(EXPANDED)
- withLength { writeNameRef(prefix); writeNameRef(original) }
- case ModuleClass(module) =>
- writeByte(OBJECTCLASS)
- withLength { writeNameRef(module) }
- case SuperAccessor(accessed) =>
- writeByte(SUPERACCESSOR)
- withLength { writeNameRef(accessed) }
- case DefaultGetter(method, paramNumber) =>
- writeByte(DEFAULTGETTER)
- withLength { writeNameRef(method); writeNat(paramNumber) }
- case Shadowed(original) =>
- writeByte(SHADOWED)
- withLength { writeNameRef(original) }
+ case DerivedTermName(original, _) =>
+ withLength { writeNameRef(original) }
+ }
}
override def assemble(): Unit = {
@@ -89,7 +88,7 @@ class NameBuffer extends TastyBuffer(10000) {
for ((name, ref) <- nameRefs) {
assert(ref.index == i)
i += 1
- pickleName(name)
+ pickleNameContents(name)
}
}
}
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyBuffer.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyBuffer.scala
index 13bc95028..40782f534 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TastyBuffer.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyBuffer.scala
@@ -26,6 +26,9 @@ object TastyBuffer {
* the value of 4 gives a maximal array size of 256M.
*/
final val AddrWidth = 4
+
+ /** An address referring to a serialized name */
+ case class NameRef(index: Int) extends AnyVal
}
import TastyBuffer._
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala
index 8b2255e94..f03e279c6 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala
@@ -33,11 +33,11 @@ Macro-format:
QUALIFIED Length qualified_NameRef selector_NameRef
SIGNED Length original_NameRef resultSig_NameRef paramSig_NameRef*
EXPANDED Length original_NameRef
+ UNIQUE Length separator_NameRef num_Nat original_NameRef?
OBJECTCLASS Length module_NameRef
SUPERACCESSOR Length accessed_NameRef
DEFAULTGETTER Length method_NameRef paramNumber_Nat
SHADOWED Length original_NameRef
- MANGLED Length mangle_NameRef name_NameRef
...
NameRef = Nat // ordinal number of name in name table, starting from 1.
@@ -222,12 +222,30 @@ object TastyFormat {
final val UTF8 = 1
final val QUALIFIED = 2
- final val SIGNED = 3
+ final val FLATTENED = 3
final val EXPANDED = 4
- final val OBJECTCLASS = 5
- final val SUPERACCESSOR = 6
- final val DEFAULTGETTER = 7
- final val SHADOWED = 8
+ final val EXPANDPREFIX = 5
+ final val TRAITSETTER = 6
+ final val UNIQUE = 10
+ final val DEFAULTGETTER = 11
+ final val VARIANT = 12
+ final val OUTERSELECT = 13
+
+ final val SUPERACCESSOR = 20
+ final val PROTECTEDACCESSOR = 21
+ final val PROTECTEDSETTER = 22
+ final val INITIALIZER = 23
+ final val SHADOWED = 24
+ final val AVOIDCLASH = 30
+ final val DIRECT = 31
+ final val FIELD = 32
+ final val SETTER = 33
+ final val EXTMETH = 34
+ final val OBJECTVAR = 39
+ final val OBJECTCLASS = 40
+
+ final val SIGNED = 63
+ final val firstInternalTag = 64
// AST tags
@@ -411,11 +429,14 @@ object TastyFormat {
def nameTagToString(tag: Int): String = tag match {
case UTF8 => "UTF8"
case QUALIFIED => "QUALIFIED"
- case SIGNED => "SIGNED"
+ case FLATTENED => "FLATTENED"
case EXPANDED => "EXPANDED"
+ case SIGNED => "SIGNED"
case OBJECTCLASS => "OBJECTCLASS"
case SUPERACCESSOR => "SUPERACCESSOR"
case DEFAULTGETTER => "DEFAULTGETTER"
+ case SHADOWED => "SHADOWED"
+ case VARIANT => "VARIANT"
}
def astTagToString(tag: Int): String = tag match {
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyName.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyName.scala
deleted file mode 100644
index 26807115c..000000000
--- a/compiler/src/dotty/tools/dotc/core/tasty/TastyName.scala
+++ /dev/null
@@ -1,30 +0,0 @@
-package dotty.tools
-package dotc
-package core
-package tasty
-
-import core.Names.TermName
-import collection.mutable
-
-abstract class TastyName
-
-object TastyName {
-
- case class NameRef(index: Int) extends AnyVal
-
- 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(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
- case class Shadowed(original: NameRef) extends TastyName
-
- class Table extends (NameRef => TastyName) {
- private val names = new mutable.ArrayBuffer[TastyName]
- def add(name: TastyName) = names += name
- def apply(ref: NameRef) = names(ref.index)
- def contents: Iterable[TastyName] = names
- }
-}
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyPickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyPickler.scala
index c844d522e..cc2e4dd58 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TastyPickler.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyPickler.scala
@@ -9,10 +9,11 @@ import TastyBuffer._
import java.util.UUID
import core.Symbols.Symbol
import ast.tpd
+import Decorators._
class TastyPickler {
- private val sections = new mutable.ArrayBuffer[(TastyName.NameRef, TastyBuffer)]
+ private val sections = new mutable.ArrayBuffer[(NameRef, TastyBuffer)]
val uuid = UUID.randomUUID()
private val headerBuffer = {
@@ -28,7 +29,7 @@ class TastyPickler {
val nameBuffer = new NameBuffer
def newSection(name: String, buf: TastyBuffer) =
- sections += ((nameBuffer.nameIndex(name), buf))
+ sections += ((nameBuffer.nameIndex(name.toTermName), buf))
def assembleParts(): Array[Byte] = {
def lengthWithLength(buf: TastyBuffer) = {
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala
index ce3722ff1..a5c870881 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala
@@ -4,34 +4,24 @@ package tasty
import Contexts._, Decorators._
import printing.Texts._
-import TastyName._
+import Names.Name
import StdNames._
import TastyUnpickler._
-import TastyBuffer.Addr
+import TastyBuffer.{Addr, NameRef}
import util.Positions.{Position, offsetToInt}
import collection.mutable
class TastyPrinter(bytes: Array[Byte])(implicit ctx: Context) {
val unpickler = new TastyUnpickler(bytes)
- import unpickler.{tastyName, unpickle}
+ import unpickler.{nameAtRef, unpickle}
- def nameToString(name: TastyName): String = name match {
- case Simple(name) => name.toString
- case Qualified(qual, name) => nameRefToString(qual) + "." + nameRefToString(name)
- case Signed(original, params, result) =>
- i"${nameRefToString(original)}@${params.map(nameRefToString)}%,%:${nameRefToString(result)}"
- 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
- case Shadowed(original) => nameRefToString(original) + "/SHADOWED"
- }
+ def nameToString(name: Name): String = name.debugString
- def nameRefToString(ref: NameRef): String = nameToString(tastyName(ref))
+ def nameRefToString(ref: NameRef): String = nameToString(nameAtRef(ref))
def printNames() =
- for ((name, idx) <- tastyName.contents.zipWithIndex) {
+ for ((name, idx) <- nameAtRef.contents.zipWithIndex) {
val index = "%4d: ".format(idx)
println(index + nameToString(name))
}
@@ -46,7 +36,7 @@ class TastyPrinter(bytes: Array[Byte])(implicit ctx: Context) {
class TreeSectionUnpickler extends SectionUnpickler[Unit]("ASTs") {
import TastyFormat._
- def unpickle(reader: TastyReader, tastyName: TastyName.Table): Unit = {
+ def unpickle(reader: TastyReader, tastyName: NameTable): Unit = {
import reader._
var indent = 0
def newLine() = {
@@ -116,7 +106,7 @@ class TastyPrinter(bytes: Array[Byte])(implicit ctx: Context) {
}
class PositionSectionUnpickler extends SectionUnpickler[Unit]("Positions") {
- def unpickle(reader: TastyReader, tastyName: TastyName.Table): Unit = {
+ def unpickle(reader: TastyReader, tastyName: NameTable): Unit = {
print(s"${reader.endAddr.index - reader.currentAddr.index}")
val positions = new PositionUnpickler(reader).positions
println(s" position bytes:")
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyReader.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyReader.scala
index e583c4793..af5e78891 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TastyReader.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyReader.scala
@@ -4,7 +4,6 @@ package core
package tasty
import TastyBuffer._
-import TastyName.NameRef
import collection.mutable
/** A byte array buffer that can be filled with bytes or natural numbers in TASTY format,
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala
index 8a1f58acd..37a3c2e76 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala
@@ -4,14 +4,23 @@ package tasty
import scala.collection.mutable
import TastyFormat._
-import Names.{Name, termName}
+import TastyBuffer.NameRef
+import Names.{Name, TermName, termName, EmptyTermName}
+import NameKinds._
import java.util.UUID
object TastyUnpickler {
class UnpickleException(msg: String) extends Exception(msg)
abstract class SectionUnpickler[R](val name: String) {
- def unpickle(reader: TastyReader, tastyName: TastyName.Table): R
+ def unpickle(reader: TastyReader, nameAtRef: NameTable): R
+ }
+
+ class NameTable extends (NameRef => TermName) {
+ private val names = new mutable.ArrayBuffer[TermName]
+ def add(name: TermName) = names += name
+ def apply(ref: NameRef) = names(ref.index)
+ def contents: Iterable[TermName] = names
}
}
@@ -23,18 +32,15 @@ class TastyUnpickler(reader: TastyReader) {
def this(bytes: Array[Byte]) = this(new TastyReader(bytes))
private val sectionReader = new mutable.HashMap[String, TastyReader]
- val tastyName = new TastyName.Table
+ val nameAtRef = new NameTable
- def check(cond: Boolean, msg: => String) =
+ private def check(cond: Boolean, msg: => String) =
if (!cond) throw new UnpickleException(msg)
- def readString(): String = {
- val TastyName.Simple(name) = tastyName(readNameRef())
- name.toString
- }
+ private def readName(): TermName = nameAtRef(readNameRef())
+ private def readString(): String = readName().toString
- def readName(): TastyName = {
- import TastyName._
+ private def readNameContents(): TermName = {
val tag = readByte()
val length = readNat()
val start = currentAddr
@@ -42,24 +48,30 @@ class TastyUnpickler(reader: TastyReader) {
val result = tag match {
case UTF8 =>
goto(end)
- Simple(termName(bytes, start.index, length))
- case QUALIFIED =>
- Qualified(readNameRef(), readNameRef())
- case SIGNED =>
- val original = readNameRef()
- val result = readNameRef()
- val params = until(end)(readNameRef())
- Signed(original, params, result)
- case EXPANDED =>
- Expanded(readNameRef(), readNameRef())
- case OBJECTCLASS =>
- ModuleClass(readNameRef())
- case SUPERACCESSOR =>
- SuperAccessor(readNameRef())
+ termName(bytes, start.index, length)
+ case QUALIFIED | FLATTENED | EXPANDED | EXPANDPREFIX =>
+ qualifiedNameKindOfTag(tag)(readName(), readName().asSimpleName)
+ case UNIQUE =>
+ val separator = readName().toString
+ val num = readNat()
+ val originals = until(end)(readName())
+ val original = if (originals.isEmpty) EmptyTermName else originals.head
+ uniqueNameKindOfSeparator(separator)(original, num)
case DEFAULTGETTER =>
- DefaultGetter(readNameRef(), readNat())
- case SHADOWED =>
- Shadowed(readNameRef())
+ DefaultGetterName(readName(), readNat())
+ case VARIANT =>
+ VariantName(readName(), readNat() - 1)
+ case OUTERSELECT =>
+ OuterSelectName(readName(), readNat())
+ case SIGNED =>
+ val original = readName()
+ val result = readName().toTypeName
+ val params = until(end)(readName().toTypeName)
+ var sig = Signature(params, result)
+ if (sig == Signature.NotAMethod) sig = Signature.NotAMethod
+ SignedName(original, sig)
+ case _ =>
+ simpleNameKindOfTag(tag)(readName())
}
assert(currentAddr == end, s"bad name $result $start $currentAddr $end")
result
@@ -77,10 +89,10 @@ class TastyUnpickler(reader: TastyReader) {
new UUID(readUncompressedLong(), readUncompressedLong())
}
- val uuid = readHeader()
+ private val uuid = readHeader()
locally {
- until(readEnd()) { tastyName.add(readName()) }
+ until(readEnd()) { nameAtRef.add(readNameContents()) }
while (!isAtEnd) {
val secName = readString()
val secEnd = readEnd()
@@ -91,5 +103,5 @@ class TastyUnpickler(reader: TastyReader) {
def unpickle[R](sec: SectionUnpickler[R]): Option[R] =
for (reader <- sectionReader.get(sec.name)) yield
- sec.unpickle(reader, tastyName)
+ sec.unpickle(reader, nameAtRef)
}
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala
index 902d01c21..5d33738c2 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala
@@ -9,16 +9,18 @@ import TastyFormat._
import Contexts._, Symbols._, Types._, Names._, Constants._, Decorators._, Annotations._, StdNames.tpnme, NameOps._
import collection.mutable
import typer.Inliner
-import NameOps._
+import NameOps._, NameKinds._
import StdNames.nme
import TastyBuffer._
import TypeApplications._
+import transform.SymUtils._
+import config.Config
class TreePickler(pickler: TastyPickler) {
val buf = new TreeBuffer
pickler.newSection("ASTs", buf)
import buf._
- import pickler.nameBuffer.{nameIndex, fullNameIndex}
+ import pickler.nameBuffer.nameIndex
import ast.tpd._
private val symRefs = new mutable.HashMap[Symbol, Addr]
@@ -52,28 +54,8 @@ class TreePickler(pickler: TastyPickler) {
}
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 = {
- def encodeSuper(name: Name): TastyName.NameRef =
- if (sym is Flags.SuperAccessor) {
- val SuperAccessorName(n) = name
- nameIndex(TastyName.SuperAccessor(nameIndex(n)))
- }
- else nameIndex(name)
- val nameRef =
- if (sym is Flags.ExpandedName)
- nameIndex(
- TastyName.Expanded(
- nameIndex(sym.name.expandedPrefix),
- encodeSuper(sym.name.unexpandedName)))
- else encodeSuper(sym.name)
- writeNat(nameRef.index)
- }
+ private def pickleNameAndSig(name: Name, sig: Signature) =
+ pickleName(SignedName(name.toTermName, sig))
private def pickleSymRef(sym: Symbol)(implicit ctx: Context) = symRefs.get(sym) match {
case Some(label) =>
@@ -126,7 +108,7 @@ class TreePickler(pickler: TastyPickler) {
writeLongInt(java.lang.Double.doubleToRawLongBits(c.doubleValue))
case StringTag =>
writeByte(STRINGconst)
- writeNat(nameIndex(c.stringValue).index)
+ pickleName(c.stringValue.toTermName)
case NullTag =>
writeByte(NULLconst)
case ClazzTag =>
@@ -160,7 +142,7 @@ class TreePickler(pickler: TastyPickler) {
withLength { pickleType(tycon); args.foreach(pickleType(_)) }
case ConstantType(value) =>
pickleConstant(value)
- case tpe: TypeRef if tpe.info.isAlias && tpe.symbol.is(Flags.AliasPreferred) =>
+ case tpe: TypeRef if tpe.info.isAlias && tpe.symbol.isAliasPreferred =>
pickleType(tpe.superType)
case tpe: WithFixedSym =>
val sym = tpe.symbol
@@ -178,7 +160,7 @@ class TreePickler(pickler: TastyPickler) {
}
if (sym.is(Flags.Package)) {
writeByte(if (tpe.isType) TYPEREFpkg else TERMREFpkg)
- pickleName(qualifiedName(sym))
+ pickleName(sym.fullName)
}
else if (sym is Flags.BindDefinedType) {
registerDef(sym)
@@ -278,7 +260,7 @@ class TreePickler(pickler: TastyPickler) {
def picklePackageRef(pkg: Symbol)(implicit ctx: Context): Unit = {
writeByte(TERMREFpkg)
- pickleName(qualifiedName(pkg))
+ pickleName(pkg.fullName)
}
def pickleMethodic(tag: Int, tpe: LambdaType)(implicit ctx: Context) = {
@@ -312,7 +294,7 @@ class TreePickler(pickler: TastyPickler) {
registerDef(sym)
writeByte(tag)
withLength {
- pickleName(sym)
+ pickleName(sym.name)
pickleParams
tpt match {
case templ: Template => pickleTree(tpt)
@@ -370,7 +352,7 @@ class TreePickler(pickler: TastyPickler) {
case Select(qual, name) =>
writeByte(if (name.isTypeName) SELECTtpt else SELECT)
val realName = tree.tpe match {
- case tp: NamedType if tp.name.isShadowedName => tp.name
+ case tp: NamedType if tp.name.is(ShadowedName) => tp.name
case _ => name
}
val sig = tree.tpe.signature
@@ -575,10 +557,6 @@ class TreePickler(pickler: TastyPickler) {
pickleName(id.name)
}
- def qualifiedName(sym: Symbol)(implicit ctx: Context): TastyName =
- if (sym.isRoot || sym.owner.isRoot) TastyName.Simple(sym.name.toTermName)
- else TastyName.Qualified(nameIndex(qualifiedName(sym.owner)), nameIndex(sym.name))
-
def pickleModifiers(sym: Symbol)(implicit ctx: Context): Unit = {
import Flags._
val flags = sym.flags
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
index a186d1ce4..2908c541e 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
@@ -5,6 +5,7 @@ package tasty
import Contexts._, Symbols._, Types._, Scopes._, SymDenotations._, Names._, NameOps._
import StdNames._, Denotations._, Flags._, Constants._, Annotations._
+import NameKinds._
import util.Positions._
import ast.{tpd, Trees, untpd}
import Trees._
@@ -15,15 +16,15 @@ import scala.collection.mutable.ListBuffer
import scala.collection.{ mutable, immutable }
import config.Printers.pickling
import typer.Checking
+import config.Config
/** Unpickler for typed trees
* @param reader the reader from which to unpickle
* @param tastyName the nametable
* @param posUNpicklerOpt the unpickler for positions, if it exists
*/
-class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpicklerOpt: Option[PositionUnpickler]) {
+class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpicklerOpt: Option[PositionUnpickler]) {
import TastyFormat._
- import TastyName._
import TreeUnpickler._
import tpd._
@@ -74,20 +75,6 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
new TreeReader(reader).readTopLevel()(ctx.addMode(Mode.AllowDependentFunctions))
}
- def toTermName(tname: TastyName): TermName = tname match {
- case Simple(name) => name
- case Qualified(qual, name) => toTermName(qual) ++ "." ++ toTermName(name)
- case Signed(original, params, result) => toTermName(original)
- case Shadowed(original) => toTermName(original).shadowedName
- case Expanded(prefix, original) => toTermName(original).expandedName(toTermName(prefix))
- case ModuleClass(original) => toTermName(original).moduleClassName.toTermName
- case SuperAccessor(accessed) => toTermName(accessed).superName
- case DefaultGetter(meth, num) => ???
- }
-
- def toTermName(ref: NameRef): TermName = toTermName(tastyName(ref))
- def toTypeName(ref: NameRef): TypeName = toTermName(ref).toTypeName
-
class Completer(owner: Symbol, reader: TastyReader) extends LazyType {
import reader._
def complete(denot: SymDenotation)(implicit ctx: Context): Unit = {
@@ -165,17 +152,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
else tag
}
- def readName(): TermName = toTermName(readNameRef())
-
- def readNameSplitSig()(implicit ctx: Context): Any /* TermName | (TermName, Signature) */ =
- tastyName(readNameRef()) match {
- case Signed(original, params, result) =>
- var sig = Signature(params map toTypeName, toTypeName(result))
- if (sig == Signature.NotAMethod) sig = Signature.NotAMethod
- (toTermName(original), sig)
- case name =>
- toTermName(name)
- }
+ def readName(): TermName = nameAtRef(readNameRef())
// ------ Reading types -----------------------------------------------------
@@ -305,9 +282,9 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
val name = readName().toTypeName
TypeRef(readType(), name)
case TERMREF =>
- readNameSplitSig() match {
- case name: TermName => TermRef.all(readType(), name)
- case (name: TermName, sig: Signature) => TermRef.withSig(readType(), name, sig)
+ readName() match {
+ case SignedName(name, sig) => TermRef.withSig(readType(), name, sig)
+ case name => TermRef.all(readType(), name)
}
case THIS =>
ThisType.raw(readType().asInstanceOf[TypeRef])
@@ -438,9 +415,9 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
val start = currentAddr
val tag = readByte()
val end = readEnd()
- val rawName = tastyName(readNameRef())
- var name: Name = toTermName(rawName)
+ var name: Name = readName()
if (tag == TYPEDEF || tag == TYPEPARAM) name = name.toTypeName
+ val mname = name.mangled
skipParams()
val ttag = nextUnsharedTag
val isAbsType = isAbstractType(ttag)
@@ -451,19 +428,15 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
val rhsIsEmpty = noRhs(end)
if (!rhsIsEmpty) skipTree()
val (givenFlags, annots, privateWithin) = readModifiers(end)
- def nameFlags(tname: TastyName): FlagSet = tname match {
- case TastyName.Expanded(_, original) => ExpandedName | nameFlags(tastyName(original))
- case TastyName.SuperAccessor(_) => Flags.SuperAccessor
- case _ => EmptyFlags
- }
pickling.println(i"creating symbol $name at $start with flags $givenFlags")
- val flags = normalizeFlags(tag, givenFlags | nameFlags(rawName), name, isAbsType, rhsIsEmpty)
+ val flags = normalizeFlags(tag, givenFlags, name, isAbsType, rhsIsEmpty)
def adjustIfModule(completer: LazyType) =
if (flags is Module) ctx.adjustModuleCompleter(completer, name) else completer
val sym =
- roots.find(root => (root.owner eq ctx.owner) && root.name == name) match {
+ roots.find(root => (root.owner eq ctx.owner) && root.name.mangled == mname) match {
case Some(rootd) =>
pickling.println(i"overwriting ${rootd.symbol} # ${rootd.hashCode}")
+ rootd.name = name
rootd.info = adjustIfModule(
new Completer(ctx.owner, subReader(start, end)) with SymbolLoaders.SecondCompleter)
rootd.flags = flags &~ Touched // allow one more completion
@@ -886,7 +859,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
val localCtx =
if (name == nme.CONSTRUCTOR) ctx.addMode(Mode.InSuperCall) else ctx
val qual = readTerm()(localCtx)
- val unshadowed = if (name.isShadowedName) name.revertShadowed else name
+ val unshadowed = name.exclude(ShadowedName)
untpd.Select(qual, unshadowed).withType(tpf(qual.tpe.widenIfUnstable))
}
@@ -905,9 +878,9 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
case SELECT =>
def readRest(name: Name, sig: Signature) =
completeSelect(name, TermRef.withSig(_, name.asTermName, sig))
- readNameSplitSig match {
- case name: Name => readRest(name, Signature.NotAMethod)
- case (name: Name, sig: Signature) => readRest(name, sig)
+ readName() match {
+ case SignedName(name, sig) => readRest(name, sig)
+ case name => readRest(name, Signature.NotAMethod)
}
case SELECTtpt =>
val name = readName().toTypeName