From be9a1788b58bdf3ba70e5a39fbab2a30c082ca27 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Tue, 22 Feb 2011 05:01:06 +0000 Subject: Changes to startup. default. The -toolcp option now works. -D and -J options are passed as arguments to the runner program as well as to the underlying JVM, because they may be needed for such things as fsc talking to a server compiler. Added a new Settings type for -D and -J options. Deleted some dead settings code. There are dummy settings for -toolcp and -nobootcp so they can be seen in the help output, which needs a big cleanup. No review. --- .../scala/tools/ant/templates/tool-unix.tmpl | 25 +++++++++++------ .../tools/nsc/settings/AbsScalaSettings.scala | 2 ++ .../scala/tools/nsc/settings/AbsSettings.scala | 9 ------ .../scala/tools/nsc/settings/MutableSettings.scala | 32 +++++++++++++++++++--- .../scala/tools/nsc/settings/ScalaSettings.scala | 6 ++-- test/files/presentation/simple-tests.check | 12 +++++--- 6 files changed, 58 insertions(+), 28 deletions(-) diff --git a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl index 21b0bd7b39..3280796878 100644 --- a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl +++ b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl @@ -99,22 +99,31 @@ fi declare -a java_args declare -a scala_args +# default to the boot classpath for speed. +CPSELECT="-Xbootclasspath/a:" + while [ $# -gt 0 ]; do case "$1" in -D*) + # pass to scala as well: otherwise we lose it sometimes when we + # need it, e.g. communicating with a server compiler. java_args=("${java_args[@@]}" "$1") - shift - ;; - -toolcp) - TOOL_CLASSPATH="$TOOL_CLASSPATH:$2" + scala_args=("${scala_args[@@]}" "$1") shift ;; -J*) + # as with -D, pass to scala even though it will almost + # never be used. java_args=("${java_args[@@]}" "${1:2}") + scala_args=("${scala_args[@@]}" "$1") shift ;; - --usebootcp) - CPSWITCH="-Xbootclasspath/a:$TOOL_CLASSPATH" + -toolcp) + TOOL_CLASSPATH="$TOOL_CLASSPATH:$2" + shift 2 + ;; + -nobootcp) + CPSELECT="-classpath " shift ;; *) @@ -124,8 +133,6 @@ while [ $# -gt 0 ]; do esac done -: ${CPSWITCH:="-cp $TOOL_CLASSPATH"} - # reset "$@@" to the remaining args set -- "${scala_args[@@]}" @@ -136,7 +143,7 @@ fi "${JAVACMD:=java}" \ $JAVA_OPTS \ "${java_args[@@]}" \ - $CPSWITCH \ + ${CPSELECT}${TOOL_CLASSPATH} \ -Dscala.usejavacp=true \ -Dscala.home="$SCALA_HOME" \ -Denv.emacs="$EMACS" \ diff --git a/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala index 47d308853a..80183791ed 100644 --- a/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala @@ -16,6 +16,7 @@ trait AbsScalaSettings { type PathSetting <: AbsSetting { type T = String } type PhasesSetting <: AbsSetting { type T = List[String] } type StringSetting <: AbsSetting { type T = String } + type MapSetting <: AbsSetting { type T = Map[String, String] } type OutputDirs type OutputSetting <: AbsSetting @@ -28,6 +29,7 @@ trait AbsScalaSettings { def PathSetting(name: String, descr: String, default: String): PathSetting def PhasesSetting(name: String, descr: String): PhasesSetting def StringSetting(name: String, helpArg: String, descr: String, default: String): StringSetting + def MapSetting(name: String, prefix: String, descr: String): MapSetting /** **/ abstract class SettingGroup(val prefix: String) extends AbsSetting { diff --git a/src/compiler/scala/tools/nsc/settings/AbsSettings.scala b/src/compiler/scala/tools/nsc/settings/AbsSettings.scala index 2e065a936c..0cc3be6e64 100644 --- a/src/compiler/scala/tools/nsc/settings/AbsSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/AbsSettings.scala @@ -106,15 +106,6 @@ trait AbsSettings { protected[nsc] def tryToSetColon(args: List[String]): Option[ResultOfTryToSet] = errorAndValue("'%s' does not accept multiple arguments" format name, None) - /** Commands which take properties in form -Dfoo=bar or -Dfoo - */ - protected[nsc] def tryToSetProperty(args: List[String]): Option[ResultOfTryToSet] = - errorAndValue("'%s' does not accept property style arguments" format name, None) - - /** Attempt to set from a properties file style property value. - */ - def tryToSetFromPropertyValue(s: String): Unit = tryToSet(s :: Nil) - /** These categorizations are so the help output shows -X and -P among * the standard options and -Y among the advanced options. */ diff --git a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala index a5cc9ef3c7..11b4a2510c 100644 --- a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala @@ -231,6 +231,7 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal add(new PathSetting(name, descr, default, prepend, append)) } + def MapSetting(name: String, prefix: String, descr: String): MapSetting = add(new MapSetting(name, prefix, descr)) // basically this is a value which remembers if it's been modified trait SettingValue extends AbsSettingValue { @@ -446,8 +447,33 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal def tryToSet(args: List[String]) = { value = true ; Some(args) } def unparse: List[String] = if (value) List(name) else Nil - override def tryToSetFromPropertyValue(s : String) { - value = s.equalsIgnoreCase("true") + } + + /** A special setting for accumulating arguments like -Dfoo=bar. */ + class MapSetting private[nsc]( + name: String, + prefix: String, + descr: String) + extends Setting(name, descr) { + type T = Map[String, String] + protected var v: Map[String, String] = Map() + + def tryToSet(args: List[String]) = { + val (xs, rest) = args partition (_ startsWith prefix) + val pairs = xs map (_ stripPrefix prefix) map { x => + (x indexOf '=') match { + case -1 => (x, "") + case idx => (x take idx, x drop (idx + 1)) + } + } + v = v ++ pairs + Some(rest) + } + + override def respondsTo(label: String) = label startsWith prefix + def unparse: List[String] = v.toList map { + case (k, "") => prefix + k + case (k, v) => prefix + k + "=" + v } } @@ -518,7 +544,6 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal Some(rest) } override def tryToSetColon(args: List[String]) = tryToSet(args) - override def tryToSetFromPropertyValue(s: String) = tryToSet(s.trim.split(" +").toList) def unparse: List[String] = value map { name + ":" + _ } withHelpSyntax(name + ":<" + arg + ">") @@ -548,7 +573,6 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal } def unparse: List[String] = if (value == default) Nil else List(name + ":" + value) - override def tryToSetFromPropertyValue(s: String) = tryToSetColon(s::Nil) withHelpSyntax(name + ":<" + helpArg + ">") } diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala index 9940134b7d..16289f11d9 100644 --- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala @@ -23,8 +23,10 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings { /** Disable a setting */ def disable(s: Setting) = allSettings -= s - BooleanSetting("-J", "Pass directly to runtime system") - BooleanSetting("-Dprop=value", "Pass -Dprop=value directly to runtime system") + val jvmargs = MapSetting("-J", "-J", "Pass directly to the runtime system.") + val defines = MapSetting("-Dproperty=value", "-D", "Pass -Dproperty=value directly to the runtime system.") + val toolcp = PathSetting("-toolcp", "Add to the runner classpath.", "") + val nobootcp = BooleanSetting("-nobootcp", "Do not use the boot classpath for the scala jars.") /** * Standard settings diff --git a/test/files/presentation/simple-tests.check b/test/files/presentation/simple-tests.check index f3184cf457..e3d3a0c716 100644 --- a/test/files/presentation/simple-tests.check +++ b/test/files/presentation/simple-tests.check @@ -3,7 +3,7 @@ askTypeCompletion at Tester.scala(16,25) ================================================================================ [response] aksTypeCompletion at (16,25) -retreived 77 members +retreived 75 members TypeMember(method !=,(x$1: AnyRef)Boolean,true,true,) TypeMember(method !=,(x$1: Any)Boolean,true,true,) TypeMember(method ==,(x$1: AnyRef)Boolean,true,true,) @@ -67,8 +67,6 @@ TypeMember(method synchronized,[T0](x$1: T0)T0,true,true,) TypeMember(method toString,()String,true,true,) TypeMember(method tryToSet,(args: List[String])Some[List[String]],true,false,) TypeMember(method tryToSetColon,(args: List[String])Option[Tester.this.settings.ResultOfTryToSet],true,true,) -TypeMember(method tryToSetFromPropertyValue,(s: String)Unit,true,false,) -TypeMember(method tryToSetProperty,(args: List[String])Option[Tester.this.settings.ResultOfTryToSet],true,true,) TypeMember(method unparse,=> List[String],true,false,) TypeMember(variable v,Boolean,false,false,) TypeMember(method value,=> Tester.this.settings.verbose.T,true,true,) @@ -134,7 +132,7 @@ askTypeCompletion at Tester.scala(27,23) ================================================================================ [response] aksTypeCompletion at (27,23) -retreived 197 members +retreived 203 members TypeMember(method !=,(x$1: AnyRef)Boolean,true,true,) TypeMember(method !=,(x$1: Any)Boolean,true,true,) TypeMember(method ==,(x$1: AnyRef)Boolean,true,true,) @@ -156,6 +154,8 @@ TypeMember(method ChoiceSetting,(name: String,helpArg: String,descr: String,choi TypeMember(class IntSetting,Tester.this.settings.IntSetting,true,true,) TypeMember(method IntSetting,(name: String,descr: String,default: Int,range: Option[(Int, Int)],parser: (String) => Option[Int])Tester.this.settings.IntSetting,true,true,) TypeMember(trait InternalSetting,Tester.this.settings.InternalSetting,true,true,) +TypeMember(class MapSetting,Tester.this.settings.MapSetting,true,true,) +TypeMember(method MapSetting,(name: String,prefix: String,descr: String)Tester.this.settings.MapSetting,true,true,) TypeMember(class MultiStringSetting,Tester.this.settings.MultiStringSetting,true,true,) TypeMember(method MultiStringSetting,(name: String,arg: String,descr: String)Tester.this.settings.MultiStringSetting,true,true,) TypeMember(class OutputDirs,Tester.this.settings.OutputDirs,true,true,) @@ -240,6 +240,7 @@ TypeMember(method copy,()scala.tools.nsc.Settings,true,true,) TypeMember(value d,Tester.this.settings.OutputSetting,false,true,) TypeMember(value debug,Tester.this.settings.BooleanSetting,false,true,) TypeMember(method debuginfo,=> Tester.this.settings.ChoiceSetting,true,true,) +TypeMember(value defines,Tester.this.settings.MapSetting,false,true,) TypeMember(method dependenciesFile,=> Tester.this.settings.StringSetting,true,true,) TypeMember(value dependencyfile,Tester.this.settings.StringSetting,false,true,) TypeMember(value deprecation,Tester.this.settings.BooleanSetting,false,true,) @@ -272,6 +273,7 @@ TypeMember(value inline,Tester.this.settings.BooleanSetting,false,true,) TypeMember(method isInstanceOf,[T0]=> Boolean,true,true,) TypeMember(value javabootclasspath,Tester.this.settings.PathSetting,false,true,) TypeMember(value javaextdirs,Tester.this.settings.PathSetting,false,true,) +TypeMember(value jvmargs,Tester.this.settings.MapSetting,false,true,) TypeMember(value log,Tester.this.settings.PhasesSetting,false,true,) TypeMember(method lookupSetting,(cmd: String)Option[Tester.this.settings.Setting],true,true,) TypeMember(value make,Tester.this.settings.ChoiceSetting,false,true,) @@ -280,6 +282,7 @@ TypeMember(value noCompletion,Tester.this.settings.BooleanSetting,false,true,) TypeMember(value noSelfCheck,Tester.this.settings.BooleanSetting,false,true,) TypeMember(value noassertions,Tester.this.settings.BooleanSetting,false,true,) +TypeMember(value nobootcp,Tester.this.settings.BooleanSetting,false,true,) TypeMember(value noimports,Tester.this.settings.BooleanSetting,false,true,) TypeMember(value nospecialization,Tester.this.settings.BooleanSetting,false,true,) TypeMember(method notify,()Unit,true,true,) @@ -319,6 +322,7 @@ TypeMember(method synchronized,[T0](x$1: T0)T0,true,true,) TypeMember(value target,Tester.this.settings.ChoiceSetting,false,true,) TypeMember(method toConciseString,=> String,true,true,) TypeMember(method toString,()String,true,true,) +TypeMember(value toolcp,Tester.this.settings.PathSetting,false,true,) TypeMember(value unchecked,Tester.this.settings.BooleanSetting,false,true,) TypeMember(value uniqid,Tester.this.settings.BooleanSetting,false,true,) TypeMember(value usejavacp,Tester.this.settings.BooleanSetting,false,true,) -- cgit v1.2.3