clarified YXML vs. symbol encoding: operate on whole message;
authorwenzelm
Sat, 01 Apr 2017 22:03:24 +0200
changeset 65345 2fdd4431b30e
parent 65344 b99283eed13c
child 65346 673a7b3379ec
clarified YXML vs. symbol encoding: operate on whole message; tuned signature;
src/Pure/PIDE/protocol.scala
src/Pure/PIDE/prover.scala
src/Pure/System/isabelle_process.scala
--- a/src/Pure/PIDE/protocol.scala	Sat Apr 01 19:17:15 2017 +0200
+++ b/src/Pure/PIDE/protocol.scala	Sat Apr 01 22:03:24 2017 +0200
@@ -16,8 +16,7 @@
     def unapply(text: String): Option[(Document_ID.Version, Document.Assign_Update)] =
       try {
         import XML.Decode._
-        val body = YXML.parse_body(text)
-        Some(pair(long, list(pair(long, list(long))))(body))
+        Some(pair(long, list(pair(long, list(long))))(Symbol.decode_yxml(text)))
       }
       catch {
         case ERROR(_) => None
@@ -30,7 +29,7 @@
     def unapply(text: String): Option[List[Document_ID.Version]] =
       try {
         import XML.Decode._
-        Some(list(long)(YXML.parse_body(text)))
+        Some(list(long)(Symbol.decode_yxml(text)))
       }
       catch {
         case ERROR(_) => None
@@ -291,17 +290,6 @@
 
 trait Protocol
 {
-  /* text */
-
-  def encode(s: String): String
-  def decode(s: String): String
-
-  object Encode
-  {
-    val string: XML.Encode.T[String] = (s => XML.Encode.string(encode(s)))
-  }
-
-
   /* protocol commands */
 
   def protocol_command_bytes(name: String, args: Bytes*): Unit
@@ -311,7 +299,7 @@
   /* options */
 
   def options(opts: Options): Unit =
-    protocol_command("Prover.options", YXML.string_of_body(opts.encode))
+    protocol_command("Prover.options", Symbol.encode_yxml(opts.encode))
 
 
   /* interned items */
@@ -327,10 +315,10 @@
       val encode_blob: T[Command.Blob] =
         variant(List(
           { case Exn.Res((a, b)) =>
-              (Nil, pair(Encode.string, option(string))((a.node, b.map(p => p._1.toString)))) },
-          { case Exn.Exn(e) => (Nil, Encode.string(Exn.message(e))) }))
+              (Nil, pair(string, option(string))((a.node, b.map(p => p._1.toString)))) },
+          { case Exn.Exn(e) => (Nil, string(Exn.message(e))) }))
 
-      YXML.string_of_body(pair(list(encode_blob), int)(command.blobs, command.blobs_index))
+      Symbol.encode_yxml(pair(list(encode_blob), int)(command.blobs, command.blobs_index))
     }
 
     val toks = command.span.content
@@ -338,12 +326,12 @@
     {
       import XML.Encode._
       val encode_tok: T[Token] = (tok => pair(int, int)((tok.kind.id, Symbol.length(tok.source))))
-      YXML.string_of_body(list(encode_tok)(toks))
+      Symbol.encode_yxml(list(encode_tok)(toks))
     }
 
     protocol_command("Document.define_command",
-      (Document_ID(command.id) :: encode(command.span.name) :: blobs_yxml :: toks_yxml ::
-        toks.map(tok => encode(tok.source))): _*)
+      (Document_ID(command.id) :: Symbol.encode(command.span.name) :: blobs_yxml :: toks_yxml ::
+        toks.map(tok => Symbol.encode(tok.source))): _*)
   }
 
 
