summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2011-08-24 17:02:31 +0000
committerMartin Odersky <odersky@gmail.com>2011-08-24 17:02:31 +0000
commit77175ede13ac1b0b37e82aabdfe091e0ec592b25 (patch)
treedd8551c9ca54d6532ca7e44abe675560d34f2fc4 /src/compiler
parent48e8133cb08a252ea0ec325d4c6537bccb2e0465 (diff)
downloadscala-77175ede13ac1b0b37e82aabdfe091e0ec592b25.tar.gz
scala-77175ede13ac1b0b37e82aabdfe091e0ec592b25.tar.bz2
scala-77175ede13ac1b0b37e82aabdfe091e0ec592b25.zip
Refactored everything that's clean in nsc.Main ...
Refactored everything that's clean in nsc.Main to nsc.Driver. Left the cruft in Main which now inherits Driver. Makes it simpler to create new compiler variants by subclassing Driver instead of adding yet one more case to the convoluted logic in Main.
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/Driver.scala69
-rw-r--r--src/compiler/scala/tools/nsc/Main.scala72
2 files changed, 83 insertions, 58 deletions
diff --git a/src/compiler/scala/tools/nsc/Driver.scala b/src/compiler/scala/tools/nsc/Driver.scala
new file mode 100644
index 0000000000..db95c1442b
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/Driver.scala
@@ -0,0 +1,69 @@
+package scala.tools.nsc
+
+import scala.tools.nsc.reporters.{Reporter, ConsoleReporter}
+import Properties.{ versionString, copyrightString }
+import scala.tools.nsc.util.{ BatchSourceFile, FakePos }
+
+abstract class Driver {
+
+ val versionMsg = "Scala compiler " +
+ versionString + " -- " +
+ copyrightString
+
+ var reporter: ConsoleReporter = _
+ protected var command: CompilerCommand = _
+ protected var settings: Settings = _
+
+ protected def scalacError(msg: String) {
+ reporter.error(FakePos("scalac"), msg + "\n scalac -help gives more information")
+ }
+
+ protected def processSettingsHook(): Boolean = true
+
+ protected def newCompiler(): Global
+
+ protected def doCompile(compiler: Global) {
+ if (command.files.isEmpty) {
+ reporter.info(null, command.usageMsg, true)
+ reporter.info(null, compiler.pluginOptionsHelp, true)
+ } else {
+ val run = new compiler.Run()
+ run compile command.files
+ reporter.printSummary()
+ }
+ }
+
+ def process(args: Array[String]) {
+ val ss = new Settings(scalacError)
+ reporter = new ConsoleReporter(ss)
+ command = new CompilerCommand(args.toList, ss)
+ settings = command.settings
+
+ if (settings.version.value) {
+ reporter.info(null, versionMsg, true)
+ } else if (processSettingsHook()) {
+ val compiler = newCompiler()
+ try {
+ if (reporter.hasErrors)
+ reporter.flush()
+ else if (command.shouldStopWithInfo)
+ reporter.info(null, command.getInfoMessage(compiler), true)
+ else
+ doCompile(compiler)
+ } catch {
+ case ex =>
+ compiler.logThrowable(ex)
+ ex match {
+ case FatalError(msg) => reporter.error(null, "fatal error: " + msg)
+ case _ => throw ex
+ }
+ }
+ }
+ }
+
+ def main(args: Array[String]) {
+ process(args)
+ sys.exit(if (reporter.hasErrors) 1 else 0)
+ }
+
+} \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/Main.scala b/src/compiler/scala/tools/nsc/Main.scala
index de1d148a36..38da47aacc 100644
--- a/src/compiler/scala/tools/nsc/Main.scala
+++ b/src/compiler/scala/tools/nsc/Main.scala
@@ -17,19 +17,10 @@ import Properties.{ versionString, copyrightString, residentPromptString, msilLi
/** The main class for NSC, a compiler for the programming
* language Scala.
*/
-object Main extends AnyRef with EvalLoop {
- val versionMsg = "Scala compiler " +
- versionString + " -- " +
- copyrightString
+object Main extends Driver with EvalLoop {
val prompt = residentPromptString
- var reporter: ConsoleReporter = _
-
- private def scalacError(msg: String) {
- reporter.error(FakePos("scalac"), msg + "\n scalac -help gives more information")
- }
-
def resident(compiler: Global) {
loop { line =>
val args = line.split(' ').toList
@@ -39,15 +30,8 @@ object Main extends AnyRef with EvalLoop {
}
}
- def process(args: Array[String]) {
- val ss = new Settings(scalacError)
- reporter = new ConsoleReporter(ss)
- val command = new CompilerCommand(args.toList, ss)
- val settings = command.settings
-
- if (settings.version.value)
- reporter.info(null, versionMsg, true)
- else if (settings.Yidedebug.value) {
+ override def processSettingsHook(): Boolean =
+ if (settings.Yidedebug.value) {
settings.Xprintpos.value = true
settings.Yrangepos.value = true
val compiler = new interactive.Global(settings, reporter)
@@ -62,6 +46,7 @@ object Main extends AnyRef with EvalLoop {
case None => reporter.reset() // Causes other compiler errors to be ignored
}
askShutdown
+ false
}
else if (settings.Ybuilderdebug.value != "none") {
def fileSet(files : List[String]) = Set.empty ++ (files map AbstractFile.getFile)
@@ -78,50 +63,21 @@ object Main extends AnyRef with EvalLoop {
val command = new CompilerCommand(args.toList, settings)
buildManager.update(fileSet(command.files), Set.empty)
}
+ false
}
else {
if (settings.target.value == "msil")
msilLibPath foreach (x => settings.assemrefs.value += (pathSeparator + x))
-
- val compiler =
- if (settings.Yrangepos.value) new interactive.Global(settings, reporter)
- else new Global(settings, reporter)
-
- try {
- if (reporter.hasErrors)
- return reporter.flush()
-
- if (command.shouldStopWithInfo) {
- reporter.info(null, command.getInfoMessage(compiler), true)
- }
- else {
- if (settings.resident.value)
- resident(compiler)
- else if (command.files.isEmpty) {
- reporter.info(null, command.usageMsg, true)
- reporter.info(null, compiler.pluginOptionsHelp, true)
- }
- else {
- val run = new compiler.Run()
- run compile command.files
- reporter.printSummary()
- }
- }
- }
- catch {
- case ex =>
- compiler.logThrowable(ex)
- ex match {
- case FatalError(msg) => reporter.error(null, "fatal error: " + msg)
- case _ => throw ex
- }
- }
+ true
}
- }
- def main(args: Array[String]) {
- process(args)
- sys.exit(if (reporter.hasErrors) 1 else 0)
- }
+ override def newCompiler(): Global =
+ if (settings.Yrangepos.value) new interactive.Global(settings, reporter)
+ else new Global(settings, reporter)
+ override def doCompile(compiler: Global) {
+ if (settings.resident.value)
+ resident(compiler)
+ else super.doCompile(compiler)
+ }
}