summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEugene Burmako <burmako@epfl.ch>2011-11-28 13:37:52 +0000
committerEugene Burmako <burmako@epfl.ch>2011-11-28 13:37:52 +0000
commit4e987a3cf032eb176c20bf3fd5ac847a73b19c00 (patch)
tree41b2cc06372010f9d30a671d46bf504aa3f9bc05 /src
parent66bf8db3f115675377d82869fddcab6006adf04d (diff)
downloadscala-4e987a3cf032eb176c20bf3fd5ac847a73b19c00.tar.gz
scala-4e987a3cf032eb176c20bf3fd5ac847a73b19c00.tar.bz2
scala-4e987a3cf032eb176c20bf3fd5ac847a73b19c00.zip
Reflection toolboxes now respect settings that ...
Reflection toolboxes now respect settings that are provided to them. Before the fix CompilerCommand lacked the (args, settings, errorFn) ctor. I added it and provided means to augment passed settings with custom errorFn. Closes SI-5239. Review by odersky.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/reflect/runtime/ToolBoxes.scala8
-rw-r--r--src/compiler/scala/tools/nsc/CompilerCommand.scala2
-rw-r--r--src/compiler/scala/tools/nsc/Settings.scala6
-rw-r--r--src/compiler/scala/tools/nsc/settings/MutableSettings.scala17
4 files changed, 32 insertions, 1 deletions
diff --git a/src/compiler/scala/reflect/runtime/ToolBoxes.scala b/src/compiler/scala/reflect/runtime/ToolBoxes.scala
index 7ec7d15fb7..e617239398 100644
--- a/src/compiler/scala/reflect/runtime/ToolBoxes.scala
+++ b/src/compiler/scala/reflect/runtime/ToolBoxes.scala
@@ -3,6 +3,7 @@ package runtime
import scala.tools.nsc.reporters.Reporter
import scala.tools.nsc.reporters.StoreReporter
+import scala.tools.nsc.reporters.AbstractReporter
import scala.tools.nsc.ReflectGlobal
import scala.tools.nsc.CompilerCommand
import scala.tools.nsc.Global
@@ -109,7 +110,12 @@ trait ToolBoxes extends { self: Universe =>
}
lazy val compiler: ToolBoxGlobal = {
- val command = new CompilerCommand(arguments.toList, reporter.error(scala.tools.nsc.util.NoPosition, _))
+ val errorFn: String => Unit = reporter.error(scala.tools.nsc.util.NoPosition, _)
+ val command = reporter match {
+ case reporter: AbstractReporter => new CompilerCommand(arguments.toList, reporter.settings, errorFn)
+ case _ => new CompilerCommand(arguments.toList, errorFn)
+ }
+
command.settings.outputDirs setSingleOutput virtualDirectory
new ToolBoxGlobal(command.settings, reporter)
}
diff --git a/src/compiler/scala/tools/nsc/CompilerCommand.scala b/src/compiler/scala/tools/nsc/CompilerCommand.scala
index 63cb62ee2e..54bc218912 100644
--- a/src/compiler/scala/tools/nsc/CompilerCommand.scala
+++ b/src/compiler/scala/tools/nsc/CompilerCommand.scala
@@ -11,6 +11,8 @@ import io.File
/** A class representing command line info for scalac */
class CompilerCommand(arguments: List[String], val settings: Settings) {
def this(arguments: List[String], error: String => Unit) = this(arguments, new Settings(error))
+ def this(arguments: List[String], settings: Settings, error: String => Unit) = this(arguments, settings withErrorFn error)
+
type Setting = Settings#Setting
/** file extensions of files that the compiler can process */
diff --git a/src/compiler/scala/tools/nsc/Settings.scala b/src/compiler/scala/tools/nsc/Settings.scala
index ca99ddf27a..d57d5546fa 100644
--- a/src/compiler/scala/tools/nsc/Settings.scala
+++ b/src/compiler/scala/tools/nsc/Settings.scala
@@ -11,4 +11,10 @@ import settings.MutableSettings
*/
class Settings(errorFn: String => Unit) extends MutableSettings(errorFn) {
def this() = this(Console.println)
+
+ override def withErrorFn(errorFn: String => Unit): Settings = {
+ val settings = new Settings(errorFn)
+ copyInto(settings)
+ settings
+ }
}
diff --git a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
index 67a556f6f0..b468e7c0af 100644
--- a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
@@ -22,6 +22,23 @@ class MutableSettings(val errorFn: String => Unit)
with Mutable {
type ResultOfTryToSet = List[String]
+ def withErrorFn(errorFn: String => Unit): MutableSettings = {
+ val settings = new MutableSettings(errorFn)
+ copyInto(settings)
+ settings
+ }
+
+ protected def copyInto(settings: MutableSettings) {
+ allSettings foreach { thisSetting =>
+ val otherSetting = settings.allSettings find { _.name == thisSetting.name }
+ otherSetting foreach { otherSetting =>
+ if (thisSetting.isSetByUser || otherSetting.isSetByUser) {
+ otherSetting.value = thisSetting.value.asInstanceOf[otherSetting.T]
+ }
+ }
+ }
+ }
+
/** Iterates over the arguments applying them to settings where applicable.
* Then verifies setting dependencies are met.
*