1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2006-2009, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
package scala.util.parsing.input
/** <p>
* <code>Position</code> is the base trait for objects describing a
* position in a ``document''.
* </p>
* <p>
* It provides functionality for:
* </p><ul>
* <li> generating a visual representation of this position (`longString');
* <li> comparing two positions (`<').
* </ul>
* <p>
* To use this class for a concrete kind of ``document'', implement the
* <code>lineContents</code> method.
* </p>
*
* @author Martin Odersky, Adriaan Moors
*/
trait Position {
/** The line number referred to by the position; line numbers start at 1 */
def line: Int
/** The column number referred to by the position; column numbers start at 1 */
def column: Int
/** 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)
*/
protected def lineContents: String
/** Returns a string representation of the `Position', of the form `line.column' */
override def toString = ""+line+"."+column
/** Returns a more ``visual'' representation of this position.
* More precisely, the resulting string consists of two lines: <ol>
* <li> the line in the document referred to by this position </li>
* <li>a caret indicating the column</li></ol>
*
* Example:
*
*<pre> List(this, is, a, line, from, the, document)
* ^</pre>
*/
def longString = lineContents+"\n"+(" " * (column - 1))+"^"
/** 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'
*/
def <(that: Position) = {
this.line < that.line ||
this.line == that.line && this.column < that.column
}
}
|