aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/FromTasty.scala
diff options
context:
space:
mode:
authorFelix Mulder <felix.mulder@gmail.com>2016-11-02 11:08:28 +0100
committerGuillaume Martres <smarter@ubuntu.com>2016-11-22 01:35:07 +0100
commit8a61ff432543a29234193cd1f7c14abd3f3d31a0 (patch)
treea8147561d307af862c295cfc8100d271063bb0dd /compiler/src/dotty/tools/dotc/FromTasty.scala
parent6a455fe6da5ff9c741d91279a2dc6fe2fb1b472f (diff)
downloaddotty-8a61ff432543a29234193cd1f7c14abd3f3d31a0.tar.gz
dotty-8a61ff432543a29234193cd1f7c14abd3f3d31a0.tar.bz2
dotty-8a61ff432543a29234193cd1f7c14abd3f3d31a0.zip
Move compiler and compiler tests to compiler dir
Diffstat (limited to 'compiler/src/dotty/tools/dotc/FromTasty.scala')
-rw-r--r--compiler/src/dotty/tools/dotc/FromTasty.scala107
1 files changed, 107 insertions, 0 deletions
diff --git a/compiler/src/dotty/tools/dotc/FromTasty.scala b/compiler/src/dotty/tools/dotc/FromTasty.scala
new file mode 100644
index 000000000..b060a2054
--- /dev/null
+++ b/compiler/src/dotty/tools/dotc/FromTasty.scala
@@ -0,0 +1,107 @@
+/* dotc
+ * Copyright 2005-2015 LAMP/EPFL
+ * @author Martin Odersky
+ */
+package dotty.tools
+package dotc
+
+import core._
+import Contexts._
+import Symbols._
+import SymDenotations._
+import typer.FrontEnd
+import Phases.Phase
+import util._
+import reporting.Reporter
+import Decorators._
+import dotty.tools.dotc.transform.Pickler
+import tasty.DottyUnpickler
+import ast.tpd._
+
+/** Compiler for TASTY files.
+ * Usage:
+ *
+ * scala dotty.tools.dotc.FromTasty (option | classname)*
+ *
+ * Options are as for dotc.
+ * Classnames are fully qualified names of top-level classes that need to have a TASTY attribute.
+ * Example:
+ *
+ * scala dotty.tools.dotc.FromTasty -Xprint:front extMethods.T
+ */
+object FromTasty extends Driver {
+ override def newCompiler(implicit ctx: Context): Compiler = new TASTYCompiler
+
+ class TASTYCompiler extends Compiler {
+
+ override def phases: List[List[Phase]] = {
+ val backendPhases = super.phases.dropWhile {
+ case List(_: Pickler) => false
+ case _ => true
+ }.tail
+ List(new ReadTastyTreesFromClasses) :: backendPhases
+ }
+
+ override def newRun(implicit ctx: Context): Run = {
+ reset()
+ new TASTYRun(this)(rootContext)
+ }
+ }
+
+ class TASTYRun(comp: Compiler)(implicit ctx: Context) extends Run(comp) {
+ override def compile(classNames: List[String]) = {
+ units = classNames.map(new TASTYCompilationUnit(_))
+ compileUnits()
+ }
+ }
+
+ class TASTYCompilationUnit(val className: String) extends CompilationUnit(NoSource) {
+ override def toString = s"class file $className"
+ }
+
+ object force extends TreeTraverser {
+ def traverse(tree: Tree)(implicit ctx: Context): Unit = traverseChildren(tree)
+ }
+
+ class ReadTastyTreesFromClasses extends FrontEnd {
+
+ override def isTyper = false
+
+ override def runOn(units: List[CompilationUnit])(implicit ctx: Context): List[CompilationUnit] =
+ units.map(readTASTY)
+
+ def readTASTY(unit: CompilationUnit)(implicit ctx: Context): CompilationUnit = unit match {
+ case unit: TASTYCompilationUnit =>
+ val className = unit.className.toTypeName
+ val clsd =
+ if (className.contains('.')) ctx.base.staticRef(className)
+ else defn.EmptyPackageClass.info.decl(className)
+ def cannotUnpickle(reason: String) = {
+ ctx.error(s"class $className cannot be unpickled because $reason")
+ unit
+ }
+ clsd match {
+ case clsd: ClassDenotation =>
+ clsd.infoOrCompleter match {
+ case info: ClassfileLoader =>
+ info.load(clsd) match {
+ case Some(unpickler: DottyUnpickler) =>
+ val List(unpickled) = unpickler.body(ctx.addMode(Mode.ReadPositions))
+ val unit1 = new CompilationUnit(new SourceFile(clsd.symbol.sourceFile, Seq()))
+ unit1.tpdTree = unpickled
+ unit1.unpicklers += (clsd.classSymbol -> unpickler.unpickler)
+ force.traverse(unit1.tpdTree)
+ unit1
+ case _ =>
+ cannotUnpickle(s"its class file ${info.classfile} does not have a TASTY attribute")
+ }
+ case info =>
+ cannotUnpickle(s"its info of type ${info.getClass} is not a ClassfileLoader")
+ }
+ case _ =>
+ ctx.error(s"class not found: $className")
+ unit
+ }
+ }
+ }
+}