Skip to content

Commit 0a3532d

Browse files
committed
Turn ReplCompiler into ReplTyper
1 parent e6f678b commit 0a3532d

File tree

2 files changed

+27
-28
lines changed

2 files changed

+27
-28
lines changed

repl/src/dotty/tools/repl/Repl.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ class Repl(settings: Array[String]) extends Driver {
2121
private[this] def initializeCtx = {
2222
val rootCtx = initCtx.fresh
2323
val summary = CompilerCommand.distill(settings)(rootCtx)
24-
rootCtx.setSettings(summary.sstate)
24+
val ictx = rootCtx.setSettings(summary.sstate)
25+
ictx.base.initialize()(ictx)
26+
ictx
2527
}
2628

2729
private[this] var myCtx = initializeCtx
28-
private[this] var compiler = new ReplCompiler(myCtx)
30+
private[this] var typer = new ReplTyper(myCtx)
2931

3032
private def readLine(history: History) =
3133
AmmoniteReader(history)(myCtx).prompt()
@@ -49,7 +51,7 @@ class Repl(settings: Array[String]) extends Driver {
4951
}
5052

5153
def compile(parsed: Parsed, line: Int): Unit =
52-
compiler.compile(parsed, line)(myCtx)
54+
typer.typeCheck(parsed, line)(myCtx)
5355

5456
def interpretCommand(cmd: Command, history: History): Unit = cmd match {
5557
case UnknownCommand(cmd) => {

repl/src/dotty/tools/repl/ReplCompiler.scala renamed to repl/src/dotty/tools/repl/ReplTyper.scala

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package repl
44
import java.io.{ File => JFile }
55

66
import dotc.ast.untpd
7+
import dotc.ast.tpd
78
import dotc.{ CompilationUnit, Compiler }
89
import dotc.core.{ Phases, Decorators, Flags }
910
import Decorators._, Flags._
@@ -12,35 +13,18 @@ import dotc.typer.FrontEnd
1213
import backend.jvm.GenBCode
1314
import dotc.core.Contexts.Context
1415
import dotc.util.Positions._
16+
import dotc.reporting.diagnostic.MessageContainer
1517
import dotc.reporting._
1618
import io._
1719

18-
class ReplCompiler(ictx: Context) extends Compiler {
19-
20-
ictx.base.initialize()(ictx)
20+
class ReplTyper(ictx: Context) extends Compiler {
2121

2222
type NextRes = Int
2323

24-
/** A GenBCode phase that outputs to a virtual directory */
25-
private class REPLGenBCode extends GenBCode {
26-
override def phaseName = "replGenBCode"
27-
28-
/** Directory to save class files to */
29-
private val virtualDirectory =
30-
if (ictx.settings.d.isDefault(ictx))
31-
new VirtualDirectory("(memory)", None)
32-
else
33-
new PlainDirectory(new Directory(new JFile(ictx.settings.d.value(ictx))))
34-
35-
override def outputDir(implicit ctx: Context) = virtualDirectory
36-
}
37-
3824
private class REPLFrontEnd extends FrontEnd {
3925
override def phaseName = "replFrontEnd"
4026

4127
override def runOn(units: List[CompilationUnit])(implicit ctx: Context) = {
42-
for (unit <- units) do println(unit.untpdTree.show)
43-
4428
val unitContexts = for (unit <- units) yield ctx.fresh.setCompilationUnit(unit)
4529
var remaining = unitContexts
4630
while (remaining.nonEmpty) {
@@ -53,10 +37,7 @@ class ReplCompiler(ictx: Context) extends Compiler {
5337
}
5438
}
5539

56-
override def phases = {
57-
val replPhases = Phases.replace(classOf[FrontEnd], _ => new REPLFrontEnd :: Nil, super.phases)
58-
Phases.replace(classOf[GenBCode], _ => new REPLGenBCode :: Nil, replPhases)
59-
}
40+
override def phases = List(new REPLFrontEnd :: Nil)
6041

6142
def freeToAssigned(trees: Seq[untpd.Tree], currentRes: Int)
6243
(implicit ctx: Context): (NextRes, Seq[untpd.Tree]) = {
@@ -82,7 +63,18 @@ class ReplCompiler(ictx: Context) extends Compiler {
8263
.withPos(Position(trees.head.pos.start, trees.last.pos.end))
8364
}
8465

85-
def compile(parsed: Parsed, currentRes: Int)(implicit ctx: Context): NextRes = {
66+
def extractStats(tree: tpd.Tree)(implicit ctx: Context): Seq[tpd.Tree] =
67+
tree match {
68+
case tpd.TypeDef(_, tpl: tpd.Template) =>
69+
tpl.body.collect { case tree: tpd.Tree => tree }
70+
case _ => Nil
71+
}
72+
73+
sealed trait Result
74+
case class TypedTrees(trees: Seq[tpd.Tree]) extends Result
75+
case class TypeErrors(msgs: Seq[MessageContainer]) extends Result
76+
77+
def typeCheck(parsed: Parsed, currentRes: Int)(implicit ctx: Context): (NextRes, Result) = {
8678
val reporter = new StoreReporter(null) with UniqueMessagePositions with HideNonSensicalMessages
8779

8880
val unit = new CompilationUnit(new SourceFile(s"repl-run-$currentRes", parsed.sourceCode))
@@ -92,6 +84,11 @@ class ReplCompiler(ictx: Context) extends Compiler {
9284
val run = newRun(ctx.fresh.setReporter(reporter))
9385
run.compileUnits(unit :: Nil)
9486

95-
newRes
87+
val errs = reporter.removeBufferedMessages
88+
val res =
89+
if (errs.isEmpty) TypedTrees(extractStats(unit.tpdTree))
90+
else TypeErrors(errs)
91+
92+
(newRes, res)
9693
}
9794
}

0 commit comments

Comments
 (0)