# HG changeset patch # User wenzelm # Date 1282294815 -7200 # Node ID 32b924a832c4829cc779788284a0e6b2026d9a0c # Parent a6e2715fac5f535cf54457263d2841ed4e46c453 further clarification/unification of Position.Range and Text.Range concerning singularities: start offset is always included; diff -r a6e2715fac5f -r 32b924a832c4 src/Pure/General/position.scala --- a/src/Pure/General/position.scala Thu Aug 19 22:52:00 2010 +0200 +++ b/src/Pure/General/position.scala Fri Aug 20 11:00:15 2010 +0200 @@ -22,9 +22,9 @@ def get_range(pos: T): Option[Text.Range] = (get_offset(pos), get_end_offset(pos)) match { - case (Some(start), Some(stop)) => Some(Text.Range(start, stop)) - case (Some(start), None) => Some(Text.Range(start, start + 1)) - case (None, _) => None + case (Some(start), Some(stop)) if start <= stop => Some(Text.Range(start, stop)) + case (Some(start), None) => Some(Text.Range(start, start)) + case (_, _) => None } object Id { def unapply(pos: T): Option[Long] = get_id(pos) } diff -r a6e2715fac5f -r 32b924a832c4 src/Pure/PIDE/text.scala --- a/src/Pure/PIDE/text.scala Thu Aug 19 22:52:00 2010 +0200 +++ b/src/Pure/PIDE/text.scala Fri Aug 20 11:00:15 2010 +0200 @@ -15,25 +15,21 @@ type Offset = Int - /* range: interval with total quasi-ordering */ + /* range -- with total quasi-ordering */ sealed case class Range(val start: Offset, val stop: Offset) { + // denotation: {start} Un {i. start < i & i < stop} require(start <= stop) override def toString = "[" + start.toString + ":" + stop.toString + "]" def map(f: Offset => Offset): Range = Range(f(start), f(stop)) def +(i: Offset): Range = map(_ + i) - def contains(i: Offset): Boolean = start <= i && i < stop - def contains(that: Range): Boolean = - this == that || this.contains(that.start) && that.stop <= this.stop - def overlaps(that: Range): Boolean = - this == that || this.contains(that.start) || that.contains(this.start) - def compare(that: Range): Int = - if (overlaps(that)) 0 - else if (this.start < that.start) -1 - else 1 + def contains(i: Offset): Boolean = start == i || start < i && i < stop + def contains(that: Range): Boolean = this.contains(that.start) && that.stop <= this.stop + def overlaps(that: Range): Boolean = this.contains(that.start) || that.contains(this.start) + def compare(that: Range): Int = if (overlaps(that)) 0 else this.start compare that.start def start_range: Range = Range(start, start) def stop_range: Range = Range(stop, stop)