@@ -11,8 +11,7 @@ import dotty.tools.dotc.core.Decorators._
11
11
import dotty .tools .dotc .core .Flags ._
12
12
import dotty .tools .dotc .core .NameKinds .FlatName
13
13
import dotty .tools .dotc .core .Names .{Name , TermName }
14
- import dotty .tools .dotc .core .StdNames .nme
15
- import dotty .tools .dotc .core .StdNames .str .MODULE_INSTANCE_FIELD
14
+ import dotty .tools .dotc .core .StdNames ._
16
15
import dotty .tools .dotc .core .quoted ._
17
16
import dotty .tools .dotc .core .Types ._
18
17
import dotty .tools .dotc .core .Symbols ._
@@ -22,6 +21,7 @@ import dotty.tools.dotc.tastyreflect.ReflectionImpl
22
21
23
22
import scala .util .control .NonFatal
24
23
import dotty .tools .dotc .util .SourcePosition
24
+ import dotty .tools .repl .AbstractFileClassLoader
25
25
26
26
import scala .reflect .ClassTag
27
27
@@ -113,14 +113,22 @@ object Splicer {
113
113
}
114
114
115
115
protected def interpretStaticMethodCall (moduleClass : Symbol , fn : Symbol , args : => List [Object ])(implicit env : Env ): Object = {
116
- val instance = loadModule(moduleClass)
116
+ val (instance, clazz) =
117
+ if (moduleClass.name.startsWith(str.REPL_SESSION_LINE )) {
118
+ (null , loadReplLineClass(moduleClass))
119
+ } else {
120
+ val instance = loadModule(moduleClass)
121
+ (instance, instance.getClass)
122
+ }
123
+
117
124
def getDirectName (tp : Type , name : TermName ): TermName = tp.widenDealias match {
118
125
case tp : AppliedType if defn.isImplicitFunctionType(tp) =>
119
126
getDirectName(tp.args.last, NameKinds .DirectMethodName (name))
120
127
case _ => name
121
128
}
129
+
122
130
val name = getDirectName(fn.info.finalResultType, fn.name.asTermName)
123
- val method = getMethod(instance.getClass , name, paramsSig(fn))
131
+ val method = getMethod(clazz , name, paramsSig(fn))
124
132
stopIfRuntimeException(method.invoke(instance, args : _* ))
125
133
}
126
134
@@ -140,14 +148,19 @@ object Splicer {
140
148
if (sym.owner.is(Package )) {
141
149
// is top level object
142
150
val moduleClass = loadClass(sym.fullName)
143
- moduleClass.getField(MODULE_INSTANCE_FIELD ).get(null )
151
+ moduleClass.getField(str. MODULE_INSTANCE_FIELD ).get(null )
144
152
} else {
145
153
// nested object in an object
146
154
val clazz = loadClass(sym.fullNameSeparated(FlatName ))
147
155
clazz.getConstructor().newInstance().asInstanceOf [Object ]
148
156
}
149
157
}
150
158
159
+ private def loadReplLineClass (moduleClass : Symbol )(implicit env : Env ): Class [_] = {
160
+ val lineClassloader = new AbstractFileClassLoader (ctx.settings.outputDir.value, classLoader)
161
+ lineClassloader.loadClass(moduleClass.name.firstPart.toString)
162
+ }
163
+
151
164
private def loadClass (name : Name ): Class [_] = {
152
165
try classLoader.loadClass(name.toString)
153
166
catch {
0 commit comments