Skip to content

Commit 8453d30

Browse files
committed
Fix the REPL crashing when a dependency's classpath is called by a macro
1 parent 9a05eae commit 8453d30

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala

+8-6
Original file line numberDiff line numberDiff line change
@@ -394,23 +394,25 @@ object Repl extends ScalaCommand[ReplOptions] with BuildCommandHelpers {
394394
if (dryRun)
395395
logger.message("Dry run, not running REPL.")
396396
else {
397+
val isAmmonite = replArtifacts.replMainClass.startsWith("ammonite")
397398
val depClassPathArgs: Seq[String] =
398-
if replArtifacts.depsClassPath.nonEmpty && !replArtifacts.replMainClass.startsWith(
399-
"ammonite"
400-
)
401-
then
399+
if replArtifacts.depsClassPath.nonEmpty && !isAmmonite then
402400
Seq(
403401
"-classpath",
404-
replArtifacts.depsClassPath.map(_.toString).mkString(File.pathSeparator)
402+
(mainJarsOrClassDirs ++ replArtifacts.depsClassPath)
403+
.map(_.toString).mkString(File.pathSeparator)
405404
)
406405
else Nil
406+
val replLauncherClasspath =
407+
if isAmmonite then mainJarsOrClassDirs ++ replArtifacts.replClassPath
408+
else replArtifacts.replClassPath
407409
val retCode = Runner.runJvm(
408410
javaCommand = options.javaHome().value.javaCommand,
409411
javaArgs = scalapyJavaOpts ++
410412
replArtifacts.replJavaOpts ++
411413
options.javaOptions.javaOpts.toSeq.map(_.value.value) ++
412414
extraProps.toVector.sorted.map { case (k, v) => s"-D$k=$v" },
413-
classPath = mainJarsOrClassDirs ++ replArtifacts.replClassPath,
415+
classPath = replLauncherClasspath,
414416
mainClass = replArtifacts.replMainClass,
415417
args = maybeAdaptForWindows(depClassPathArgs ++ replArgs),
416418
logger = logger,

modules/integration/src/test/scala/scala/cli/integration/ReplTestDefinitions.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import scala.util.Properties
77

88
abstract class ReplTestDefinitions extends ScalaCliSuite with TestScalaVersionArgs {
99
_: TestScalaVersion =>
10-
private lazy val extraOptions = scalaVersionArgs ++ TestUtil.extraOptions
10+
protected lazy val extraOptions: Seq[String] = scalaVersionArgs ++ TestUtil.extraOptions
1111

1212
private val retrieveScalaVersionCode = if (actualScalaVersion.startsWith("2."))
1313
"scala.util.Properties.versionNumberString"

modules/integration/src/test/scala/scala/cli/integration/ReplTests3StableDefinitions.scala

+30
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package scala.cli.integration
22

3+
import com.eed3si9n.expecty.Expecty.expect
4+
5+
import scala.util.Properties
6+
37
trait ReplTests3StableDefinitions { _: ReplTestDefinitions =>
48
if (!actualScalaVersion.equals(actualMaxAmmoniteScalaVersion)) {
59
lazy val defaultScalaVersionString =
@@ -16,4 +20,30 @@ trait ReplTests3StableDefinitions { _: ReplTestDefinitions =>
1620
ammoniteTestScope(useMaxAmmoniteScalaVersion = false)
1721
}
1822
}
23+
24+
test("https://github.com/scala/scala3/issues/21229") {
25+
TestInputs(
26+
os.rel / "Pprint.scala" ->
27+
"""//> using dep "com.lihaoyi::pprint::0.9.0"
28+
|package stuff
29+
|import scala.quoted.*
30+
|def foo = pprint(1)
31+
|inline def bar = pprint(1)
32+
|inline def baz = ${ bazImpl }
33+
|def bazImpl(using Quotes) = '{ pprint(1) }
34+
|""".stripMargin
35+
).fromRoot { root =>
36+
val ammArgs = Seq("-c", "println(stuff.baz)")
37+
.map {
38+
if (Properties.isWin)
39+
a => if (a.contains(" ")) "\"" + a.replace("\"", "\\\"") + "\"" else a
40+
else
41+
identity
42+
}
43+
.flatMap(arg => Seq("--ammonite-arg", arg))
44+
val res = os.proc(TestUtil.cli, "repl", ".", "--power", "--amm", ammArgs, extraOptions)
45+
.call(cwd = root)
46+
expect(res.out.trim().nonEmpty)
47+
}
48+
}
1949
}

0 commit comments

Comments
 (0)