@@ -11,8 +11,7 @@ import dotty.tools.dotc.core.Decorators._
1111import dotty .tools .dotc .core .Flags ._
1212import dotty .tools .dotc .core .NameKinds .FlatName
1313import 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 ._
1615import dotty .tools .dotc .core .quoted ._
1716import dotty .tools .dotc .core .Types ._
1817import dotty .tools .dotc .core .Symbols ._
@@ -22,6 +21,7 @@ import dotty.tools.dotc.tastyreflect.ReflectionImpl
2221
2322import scala .util .control .NonFatal
2423import dotty .tools .dotc .util .SourcePosition
24+ import dotty .tools .repl .AbstractFileClassLoader
2525
2626import scala .reflect .ClassTag
2727
@@ -113,14 +113,22 @@ object Splicer {
113113 }
114114
115115 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+
117124 def getDirectName (tp : Type , name : TermName ): TermName = tp.widenDealias match {
118125 case tp : AppliedType if defn.isImplicitFunctionType(tp) =>
119126 getDirectName(tp.args.last, NameKinds .DirectMethodName (name))
120127 case _ => name
121128 }
129+
122130 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))
124132 stopIfRuntimeException(method.invoke(instance, args : _* ))
125133 }
126134
@@ -140,14 +148,19 @@ object Splicer {
140148 if (sym.owner.is(Package )) {
141149 // is top level object
142150 val moduleClass = loadClass(sym.fullName)
143- moduleClass.getField(MODULE_INSTANCE_FIELD ).get(null )
151+ moduleClass.getField(str. MODULE_INSTANCE_FIELD ).get(null )
144152 } else {
145153 // nested object in an object
146154 val clazz = loadClass(sym.fullNameSeparated(FlatName ))
147155 clazz.getConstructor().newInstance().asInstanceOf [Object ]
148156 }
149157 }
150158
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+
151164 private def loadClass (name : Name ): Class [_] = {
152165 try classLoader.loadClass(name.toString)
153166 catch {
0 commit comments