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 + -
显示快捷键?