Use `ConsoleReporter` if no reporter is found

This change is necessary in the cases where we have global
initialization issues that have no position, like:

```
[info] [error] scala.reflect.internal.MissingRequirementError: object scala in compiler mirror not found.
```

Before, it was failing with a `sys.error` exception. Now we will report
these issues with a console reporter that is not meant to be
thread-safe.
This commit is contained in:
jvican 2017-05-01 16:45:22 +02:00
parent 5ca2e3c87e
commit 9d260f68c7
No known key found for this signature in database
GPG Key ID: 42DAFA0F112E8050
1 changed files with 9 additions and 9 deletions

View File

@ -3,7 +3,6 @@ package internal
package parser
import sbt.internal.util.{ LineRange, MessageOnlyException }
import java.io.File
import java.util.concurrent.ConcurrentHashMap
@ -14,10 +13,9 @@ import scala.reflect.internal.util.{ BatchSourceFile, Position }
import scala.reflect.io.VirtualDirectory
import scala.reflect.internal.Positions
import scala.tools.nsc.{ CompilerCommand, Global }
import scala.tools.nsc.reporters.{ Reporter, StoreReporter }
import scala.tools.nsc.reporters.{ ConsoleReporter, Reporter, StoreReporter }
import scala.util.Random
import scala.util.{ Success, Failure }
import scala.util.{ Failure, Success }
private[sbt] object SbtParser {
val END_OF_LINE_CHAR = '\n'
@ -78,9 +76,10 @@ private[sbt] object SbtParser {
private def getReporter(fileName: String) = {
val reporter = reporters.get(fileName)
if (reporter == null)
sys.error(s"Sbt parser failure: no reporter for $fileName.")
reporter
if (reporter == null) {
scalacGlobalInitReporter.getOrElse(
sys.error(s"Sbt forgot to initialize `scalacGlobalInitReporter`."))
} else reporter
}
def throwParserErrorsIfAny(reporter: StoreReporter, fileName: String): Unit = {
@ -99,14 +98,15 @@ private[sbt] object SbtParser {
}
private[sbt] final val globalReporter = new UniqueParserReporter
private[sbt] var scalacGlobalInitReporter: Option[ConsoleReporter] = None
private[sbt] final lazy val defaultGlobalForParser = {
import scala.reflect.internal.util.NoPosition
val options = "-cp" :: s"$defaultClasspath" :: "-Yrangepos" :: Nil
val reportError = (msg: String) => globalReporter.error(NoPosition, msg)
val reportError = (msg: String) => System.err.println(msg)
val command = new CompilerCommand(options, reportError)
val settings = command.settings
settings.outputDirs.setSingleOutput(new VirtualDirectory("(memory)", None))
scalacGlobalInitReporter = Some(new ConsoleReporter(settings))
// Mix Positions, otherwise global ignores -Yrangepos
val global = new Global(settings, globalReporter) with Positions