diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2014-05-09 15:23:45 +0200 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2014-05-09 15:23:45 +0200 |
commit | 6f33b2418a56ea7b945ec101c5fbe4b904d467df (patch) | |
tree | 1f0dd827354d7274f127642f7983f9c601ec5ea7 /src | |
parent | b5392a0f034afe23aff183d8673464c848f76241 (diff) | |
parent | 78bd175afcc89878ca1c00cce69d0517909c6ff3 (diff) | |
download | scala-6f33b2418a56ea7b945ec101c5fbe4b904d467df.tar.gz scala-6f33b2418a56ea7b945ec101c5fbe4b904d467df.tar.bz2 scala-6f33b2418a56ea7b945ec101c5fbe4b904d467df.zip |
Merge pull request #3597 from som-snytt/issue/5905-feature-help
SI-5905 Sanity check -language options
Diffstat (limited to 'src')
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))), _)) = |