| author | wenzelm | 
| Sat, 09 Apr 2022 15:28:55 +0200 | |
| changeset 75436 | 40630fec3b5d | 
| parent 75393 | 87ebf5a50283 | 
| child 76022 | 6ce62e4e7dc0 | 
| permissions | -rw-r--r-- | 
| 36676 | 1  | 
/* Title: Pure/PIDE/command.scala  | 
2  | 
Author: Fabian Immler, TU Munich  | 
|
3  | 
Author: Makarius  | 
|
4  | 
||
| 52536 | 5  | 
Prover commands with accumulated results from execution.  | 
| 36676 | 6  | 
*/  | 
| 34407 | 7  | 
|
| 
34871
 
e596a0b71f3c
incorporate "proofdocument" part into main Isabelle/Pure.jar -- except for html_panel.scala, which depends on external library (Lobo/Cobra browser);
 
wenzelm 
parents: 
34865 
diff
changeset
 | 
8  | 
package isabelle  | 
| 
34318
 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 
wenzelm 
parents:  
diff
changeset
 | 
9  | 
|
| 34451 | 10  | 
|
| 38872 | 11  | 
import scala.collection.immutable.SortedMap  | 
12  | 
||
13  | 
||
| 75393 | 14  | 
object Command {
 | 
| 72814 | 15  | 
/* blobs */  | 
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
16  | 
|
| 75393 | 17  | 
  object Blob {
 | 
18  | 
    def read_file(name: Document.Node.Name, src_path: Path): Blob = {
 | 
|
| 
72817
 
1c378ab75d48
clarified signature, notably access to blob files;
 
wenzelm 
parents: 
72816 
diff
changeset
 | 
19  | 
val bytes = Bytes.read(name.path)  | 
| 
 
1c378ab75d48
clarified signature, notably access to blob files;
 
wenzelm 
parents: 
72816 
diff
changeset
 | 
20  | 
val chunk = Symbol.Text_Chunk(bytes.text)  | 
| 
 
1c378ab75d48
clarified signature, notably access to blob files;
 
wenzelm 
parents: 
72816 
diff
changeset
 | 
21  | 
Blob(name, src_path, Some((bytes.sha1_digest, chunk)))  | 
| 
 
1c378ab75d48
clarified signature, notably access to blob files;
 
wenzelm 
parents: 
72816 
diff
changeset
 | 
22  | 
}  | 
| 
 
1c378ab75d48
clarified signature, notably access to blob files;
 
wenzelm 
parents: 
72816 
diff
changeset
 | 
23  | 
}  | 
| 
 
1c378ab75d48
clarified signature, notably access to blob files;
 
wenzelm 
parents: 
72816 
diff
changeset
 | 
24  | 
|
| 72745 | 25  | 
sealed case class Blob(  | 
26  | 
name: Document.Node.Name,  | 
|
| 
72747
 
5f9d66155081
clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
 
wenzelm 
parents: 
72745 
diff
changeset
 | 
27  | 
src_path: Path,  | 
| 75393 | 28  | 
content: Option[(SHA1.Digest, Symbol.Text_Chunk)]  | 
29  | 
  ) {
 | 
|
| 72962 | 30  | 
def read_file: Bytes = Bytes.read(name.path)  | 
| 
72817
 
1c378ab75d48
clarified signature, notably access to blob files;
 
wenzelm 
parents: 
72816 
diff
changeset
 | 
31  | 
|
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
32  | 
def chunk_file: Symbol.Text_Chunk.File =  | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
33  | 
Symbol.Text_Chunk.File(name.node)  | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
34  | 
}  | 
| 72745 | 35  | 
|
| 75393 | 36  | 
  object Blobs_Info {
 | 
| 72846 | 37  | 
val none: Blobs_Info = Blobs_Info(Nil)  | 
| 72814 | 38  | 
|
39  | 
def errors(msgs: List[String]): Blobs_Info =  | 
|
| 72846 | 40  | 
Blobs_Info(msgs.map(msg => Exn.Exn[Blob](ERROR(msg))))  | 
| 72814 | 41  | 
}  | 
42  | 
||
| 72846 | 43  | 
sealed case class Blobs_Info(blobs: List[Exn.Result[Blob]], index: Int = -1)  | 
| 72814 | 44  | 
|
| 52849 | 45  | 
|
46  | 
||
| 38361 | 47  | 
/** accumulated results from prover **/  | 
48  | 
||
| 50507 | 49  | 
/* results */  | 
50  | 
||
| 75393 | 51  | 
  object Results {
 | 
| 72869 | 52  | 
type Entry = (Long, XML.Elem)  | 
| 68101 | 53  | 
val empty: Results = new Results(SortedMap.empty)  | 
| 73362 | 54  | 
def make(args: IterableOnce[Results.Entry]): Results =  | 
55  | 
args.iterator.foldLeft(empty)(_ + _)  | 
|
56  | 
def merge(args: IterableOnce[Results]): Results =  | 
|
57  | 
args.iterator.foldLeft(empty)(_ ++ _)  | 
|
| 50507 | 58  | 
}  | 
59  | 
||
| 75393 | 60  | 
  final class Results private(private val rep: SortedMap[Long, XML.Elem]) {
 | 
| 64802 | 61  | 
def is_empty: Boolean = rep.isEmpty  | 
| 50507 | 62  | 
def defined(serial: Long): Boolean = rep.isDefinedAt(serial)  | 
| 72869 | 63  | 
def get(serial: Long): Option[XML.Elem] = rep.get(serial)  | 
| 
56372
 
fadb0fef09d7
more explicit iterator terminology, in accordance to Scala 2.8 library;
 
wenzelm 
parents: 
56359 
diff
changeset
 | 
64  | 
def iterator: Iterator[Results.Entry] = rep.iterator  | 
| 
50508
 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 
wenzelm 
parents: 
50507 
diff
changeset
 | 
65  | 
|
| 
51496
 
cb677987b7e3
retain original tooltip range, to avoid repeated window popup when the mouse is moved over the same content;
 
wenzelm 
parents: 
51494 
diff
changeset
 | 
66  | 
def + (entry: Results.Entry): Results =  | 
| 
50508
 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 
wenzelm 
parents: 
50507 
diff
changeset
 | 
67  | 
if (defined(entry._1)) this  | 
| 
 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 
wenzelm 
parents: 
50507 
diff
changeset
 | 
68  | 
else new Results(rep + entry)  | 
| 
 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 
wenzelm 
parents: 
50507 
diff
changeset
 | 
69  | 
|
| 
 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 
wenzelm 
parents: 
50507 
diff
changeset
 | 
70  | 
def ++ (other: Results): Results =  | 
| 
 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 
wenzelm 
parents: 
50507 
diff
changeset
 | 
71  | 
if (this eq other) this  | 
| 
 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 
wenzelm 
parents: 
50507 
diff
changeset
 | 
72  | 
else if (rep.isEmpty) other  | 
| 73359 | 73  | 
else other.iterator.foldLeft(this)(_ + _)  | 
| 50540 | 74  | 
|
| 51494 | 75  | 
override def hashCode: Int = rep.hashCode  | 
76  | 
override def equals(that: Any): Boolean =  | 
|
77  | 
      that match {
 | 
|
78  | 
case other: Results => rep == other.rep  | 
|
79  | 
case _ => false  | 
|
80  | 
}  | 
|
| 
56372
 
fadb0fef09d7
more explicit iterator terminology, in accordance to Scala 2.8 library;
 
wenzelm 
parents: 
56359 
diff
changeset
 | 
81  | 
    override def toString: String = iterator.mkString("Results(", ", ", ")")
 | 
| 50507 | 82  | 
}  | 
83  | 
||
84  | 
||
| 68101 | 85  | 
/* exports */  | 
86  | 
||
| 75393 | 87  | 
  object Exports {
 | 
| 68101 | 88  | 
type Entry = (Long, Export.Entry)  | 
89  | 
val empty: Exports = new Exports(SortedMap.empty)  | 
|
| 73362 | 90  | 
def merge(args: IterableOnce[Exports]): Exports =  | 
91  | 
args.iterator.foldLeft(empty)(_ ++ _)  | 
|
| 68101 | 92  | 
}  | 
93  | 
||
| 75393 | 94  | 
  final class Exports private(private val rep: SortedMap[Long, Export.Entry]) {
 | 
| 69634 | 95  | 
def is_empty: Boolean = rep.isEmpty  | 
| 68101 | 96  | 
def iterator: Iterator[Exports.Entry] = rep.iterator  | 
97  | 
||
98  | 
def + (entry: Exports.Entry): Exports =  | 
|
99  | 
if (rep.isDefinedAt(entry._1)) this  | 
|
100  | 
else new Exports(rep + entry)  | 
|
101  | 
||
102  | 
def ++ (other: Exports): Exports =  | 
|
103  | 
if (this eq other) this  | 
|
104  | 
else if (rep.isEmpty) other  | 
|
| 73359 | 105  | 
else other.iterator.foldLeft(this)(_ + _)  | 
| 68101 | 106  | 
|
107  | 
override def hashCode: Int = rep.hashCode  | 
|
108  | 
override def equals(that: Any): Boolean =  | 
|
109  | 
      that match {
 | 
|
110  | 
case other: Exports => rep == other.rep  | 
|
111  | 
case _ => false  | 
|
112  | 
}  | 
|
113  | 
    override def toString: String = iterator.mkString("Exports(", ", ", ")")
 | 
|
114  | 
}  | 
|
115  | 
||
116  | 
||
117  | 
/* markups */  | 
|
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
118  | 
|
| 75393 | 119  | 
  object Markup_Index {
 | 
| 56746 | 120  | 
val markup: Markup_Index = Markup_Index(false, Symbol.Text_Chunk.Default)  | 
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
121  | 
def blob(blob: Blob): Markup_Index = Markup_Index(false, blob.chunk_file)  | 
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
122  | 
}  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
123  | 
|
| 56746 | 124  | 
sealed case class Markup_Index(status: Boolean, chunk_name: Symbol.Text_Chunk.Name)  | 
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
125  | 
|
| 75393 | 126  | 
  object Markups {
 | 
| 
72848
 
d5d0e36eda16
read theory with PIDE markup from session database;
 
wenzelm 
parents: 
72846 
diff
changeset
 | 
127  | 
type Entry = (Markup_Index, Markup_Tree)  | 
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
128  | 
val empty: Markups = new Markups(Map.empty)  | 
| 65335 | 129  | 
def init(markup: Markup_Tree): Markups = new Markups(Map(Markup_Index.markup -> markup))  | 
| 73362 | 130  | 
def make(args: IterableOnce[Entry]): Markups =  | 
131  | 
args.iterator.foldLeft(empty)(_ + _)  | 
|
132  | 
def merge(args: IterableOnce[Markups]): Markups =  | 
|
133  | 
args.iterator.foldLeft(empty)(_ ++ _)  | 
|
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
134  | 
}  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
135  | 
|
| 75393 | 136  | 
  final class Markups private(private val rep: Map[Markup_Index, Markup_Tree]) {
 | 
| 56489 | 137  | 
def is_empty: Boolean = rep.isEmpty  | 
138  | 
||
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
139  | 
def apply(index: Markup_Index): Markup_Tree =  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
140  | 
rep.getOrElse(index, Markup_Tree.empty)  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
141  | 
|
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
142  | 
def add(index: Markup_Index, markup: Text.Markup): Markups =  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
143  | 
new Markups(rep + (index -> (this(index) + markup)))  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
144  | 
|
| 75393 | 145  | 
    def + (entry: Markups.Entry): Markups = {
 | 
| 65335 | 146  | 
val (index, tree) = entry  | 
147  | 
new Markups(rep + (index -> (this(index).merge(tree, Text.Range.full, Markup.Elements.full))))  | 
|
148  | 
}  | 
|
149  | 
||
150  | 
def ++ (other: Markups): Markups =  | 
|
151  | 
if (this eq other) this  | 
|
152  | 
else if (rep.isEmpty) other  | 
|
| 73359 | 153  | 
else other.rep.iterator.foldLeft(this)(_ + _)  | 
| 65335 | 154  | 
|
| 56475 | 155  | 
def redirection_iterator: Iterator[Document_ID.Generic] =  | 
| 56746 | 156  | 
for (Markup_Index(_, Symbol.Text_Chunk.Id(id)) <- rep.keysIterator)  | 
| 56475 | 157  | 
yield id  | 
| 
56470
 
8eda56033203
accumulate markup reports for "other" command ids, which are later retargeted and merged for rendering (in erratic order);
 
wenzelm 
parents: 
56469 
diff
changeset
 | 
158  | 
|
| 75393 | 159  | 
    def redirect(other_id: Document_ID.Generic): Markups = {
 | 
| 56489 | 160  | 
val rep1 =  | 
| 
56470
 
8eda56033203
accumulate markup reports for "other" command ids, which are later retargeted and merged for rendering (in erratic order);
 
wenzelm 
parents: 
56469 
diff
changeset
 | 
161  | 
        (for {
 | 
| 56746 | 162  | 
(Markup_Index(status, Symbol.Text_Chunk.Id(id)), markup) <- rep.iterator  | 
| 
56470
 
8eda56033203
accumulate markup reports for "other" command ids, which are later retargeted and merged for rendering (in erratic order);
 
wenzelm 
parents: 
56469 
diff
changeset
 | 
163  | 
if other_id == id  | 
| 56746 | 164  | 
} yield (Markup_Index(status, Symbol.Text_Chunk.Default), markup)).toMap  | 
| 56489 | 165  | 
if (rep1.isEmpty) Markups.empty else new Markups(rep1)  | 
166  | 
}  | 
|
| 
56470
 
8eda56033203
accumulate markup reports for "other" command ids, which are later retargeted and merged for rendering (in erratic order);
 
wenzelm 
parents: 
56469 
diff
changeset
 | 
167  | 
|
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
168  | 
override def hashCode: Int = rep.hashCode  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
169  | 
override def equals(that: Any): Boolean =  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
170  | 
      that match {
 | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
171  | 
case other: Markups => rep == other.rep  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
172  | 
case _ => false  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
173  | 
}  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
174  | 
    override def toString: String = rep.iterator.mkString("Markups(", ", ", ")")
 | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
175  | 
}  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
176  | 
|
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
177  | 
|
| 50507 | 178  | 
/* state */  | 
| 
50501
 
6f41f1646617
more careful handling of Dialog_Result, with active area and color feedback;
 
wenzelm 
parents: 
50500 
diff
changeset
 | 
179  | 
|
| 75393 | 180  | 
  object State {
 | 
| 72869 | 181  | 
def get_result(states: List[State], serial: Long): Option[XML.Elem] =  | 
| 
67824
 
661cd25304ae
more compact markup tree: output messages are already stored in command results (e.g. relevant for  XML data representation);
 
wenzelm 
parents: 
67446 
diff
changeset
 | 
182  | 
states.find(st => st.results.defined(serial)).map(st => st.results.get(serial).get)  | 
| 
 
661cd25304ae
more compact markup tree: output messages are already stored in command results (e.g. relevant for  XML data representation);
 
wenzelm 
parents: 
67446 
diff
changeset
 | 
183  | 
|
| 
 
661cd25304ae
more compact markup tree: output messages are already stored in command results (e.g. relevant for  XML data representation);
 
wenzelm 
parents: 
67446 
diff
changeset
 | 
184  | 
def get_result_proper(states: List[State], props: Properties.T): Option[Results.Entry] =  | 
| 
 
661cd25304ae
more compact markup tree: output messages are already stored in command results (e.g. relevant for  XML data representation);
 
wenzelm 
parents: 
67446 
diff
changeset
 | 
185  | 
      for {
 | 
| 
 
661cd25304ae
more compact markup tree: output messages are already stored in command results (e.g. relevant for  XML data representation);
 
wenzelm 
parents: 
67446 
diff
changeset
 | 
186  | 
serial <- Markup.Serial.unapply(props)  | 
| 72869 | 187  | 
elem <- get_result(states, serial)  | 
188  | 
if elem.body.nonEmpty  | 
|
189  | 
} yield serial -> elem  | 
|
| 
67824
 
661cd25304ae
more compact markup tree: output messages are already stored in command results (e.g. relevant for  XML data representation);
 
wenzelm 
parents: 
67446 
diff
changeset
 | 
190  | 
|
| 65335 | 191  | 
def merge_results(states: List[State]): Results =  | 
| 
56299
 
8201790fdeb9
more careful treatment of multiple command states (eval + prints): merge content that is actually required;
 
wenzelm 
parents: 
56295 
diff
changeset
 | 
192  | 
Results.merge(states.map(_.results))  | 
| 
 
8201790fdeb9
more careful treatment of multiple command states (eval + prints): merge content that is actually required;
 
wenzelm 
parents: 
56295 
diff
changeset
 | 
193  | 
|
| 68101 | 194  | 
def merge_exports(states: List[State]): Exports =  | 
195  | 
Exports.merge(states.map(_.exports))  | 
|
196  | 
||
| 65335 | 197  | 
def merge_markups(states: List[State]): Markups =  | 
198  | 
Markups.merge(states.map(_.markups))  | 
|
199  | 
||
| 
56301
 
1da7b4c33db9
more frugal merge of markup trees: filter wrt. subsequent query;
 
wenzelm 
parents: 
56299 
diff
changeset
 | 
200  | 
def merge_markup(states: List[State], index: Markup_Index,  | 
| 56743 | 201  | 
range: Text.Range, elements: Markup.Elements): Markup_Tree =  | 
| 
56301
 
1da7b4c33db9
more frugal merge of markup trees: filter wrt. subsequent query;
 
wenzelm 
parents: 
56299 
diff
changeset
 | 
202  | 
Markup_Tree.merge(states.map(_.markup(index)), range, elements)  | 
| 65335 | 203  | 
|
204  | 
def merge(command: Command, states: List[State]): State =  | 
|
| 68101 | 205  | 
State(command, states.flatMap(_.status), merge_results(states),  | 
206  | 
merge_exports(states), merge_markups(states))  | 
|
| 
56299
 
8201790fdeb9
more careful treatment of multiple command states (eval + prints): merge content that is actually required;
 
wenzelm 
parents: 
56295 
diff
changeset
 | 
207  | 
}  | 
| 
 
8201790fdeb9
more careful treatment of multiple command states (eval + prints): merge content that is actually required;
 
wenzelm 
parents: 
56295 
diff
changeset
 | 
208  | 
|
| 43714 | 209  | 
sealed case class State(  | 
| 
50501
 
6f41f1646617
more careful handling of Dialog_Result, with active area and color feedback;
 
wenzelm 
parents: 
50500 
diff
changeset
 | 
210  | 
command: Command,  | 
| 
 
6f41f1646617
more careful handling of Dialog_Result, with active area and color feedback;
 
wenzelm 
parents: 
50500 
diff
changeset
 | 
211  | 
status: List[Markup] = Nil,  | 
| 50507 | 212  | 
results: Results = Results.empty,  | 
| 68101 | 213  | 
exports: Exports = Exports.empty,  | 
| 75393 | 214  | 
markups: Markups = Markups.empty  | 
215  | 
  ) {
 | 
|
| 68323 | 216  | 
def initialized: Boolean = status.exists(markup => markup.name == Markup.INITIALIZED)  | 
| 
70780
 
034742453594
more robust: avoid update/interrupt of long-running print_consolidation;
 
wenzelm 
parents: 
70713 
diff
changeset
 | 
217  | 
def consolidating: Boolean = status.exists(markup => markup.name == Markup.CONSOLIDATING)  | 
| 68335 | 218  | 
def consolidated: Boolean = status.exists(markup => markup.name == Markup.CONSOLIDATED)  | 
| 
66379
 
6392766f3c25
maintain "consolidated" status of theory nodes, which means all evals are finished (but not necessarily prints nor imports);
 
wenzelm 
parents: 
65522 
diff
changeset
 | 
219  | 
|
| 75393 | 220  | 
    lazy val maybe_consolidated: Boolean = {
 | 
| 68758 | 221  | 
var touched = false  | 
222  | 
var forks = 0  | 
|
223  | 
var runs = 0  | 
|
224  | 
      for (markup <- status) {
 | 
|
225  | 
        markup.name match {
 | 
|
226  | 
case Markup.FORKED => touched = true; forks += 1  | 
|
227  | 
case Markup.JOINED => forks -= 1  | 
|
228  | 
case Markup.RUNNING => touched = true; runs += 1  | 
|
229  | 
case Markup.FINISHED => runs -= 1  | 
|
230  | 
case _ =>  | 
|
231  | 
}  | 
|
232  | 
}  | 
|
233  | 
touched && forks == 0 && runs == 0  | 
|
234  | 
}  | 
|
| 
68381
 
2fd3a6d6ba2e
less wasteful consolidation, based on PIDE front-end state and recent changes;
 
wenzelm 
parents: 
68335 
diff
changeset
 | 
235  | 
|
| 75393 | 236  | 
    lazy val document_status: Document_Status.Command_Status = {
 | 
| 
56395
 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 
wenzelm 
parents: 
56372 
diff
changeset
 | 
237  | 
val warnings =  | 
| 
59203
 
5f0bd5afc16d
explicit message channel for "legacy", which is nonetheless a variant of "warning";
 
wenzelm 
parents: 
59072 
diff
changeset
 | 
238  | 
if (results.iterator.exists(p => Protocol.is_warning(p._2) || Protocol.is_legacy(p._2)))  | 
| 
56395
 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 
wenzelm 
parents: 
56372 
diff
changeset
 | 
239  | 
List(Markup(Markup.WARNING, Nil))  | 
| 
 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 
wenzelm 
parents: 
56372 
diff
changeset
 | 
240  | 
else Nil  | 
| 
 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 
wenzelm 
parents: 
56372 
diff
changeset
 | 
241  | 
val errors =  | 
| 
 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 
wenzelm 
parents: 
56372 
diff
changeset
 | 
242  | 
if (results.iterator.exists(p => Protocol.is_error(p._2)))  | 
| 
 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 
wenzelm 
parents: 
56372 
diff
changeset
 | 
243  | 
List(Markup(Markup.ERROR, Nil))  | 
| 
 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 
wenzelm 
parents: 
56372 
diff
changeset
 | 
244  | 
else Nil  | 
| 68758 | 245  | 
Document_Status.Command_Status.make((warnings ::: errors ::: status).iterator)  | 
| 
56395
 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 
wenzelm 
parents: 
56372 
diff
changeset
 | 
246  | 
}  | 
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
247  | 
|
| 55650 | 248  | 
def markup(index: Markup_Index): Markup_Tree = markups(index)  | 
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
249  | 
|
| 75393 | 250  | 
    def redirect(other_command: Command): Option[State] = {
 | 
| 56489 | 251  | 
val markups1 = markups.redirect(other_command.id)  | 
252  | 
if (markups1.is_empty) None  | 
|
| 68101 | 253  | 
else Some(new State(other_command, markups = markups1))  | 
| 56489 | 254  | 
}  | 
| 49614 | 255  | 
|
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
256  | 
private def add_status(st: Markup): State =  | 
| 
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
257  | 
copy(status = st :: status)  | 
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
258  | 
|
| 67826 | 259  | 
private def add_result(entry: Results.Entry): State =  | 
260  | 
copy(results = results + entry)  | 
|
261  | 
||
| 68114 | 262  | 
def add_export(entry: Exports.Entry): Option[State] =  | 
263  | 
if (command.node_name.theory == entry._2.theory_name) Some(copy(exports = exports + entry))  | 
|
264  | 
else None  | 
|
| 68101 | 265  | 
|
| 56746 | 266  | 
private def add_markup(  | 
| 75393 | 267  | 
status: Boolean,  | 
268  | 
chunk_name: Symbol.Text_Chunk.Name,  | 
|
269  | 
m: Text.Markup  | 
|
270  | 
    ): State = {
 | 
|
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
271  | 
val markups1 =  | 
| 68758 | 272  | 
if (status || Document_Status.Command_Status.liberal_elements(m.info.name))  | 
| 
56462
 
b64b0cb845fe
more explicit Command.Chunk types, less ooddities;
 
wenzelm 
parents: 
56395 
diff
changeset
 | 
273  | 
markups.add(Markup_Index(true, chunk_name), m)  | 
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
274  | 
else markups  | 
| 
56462
 
b64b0cb845fe
more explicit Command.Chunk types, less ooddities;
 
wenzelm 
parents: 
56395 
diff
changeset
 | 
275  | 
copy(markups = markups1.add(Markup_Index(false, chunk_name), m))  | 
| 
55649
 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 
wenzelm 
parents: 
55648 
diff
changeset
 | 
276  | 
}  | 
| 38361 | 277  | 
|
| 
56470
 
8eda56033203
accumulate markup reports for "other" command ids, which are later retargeted and merged for rendering (in erratic order);
 
wenzelm 
parents: 
56469 
diff
changeset
 | 
278  | 
def accumulate(  | 
| 
 
8eda56033203
accumulate markup reports for "other" command ids, which are later retargeted and merged for rendering (in erratic order);
 
wenzelm 
parents: 
56469 
diff
changeset
 | 
279  | 
self_id: Document_ID.Generic => Boolean,  | 
| 72780 | 280  | 
other_id: (Document.Node.Name, Document_ID.Generic) =>  | 
281  | 
Option[(Symbol.Text_Chunk.Id, Symbol.Text_Chunk)],  | 
|
| 67825 | 282  | 
message: XML.Elem,  | 
| 
73031
 
f93f0597f4fb
clarified signature: absorb XZ.Cache into XML.Cache;
 
wenzelm 
parents: 
72962 
diff
changeset
 | 
283  | 
cache: XML.Cache): State =  | 
| 38361 | 284  | 
      message match {
 | 
| 
50201
 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 
wenzelm 
parents: 
50163 
diff
changeset
 | 
285  | 
case XML.Elem(Markup(Markup.STATUS, _), msgs) =>  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
286  | 
if (command.span.is_theory) this  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
287  | 
          else {
 | 
| 73359 | 288  | 
            msgs.foldLeft(this) {
 | 
289  | 
case (state, msg) =>  | 
|
290  | 
                msg match {
 | 
|
291  | 
case elem @ XML.Elem(markup, Nil) =>  | 
|
292  | 
state.  | 
|
293  | 
add_status(markup).  | 
|
294  | 
add_markup(true, Symbol.Text_Chunk.Default, Text.Info(command.core_range, elem))  | 
|
295  | 
case _ =>  | 
|
296  | 
                    Output.warning("Ignored status message: " + msg)
 | 
|
297  | 
state  | 
|
298  | 
}  | 
|
299  | 
}  | 
|
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
300  | 
}  | 
| 
38581
 
d503a0912e14
simplified Command.status again, reverting most of e5eed57913d0 (note that more complex information can be represented with full markup reports);
 
wenzelm 
parents: 
38579 
diff
changeset
 | 
301  | 
|
| 
72709
 
cb9d5af781b4
more complete report positions, notably for command 'back' (amending eca176f773e0);
 
wenzelm 
parents: 
72708 
diff
changeset
 | 
302  | 
case XML.Elem(Markup(Markup.REPORT, atts0), msgs) =>  | 
| 73359 | 303  | 
          msgs.foldLeft(this) {
 | 
304  | 
case (state, msg) =>  | 
|
| 
56782
 
433cf57550fa
more systematic Isabelle output, like in classic Isabelle/ML (without markup);
 
wenzelm 
parents: 
56746 
diff
changeset
 | 
305  | 
              def bad(): Unit = Output.warning("Ignored report message: " + msg)
 | 
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
306  | 
|
| 
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
307  | 
              msg match {
 | 
| 
72826
 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 
wenzelm 
parents: 
72824 
diff
changeset
 | 
308  | 
case XML.Elem(Markup(name, atts), args) =>  | 
| 
 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 
wenzelm 
parents: 
72824 
diff
changeset
 | 
309  | 
                  command.reported_position(atts) orElse command.reported_position(atts0) match {
 | 
| 
 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 
wenzelm 
parents: 
72824 
diff
changeset
 | 
310  | 
case Some((id, chunk_name, target_range)) =>  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
311  | 
val target =  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
312  | 
if (self_id(id) && command.chunks.isDefinedAt(chunk_name))  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
313  | 
Some((chunk_name, command.chunks(chunk_name)))  | 
| 72780 | 314  | 
else if (chunk_name == Symbol.Text_Chunk.Default)  | 
315  | 
other_id(command.node_name, id)  | 
|
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
316  | 
else None  | 
| 
56470
 
8eda56033203
accumulate markup reports for "other" command ids, which are later retargeted and merged for rendering (in erratic order);
 
wenzelm 
parents: 
56469 
diff
changeset
 | 
317  | 
|
| 
72826
 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 
wenzelm 
parents: 
72824 
diff
changeset
 | 
318  | 
                      (target, target_range) match {
 | 
| 
72831
 
ffae996e9c08
silently ignore markup that starts out as singularity, e.g. <language/> from empty ML file;
 
wenzelm 
parents: 
72827 
diff
changeset
 | 
319  | 
case (Some((target_name, target_chunk)), Some(symbol_range))  | 
| 
 
ffae996e9c08
silently ignore markup that starts out as singularity, e.g. <language/> from empty ML file;
 
wenzelm 
parents: 
72827 
diff
changeset
 | 
320  | 
if !symbol_range.is_singularity =>  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
321  | 
                          target_chunk.incorporate(symbol_range) match {
 | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
322  | 
case Some(range) =>  | 
| 72708 | 323  | 
val props = atts.filterNot(Markup.position_property)  | 
| 
73031
 
f93f0597f4fb
clarified signature: absorb XZ.Cache into XML.Cache;
 
wenzelm 
parents: 
72962 
diff
changeset
 | 
324  | 
val elem = cache.elem(XML.Elem(Markup(name, props), args))  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
325  | 
state.add_markup(false, target_name, Text.Info(range, elem))  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
326  | 
case None => bad(); state  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
327  | 
}  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
328  | 
case _ =>  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
329  | 
// silently ignore excessive reports  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
330  | 
state  | 
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
331  | 
}  | 
| 
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
332  | 
|
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
333  | 
case _ => bad(); state  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
334  | 
}  | 
| 
56470
 
8eda56033203
accumulate markup reports for "other" command ids, which are later retargeted and merged for rendering (in erratic order);
 
wenzelm 
parents: 
56469 
diff
changeset
 | 
335  | 
case _ => bad(); state  | 
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
336  | 
}  | 
| 73359 | 337  | 
}  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
338  | 
|
| 
52930
 
5fab62ae3532
retain original messages properties, e.g. for retrieval via Command.Results;
 
wenzelm 
parents: 
52849 
diff
changeset
 | 
339  | 
case XML.Elem(Markup(name, props), body) =>  | 
| 
 
5fab62ae3532
retain original messages properties, e.g. for retrieval via Command.Results;
 
wenzelm 
parents: 
52849 
diff
changeset
 | 
340  | 
          props match {
 | 
| 
50201
 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 
wenzelm 
parents: 
50163 
diff
changeset
 | 
341  | 
case Markup.Serial(i) =>  | 
| 67825 | 342  | 
val markup_message =  | 
| 
73031
 
f93f0597f4fb
clarified signature: absorb XZ.Cache into XML.Cache;
 
wenzelm 
parents: 
72962 
diff
changeset
 | 
343  | 
cache.elem(XML.Elem(Markup(Markup.message(name), props), body))  | 
| 67825 | 344  | 
val message_markup =  | 
| 
73031
 
f93f0597f4fb
clarified signature: absorb XZ.Cache into XML.Cache;
 
wenzelm 
parents: 
72962 
diff
changeset
 | 
345  | 
cache.elem(XML.elem(Markup(name, props.filter(p => p._1 == Markup.SERIAL))))  | 
| 
50163
 
c62ce309dc26
more abstract Sendback operations, with explicit id/exec_id properties;
 
wenzelm 
parents: 
50158 
diff
changeset
 | 
346  | 
|
| 67826 | 347  | 
var st = add_result(i -> markup_message)  | 
| 
55433
 
d2960d67f163
clarified message_positions: cover alt_id as well;
 
wenzelm 
parents: 
55432 
diff
changeset
 | 
348  | 
              if (Protocol.is_inlined(message)) {
 | 
| 
 
d2960d67f163
clarified message_positions: cover alt_id as well;
 
wenzelm 
parents: 
55432 
diff
changeset
 | 
349  | 
                for {
 | 
| 56469 | 350  | 
(chunk_name, chunk) <- command.chunks.iterator  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
351  | 
range <- command.message_positions(self_id, chunk_name, chunk, message)  | 
| 
67824
 
661cd25304ae
more compact markup tree: output messages are already stored in command results (e.g. relevant for  XML data representation);
 
wenzelm 
parents: 
67446 
diff
changeset
 | 
352  | 
} st = st.add_markup(false, chunk_name, Text.Info(range, message_markup))  | 
| 
55433
 
d2960d67f163
clarified message_positions: cover alt_id as well;
 
wenzelm 
parents: 
55432 
diff
changeset
 | 
353  | 
}  | 
| 
 
d2960d67f163
clarified message_positions: cover alt_id as well;
 
wenzelm 
parents: 
55432 
diff
changeset
 | 
354  | 
st  | 
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
355  | 
|
| 52536 | 356  | 
case _ =>  | 
| 
56782
 
433cf57550fa
more systematic Isabelle output, like in classic Isabelle/ML (without markup);
 
wenzelm 
parents: 
56746 
diff
changeset
 | 
357  | 
              Output.warning("Ignored message without serial number: " + message)
 | 
| 52536 | 358  | 
this  | 
| 38872 | 359  | 
}  | 
| 68101 | 360  | 
}  | 
| 38361 | 361  | 
}  | 
| 38367 | 362  | 
|
363  | 
||
| 
55431
 
e0f20a44ff9d
common Command.Chunk for command source and auxiliary files (static Symbol.Index without actual String content);
 
wenzelm 
parents: 
55430 
diff
changeset
 | 
364  | 
|
| 
 
e0f20a44ff9d
common Command.Chunk for command source and auxiliary files (static Symbol.Index without actual String content);
 
wenzelm 
parents: 
55430 
diff
changeset
 | 
365  | 
/** static content **/  | 
| 
 
e0f20a44ff9d
common Command.Chunk for command source and auxiliary files (static Symbol.Index without actual String content);
 
wenzelm 
parents: 
55430 
diff
changeset
 | 
366  | 
|
| 45644 | 367  | 
/* make commands */  | 
368  | 
||
| 
55648
 
38f264741609
tuned signature -- avoid obscure default arguments;
 
wenzelm 
parents: 
55622 
diff
changeset
 | 
369  | 
def apply(  | 
| 
 
38f264741609
tuned signature -- avoid obscure default arguments;
 
wenzelm 
parents: 
55622 
diff
changeset
 | 
370  | 
id: Document_ID.Command,  | 
| 
 
38f264741609
tuned signature -- avoid obscure default arguments;
 
wenzelm 
parents: 
55622 
diff
changeset
 | 
371  | 
node_name: Document.Node.Name,  | 
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
372  | 
blobs_info: Blobs_Info,  | 
| 75393 | 373  | 
span: Command_Span.Span  | 
374  | 
  ): Command = {
 | 
|
| 
57901
 
e1abca2527da
more explicit type Span in Scala, according to ML version;
 
wenzelm 
parents: 
57842 
diff
changeset
 | 
375  | 
val (source, span1) = span.compact_source  | 
| 
72722
 
ade53fbc6f03
clarified signature: initial markup is_empty, not init_markup;
 
wenzelm 
parents: 
72709 
diff
changeset
 | 
376  | 
new Command(id, node_name, blobs_info, span1, source, Results.empty, Markups.empty)  | 
| 
55648
 
38f264741609
tuned signature -- avoid obscure default arguments;
 
wenzelm 
parents: 
55622 
diff
changeset
 | 
377  | 
}  | 
| 49414 | 378  | 
|
| 
57901
 
e1abca2527da
more explicit type Span in Scala, according to ML version;
 
wenzelm 
parents: 
57842 
diff
changeset
 | 
379  | 
val empty: Command =  | 
| 72814 | 380  | 
Command(Document_ID.none, Document.Node.Name.empty, Blobs_Info.none, Command_Span.empty)  | 
| 
55648
 
38f264741609
tuned signature -- avoid obscure default arguments;
 
wenzelm 
parents: 
55622 
diff
changeset
 | 
381  | 
|
| 
 
38f264741609
tuned signature -- avoid obscure default arguments;
 
wenzelm 
parents: 
55622 
diff
changeset
 | 
382  | 
def unparsed(  | 
| 
 
38f264741609
tuned signature -- avoid obscure default arguments;
 
wenzelm 
parents: 
55622 
diff
changeset
 | 
383  | 
source: String,  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
384  | 
theory: Boolean = false,  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
385  | 
id: Document_ID.Command = Document_ID.none,  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
386  | 
node_name: Document.Node.Name = Document.Node.Name.empty,  | 
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
387  | 
blobs_info: Blobs_Info = Blobs_Info.none,  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
388  | 
results: Results = Results.empty,  | 
| 75393 | 389  | 
markups: Markups = Markups.empty  | 
390  | 
  ): Command = {
 | 
|
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
391  | 
val (source1, span1) = Command_Span.unparsed(source, theory).compact_source  | 
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
392  | 
new Command(id, node_name, blobs_info, span1, source1, results, markups)  | 
| 
55648
 
38f264741609
tuned signature -- avoid obscure default arguments;
 
wenzelm 
parents: 
55622 
diff
changeset
 | 
393  | 
}  | 
| 49414 | 394  | 
|
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
395  | 
def text(source: String): Command = unparsed(source)  | 
| 44384 | 396  | 
|
| 
52530
 
99dd8b4ef3fe
explicit module Document_ID as source of globally unique identifiers across ML/Scala;
 
wenzelm 
parents: 
52527 
diff
changeset
 | 
397  | 
def rich_text(id: Document_ID.Command, results: Results, body: XML.Body): Command =  | 
| 
72722
 
ade53fbc6f03
clarified signature: initial markup is_empty, not init_markup;
 
wenzelm 
parents: 
72709 
diff
changeset
 | 
398  | 
unparsed(XML.content(body), id = id, results = results,  | 
| 
 
ade53fbc6f03
clarified signature: initial markup is_empty, not init_markup;
 
wenzelm 
parents: 
72709 
diff
changeset
 | 
399  | 
markups = Markups.init(Markup_Tree.from_XML(body)))  | 
| 
49359
 
c1262d7389fb
refined output panel: more value-oriented approach to update and caret focus;
 
wenzelm 
parents: 
49037 
diff
changeset
 | 
400  | 
|
| 44384 | 401  | 
|
| 72814 | 402  | 
/* edits and perspective */  | 
403  | 
||
404  | 
type Edit = (Option[Command], Option[Command])  | 
|
| 44384 | 405  | 
|
| 75393 | 406  | 
  object Perspective {
 | 
| 44474 | 407  | 
val empty: Perspective = Perspective(Nil)  | 
408  | 
}  | 
|
| 
44385
 
e7fdb008aa7d
propagate editor perspective through document model;
 
wenzelm 
parents: 
44384 
diff
changeset
 | 
409  | 
|
| 75393 | 410  | 
sealed case class Perspective(  | 
411  | 
commands: List[Command] // visible commands in canonical order  | 
|
412  | 
  ) {
 | 
|
| 
57615
 
df1b3452d71c
more explicit discrimination of empty nodes -- suppress from Theories panel;
 
wenzelm 
parents: 
56782 
diff
changeset
 | 
413  | 
def is_empty: Boolean = commands.isEmpty  | 
| 
 
df1b3452d71c
more explicit discrimination of empty nodes -- suppress from Theories panel;
 
wenzelm 
parents: 
56782 
diff
changeset
 | 
414  | 
|
| 75393 | 415  | 
    def same(that: Perspective): Boolean = {
 | 
| 44474 | 416  | 
val cmds1 = this.commands  | 
417  | 
val cmds2 = that.commands  | 
|
| 
73120
 
c3589f2dff31
more informative errors: simplify diagnosis of spurious failures reported by users;
 
wenzelm 
parents: 
73115 
diff
changeset
 | 
418  | 
require(!cmds1.exists(_.is_undefined), "cmds1 not defined")  | 
| 
 
c3589f2dff31
more informative errors: simplify diagnosis of spurious failures reported by users;
 
wenzelm 
parents: 
73115 
diff
changeset
 | 
419  | 
require(!cmds2.exists(_.is_undefined), "cmds2 not defined")  | 
| 44474 | 420  | 
cmds1.length == cmds2.length &&  | 
421  | 
        (cmds1.iterator zip cmds2.iterator).forall({ case (c1, c2) => c1.id == c2.id })
 | 
|
422  | 
}  | 
|
| 
44385
 
e7fdb008aa7d
propagate editor perspective through document model;
 
wenzelm 
parents: 
44384 
diff
changeset
 | 
423  | 
}  | 
| 
59689
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59684 
diff
changeset
 | 
424  | 
|
| 
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59684 
diff
changeset
 | 
425  | 
|
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
426  | 
/* blobs: inlined errors and auxiliary files */  | 
| 
59689
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59684 
diff
changeset
 | 
427  | 
|
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
428  | 
def blobs_info(  | 
| 59699 | 429  | 
resources: Resources,  | 
| 
63584
 
68751fe1c036
tuned signature -- prover-independence is presently theoretical;
 
wenzelm 
parents: 
62969 
diff
changeset
 | 
430  | 
syntax: Outer_Syntax,  | 
| 59699 | 431  | 
get_blob: Document.Node.Name => Option[Document.Blob],  | 
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
432  | 
can_import: Document.Node.Name => Boolean,  | 
| 59699 | 433  | 
node_name: Document.Node.Name,  | 
| 75393 | 434  | 
span: Command_Span.Span  | 
435  | 
  ): Blobs_Info = {
 | 
|
| 59735 | 436  | 
    span.name match {
 | 
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
437  | 
// inlined errors  | 
| 59735 | 438  | 
case Thy_Header.THEORY =>  | 
| 72946 | 439  | 
val reader = span.content_reader  | 
440  | 
val header = resources.check_thy(node_name, span.content_reader)  | 
|
| 
72748
 
04d5f6d769a7
more flexible syntax for theory load commands via Isabelle/Scala;
 
wenzelm 
parents: 
72747 
diff
changeset
 | 
441  | 
val imports_pos = header.imports_pos  | 
| 66768 | 442  | 
val raw_imports =  | 
443  | 
          try {
 | 
|
| 72778 | 444  | 
val read_imports = Thy_Header.read(node_name, reader).imports.map(_._1)  | 
| 
70638
 
f164cec7ac22
clarified signature: prefer operations without position;
 
wenzelm 
parents: 
69891 
diff
changeset
 | 
445  | 
            if (imports_pos.length == read_imports.length) read_imports else error("")
 | 
| 66768 | 446  | 
}  | 
| 72778 | 447  | 
          catch { case _: Throwable => List.fill(header.imports.length)("") }
 | 
| 66768 | 448  | 
|
| 72765 | 449  | 
val errors =  | 
| 
70638
 
f164cec7ac22
clarified signature: prefer operations without position;
 
wenzelm 
parents: 
69891 
diff
changeset
 | 
450  | 
          for { ((import_name, pos), s) <- imports_pos zip raw_imports if !can_import(import_name) }
 | 
| 66768 | 451  | 
          yield {
 | 
452  | 
val completion =  | 
|
| 
70713
 
fd188463066e
clarified theory imports completion, based on session directories and current master directory (no support for local session-subdirectories);
 
wenzelm 
parents: 
70638 
diff
changeset
 | 
453  | 
if (Thy_Header.is_base_name(s)) resources.complete_import_name(node_name, s) else Nil  | 
| 72814 | 454  | 
"Bad theory import " +  | 
455  | 
Markup.Path(import_name.node).markup(quote(import_name.toString)) +  | 
|
456  | 
Position.here(pos) + Completion.report_theories(pos, completion)  | 
|
| 
59708
 
aed304412e43
more markup, which helps to create missing imports;
 
wenzelm 
parents: 
59706 
diff
changeset
 | 
457  | 
}  | 
| 72814 | 458  | 
Blobs_Info.errors(errors)  | 
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
459  | 
|
| 
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
460  | 
// auxiliary files  | 
| 
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
461  | 
case _ =>  | 
| 72757 | 462  | 
val loaded_files = span.loaded_files(syntax)  | 
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
463  | 
val blobs =  | 
| 72757 | 464  | 
loaded_files.files.map(file =>  | 
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
465  | 
            (Exn.capture {
 | 
| 
72747
 
5f9d66155081
clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
 
wenzelm 
parents: 
72745 
diff
changeset
 | 
466  | 
val src_path = Path.explode(file)  | 
| 
 
5f9d66155081
clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
 
wenzelm 
parents: 
72745 
diff
changeset
 | 
467  | 
val name = Document.Node.Name(resources.append(node_name, src_path))  | 
| 72745 | 468  | 
val content = get_blob(name).map(blob => (blob.bytes.sha1_digest, blob.chunk))  | 
| 
72747
 
5f9d66155081
clarified theory keywords: loaded_files are determined statically in Scala, but ML needs to do it semantically;
 
wenzelm 
parents: 
72745 
diff
changeset
 | 
469  | 
Blob(name, src_path, content)  | 
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
470  | 
}).user_error)  | 
| 72846 | 471  | 
Blobs_Info(blobs, index = loaded_files.index)  | 
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
472  | 
}  | 
| 
59689
 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 
wenzelm 
parents: 
59684 
diff
changeset
 | 
473  | 
}  | 
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
474  | 
|
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
475  | 
def build_blobs_info(  | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
476  | 
syntax: Outer_Syntax,  | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
477  | 
node_name: Document.Node.Name,  | 
| 75393 | 478  | 
load_commands: List[Command_Span.Span]  | 
479  | 
  ): Blobs_Info = {
 | 
|
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
480  | 
val blobs =  | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
481  | 
      for {
 | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
482  | 
span <- load_commands  | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
483  | 
file <- span.loaded_files(syntax).files  | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
484  | 
      } yield {
 | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
485  | 
        (Exn.capture {
 | 
| 
72817
 
1c378ab75d48
clarified signature, notably access to blob files;
 
wenzelm 
parents: 
72816 
diff
changeset
 | 
486  | 
val dir = node_name.master_dir_path  | 
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
487  | 
val src_path = Path.explode(file)  | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
488  | 
val name = Document.Node.Name((dir + src_path).expand.implode_symbolic)  | 
| 
72817
 
1c378ab75d48
clarified signature, notably access to blob files;
 
wenzelm 
parents: 
72816 
diff
changeset
 | 
489  | 
Blob.read_file(name, src_path)  | 
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
490  | 
}).user_error  | 
| 
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
491  | 
}  | 
| 72846 | 492  | 
Blobs_Info(blobs)  | 
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
493  | 
}  | 
| 
34318
 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 
wenzelm 
parents:  
diff
changeset
 | 
494  | 
}  | 
| 
 
c13e168a8ae6
original sources from Johannes Hölzl a48e0c6ab1aea77c52d596f7efc007a543d3d10c with minor modifications of directory layout;
 
wenzelm 
parents:  
diff
changeset
 | 
495  | 
|
| 38361 | 496  | 
|
| 46712 | 497  | 
final class Command private(  | 
| 75393 | 498  | 
val id: Document_ID.Command,  | 
499  | 
val node_name: Document.Node.Name,  | 
|
500  | 
val blobs_info: Command.Blobs_Info,  | 
|
501  | 
val span: Command_Span.Span,  | 
|
502  | 
val source: String,  | 
|
503  | 
val init_results: Command.Results,  | 
|
504  | 
val init_markups: Command.Markups  | 
|
505  | 
) {
 | 
|
| 73363 | 506  | 
override def toString: String = id.toString + "/" + span.kind.toString  | 
| 34495 | 507  | 
|
| 57910 | 508  | 
|
509  | 
/* classification */  | 
|
510  | 
||
| 
57905
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57904 
diff
changeset
 | 
511  | 
def is_proper: Boolean = span.kind.isInstanceOf[Command_Span.Command_Span]  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57904 
diff
changeset
 | 
512  | 
def is_ignored: Boolean = span.kind == Command_Span.Ignored_Span  | 
| 57904 | 513  | 
|
514  | 
def is_undefined: Boolean = id == Document_ID.none  | 
|
515  | 
val is_unparsed: Boolean = span.content.exists(_.is_unparsed)  | 
|
516  | 
val is_unfinished: Boolean = span.content.exists(_.is_unfinished)  | 
|
517  | 
||
| 68323 | 518  | 
def potentially_initialized: Boolean = span.name == Thy_Header.THEORY  | 
519  | 
||
| 34859 | 520  | 
|
| 
54519
 
5fed81762406
maintain blobs within document state: digest + text in ML, digest-only in Scala;
 
wenzelm 
parents: 
54517 
diff
changeset
 | 
521  | 
/* blobs */  | 
| 
 
5fed81762406
maintain blobs within document state: digest + text in ML, digest-only in Scala;
 
wenzelm 
parents: 
54517 
diff
changeset
 | 
522  | 
|
| 72814 | 523  | 
def blobs: List[Exn.Result[Command.Blob]] = blobs_info.blobs  | 
524  | 
def blobs_index: Int = blobs_info.index  | 
|
| 
59702
 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 
wenzelm 
parents: 
59699 
diff
changeset
 | 
525  | 
|
| 65335 | 526  | 
def blobs_ok: Boolean =  | 
527  | 
    blobs.forall({ case Exn.Res(_) => true case _ => false })
 | 
|
528  | 
||
| 
54530
 
2c1440f70028
ranges of thy_load commands count as visible within perspective;
 
wenzelm 
parents: 
54524 
diff
changeset
 | 
529  | 
def blobs_names: List[Document.Node.Name] =  | 
| 72745 | 530  | 
for (Exn.Res(blob) <- blobs) yield blob.name  | 
| 
54530
 
2c1440f70028
ranges of thy_load commands count as visible within perspective;
 
wenzelm 
parents: 
54524 
diff
changeset
 | 
531  | 
|
| 
60916
 
a6e2a667b0a8
resolve undefined blobs by default, e.g. relevant for ML debugger to avoid reset of breakpoints after reload;
 
wenzelm 
parents: 
60215 
diff
changeset
 | 
532  | 
def blobs_undefined: List[Document.Node.Name] =  | 
| 72745 | 533  | 
for (Exn.Res(blob) <- blobs if blob.content.isEmpty) yield blob.name  | 
| 
60916
 
a6e2a667b0a8
resolve undefined blobs by default, e.g. relevant for ML debugger to avoid reset of breakpoints after reload;
 
wenzelm 
parents: 
60215 
diff
changeset
 | 
534  | 
|
| 
57842
 
8e4ae2db1849
more direct access to persistent blobs (see also 8953d4cc060a), avoiding fragile digest lookup from later version (which might have removed unused blobs already);
 
wenzelm 
parents: 
57615 
diff
changeset
 | 
535  | 
def blobs_defined: List[(Document.Node.Name, SHA1.Digest)] =  | 
| 72745 | 536  | 
for (Exn.Res(blob) <- blobs; (digest, _) <- blob.content) yield (blob.name, digest)  | 
| 
57842
 
8e4ae2db1849
more direct access to persistent blobs (see also 8953d4cc060a), avoiding fragile digest lookup from later version (which might have removed unused blobs already);
 
wenzelm 
parents: 
57615 
diff
changeset
 | 
537  | 
|
| 
 
8e4ae2db1849
more direct access to persistent blobs (see also 8953d4cc060a), avoiding fragile digest lookup from later version (which might have removed unused blobs already);
 
wenzelm 
parents: 
57615 
diff
changeset
 | 
538  | 
def blobs_changed(doc_blobs: Document.Blobs): Boolean =  | 
| 72745 | 539  | 
    blobs.exists({ case Exn.Res(blob) => doc_blobs.changed(blob.name) case _ => false })
 | 
| 
54519
 
5fed81762406
maintain blobs within document state: digest + text in ML, digest-only in Scala;
 
wenzelm 
parents: 
54517 
diff
changeset
 | 
540  | 
|
| 
55432
 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 
wenzelm 
parents: 
55431 
diff
changeset
 | 
541  | 
|
| 
56462
 
b64b0cb845fe
more explicit Command.Chunk types, less ooddities;
 
wenzelm 
parents: 
56395 
diff
changeset
 | 
542  | 
/* source chunks */  | 
| 
55431
 
e0f20a44ff9d
common Command.Chunk for command source and auxiliary files (static Symbol.Index without actual String content);
 
wenzelm 
parents: 
55430 
diff
changeset
 | 
543  | 
|
| 56746 | 544  | 
val chunk: Symbol.Text_Chunk = Symbol.Text_Chunk(source)  | 
| 56473 | 545  | 
|
| 56746 | 546  | 
val chunks: Map[Symbol.Text_Chunk.Name, Symbol.Text_Chunk] =  | 
547  | 
((Symbol.Text_Chunk.Default -> chunk) ::  | 
|
| 72745 | 548  | 
(for (Exn.Res(blob) <- blobs; (_, file) <- blob.content)  | 
| 
72816
 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 
wenzelm 
parents: 
72814 
diff
changeset
 | 
549  | 
yield blob.chunk_file -> file)).toMap  | 
| 56473 | 550  | 
|
| 46813 | 551  | 
def length: Int = source.length  | 
| 56473 | 552  | 
def range: Text.Range = chunk.range  | 
| 46813 | 553  | 
|
| 68728 | 554  | 
val core_range: Text.Range =  | 
| 
57901
 
e1abca2527da
more explicit type Span in Scala, according to ML version;
 
wenzelm 
parents: 
57842 
diff
changeset
 | 
555  | 
Text.Range(0,  | 
| 73359 | 556  | 
span.content.reverse.iterator.takeWhile(_.is_ignored).foldLeft(length)(_ - _.source.length))  | 
| 46813 | 557  | 
|
| 65522 | 558  | 
def source(range: Text.Range): String = range.substring(source)  | 
| 
38572
 
0fe2c01ef7da
Command.State: accumulate markup reports uniformly;
 
wenzelm 
parents: 
38564 
diff
changeset
 | 
559  | 
|
| 
38370
 
8b15d0f98962
explicit Document.State value, instead of individual state variables in Session, Command, Document;
 
wenzelm 
parents: 
38367 
diff
changeset
 | 
560  | 
|
| 72946 | 561  | 
/* theory parents */  | 
562  | 
||
563  | 
def theory_parents(resources: Resources): List[Document.Node.Name] =  | 
|
564  | 
    if (span.name == Thy_Header.THEORY) {
 | 
|
565  | 
      try {
 | 
|
566  | 
val header = Thy_Header.read(node_name, span.content_reader)  | 
|
567  | 
for ((s, _) <- header.imports)  | 
|
568  | 
        yield {
 | 
|
569  | 
          try { resources.import_name(node_name, s) }
 | 
|
570  | 
          catch { case ERROR(_) => Document.Node.Name.empty }
 | 
|
571  | 
}  | 
|
572  | 
}  | 
|
573  | 
      catch { case ERROR(_) => Nil }
 | 
|
574  | 
}  | 
|
575  | 
else Nil  | 
|
576  | 
||
577  | 
||
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
578  | 
/* reported positions */  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
579  | 
|
| 75393 | 580  | 
def reported_position(  | 
581  | 
pos: Position.T  | 
|
582  | 
  ) : Option[(Document_ID.Generic, Symbol.Text_Chunk.Name, Option[Symbol.Range])] = {
 | 
|
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
583  | 
    pos match {
 | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
584  | 
case Position.Id(id) =>  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
585  | 
val chunk_name =  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
586  | 
          pos match {
 | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
587  | 
case Position.File(name) if name != node_name.node =>  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
588  | 
Symbol.Text_Chunk.File(name)  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
589  | 
case _ => Symbol.Text_Chunk.Default  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
590  | 
}  | 
| 
72826
 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 
wenzelm 
parents: 
72824 
diff
changeset
 | 
591  | 
Some((id, chunk_name, Position.Range.unapply(pos)))  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
592  | 
case _ => None  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
593  | 
}  | 
| 
72826
 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 
wenzelm 
parents: 
72824 
diff
changeset
 | 
594  | 
}  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
595  | 
|
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
596  | 
def message_positions(  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
597  | 
self_id: Document_ID.Generic => Boolean,  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
598  | 
chunk_name: Symbol.Text_Chunk.Name,  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
599  | 
chunk: Symbol.Text_Chunk,  | 
| 75393 | 600  | 
message: XML.Elem  | 
601  | 
  ): Set[Text.Range] = {
 | 
|
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
602  | 
def elem(props: Properties.T, set: Set[Text.Range]): Set[Text.Range] =  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
603  | 
      reported_position(props) match {
 | 
| 
72826
 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 
wenzelm 
parents: 
72824 
diff
changeset
 | 
604  | 
case Some((id, name, reported_range)) if self_id(id) && name == chunk_name =>  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
605  | 
val opt_range =  | 
| 
72826
 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 
wenzelm 
parents: 
72824 
diff
changeset
 | 
606  | 
            reported_range orElse {
 | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
607  | 
if (name == Symbol.Text_Chunk.Default)  | 
| 
73115
 
a8e5d7c9a834
discontinued odd absolute position (amending 85bcdd05c6d0, 1975f397eabb): it violates translation invariance of commands and may lead to redundant re-checking of PIDE document;
 
wenzelm 
parents: 
73031 
diff
changeset
 | 
608  | 
Position.Range.unapply(span.position)  | 
| 
72692
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
609  | 
else None  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
610  | 
}  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
611  | 
          opt_range match {
 | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
612  | 
case Some(symbol_range) =>  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
613  | 
              chunk.incorporate(symbol_range) match {
 | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
614  | 
case Some(range) => set + range  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
615  | 
case _ => set  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
616  | 
}  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
617  | 
case None => set  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
618  | 
}  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
619  | 
case _ => set  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
620  | 
}  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
621  | 
def tree(set: Set[Text.Range], t: XML.Tree): Set[Text.Range] =  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
622  | 
      t match {
 | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
623  | 
case XML.Wrapped_Elem(Markup(name, props), _, body) =>  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
624  | 
body.foldLeft(if (Rendering.position_elements(name)) elem(props, set) else set)(tree)  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
625  | 
case XML.Elem(Markup(name, props), body) =>  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
626  | 
body.foldLeft(if (Rendering.position_elements(name)) elem(props, set) else set)(tree)  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
627  | 
case XML.Text(_) => set  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
628  | 
}  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
629  | 
|
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
630  | 
val set = tree(Set.empty, message)  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
631  | 
if (set.isEmpty) elem(message.markup.properties, set)  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
632  | 
else set  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
633  | 
}  | 
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
634  | 
|
| 
 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 
wenzelm 
parents: 
70780 
diff
changeset
 | 
635  | 
|
| 
38370
 
8b15d0f98962
explicit Document.State value, instead of individual state variables in Session, Command, Document;
 
wenzelm 
parents: 
38367 
diff
changeset
 | 
636  | 
/* accumulated results */  | 
| 
 
8b15d0f98962
explicit Document.State value, instead of individual state variables in Session, Command, Document;
 
wenzelm 
parents: 
38367 
diff
changeset
 | 
637  | 
|
| 
50501
 
6f41f1646617
more careful handling of Dialog_Result, with active area and color feedback;
 
wenzelm 
parents: 
50500 
diff
changeset
 | 
638  | 
val init_state: Command.State =  | 
| 
72722
 
ade53fbc6f03
clarified signature: initial markup is_empty, not init_markup;
 
wenzelm 
parents: 
72709 
diff
changeset
 | 
639  | 
Command.State(this, results = init_results, markups = init_markups)  | 
| 
52527
 
dbac84eab3bc
separate exec_id assignment for Command.print states, without affecting result of eval;
 
wenzelm 
parents: 
52524 
diff
changeset
 | 
640  | 
|
| 
 
dbac84eab3bc
separate exec_id assignment for Command.print states, without affecting result of eval;
 
wenzelm 
parents: 
52524 
diff
changeset
 | 
641  | 
val empty_state: Command.State = Command.State(this)  | 
| 
34676
 
9e725d34df7b
Command and Command_State handle results from prover as Accumulator
 
immler@in.tum.de 
parents: 
34675 
diff
changeset
 | 
642  | 
}  |