Skip to content

Commit 8b1352d

Browse files
committed
Implement fresh injection of trees into ReplSession object
1 parent 774a21f commit 8b1352d

File tree

4 files changed

+43
-13
lines changed

4 files changed

+43
-13
lines changed

repl/src/dotty/tools/repl/InjectableTree.scala

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import dotc.core.Decorators.PreNamedString
66
import dotc.ast.tpd.{ ModuleDef, Thicket, cpy }
77
import dotc.core.Flags.EmptyFlags
88
import dotc.core.Scopes
9-
import dotc.ast.Trees.Template
9+
import dotc.ast.Trees._
10+
import dotc.ast.tpd
1011
import dotc.core.StdNames._
1112

1213
import results.Result
@@ -30,8 +31,16 @@ object InjectableTree {
3031
(implicit ctx: Context): Result[InjectableTree] = {
3132

3233
val changedTrees =
33-
res.trees.map(t => t.changeOwner(t.symbol, tree.obj.symbol)).toList
34+
res.trees.map(t => t.changeOwner(t.symbol, tree.obj.trees(1).symbol)).toList
3435

35-
new InjectableTree(cpy.Thicket(tree.obj)(changedTrees), tree.nextId)
36+
val statsReplacer = new tpd.TreeMap {
37+
override def transformStats(trees: List[tpd.Tree])(implicit ctx: Context) =
38+
changedTrees
39+
}
40+
41+
new InjectableTree(
42+
statsReplacer.transform(tree.obj).asInstanceOf[tpd.Thicket],
43+
tree.nextId
44+
)
3645
}
3746
}

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class Repl(settings: Array[String]) extends Driver {
2727
ictx
2828
}
2929

30-
protected[this] var myCtx = initializeCtx
30+
protected[this] var myCtx = initializeCtx: Context
3131
protected[this] var typer = new ReplTyper(myCtx)
3232
protected[this] var compiler = new ReplCompiler(myCtx)
3333

@@ -56,17 +56,20 @@ class Repl(settings: Array[String]) extends Driver {
5656
def compile(parsed: Parsed, tree: InjectableTree)(implicit ctx: Context): InjectableTree = {
5757
val res = for {
5858
typed <- typer.typeCheck(parsed, tree.nextId)
59-
injected <- InjectableTree.patch(tree, typed)
60-
_ <- compiler.compile(injected.obj)
61-
} yield injected
59+
injected <- InjectableTree.patch(tree, typed)(typed.newCtx)
60+
_ <- compiler.compile(injected.obj)(typed.newCtx)
61+
} yield (injected, typed.newCtx)
6262

6363
// Fold over result, on failure - report errors and return old `tree`:
6464
res.fold(
6565
errors => {
6666
displayErrors(errors.msgs)
6767
tree
6868
},
69-
id
69+
(injected, newCtx) => {
70+
myCtx = newCtx
71+
injected
72+
}
7073
)
7174
}
7275

repl/src/dotty/tools/repl/ReplTyper.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import io._
1818

1919
import results._
2020

21-
case class TypedTrees(nextId: Int, trees: Seq[tpd.Tree])
21+
case class TypedTrees(nextId: Int, trees: Seq[tpd.Tree], newCtx: Context)
2222

2323
class ReplTyper(ictx: Context) extends Compiler {
2424

@@ -84,7 +84,7 @@ class ReplTyper(ictx: Context) extends Compiler {
8484
run.compileUnits(unit :: Nil)
8585

8686
val errs = reporter.removeBufferedMessages
87-
if (errs.isEmpty) TypedTrees(newRes, extractStats(unit.tpdTree))
87+
if (errs.isEmpty) TypedTrees(newRes, extractStats(unit.tpdTree), run.runContext)
8888
else Errors(errs)
8989
}
9090
}

repl/test/dotty/tools/repl/InjectableTreeTests.scala

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,18 @@ package repl
44
import org.junit.Assert._
55
import org.junit.Test
66
import dotc.ast.tpd
7+
import dotc.core.Contexts.Context
78

89
class InjectableTreeTests extends ReplTest {
10+
11+
def extractMembers(obj: tpd.TypeDef)(implicit ctx: Context): List[tpd.MemberDef] =
12+
obj.rhs match {
13+
case tmpl: tpd.Template =>
14+
tmpl.body.collect { case tree: tpd.MemberDef => tree }
15+
case _ => Nil
16+
}
17+
18+
919
@Test def crashCheck = {
1020
implicit val ctx = myCtx
1121
val injTree = InjectableTree()
@@ -21,9 +31,17 @@ class InjectableTreeTests extends ReplTest {
2131
val parsed @ Parsed(_,_) = ParseResult("def foo: 1 = 1")
2232
val typer = new ReplTyper(myCtx)
2333

24-
val tt @ TypedTrees(_,_) = typer.typeCheck(parsed, 0)
25-
val newInjTree @ InjectableTree(_,_) = InjectableTree.patch(injTree, tt)
34+
val tt @ TypedTrees(_,_, newCtx) = typer.typeCheck(parsed, 0)
35+
val InjectableTree(tpd.Thicket(List(_, obj: tpd.TypeDef)), 0) =
36+
InjectableTree.patch(injTree, tt)(newCtx)
37+
38+
val members = extractMembers(obj)
39+
40+
assert(members.length == 1, s"Wrong amount of members in object: $members")
2641

27-
// assert( newInjTree has 1 method == "def foo: 1 = 1" )
42+
members.head match {
43+
case tpd.DefDef(name, _, _, _, _) => assert(name.show == "foo")
44+
case _ => assert(false, "incorrect shit yo")
45+
}
2846
}
2947
}

0 commit comments

Comments
 (0)