Skip to content

Commit 3635303

Browse files
authored
REPL: open up for extensibility (#16276)
2 parents c5181b9 + bdcf667 commit 3635303

File tree

3 files changed

+21
-13
lines changed

3 files changed

+21
-13
lines changed

compiler/src/dotty/tools/repl/JLineTerminal.scala

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import org.jline.reader.impl.history.DefaultHistory
1616
import org.jline.terminal.TerminalBuilder
1717
import org.jline.utils.AttributedString
1818

19-
final class JLineTerminal extends java.io.Closeable {
19+
class JLineTerminal extends java.io.Closeable {
2020
// import java.util.logging.{Logger, Level}
2121
// Logger.getLogger("org.jline").setLevel(Level.FINEST)
2222

@@ -30,7 +30,8 @@ final class JLineTerminal extends java.io.Closeable {
3030
private def blue(str: String)(using Context) =
3131
if (ctx.settings.color.value != "never") Console.BLUE + str + Console.RESET
3232
else str
33-
private def prompt(using Context) = blue("\nscala> ")
33+
protected def promptStr = "scala"
34+
private def prompt(using Context) = blue(s"\n$promptStr> ")
3435
private def newLinePrompt(using Context) = blue(" | ")
3536

3637
/** Blockingly read line from `System.in`

compiler/src/dotty/tools/repl/Rendering.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ private[repl] class Rendering(parentClassLoader: Option[ClassLoader] = None):
2828

2929
import Rendering._
3030

31-
private var myClassLoader: AbstractFileClassLoader = _
31+
var myClassLoader: AbstractFileClassLoader = _
3232

3333
/** (value, maxElements, maxCharacters) => String */
34-
private var myReplStringOf: (Object, Int, Int) => String = _
34+
var myReplStringOf: (Object, Int, Int) => String = _
3535

3636
/** Class loader used to load compiled code */
3737
private[repl] def classLoader()(using Context) =

compiler/src/dotty/tools/repl/ReplDriver.scala

+16-9
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class ReplDriver(settings: Array[String],
118118
private var rootCtx: Context = _
119119
private var shouldStart: Boolean = _
120120
private var compiler: ReplCompiler = _
121-
private var rendering: Rendering = _
121+
protected var rendering: Rendering = _
122122

123123
// initialize the REPL session as part of the constructor so that once `run`
124124
// is called, we're in business
@@ -138,7 +138,7 @@ class ReplDriver(settings: Array[String],
138138
* observable outside of the CLI, for this reason, most helper methods are
139139
* `protected final` to facilitate testing.
140140
*/
141-
final def runUntilQuit(using initialState: State = initialState)(): State = {
141+
def runUntilQuit(using initialState: State = initialState)(): State = {
142142
val terminal = new JLineTerminal
143143

144144
out.println(
@@ -176,7 +176,12 @@ class ReplDriver(settings: Array[String],
176176
interpret(ParseResult.complete(input))
177177
}
178178

179-
private def runBody(body: => State): State = rendering.classLoader()(using rootCtx).asContext(withRedirectedOutput(body))
179+
final def runQuietly(input: String)(using State): State = runBody {
180+
val parsed = ParseResult(input)
181+
interpret(parsed, quiet = true)
182+
}
183+
184+
protected def runBody(body: => State): State = rendering.classLoader()(using rootCtx).asContext(withRedirectedOutput(body))
180185

181186
// TODO: i5069
182187
final def bind(name: String, value: Any)(using state: State): State = state
@@ -242,10 +247,10 @@ class ReplDriver(settings: Array[String],
242247
.getOrElse(Nil)
243248
end completions
244249

245-
private def interpret(res: ParseResult)(using state: State): State = {
250+
protected def interpret(res: ParseResult, quiet: Boolean = false)(using state: State): State = {
246251
res match {
247252
case parsed: Parsed if parsed.trees.nonEmpty =>
248-
compile(parsed, state)
253+
compile(parsed, state, quiet)
249254

250255
case SyntaxErrors(_, errs, _) =>
251256
displayErrors(errs)
@@ -263,7 +268,7 @@ class ReplDriver(settings: Array[String],
263268
}
264269

265270
/** Compile `parsed` trees and evolve `state` in accordance */
266-
private def compile(parsed: Parsed, istate: State): State = {
271+
private def compile(parsed: Parsed, istate: State, quiet: Boolean = false): State = {
267272
def extractNewestWrapper(tree: untpd.Tree): Name = tree match {
268273
case PackageDef(_, (obj: untpd.ModuleDef) :: Nil) => obj.name.moduleClassName
269274
case _ => nme.NO_NAME
@@ -314,9 +319,11 @@ class ReplDriver(settings: Array[String],
314319
given Ordering[Diagnostic] =
315320
Ordering[(Int, Int, Int)].on(d => (d.pos.line, -d.level, d.pos.column))
316321

317-
(definitions ++ warnings)
318-
.sorted
319-
.foreach(printDiagnostic)
322+
if (!quiet) {
323+
(definitions ++ warnings)
324+
.sorted
325+
.foreach(printDiagnostic)
326+
}
320327

321328
updatedState
322329
}

0 commit comments

Comments
 (0)