always traverse required nodes, e.g. relevant for inlined errors of imported theory header;
authorwenzelm
Fri, 24 Apr 2015 20:33:10 +0200
changeset 60198 8483c2883c8c
parent 60197 6e8014342c9d
child 60199 a06f69f0de46
always traverse required nodes, e.g. relevant for inlined errors of imported theory header;
src/Pure/PIDE/document.ML
--- a/src/Pure/PIDE/document.ML	Fri Apr 24 19:08:43 2015 +0200
+++ b/src/Pure/PIDE/document.ML	Fri Apr 24 20:33:10 2015 +0200
@@ -434,6 +434,21 @@
 
 (* document execution *)
 
+fun make_required nodes =
+  let
+    fun all_preds P =
+      String_Graph.fold (fn (a, (node, _)) => P node ? cons a) nodes []
+      |> String_Graph.all_preds nodes
+      |> Symtab.make_set;
+
+    val all_visible = all_preds visible_node;
+    val all_required = all_preds required_node;
+  in
+    Symtab.fold (fn (a, ()) =>
+      exists (Symtab.defined all_visible) (String_Graph.immediate_succs nodes a) ?
+        Symtab.update (a, ())) all_visible all_required
+  end;
+
 fun start_execution state = state |> map_state (fn (versions, blobs, commands, execution) =>
   timeit "Document.start_execution" (fn () =>
     let
@@ -446,10 +461,13 @@
 
       fun finished_import (name, (node, _)) =
         finished_result node orelse is_some (loaded_theory name);
+
+      val nodes = nodes_of (the_version state version_id);
+      val required = make_required nodes;
       val _ =
-        nodes_of (the_version state version_id) |> String_Graph.schedule
+        nodes |> String_Graph.schedule
           (fn deps => fn (name, node) =>
-            if visible_node node orelse pending_result node then
+            if Symtab.defined required name orelse visible_node node orelse pending_result node then
               let
                 fun body () =
                   (if forall finished_import deps then
@@ -498,21 +516,6 @@
 
 local
 
-fun make_required nodes =
-  let
-    fun all_preds P =
-      String_Graph.fold (fn (a, (node, _)) => P node ? cons a) nodes []
-      |> String_Graph.all_preds nodes
-      |> Symtab.make_set;
-
-    val all_visible = all_preds visible_node;
-    val all_required = all_preds required_node;
-  in
-    Symtab.fold (fn (a, ()) =>
-      exists (Symtab.defined all_visible) (String_Graph.immediate_succs nodes a) ?
-        Symtab.update (a, ())) all_visible all_required
-  end;
-
 fun init_theory deps node span =
   let
     val master_dir = master_directory node;