diff options
author | Martin Odersky <odersky@gmail.com> | 2017-03-27 21:47:07 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2017-04-11 09:33:11 +0200 |
commit | 1d6f5f7f33f9e4be29553cb7ef1e6f054a64dc6b (patch) | |
tree | 22f2b40e0c963280f183b026bc867284b217ceb6 /compiler | |
parent | ea96ecda77ab99969a65b66173260e66b199be74 (diff) | |
download | dotty-1d6f5f7f33f9e4be29553cb7ef1e6f054a64dc6b.tar.gz dotty-1d6f5f7f33f9e4be29553cb7ef1e6f054a64dc6b.tar.bz2 dotty-1d6f5f7f33f9e4be29553cb7ef1e6f054a64dc6b.zip |
Streamline pickling and unpickling of names
Diffstat (limited to 'compiler')
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 |