Skip to content

Commit

Permalink
Backport "Add support for disabling redirected output in the REPL dri…
Browse files Browse the repository at this point in the history
…ver for usage in worksheets in the Scala Plugin for IntelliJ IDEA" (#16947)

Backports #16810
  • Loading branch information
Kordyjan authored Feb 17, 2023
2 parents 5803809 + b36f319 commit ebb2eb5
Showing 1 changed file with 26 additions and 11 deletions.
37 changes: 26 additions & 11 deletions compiler/src/dotty/tools/repl/ReplDriver.scala
Original file line number Diff line number Diff line change
Expand Up @@ -187,19 +187,34 @@ class ReplDriver(settings: Array[String],
// TODO: i5069
final def bind(name: String, value: Any)(using state: State): State = state

/**
* Controls whether the `System.out` and `System.err` streams are set to the provided constructor parameter instance
* of [[java.io.PrintStream]] during the execution of the repl. On by default.
*
* Disabling this can be beneficial when executing a repl instance inside a concurrent environment, for example a
* thread pool (such as the Scala compile server in the Scala Plugin for IntelliJ IDEA).
*
* In such environments, indepently executing `System.setOut` and `System.setErr` without any synchronization can
* lead to unpredictable results when restoring the original streams (dependent on the order of execution), leaving
* the Java process in an inconsistent state.
*/
protected def redirectOutput: Boolean = true

// redirecting the output allows us to test `println` in scripted tests
private def withRedirectedOutput(op: => State): State = {
val savedOut = System.out
val savedErr = System.err
try {
System.setOut(out)
System.setErr(out)
op
}
finally {
System.setOut(savedOut)
System.setErr(savedErr)
}
if redirectOutput then
val savedOut = System.out
val savedErr = System.err
try {
System.setOut(out)
System.setErr(out)
op
}
finally {
System.setOut(savedOut)
System.setErr(savedErr)
}
else op
}

private def newRun(state: State, reporter: StoreReporter = newStoreReporter) = {
Expand Down

0 comments on commit ebb2eb5

Please sign in to comment.