diff options
Diffstat (limited to 'compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala')
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala | 60 |
1 files changed, 34 insertions, 26 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala index e6b43e6b4..6dd22db88 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} +import NameExtractors._ 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,28 +48,30 @@ class TastyUnpickler(reader: TastyReader) { val result = tag match { case UTF8 => goto(end) - Simple(termName(bytes, start.index, length)) + termName(bytes, start.index, length) case QUALIFIED => - Qualified(readNameRef(), readNameRef()) + QualifiedName(readName(), readName().asSimpleName) case FLATTENED => - Flattened(readNameRef(), readNameRef()) + FlattenedName(readName(), readName().asSimpleName) case EXPANDED => - Expanded(readNameRef(), readNameRef()) + XpandedName(readName(), readName().asSimpleName) case SIGNED => - val original = readNameRef() - val result = readNameRef() - val params = until(end)(readNameRef()) - Signed(original, params, result) + 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 OBJECTCLASS => - ModuleClass(readNameRef()) + ModuleClassName(readName()) case SUPERACCESSOR => - SuperAccessor(readNameRef()) + SuperAccessorName(readName()) case DEFAULTGETTER => - DefaultGetter(readNameRef(), readNat()) + DefaultGetterName(readName(), readNat()) case SHADOWED => - Shadowed(readNameRef()) + ShadowedName(readName()) case VARIANT => - Variant(readNameRef(), readNat() - 1) + VariantName(readName(), readNat() - 1) } assert(currentAddr == end, s"bad name $result $start $currentAddr $end") result @@ -81,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() @@ -95,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) } |