offsetposition.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 74 行

SCALA
74
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2006-2007, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */package scala.util.parsing.inputimport collection.mutable.ArrayBuffer/** <p> *    <code>OffsetPosition</code> is a standard class for positions *    represented as offsets into a source ``document''. *    @param source   The source document *    @param offset   The offset indicating the position * * @author Martin Odersky */case class OffsetPosition(source: java.lang.CharSequence, offset: Int) extends Position {  /** An index that contains all line starts, including first line, and eof */  private lazy val index: Array[Int] = {    var lineStarts = new ArrayBuffer[Int]    lineStarts += 0    for (i <- 0 until source.length)      if (source.charAt(i) == '\n') lineStarts += (i + 1)    lineStarts += source.length    lineStarts.toArray  }  /** The line number referred to by the position; line numbers start at 1 */  def line: Int = {    var lo = 0    var hi = index.length - 1    while (lo + 1 < hi) {      val mid = (hi + lo) / 2      if (offset < index(mid)) hi = mid      else lo = mid    }     lo + 1  }     /** The column number referred to by the position; column numbers start at 1 */  def column: Int = offset - index(line - 1) + 1  /** The contents of the line numbered `lnum' (must not contain a new-line character).   *    * @param lnum a 1-based integer index into the `document'   * @return the line at `lnum' (not including a newline)   */  def lineContents: String =    source.subSequence(index(line - 1), index(line)).toString    /** Returns a string representation of the `Position', of the form `line.column' */  override def toString = line+"."+column  /** Compare this position to another, by first comparing their line numbers,   * and then -- if necessary -- using the columns to break a tie.   *   * @param `that' a `Position' to compare to this `Position'   * @return true if this position's line or (in case of a tie wrt. line numbers)   *         its column is smaller than the corresponding components of `that'   */  override def <(that: Position) = that match {    case OffsetPosition(_, that_offset) =>      this.offset < that_offset    case _ =>      this.line < that.line ||       this.line == that.line && this.column < that.column  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?