wenzelm@45709: (* Title: Pure/PIDE/protocol.ML wenzelm@38412: Author: Makarius wenzelm@38412: wenzelm@45709: Protocol message formats for interactive proof documents. wenzelm@38412: *) wenzelm@38412: wenzelm@45709: structure Protocol: sig end = wenzelm@38412: struct wenzelm@38412: wenzelm@38418: val _ = wenzelm@46119: Isabelle_Process.protocol_command "Document.define_command" wenzelm@44644: (fn [id, name, text] => wenzelm@44644: Document.change_state (Document.define_command (Document.parse_id id) name text)); wenzelm@38412: wenzelm@38418: val _ = wenzelm@47343: Isabelle_Process.protocol_command "Document.discontinue_execution" wenzelm@47343: (fn [] => Document.discontinue_execution (Document.state ())); wenzelm@47343: wenzelm@47343: val _ = wenzelm@46119: Isabelle_Process.protocol_command "Document.cancel_execution" wenzelm@44612: (fn [] => ignore (Document.cancel_execution (Document.state ()))); wenzelm@44612: wenzelm@44612: val _ = wenzelm@46119: Isabelle_Process.protocol_command "Document.update_perspective" wenzelm@44436: (fn [old_id_string, new_id_string, name, ids_yxml] => Document.change_state (fn state => wenzelm@44436: let wenzelm@44436: val old_id = Document.parse_id old_id_string; wenzelm@44436: val new_id = Document.parse_id new_id_string; wenzelm@44436: val ids = YXML.parse_body ids_yxml wenzelm@44436: |> let open XML.Decode in list int end; wenzelm@44436: wenzelm@44436: val _ = Future.join_tasks (Document.cancel_execution state); wenzelm@44436: in wenzelm@44436: state wenzelm@44436: |> Document.update_perspective old_id new_id name ids wenzelm@44436: |> Document.execute new_id wenzelm@44436: end)); wenzelm@44436: wenzelm@44436: val _ = wenzelm@46119: Isabelle_Process.protocol_command "Document.update" wenzelm@44157: (fn [old_id_string, new_id_string, edits_yxml] => Document.change_state (fn state => wenzelm@38418: let wenzelm@38418: val old_id = Document.parse_id old_id_string; wenzelm@38418: val new_id = Document.parse_id new_id_string; wenzelm@44157: val edits = wenzelm@44157: YXML.parse_body edits_yxml |> wenzelm@44157: let open XML.Decode in wenzelm@44157: list (pair string wenzelm@44157: (variant wenzelm@44185: [fn ([], []) => Document.Clear, wenzelm@44157: fn ([], a) => Document.Edits (list (pair (option int) (option int)) a), wenzelm@44157: fn ([], a) => wenzelm@46938: let wenzelm@46938: val ((((master, name), imports), keywords), uses) = wenzelm@46938: pair (pair (pair (pair string string) (list string)) wenzelm@46938: (list (pair string (option (pair string (list string)))))) wenzelm@46938: (list (pair string bool)) a; wenzelm@46938: val res = wenzelm@46938: Exn.capture (fn () => wenzelm@46938: (master, Thy_Header.make name imports keywords wenzelm@46938: (map (apfst Path.explode) uses))) (); wenzelm@46938: in Document.Header res end, wenzelm@44384: fn ([a], []) => Document.Header (Exn.Exn (ERROR a)), wenzelm@44384: fn (a, []) => Document.Perspective (map int_atom a)])) wenzelm@44157: end; wenzelm@38412: wenzelm@44436: val running = Document.cancel_execution state; wenzelm@44610: val (assignment, state1) = Document.update old_id new_id edits state; wenzelm@44436: val _ = Future.join_tasks running; wenzelm@44436: val _ = wenzelm@46774: Output.protocol_message Isabelle_Markup.assign_execs wenzelm@44661: ((new_id, assignment) |> wenzelm@44476: let open XML.Encode wenzelm@44661: in pair int (pair (list (pair int (option int))) (list (pair string (option int)))) end wenzelm@44661: |> YXML.string_of_body); wenzelm@44660: val state2 = Document.execute new_id state1; wenzelm@44660: in state2 end)); wenzelm@38412: wenzelm@43748: val _ = wenzelm@46119: Isabelle_Process.protocol_command "Document.remove_versions" wenzelm@44673: (fn [versions_yxml] => Document.change_state (fn state => wenzelm@44673: let wenzelm@44673: val versions = wenzelm@44673: YXML.parse_body versions_yxml |> wenzelm@44673: let open XML.Decode in list int end; wenzelm@44676: val state1 = Document.remove_versions versions state; wenzelm@46774: val _ = Output.protocol_message Isabelle_Markup.removed_versions versions_yxml; wenzelm@44676: in state1 end)); wenzelm@44673: wenzelm@44673: val _ = wenzelm@46119: Isabelle_Process.protocol_command "Document.invoke_scala" wenzelm@43748: (fn [id, tag, res] => Invoke_Scala.fulfill_method id tag res); wenzelm@43748: wenzelm@38412: end; wenzelm@38412: