Skip to content

Commit 971e89f

Browse files
authored
Merge pull request #5688 from dotty-staging/fix-#5551
Fix #5551: Handle repl line modules in splicer
2 parents 00bfbbd + b54e3c5 commit 971e89f

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

compiler/src/dotty/tools/dotc/transform/Splicer.scala

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ import dotty.tools.dotc.core.Decorators._
1111
import dotty.tools.dotc.core.Flags._
1212
import dotty.tools.dotc.core.NameKinds.FlatName
1313
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._
1615
import dotty.tools.dotc.core.quoted._
1716
import dotty.tools.dotc.core.Types._
1817
import dotty.tools.dotc.core.Symbols._
@@ -22,6 +21,7 @@ import dotty.tools.dotc.tastyreflect.ReflectionImpl
2221

2322
import scala.util.control.NonFatal
2423
import dotty.tools.dotc.util.SourcePosition
24+
import dotty.tools.repl.AbstractFileClassLoader
2525

2626
import 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 {

compiler/test-resources/repl/i5551

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
scala> import scala.quoted._
2+
3+
scala> def assertImpl(expr: Expr[Boolean]) = '{ if !(~expr) then throw new AssertionError("failed assertion")}
4+
def assertImpl(expr: quoted.Expr[Boolean]): quoted.Expr[Unit]
5+
6+
scala> inline def assert(expr: => Boolean): Unit = ~ assertImpl('(expr))
7+
def assert(expr: => Boolean): Unit
8+
9+
scala> assert(0 == 0)
10+
11+
scala> try assert(0 == 1) catch { case _: AssertionError => println("ok") }
12+
ok

0 commit comments

Comments
 (0)