src/Pure/PIDE/line.scala
changeset 81061 fe9ae6b67c29
parent 76825 65e8a9272837
equal deleted inserted replaced
81060:159d1b09fe66 81061:fe9ae6b67c29
   116     def text(lines: List[Line]): String = lines.mkString("", "\n", "")
   116     def text(lines: List[Line]): String = lines.mkString("", "\n", "")
   117   }
   117   }
   118 
   118 
   119   sealed case class Document(lines: List[Line]) {
   119   sealed case class Document(lines: List[Line]) {
   120     lazy val text_length: Text.Offset = Document.length(lines)
   120     lazy val text_length: Text.Offset = Document.length(lines)
   121     def text_range: Text.Range = Text.Range(0, text_length)
   121     def full_range: Text.Range = Text.Range(0, text_length)
   122 
   122 
   123     lazy val text: String = Document.text(lines)
   123     lazy val text: String = Document.text(lines)
   124 
   124 
   125     def get_text(range: Text.Range): Option[String] =
   125     def get_text(range: Text.Range): Option[String] =
   126       if (text_range.contains(range)) Some(range.substring(text)) else None
   126       if (full_range.contains(range)) Some(range.substring(text)) else None
       
   127 
       
   128     def get_text(range: Line.Range): Option[String] =
       
   129       text_range(range).flatMap(get_text)
   127 
   130 
   128     override def toString: String = text
   131     override def toString: String = text
   129 
   132 
   130     override def equals(that: Any): Boolean =
   133     override def equals(that: Any): Boolean =
   131       that match {
   134       that match {
   167         else None
   170         else None
   168       }
   171       }
   169       else if (l == n && c == 0) Some(text_length)
   172       else if (l == n && c == 0) Some(text_length)
   170       else None
   173       else None
   171     }
   174     }
       
   175 
       
   176     def text_range(line_range: Range): Option[Text.Range] =
       
   177       for {
       
   178         start <- offset(line_range.start)
       
   179         stop <- offset(line_range.stop)
       
   180       } yield Text.Range(start, stop)
   172 
   181 
   173     def change(remove: Range, insert: String): Option[(List[Text.Edit], Document)] = {
   182     def change(remove: Range, insert: String): Option[(List[Text.Edit], Document)] = {
   174       for {
   183       for {
   175         edit_start <- offset(remove.start)
   184         edit_start <- offset(remove.start)
   176         if remove.stop == remove.start || offset(remove.stop).isDefined
   185         if remove.stop == remove.start || offset(remove.stop).isDefined