aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-03-27 21:47:07 +0200
committerMartin Odersky <odersky@gmail.com>2017-04-11 09:33:11 +0200
commit1d6f5f7f33f9e4be29553cb7ef1e6f054a64dc6b (patch)
tree22f2b40e0c963280f183b026bc867284b217ceb6 /compiler
parentea96ecda77ab99969a65b66173260e66b199be74 (diff)
downloaddotty-1d6f5f7f33f9e4be29553cb7ef1e6f054a64dc6b.tar.gz
dotty-1d6f5f7f33f9e4be29553cb7ef1e6f054a64dc6b.tar.bz2
dotty-1d6f5f7f33f9e4be29553cb7ef1e6f054a64dc6b.zip
Streamline pickling and unpickling of names
Diffstat (limited to 'compiler')
-rw-r--r--compiler/src/dotty/tools/dotc/core/NameExtractors.scala10
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala16
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala16
3 files changed, 18 insertions, 24 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/NameExtractors.scala b/compiler/src/dotty/tools/dotc/core/NameExtractors.scala
index eaac30bf5..f84ee565d 100644
--- a/compiler/src/dotty/tools/dotc/core/NameExtractors.scala
+++ b/compiler/src/dotty/tools/dotc/core/NameExtractors.scala
@@ -7,9 +7,12 @@ import StdNames._
import util.DotClass
import tasty.TastyFormat._
import Decorators._
+import collection.mutable
object NameExtractors {
+ private val extractors = new mutable.HashMap[Int, ClassifiedNameExtractor]
+
abstract class NameInfo extends DotClass {
def tag: Int
def mkString(underlying: TermName): String
@@ -41,6 +44,7 @@ object NameExtractors {
case DerivedTermName(underlying, `info`) => Some(underlying)
case _ => None
}
+ extractors(tag) = this
}
class PrefixNameExtractor(tag: Int, prefix: String, infoString: String) extends ClassifiedNameExtractor(tag, infoString) {
@@ -73,8 +77,8 @@ object NameExtractors {
}
object AnyQualifiedName {
- def unapply(name: DerivedTermName): Option[(TermName, QualifiedNameExtractor # QualInfo)] = name match {
- case DerivedTermName(qual, info: QualifiedNameExtractor # QualInfo) =>
+ def unapply(name: DerivedTermName): Option[(TermName, QualifiedInfo)] = name match {
+ case DerivedTermName(qual, info: QualifiedInfo) =>
Some((name.underlying, info))
case _ => None
}
@@ -143,6 +147,8 @@ object NameExtractors {
def definesNewName(tag: Int) = tag <= TraitSetterName.tag
+ def extractorOfTag(tag: Int) = extractors(tag)
+
val separatorToQualified: Map[String, QualifiedNameExtractor] =
Map("." -> QualifiedName,
"$" -> FlattenedName,
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala b/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala
index a09a21964..df43eabb2 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala
@@ -58,26 +58,18 @@ class NameBuffer extends TastyBuffer(10000) {
else Codec.toUTF8(chrs, name.start, name.length)
writeNat(bytes.length)
writeBytes(bytes, bytes.length)
- case QualifiedName(qualified, selector) =>
- withLength { writeNameRef(qualified); writeNameRef(selector) }
- case FlattenedName(qualified, selector) =>
- withLength { writeNameRef(qualified); writeNameRef(selector) }
- case ExpandedName(prefix, original) =>
- withLength { writeNameRef(prefix); writeNameRef(original) }
+ case AnyQualifiedName(prefix, info) =>
+ withLength { writeNameRef(prefix); writeNameRef(info.name) }
case SignedName(original, Signature(params, result)) =>
withLength(
{ writeNameRef(original); writeNameRef(result); params.foreach(writeNameRef) },
if ((params.length + 2) * maxIndexWidth <= maxNumInByte) 1 else 2)
- case ModuleClassName(module) =>
- withLength { writeNameRef(module) }
- case SuperAccessorName(accessed) =>
- withLength { writeNameRef(accessed) }
case DefaultGetterName(method, paramNumber) =>
withLength { writeNameRef(method); writeNat(paramNumber) }
- case ShadowedName(original) =>
- withLength { writeNameRef(original) }
case VariantName(original, sign) =>
withLength { writeNameRef(original); writeNat(sign + 1) }
+ case DerivedTermName(original, info) =>
+ withLength { writeNameRef(original) }
}
}
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala
index d20e890c2..7ebf3a2ea 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala
@@ -55,6 +55,10 @@ class TastyUnpickler(reader: TastyReader) {
FlattenedName(readName(), readName().asSimpleName)
case EXPANDED =>
ExpandedName(readName(), readName().asSimpleName)
+ case DEFAULTGETTER =>
+ DefaultGetterName(readName(), readNat())
+ case VARIANT =>
+ VariantName(readName(), readNat() - 1)
case SIGNED =>
val original = readName()
val result = readName().toTypeName
@@ -62,16 +66,8 @@ class TastyUnpickler(reader: TastyReader) {
var sig = Signature(params, result)
if (sig == Signature.NotAMethod) sig = Signature.NotAMethod
SignedName(original, sig)
- case OBJECTCLASS =>
- ModuleClassName(readName())
- case SUPERACCESSOR =>
- SuperAccessorName(readName())
- case DEFAULTGETTER =>
- DefaultGetterName(readName(), readNat())
- case SHADOWED =>
- ShadowedName(readName())
- case VARIANT =>
- VariantName(readName(), readNat() - 1)
+ case _ =>
+ extractorOfTag(tag)(readName())
}
assert(currentAddr == end, s"bad name $result $start $currentAddr $end")
result