@@ -374,20 +362,18 @@
               val theory = Long_Name.base_name(name.theory)
               val imports = header.imports.map({ case (a, _) => a.node })
               (Nil,
-                pair(Encode.string, pair(Encode.string, pair(list(Encode.string),
-                  pair(list(pair(Encode.string,
-                    pair(pair(Encode.string, list(Encode.string)), list(Encode.string)))),
-                  list(Encode.string)))))(
+                pair(string, pair(string, pair(list(string), pair(list(pair(string,
+                    pair(pair(string, list(string)), list(string)))), list(string)))))(
                 (master_dir, (theory, (imports, (header.keywords, header.errors)))))) },
           { case Document.Node.Perspective(a, b, c) =>
               (bool_atom(a) :: b.commands.map(cmd => long_atom(cmd.id)),
-                list(pair(id, pair(Encode.string, list(Encode.string))))(c.dest)) }))
+                list(pair(id, pair(string, list(string))))(c.dest)) }))
       def encode_edits: T[List[Document.Edit_Command]] = list((node_edit: Document.Edit_Command) =>
       {
         val (name, edit) = node_edit
-        pair(Encode.string, encode_edit(name))(name.node, edit)
+        pair(string, encode_edit(name))(name.node, edit)
       })
-      YXML.string_of_body(encode_edits(edits)) }
+      Symbol.encode_yxml(encode_edits(edits)) }
     protocol_command("Document.update", Document_ID(old_id), Document_ID(new_id), edits_yxml)
   }
 
@@ -395,7 +381,7 @@
   {
     val versions_yxml =
     { import XML.Encode._
-      YXML.string_of_body(list(long)(versions.map(_.id))) }
+      Symbol.encode_yxml(list(long)(versions.map(_.id))) }
     protocol_command("Document.remove_versions", versions_yxml)
   }
 
--- a/src/Pure/PIDE/prover.scala	Sat Apr 01 19:17:15 2017 +0200
+++ b/src/Pure/PIDE/prover.scala	Sat Apr 01 22:03:24 2017 +0200
@@ -62,7 +62,7 @@
 }
 
 
-abstract class Prover(
+class Prover(
   receiver: Prover.Receiver,
   xml_cache: XML.Cache,
   channel: System_Channel,
@@ -232,7 +232,7 @@
             else done = true
           }
           if (result.length > 0) {
-            output(markup, Nil, List(XML.Text(decode(result.toString))))
+            output(markup, Nil, List(XML.Text(Symbol.decode(result.toString))))
             result.length = 0
           }
           else {
@@ -302,7 +302,7 @@
       def read_chunk(): XML.Body =
       {
         val (buf, n) = read_chunk_bytes()
-        YXML.parse_body_failsafe(UTF8.decode_chars(decode, buf, 0, n))
+        YXML.parse_body_failsafe(UTF8.decode_chars(Symbol.decode, buf, 0, n))
       }
 
       try {
--- a/src/Pure/System/isabelle_process.scala	Sat Apr 01 19:17:15 2017 +0200
+++ b/src/Pure/System/isabelle_process.scala	Sat Apr 01 22:03:24 2017 +0200
@@ -44,7 +44,7 @@
     receiver: Prover.Receiver = Console.println(_),
     xml_cache: XML.Cache = new XML.Cache(),
     tree: Option[Sessions.Tree] = None,
-    store: Sessions.Store = Sessions.store()): Isabelle_Process =
+    store: Sessions.Store = Sessions.store()): Prover =
   {
     val channel = System_Channel()
     val process =
@@ -55,17 +55,6 @@
       catch { case exn @ ERROR(_) => channel.accepted(); throw exn }
     process.stdin.close
 
-    new Isabelle_Process(receiver, xml_cache, channel, process)
+    new Prover(receiver, xml_cache, channel, process)
   }
 }
-
-class Isabelle_Process private(
-    receiver: Prover.Receiver,
-    xml_cache: XML.Cache,
-    channel: System_Channel,
-    process: Bash.Process)
-  extends Prover(receiver, xml_cache, channel, process)
-{
-  def encode(s: String): String = Symbol.encode(s)
-  def decode(s: String): String = Symbol.decode(s)
-}