summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2014-05-09 18:02:57 +0200
committerJason Zaugg <jzaugg@gmail.com>2014-05-09 18:03:22 +0200
commit068d2c06bf43a9a8cf74529929c1640e1db9a338 (patch)
tree17654c3e1279305a90fabd450bf810e0817e8cd2 /src/compiler
parent7523ed37d5a4eeb2664f9ddf2cad09b70aa81877 (diff)
parentaf6941fbcf6f4f4efeb372a9a937463ff630b81c (diff)
downloadscala-068d2c06bf43a9a8cf74529929c1640e1db9a338.tar.gz
scala-068d2c06bf43a9a8cf74529929c1640e1db9a338.tar.bz2
scala-068d2c06bf43a9a8cf74529929c1640e1db9a338.zip
Merge origin/master into topic/master-to-2.11.x-2
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala2
-rw-r--r--src/compiler/scala/tools/nsc/settings/MutableSettings.scala25
-rw-r--r--src/compiler/scala/tools/nsc/settings/ScalaSettings.scala10
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala2
4 files changed, 33 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala
index 8b897b83b2..38a7525862 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 ChoiceSetting <: Setting { type T = String }
type IntSetting <: Setting { type T = Int }
type MultiStringSetting <: Setting { type T = List[String] }
+ type MultiChoiceSetting <: Setting { type T = List[String] }
type PathSetting <: Setting { type T = String }
type PhasesSetting <: Setting { type T = List[String] }
type StringSetting <: Setting { type T = String }
@@ -28,6 +29,7 @@ trait AbsScalaSettings {
def ChoiceSetting(name: String, helpArg: String, descr: String, choices: List[String], default: String): ChoiceSetting
def IntSetting(name: String, descr: String, default: Int, range: Option[(Int, Int)], parser: String => Option[Int]): IntSetting
def MultiStringSetting(name: String, helpArg: String, descr: String): MultiStringSetting
+ def MultiChoiceSetting(name: String, helpArg: String, descr: String, choices: List[String]): MultiChoiceSetting
def OutputSetting(outputDirs: OutputDirs, default: String): OutputSetting
def PathSetting(name: String, descr: String, default: String): PathSetting
def PhasesSetting(name: String, descr: String, default: String): PhasesSetting
diff --git a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
index 3590254128..54e444decf 100644
--- a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
@@ -211,6 +211,11 @@ class MutableSettings(val errorFn: String => Unit)
add(new ChoiceSetting(name, helpArg, descr, choices, default))
def IntSetting(name: String, descr: String, default: Int, range: Option[(Int, Int)], parser: String => Option[Int]) = add(new IntSetting(name, descr, default, range, parser))
def MultiStringSetting(name: String, arg: String, descr: String) = add(new MultiStringSetting(name, arg, descr))
+ def MultiChoiceSetting(name: String, helpArg: String, descr: String, choices: List[String]): MultiChoiceSetting = {
+ val fullChoix = choices.mkString(": ", ",", ".")
+ val fullDescr = s"$descr$fullChoix"
+ add(new MultiChoiceSetting(name, helpArg, fullDescr, choices))
+ }
def OutputSetting(outputDirs: OutputDirs, default: String) = add(new OutputSetting(outputDirs, default))
def PhasesSetting(name: String, descr: String, default: String = "") = add(new PhasesSetting(name, descr, default))
def StringSetting(name: String, arg: String, descr: String, default: String) = add(new StringSetting(name, arg, descr, default))
@@ -548,8 +553,16 @@ class MutableSettings(val errorFn: String => Unit)
}
}
+ class MultiChoiceSetting private[nsc](
+ name: String,
+ arg: String,
+ descr: String,
+ override val choices: List[String])
+ extends MultiStringSetting(name, arg, descr)
+
/** A setting that accumulates all strings supplied to it,
- * until it encounters one starting with a '-'. */
+ * until it encounters one starting with a '-'.
+ */
class MultiStringSetting private[nsc](
name: String,
val arg: String,
@@ -558,11 +571,15 @@ class MutableSettings(val errorFn: String => Unit)
type T = List[String]
protected var v: T = Nil
def appendToValue(str: String) { value ++= List(str) }
+ def badChoice(s: String, n: String) = errorFn(s"'$s' is not a valid choice for '$name'")
def tryToSet(args: List[String]) = {
val (strings, rest) = args span (x => !x.startsWith("-"))
- strings foreach appendToValue
-
+ strings foreach {
+ case "_" if choices.nonEmpty => choices foreach appendToValue
+ case s if choices.isEmpty || (choices contains s) => appendToValue(s)
+ case s => badChoice(s, name)
+ }
Some(rest)
}
override def tryToSetColon(args: List[String]) = tryToSet(args)
@@ -570,6 +587,8 @@ class MutableSettings(val errorFn: String => Unit)
def clear(): Unit = (v = Nil)
def unparse: List[String] = value map (name + ":" + _)
+ def contains(s: String) = value contains s
+
withHelpSyntax(name + ":<" + arg + ">")
}
diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
index a643a08614..20ccc30ff6 100644
--- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
@@ -62,8 +62,14 @@ trait ScalaSettings extends AbsScalaSettings
/*val argfiles = */ BooleanSetting ("@<file>", "A text file containing compiler arguments (options and source files)")
val classpath = PathSetting ("-classpath", "Specify where to find user class files.", defaultClasspath) withAbbreviation "-cp"
val d = OutputSetting (outputDirs, ".")
- val nospecialization = BooleanSetting ("-no-specialization", "Ignore @specialize annotations.")
- val language = MultiStringSetting("-language", "feature", "Enable one or more language features.")
+ val nospecialization = BooleanSetting ("-no-specialization", "Ignore @specialize annotations.")
+
+ // Would be nice to build this dynamically from scala.languageFeature.
+ // The two requirements: delay error checking until you have symbols, and let compiler command build option-specific help.
+ val language = {
+ val features = List("dynamics", "postfixOps", "reflectiveCalls", "implicitConversions", "higherKinds", "existentials", "experimental.macros")
+ MultiChoiceSetting("-language", "feature", "Enable one or more language features", features)
+ }
/*
* The previous "-source" option is intended to be used mainly
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 3690750e42..bf98c0e3dc 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -741,7 +741,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
val featureName = (nestedOwners map (_.name + ".")).mkString + featureTrait.name
def action(): Boolean = {
def hasImport = inferImplicit(EmptyTree: Tree, featureTrait.tpe, reportAmbiguous = true, isView = false, context).isSuccess
- def hasOption = settings.language.value exists (s => s == featureName || s == "_")
+ def hasOption = settings.language contains featureName
val OK = hasImport || hasOption
if (!OK) {
val Some(AnnotationInfo(_, List(Literal(Constant(featureDesc: String)), Literal(Constant(required: Boolean))), _)) =