settings.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 500 行 · 第 1/2 页
SCALA
500 行
def isAdvanced: Boolean = (name startsWith "-X") && !(name eq "-X") def isPrivate: Boolean = (name == "-P") || ((name startsWith "-Y") && !(name eq "-Y"))/* def isDocOption: Boolean = !dependency.isEmpty && dependency.get._1 == doc*/ // initialization allsettings = this :: allsettings } /** A setting represented by a boolean flag (false, unless set) */ case class BooleanSetting(name: String, descr: String) extends Setting(descr) { protected var v: Boolean = false def value: Boolean = this.v def value_=(s: Boolean) { setByUser = true; this.v = s } def tryToSet(args: List[String]): List[String] = args match { case n :: rest if (n == name) => value = true; rest case _ => args } def unparse: List[String] = if (value) List(name) else Nil override def equals(that: Any) = that match { case bs:BooleanSetting => this.name == bs.name && this.value == bs.value case _ => false } } /** A setting represented by a string, (`default' unless set) */ case class StringSetting(name: String, arg: String, descr: String, default: String) extends Setting(descr) { hideToIDE def abbreviation: String = null protected var v: String = default def value: String = this.v def value_=(s: String) { setByUser = true; this.v = s } def tryToSet(args: List[String]): List[String] = args match { case n :: rest if (name == n || abbreviation == n) => if (rest.isEmpty) { error("missing argument") args } else { value = rest.head rest.tail } case _ => args } override def helpSyntax = name + " <" + arg + ">" def unparse: List[String] = if (value == default) Nil else List(name, value) override def equals(that: Any) = that match { case ss:StringSetting => this.name == ss.name && this.value == ss.value case _ => false } } /** A setting that accumulates all strings supplied to it */ case class MultiStringSetting(name: String, arg: String, descr: String) extends Setting(descr) { hideToIDE protected var v: List[String] = Nil def value = v def appendToValue(str: String) { v = v ::: List(str) } protected val nameColon = name + ":" def tryToSet(args: List[String]): List[String] = args match { case arg :: rest if (arg startsWith nameColon) => val toadd = arg.substring(nameColon.length()) if (toadd.length == 0) { error("empty argument to " + nameColon) args } else { appendToValue(toadd) rest } case opt :: arg :: rest if (opt == name) => appendToValue(arg) rest case _ => args } override def helpSyntax = name + ":<" + arg + ">" def unparse: List[String] = for (opt <- value) yield nameColon+opt override def equals(that: Any) = that match { case mss:MultiStringSetting => this.name == mss.name && this.value.length == mss.value.length && List.forall2(this.value.sort(_<_), mss.value.sort(_<_))(_==_) case _ => false } } /** A setting represented by a string in a given set of <code>choices</code>, * (<code>default</code> unless set). */ case class ChoiceSetting(name: String, descr: String, choices: List[String], default: String) extends Setting(descr + choices.mkString(" (", ",", ")")) { protected var v: String = default def value: String = this.v def value_=(s: String) { setByUser = true; this.v = s } protected def argument: String = name.substring(1) def tryToSet(args: List[String]): List[String] = args match { case n :: rest if (n startsWith (name + ":")) => val choice = n.substring(name.length() + 1) if (!(choices contains choice)) { error( if (choice == "") "missing " + argument else "unknown " + argument + " '" + choice + "'") args } else { value = choice rest } case n :: choice :: rest if n == name => // alternative to be consistent with IDE if (!(choices contains choice)) { error( if (choice == "") "missing " + argument else "unknown " + argument + " '" + choice + "'") args } else { value = choice rest } case _ => args } override def helpSyntax = name + ":<" + argument + ">" def unparse: List[String] = if (value == default) Nil else List(name + ":" + value) override def equals(that: Any) = that match { case cs:ChoiceSetting => this.name == cs.name && this.value == cs.value case _ => false } } /** Same as ChoiceSetting but have a <code>level</code> int which tells the * index of the selected choice. The <code>defaultEmpty</code> is used when * this setting is used without specifying any of the available choices. */ class DebugSetting(name: String, descr: String, choices: List[String], default: String, defaultEmpty: String) extends ChoiceSetting(name, descr, choices, default) { def indexOf[a](xs: List[a], e: a): Option[Int] = xs match { case y :: ys => if (e == y) Some(0) else indexOf(ys, e) match { case Some(idx) => Some(1 + idx) case None => None } case _ => None } var level: Int = indexOf(choices, default).get override def value_=(choice: String) { setByUser = true this.v = choice this.level = indexOf(choices, choice).get } override def tryToSet(args: List[String]): List[String] = args match { case n :: rest if (n startsWith (name + ":")) => val choice = n.substring(name.length() + 1) if (!(choices contains choice)) { error( if (choice == "") "missing " + argument else "unknown " + argument + " '" + choice + "'") args } else { value = choice rest } case n :: rest if (n startsWith name) => value = defaultEmpty rest case _ => args } } /** A setting represented by a list of strings which should be prefixes of * phase names. This is not checked here, however. * (the empty list, unless set) */ case class PhasesSetting(name: String, descr: String) extends Setting(descr + " <phase>") { // (see -showphases)") { hideToIDE protected var v: List[String] = List() def value: List[String] = this.v def value_=(s: List[String]) { setByUser = true; this.v = s } def tryToSet(args: List[String]): List[String] = args match { case n :: rest if (n startsWith (name + ":")) => val phase = n.substring(name.length() + 1) if (phase == "") { error("missing phase") args } else { value = value ::: List(phase) rest } case _ => args } override def helpSyntax = name + ":<phase>" def contains(phasename: String): Boolean = value exists (str => phasename startsWith str) def unparse: List[String] = (value.foldLeft[List[String]] (Nil) ((args, phase) => List(name + ":" + phase) ::: args)) override def equals(that: Any) = that match { case ps:PhasesSetting => this.name == ps.name && this.value.length == ps.value.length && List.forall2(this.value.sort(_<_), ps.value.sort(_<_))(_==_) case _ => false } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?