diff options
Diffstat (limited to 'compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala')
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala new file mode 100644 index 000000000..2c93819d5 --- /dev/null +++ b/compiler/src/dotty/tools/dotc/core/tasty/DottyUnpickler.scala @@ -0,0 +1,53 @@ +package dotty.tools +package dotc +package core +package tasty + +import Contexts._, SymDenotations._, Symbols._ +import dotty.tools.dotc.ast.tpd +import TastyUnpickler._, TastyBuffer._ +import util.Positions._ +import util.{SourceFile, NoSource} +import Annotations.Annotation +import core.Mode +import classfile.ClassfileParser + +object DottyUnpickler { + + /** Exception thrown if classfile is corrupted */ + class BadSignature(msg: String) extends RuntimeException(msg) + + class TreeSectionUnpickler(posUnpickler: Option[PositionUnpickler]) + extends SectionUnpickler[TreeUnpickler]("ASTs") { + def unpickle(reader: TastyReader, tastyName: TastyName.Table) = + new TreeUnpickler(reader, tastyName, posUnpickler) + } + + class PositionsSectionUnpickler extends SectionUnpickler[PositionUnpickler]("Positions") { + def unpickle(reader: TastyReader, tastyName: TastyName.Table) = + new PositionUnpickler(reader) + } +} + +/** A class for unpickling Tasty trees and symbols. + * @param bytes the bytearray containing the Tasty file from which we unpickle + */ +class DottyUnpickler(bytes: Array[Byte]) extends ClassfileParser.Embedded { + import tpd._ + import DottyUnpickler._ + + val unpickler = new TastyUnpickler(bytes) + private val posUnpicklerOpt = unpickler.unpickle(new PositionsSectionUnpickler) + private val treeUnpickler = unpickler.unpickle(new TreeSectionUnpickler(posUnpicklerOpt)).get + + /** Enter all toplevel classes and objects into their scopes + * @param roots a set of SymDenotations that should be overwritten by unpickling + */ + def enter(roots: Set[SymDenotation])(implicit ctx: Context): Unit = + treeUnpickler.enterTopLevel(roots) + + /** The unpickled trees, and the source file they come from. */ + def body(implicit ctx: Context): List[Tree] = { + treeUnpickler.unpickle() + } +} |