Skip to content

Commit bb5deff

Browse files
committed
Extract inner classes from FromTasty
1 parent 7c4d1d7 commit bb5deff

File tree

5 files changed

+105
-88
lines changed

5 files changed

+105
-88
lines changed

compiler/src/dotty/tools/dotc/FromTasty.scala

Lines changed: 3 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,10 @@
22
* Copyright 2005-2015 LAMP/EPFL
33
* @author Martin Odersky
44
*/
5-
package dotty.tools
6-
package dotc
5+
package dotty.tools.dotc
76

8-
import core._
9-
import Contexts._
10-
import Symbols._
11-
import SymDenotations._
12-
import typer.FrontEnd
13-
import Phases.Phase
14-
import util._
15-
import Decorators._
16-
import dotty.tools.dotc.ast.tpd
17-
import dotty.tools.dotc.core._
18-
import dotty.tools.dotc.core.Names._
19-
import dotty.tools.dotc.core.NameOps._
20-
import dotty.tools.dotc.transform.Pickler
7+
import dotty.tools.dotc.core.Contexts._
8+
import dotty.tools.dotc.fromtasty.TASTYCompiler
219

2210
/** Compiler for TASTY files.
2311
* Usage:
@@ -32,77 +20,4 @@ import dotty.tools.dotc.transform.Pickler
3220
*/
3321
object FromTasty extends Driver {
3422
override def newCompiler(implicit ctx: Context): Compiler = new TASTYCompiler
35-
36-
class TASTYCompiler extends Compiler {
37-
38-
override def phases: List[List[Phase]] = {
39-
val backendPhases = super.phases.dropWhile {
40-
case List(_: Pickler) => false
41-
case _ => true
42-
}.tail
43-
List(new ReadTastyTreesFromClasses) :: backendPhases
44-
}
45-
46-
override def newRun(implicit ctx: Context): Run = {
47-
reset()
48-
new TASTYRun(this, ctx)
49-
}
50-
}
51-
52-
class TASTYRun(comp: Compiler, ictx: Context) extends Run(comp, ictx) {
53-
override def compile(classNames: List[String]) = {
54-
units = classNames.map(new TASTYCompilationUnit(_))
55-
compileUnits()
56-
}
57-
}
58-
59-
class TASTYCompilationUnit(val className: String) extends CompilationUnit(NoSource) {
60-
override def toString = s"class file $className"
61-
}
62-
63-
class ReadTastyTreesFromClasses extends FrontEnd {
64-
65-
override def isTyper = false
66-
67-
override def runOn(units: List[CompilationUnit])(implicit ctx: Context): List[CompilationUnit] =
68-
units.flatMap(readTASTY)
69-
70-
def readTASTY(unit: CompilationUnit)(implicit ctx: Context): List[CompilationUnit] = unit match {
71-
case unit: TASTYCompilationUnit =>
72-
assert(ctx.settings.YretainTrees.value)
73-
val className = unit.className.toTypeName
74-
val compilationUnits = List(tree(className), tree(className.moduleClassName)).flatMap {
75-
case Some((clsd, unpickled)) if !unpickled.isEmpty =>
76-
List(CompilationUnit.mkCompilationUnit(clsd, unpickled, forceTrees = true))
77-
case _ => Nil
78-
}
79-
compilationUnits
80-
}
81-
82-
private def tree(className: TypeName)(implicit ctx: Context): Option[(ClassDenotation, tpd.Tree)] = {
83-
val clsd = ctx.base.staticRef(className)
84-
ctx.base.staticRef(className) match {
85-
case clsd: ClassDenotation =>
86-
def cannotUnpickle(reason: String) =
87-
ctx.error(s"class $className cannot be unpickled because $reason")
88-
def tryToLoad = clsd.infoOrCompleter match {
89-
case info: ClassfileLoader =>
90-
info.load(clsd)
91-
Option(clsd.symbol.asClass.tree).orElse {
92-
cannotUnpickle(s"its class file ${info.classfile} does not have a TASTY attribute")
93-
None
94-
}
95-
96-
case info =>
97-
cannotUnpickle(s"its info of type ${info.getClass} is not a ClassfileLoader")
98-
None
99-
}
100-
Option(clsd.symbol.asClass.tree).orElse(tryToLoad).map(tree => (clsd, tree))
101-
102-
case _ =>
103-
ctx.error(s"class not found: $className")
104-
None
105-
}
106-
}
107-
}
10823
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package dotty.tools
2+
package dotc
3+
package fromtasty
4+
5+
import dotty.tools.dotc.ast.tpd
6+
import dotty.tools.dotc.core.Contexts.Context
7+
import dotty.tools.dotc.core.Decorators._
8+
import dotty.tools.dotc.core.Names._
9+
import dotty.tools.dotc.core.NameOps._
10+
import dotty.tools.dotc.core.SymDenotations.ClassDenotation
11+
import dotty.tools.dotc.core._
12+
import dotty.tools.dotc.typer.FrontEnd
13+
14+
class ReadTastyTreesFromClasses extends FrontEnd {
15+
16+
override def isTyper = false
17+
18+
override def runOn(units: List[CompilationUnit])(implicit ctx: Context): List[CompilationUnit] =
19+
units.flatMap(readTASTY)
20+
21+
def readTASTY(unit: CompilationUnit)(implicit ctx: Context): List[CompilationUnit] = unit match {
22+
case unit: TASTYCompilationUnit =>
23+
assert(ctx.settings.YretainTrees.value)
24+
val className = unit.className.toTypeName
25+
val compilationUnits = List(tree(className), tree(className.moduleClassName)).flatMap {
26+
case Some((clsd, unpickled)) if !unpickled.isEmpty =>
27+
List(CompilationUnit.mkCompilationUnit(clsd, unpickled, forceTrees = true))
28+
case _ => Nil
29+
}
30+
compilationUnits
31+
}
32+
33+
private def tree(className: TypeName)(implicit ctx: Context): Option[(ClassDenotation, tpd.Tree)] = {
34+
val clsd = ctx.base.staticRef(className)
35+
ctx.base.staticRef(className) match {
36+
case clsd: ClassDenotation =>
37+
def cannotUnpickle(reason: String) =
38+
ctx.error(s"class $className cannot be unpickled because $reason")
39+
def tryToLoad = clsd.infoOrCompleter match {
40+
case info: ClassfileLoader =>
41+
info.load(clsd)
42+
Option(clsd.symbol.asClass.tree).orElse {
43+
cannotUnpickle(s"its class file ${info.classfile} does not have a TASTY attribute")
44+
None
45+
}
46+
47+
case info =>
48+
cannotUnpickle(s"its info of type ${info.getClass} is not a ClassfileLoader")
49+
None
50+
}
51+
Option(clsd.symbol.asClass.tree).orElse(tryToLoad).map(tree => (clsd, tree))
52+
53+
case _ =>
54+
ctx.error(s"class not found: $className")
55+
None
56+
}
57+
}
58+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package dotty.tools.dotc.fromtasty
2+
3+
import dotty.tools.dotc.CompilationUnit
4+
import dotty.tools.dotc.util.NoSource
5+
6+
class TASTYCompilationUnit(val className: String) extends CompilationUnit(NoSource) {
7+
override def toString = s"class file $className"
8+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package dotty.tools
2+
package dotc
3+
package fromtasty
4+
5+
import core._
6+
import Contexts._
7+
import Phases.Phase
8+
import dotty.tools.dotc.transform.Pickler
9+
10+
class TASTYCompiler extends Compiler {
11+
12+
override def phases: List[List[Phase]] = {
13+
val backendPhases = super.phases.dropWhile {
14+
case List(_: Pickler) => false
15+
case _ => true
16+
}.tail
17+
List(new ReadTastyTreesFromClasses) :: backendPhases
18+
}
19+
20+
override def newRun(implicit ctx: Context): Run = {
21+
reset()
22+
new TASTYRun(this, ctx)
23+
}
24+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dotty.tools
2+
package dotc
3+
package fromtasty
4+
5+
import core.Contexts._
6+
7+
class TASTYRun(comp: Compiler, ictx: Context) extends Run(comp, ictx) {
8+
override def compile(classNames: List[String]) = {
9+
units = classNames.map(new TASTYCompilationUnit(_))
10+
compileUnits()
11+
}
12+
}

0 commit comments

Comments
 (0)