1
1
package dotty .tools
2
2
package repl
3
3
4
+ import java .net .{URL , URLClassLoader }
5
+ import java .lang .ClassLoader
6
+
4
7
import scala .annotation .tailrec
5
8
6
9
import dotc .reporting .MessageRendering
@@ -15,13 +18,17 @@ import dotc.core.Types.{ ExprType, ConstantType }
15
18
import dotc .config .CompilerCommand
16
19
import dotc .{ Compiler , Driver }
17
20
import dotc .printing .SyntaxHighlighting
21
+ import dotc .repl .AbstractFileClassLoader // FIXME
18
22
19
23
import AmmoniteReader ._
20
24
import results ._
21
25
22
26
case class State (objectIndex : Int , valIndex : Int , history : History )
23
27
24
- class Repl (settings : Array [String ]) extends Driver {
28
+ class Repl (
29
+ settings : Array [String ],
30
+ parentClassLoader : Option [ClassLoader ] = None
31
+ ) extends Driver {
25
32
26
33
// FIXME: Change the Driver API to not require implementing this method
27
34
override protected def newCompiler (implicit ctx : Context ): Compiler =
@@ -35,6 +42,25 @@ class Repl(settings: Array[String]) extends Driver {
35
42
ictx
36
43
}
37
44
45
+ private [this ] var _classLoader : ClassLoader = _
46
+ def classLoader (implicit ctx : Context ): ClassLoader = {
47
+ if (_classLoader eq null ) _classLoader = {
48
+ /** the compiler's classpath, as URL's */
49
+ val compilerClasspath : Seq [URL ] = ctx.platform.classPath(ctx).asURLs
50
+
51
+ lazy val parent = new URLClassLoader (compilerClasspath.toArray,
52
+ classOf [Repl ].getClassLoader)
53
+
54
+ new AbstractFileClassLoader (compiler.virtualDirectory,
55
+ parentClassLoader.getOrElse(parent))
56
+ }
57
+
58
+ // Set the current Java "context" class loader to this interpreter's
59
+ // class loader
60
+ Thread .currentThread.setContextClassLoader(_classLoader)
61
+ _classLoader
62
+ }
63
+
38
64
protected [this ] var myCtx = initializeCtx : Context
39
65
protected [this ] var compiler = new ReplCompiler (myCtx)
40
66
@@ -94,8 +120,8 @@ class Repl(settings: Array[String]) extends Driver {
94
120
95
121
(
96
122
defs.map(Rendering .renderMethod) ++
97
- vals.map(Rendering .renderVal)
98
- ).foreach(println)
123
+ vals.map(Rendering .renderVal(_, classLoader) )
124
+ ).foreach(str => println( SyntaxHighlighting (str)) )
99
125
}
100
126
101
127
def displayTypeDef (tree : tpd.TypeDef ) = {
@@ -108,8 +134,7 @@ class Repl(settings: Array[String]) extends Driver {
108
134
else if (sym.is(Module )) " object"
109
135
else " class"
110
136
111
-
112
- println(SyntaxHighlighting (s " defined $kind $name" ))
137
+ println(SyntaxHighlighting (s " // defined $kind $name" ))
113
138
}
114
139
115
140
@@ -138,6 +163,7 @@ class Repl(settings: Array[String]) extends Driver {
138
163
139
164
case Reset => {
140
165
myCtx = initCtx.fresh
166
+ _classLoader = null
141
167
run()
142
168
}
143
169
0 commit comments