src/Pure/PIDE/text.scala
changeset 56468 30128d1acfbc
parent 56308 ebd3bf053969
child 56469 ffc94a271633
--- a/src/Pure/PIDE/text.scala	Tue Apr 08 14:59:36 2014 +0200
+++ b/src/Pure/PIDE/text.scala	Tue Apr 08 15:12:54 2014 +0200
@@ -71,6 +71,55 @@
   }
 
 
+  /* named chunks */
+
+  abstract class Chunk
+  {
+    def name: Chunk.Name
+    def range: Range
+    def symbol_index: Symbol.Index
+
+    private lazy val hash: Int = (name, range, symbol_index).hashCode
+    override def hashCode: Int = hash
+    override def equals(that: Any): Boolean =
+      that match {
+        case other: Chunk =>
+          hash == other.hash &&
+          name == other.name &&
+          range == other.range &&
+          symbol_index == other.symbol_index
+        case _ => false
+      }
+    override def toString: String = "Text.Chunk(" + name + ")"
+
+    def decode(symbol_offset: Symbol.Offset): Offset = symbol_index.decode(symbol_offset)
+    def decode(symbol_range: Symbol.Range): Range = symbol_index.decode(symbol_range)
+    def incorporate(symbol_range: Symbol.Range): Option[Range] =
+    {
+      def in(r: Symbol.Range): Option[Range] =
+        range.try_restrict(decode(r)) match {
+          case Some(r1) if !r1.is_singularity => Some(r1)
+          case _ => None
+        }
+     in(symbol_range) orElse in(symbol_range - 1)
+    }
+  }
+
+  object Chunk
+  {
+    sealed abstract class Name
+    case object Default extends Name
+    case class File_Name(file_name: String) extends Name
+
+    class File(file_name: String, text: CharSequence) extends Chunk
+    {
+      val name = File_Name(file_name)
+      val range = Range(0, text.length)
+      val symbol_index = Symbol.Index(text)
+    }
+  }
+
+
   /* perspective */
 
   object Perspective