more explicit last exec result;
authorwenzelm
Mon, 09 Apr 2012 20:42:05 +0200
changeset 47407 8da23ecc70cd
parent 47406 8818f54773cc
child 47408 63c05991882e
more explicit last exec result;
src/Pure/PIDE/document.ML
--- a/src/Pure/PIDE/document.ML	Mon Apr 09 19:50:04 2012 +0200
+++ b/src/Pure/PIDE/document.ML	Mon Apr 09 20:42:05 2012 +0200
@@ -59,7 +59,7 @@
 (** document structure **)
 
 type node_header = (string * Thy_Header.header) Exn.result;
-type perspective = (command_id -> bool) * command_id option; (*visible commands, last*)
+type perspective = (command_id -> bool) * command_id option;
 structure Entries = Linear_Set(type key = command_id val ord = int_ord);
 
 type exec = (Toplevel.state * unit lazy) Command.memo;  (*eval/print process*)
@@ -67,9 +67,9 @@
 
 abstype node = Node of
  {header: node_header,
-  perspective: perspective,
+  perspective: perspective,  (*visible commands, last*)
   entries: (exec_id * exec) option Entries.T,  (*command entries with excecutions*)
-  result: exec}
+  result: exec option}  (*result of last execution*)
 and version = Version of node Graph.T  (*development graph wrt. static imports*)
 with
 
@@ -85,8 +85,8 @@
 val no_header = Exn.Exn (ERROR "Bad theory header");
 val no_perspective = make_perspective [];
 
-val empty_node = make_node (no_header, no_perspective, Entries.empty, no_exec);
-val clear_node = map_node (fn (header, _, _, _) => (header, no_perspective, Entries.empty, no_exec));
+val empty_node = make_node (no_header, no_perspective, Entries.empty, NONE);
+val clear_node = map_node (fn (header, _, _, _) => (header, no_perspective, Entries.empty, NONE));
 
 
 (* basic components *)
@@ -281,7 +281,7 @@
 local
 
 fun finished_theory node =
-  (case Exn.capture Command.memo_result (get_result node) of
+  (case Exn.capture (Command.memo_result o the) (get_result node) of
     Exn.Res (st, _) => can (Toplevel.end_theory Position.none) st
   | _ => false);
 
@@ -330,7 +330,7 @@
 
 fun stable_finished_theory node =
   is_some (Exn.get_res (Exn.capture (fn () =>
-    fst (Command.memo_result (get_result node))
+    fst (Command.memo_result (the (get_result node)))
     |> Toplevel.end_theory Position.none
     |> Global_Theory.join_proofs) ()));
 
@@ -365,17 +365,19 @@
       | _ => Path.current);
     val parents =
       #imports header |> map (fn import =>
-        (case Thy_Info.lookup_theory import of  (* FIXME more robust!? *)
+        (case Thy_Info.lookup_theory import of
           SOME thy => thy
         | NONE =>
             Toplevel.end_theory (Position.file_only import)
-              (fst (Command.memo_result
-                (get_result (snd (the (AList.lookup (op =) imports import))))))));
+              (fst
+                (Command.memo_result
+                  (the_default no_exec
+                    (get_result (snd (the (AList.lookup (op =) imports import)))))))));
   in Thy_Load.begin_theory master_dir header parents end;
 
-fun check_theory nodes name =
-  is_some (Thy_Info.lookup_theory name) orelse  (* FIXME more robust!? *)
-  is_some (Exn.get_res (get_header (get_node nodes name)));
+fun check_theory full name node =
+  is_some (Thy_Info.lookup_theory name) orelse
+  is_some (Exn.get_res (get_header node)) andalso (not full orelse is_some (get_result node));
 
 fun last_common state last_visible node0 node =
   let
@@ -410,8 +412,8 @@
 
 fun illegal_init () = error "Illegal theory header after end of theory";
 
-fun new_exec state bad_init command_id' (execs, command_exec, init) =
-  if bad_init andalso is_none init then NONE
+fun new_exec state proper_init command_id' (execs, command_exec, init) =
+  if not proper_init andalso is_none init then NONE
   else
     let
       val (name, span) = the_command state command_id' ||> Lazy.force;
@@ -463,8 +465,9 @@
                   let
                     val node0 = node_of old_version name;
                     fun init () = init_theory imports node;
-                    val bad_init =
-                      not (check_theory nodes name andalso forall (check_theory nodes o #1) imports);
+                    val proper_init =
+                      check_theory false name node andalso
+                      forall (fn (name, (_, node)) => check_theory true name node) imports;
 
                     val last_visible = visible_last node;
                     val (common, (visible, initial)) =
@@ -478,7 +481,7 @@
                         iterate_entries_after common
                           (fn ((prev, id), _) => fn res =>
                             if not required andalso prev = last_visible then NONE
-                            else new_exec state bad_init id res) node;
+                            else new_exec state proper_init id res) node;
 
                     val no_execs =
                       iterate_entries_after common
@@ -489,8 +492,8 @@
 
                     val last_exec = if command_id' = no_id then NONE else SOME command_id';
                     val result =
-                      if is_some (after_entry node last_exec) then no_exec
-                      else exec';
+                      if is_some (after_entry node last_exec) then NONE
+                      else SOME exec';
 
                     val node' = node
                       |> fold reset_entry no_execs