| author | wenzelm | 
| Thu, 08 Dec 2022 22:38:03 +0100 | |
| changeset 76610 | 6e2383488a55 | 
| parent 76473 | b45db8030794 | 
| child 76663 | b7546c25e4f0 | 
| 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: 
34865diff
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: 
59699diff
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: 
72816diff
changeset | 19 | val bytes = Bytes.read(name.path) | 
| 
1c378ab75d48
clarified signature, notably access to blob files;
 wenzelm parents: 
72816diff
changeset | 20 | val chunk = Symbol.Text_Chunk(bytes.text) | 
| 
1c378ab75d48
clarified signature, notably access to blob files;
 wenzelm parents: 
72816diff
changeset | 21 | Blob(name, src_path, Some((bytes.sha1_digest, chunk))) | 
| 
1c378ab75d48
clarified signature, notably access to blob files;
 wenzelm parents: 
72816diff
changeset | 22 | } | 
| 
1c378ab75d48
clarified signature, notably access to blob files;
 wenzelm parents: 
72816diff
changeset | 23 | } | 
| 
1c378ab75d48
clarified signature, notably access to blob files;
 wenzelm parents: 
72816diff
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: 
72745diff
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: 
72816diff
changeset | 31 | |
| 72816 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 32 | def chunk_file: Symbol.Text_Chunk.File = | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 33 | Symbol.Text_Chunk.File(name.node) | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
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: 
56359diff
changeset | 64 | def iterator: Iterator[Results.Entry] = rep.iterator | 
| 50508 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 wenzelm parents: 
50507diff
changeset | 65 | |
| 51496 
cb677987b7e3
retain original tooltip range, to avoid repeated window popup when the mouse is moved over the same content;
 wenzelm parents: 
51494diff
changeset | 66 | def + (entry: Results.Entry): Results = | 
| 50508 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 wenzelm parents: 
50507diff
changeset | 67 | if (defined(entry._1)) this | 
| 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 wenzelm parents: 
50507diff
changeset | 68 | else new Results(rep + entry) | 
| 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 wenzelm parents: 
50507diff
changeset | 69 | |
| 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 wenzelm parents: 
50507diff
changeset | 70 | def ++ (other: Results): Results = | 
| 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 wenzelm parents: 
50507diff
changeset | 71 | if (this eq other) this | 
| 
5b7150395568
tuned implementation according to Library.insert/merge in ML;
 wenzelm parents: 
50507diff
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: 
56359diff
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: 
55648diff
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: 
72814diff
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: 
55648diff
changeset | 122 | } | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
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: 
55648diff
changeset | 125 | |
| 75393 | 126 |   object Markups {
 | 
| 72848 
d5d0e36eda16
read theory with PIDE markup from session database;
 wenzelm parents: 
72846diff
changeset | 127 | type Entry = (Markup_Index, Markup_Tree) | 
| 55649 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
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: 
55648diff
changeset | 134 | } | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
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: 
55648diff
changeset | 139 | def apply(index: Markup_Index): Markup_Tree = | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 140 | rep.getOrElse(index, Markup_Tree.empty) | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 141 | |
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
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: 
55648diff
changeset | 143 | new Markups(rep + (index -> (this(index) + markup))) | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
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: 
56469diff
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: 
56469diff
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: 
56469diff
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: 
56469diff
changeset | 167 | |
| 55649 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 168 | override def hashCode: Int = rep.hashCode | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 169 | override def equals(that: Any): Boolean = | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 170 |       that match {
 | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 171 | case other: Markups => rep == other.rep | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 172 | case _ => false | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 173 | } | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 174 |     override def toString: String = rep.iterator.mkString("Markups(", ", ", ")")
 | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 175 | } | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 176 | |
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 177 | |
| 50507 | 178 | /* state */ | 
| 50501 
6f41f1646617
more careful handling of Dialog_Result, with active area and color feedback;
 wenzelm parents: 
50500diff
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: 
67446diff
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: 
67446diff
changeset | 183 | |
| 
661cd25304ae
more compact markup tree: output messages are already stored in command results (e.g. relevant for  XML data representation);
 wenzelm parents: 
67446diff
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: 
67446diff
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: 
67446diff
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: 
67446diff
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: 
56295diff
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: 
56295diff
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: 
56299diff
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: 
56299diff
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: 
56295diff
changeset | 207 | } | 
| 
8201790fdeb9
more careful treatment of multiple command states (eval + prints): merge content that is actually required;
 wenzelm parents: 
56295diff
changeset | 208 | |
| 43714 | 209 | sealed case class State( | 
| 50501 
6f41f1646617
more careful handling of Dialog_Result, with active area and color feedback;
 wenzelm parents: 
50500diff
changeset | 210 | command: Command, | 
| 
6f41f1646617
more careful handling of Dialog_Result, with active area and color feedback;
 wenzelm parents: 
50500diff
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 |   ) {
 | |
| 76473 | 216 | lazy val initialized: Boolean = status.exists(markup => markup.name == Markup.INITIALIZED) | 
| 217 | lazy val consolidating: Boolean = status.exists(markup => markup.name == Markup.CONSOLIDATING) | |
| 218 | lazy val 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: 
65522diff
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: 
68335diff
changeset | 235 | |
| 75393 | 236 |     lazy val document_status: Document_Status.Command_Status = {
 | 
| 56395 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 wenzelm parents: 
56372diff
changeset | 237 | val warnings = | 
| 59203 
5f0bd5afc16d
explicit message channel for "legacy", which is nonetheless a variant of "warning";
 wenzelm parents: 
59072diff
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: 
56372diff
changeset | 239 | List(Markup(Markup.WARNING, Nil)) | 
| 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 wenzelm parents: 
56372diff
changeset | 240 | else Nil | 
| 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 wenzelm parents: 
56372diff
changeset | 241 | val errors = | 
| 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 wenzelm parents: 
56372diff
changeset | 242 | if (results.iterator.exists(p => Protocol.is_error(p._2))) | 
| 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 wenzelm parents: 
56372diff
changeset | 243 | List(Markup(Markup.ERROR, Nil)) | 
| 
0546e036d1c0
more direct warning within persistent Protocol.Status;
 wenzelm parents: 
56372diff
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: 
56372diff
changeset | 246 | } | 
| 55432 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 wenzelm parents: 
55431diff
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: 
55431diff
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: 
55648diff
changeset | 256 | private def add_status(st: Markup): State = | 
| 
1532ab0dc67b
more general / abstract Command.Markups, with separate index for status elements;
 wenzelm parents: 
55648diff
changeset | 257 | copy(status = st :: status) | 
| 55432 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 wenzelm parents: 
55431diff
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: 
55648diff
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: 
56395diff
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: 
55648diff
changeset | 274 | else markups | 
| 56462 
b64b0cb845fe
more explicit Command.Chunk types, less ooddities;
 wenzelm parents: 
56395diff
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: 
55648diff
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: 
56469diff
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: 
56469diff
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: 
72962diff
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: 
50163diff
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: 
70780diff
changeset | 286 | if (command.span.is_theory) this | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
70780diff
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: 
38579diff
changeset | 301 | |
| 72709 
cb9d5af781b4
more complete report positions, notably for command 'back' (amending eca176f773e0);
 wenzelm parents: 
72708diff
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: 
56746diff
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: 
55431diff
changeset | 306 | |
| 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 wenzelm parents: 
55431diff
changeset | 307 |               msg match {
 | 
| 72826 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 wenzelm parents: 
72824diff
changeset | 308 | case XML.Elem(Markup(name, atts), args) => | 
| 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 wenzelm parents: 
72824diff
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: 
72824diff
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: 
70780diff
changeset | 311 | val target = | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
70780diff
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: 
70780diff
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: 
56469diff
changeset | 317 | |
| 72826 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 wenzelm parents: 
72824diff
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: 
72827diff
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: 
72827diff
changeset | 320 | if !symbol_range.is_singularity => | 
| 72692 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 321 |                           target_chunk.incorporate(symbol_range) match {
 | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
72962diff
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: 
70780diff
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: 
70780diff
changeset | 326 | case None => bad(); state | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 327 | } | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 328 | case _ => | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 329 | // silently ignore excessive reports | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 330 | state | 
| 55432 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 wenzelm parents: 
55431diff
changeset | 331 | } | 
| 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 wenzelm parents: 
55431diff
changeset | 332 | |
| 72692 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 333 | case _ => bad(); state | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 334 | } | 
| 56470 
8eda56033203
accumulate markup reports for "other" command ids, which are later retargeted and merged for rendering (in erratic order);
 wenzelm parents: 
56469diff
changeset | 335 | case _ => bad(); state | 
| 55432 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 wenzelm parents: 
55431diff
changeset | 336 | } | 
| 73359 | 337 | } | 
| 72692 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 338 | |
| 52930 
5fab62ae3532
retain original messages properties, e.g. for retrieval via Command.Results;
 wenzelm parents: 
52849diff
changeset | 339 | case XML.Elem(Markup(name, props), body) => | 
| 
5fab62ae3532
retain original messages properties, e.g. for retrieval via Command.Results;
 wenzelm parents: 
52849diff
changeset | 340 |           props match {
 | 
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
50163diff
changeset | 341 | case Markup.Serial(i) => | 
| 67825 | 342 | val markup_message = | 
| 76022 | 343 | cache.elem(Protocol.make_message(body, kind = name, props = props)) | 
| 67825 | 344 | val message_markup = | 
| 73031 
f93f0597f4fb
clarified signature: absorb XZ.Cache into XML.Cache;
 wenzelm parents: 
72962diff
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: 
50158diff
changeset | 346 | |
| 67826 | 347 | var st = add_result(i -> markup_message) | 
| 55433 
d2960d67f163
clarified message_positions: cover alt_id as well;
 wenzelm parents: 
55432diff
changeset | 348 |               if (Protocol.is_inlined(message)) {
 | 
| 
d2960d67f163
clarified message_positions: cover alt_id as well;
 wenzelm parents: 
55432diff
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: 
70780diff
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: 
67446diff
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: 
55432diff
changeset | 353 | } | 
| 
d2960d67f163
clarified message_positions: cover alt_id as well;
 wenzelm parents: 
55432diff
changeset | 354 | st | 
| 55432 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 wenzelm parents: 
55431diff
changeset | 355 | |
| 52536 | 356 | case _ => | 
| 56782 
433cf57550fa
more systematic Isabelle output, like in classic Isabelle/ML (without markup);
 wenzelm parents: 
56746diff
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: 
55430diff
changeset | 364 | |
| 
e0f20a44ff9d
common Command.Chunk for command source and auxiliary files (static Symbol.Index without actual String content);
 wenzelm parents: 
55430diff
changeset | 365 | /** static content **/ | 
| 
e0f20a44ff9d
common Command.Chunk for command source and auxiliary files (static Symbol.Index without actual String content);
 wenzelm parents: 
55430diff
changeset | 366 | |
| 45644 | 367 | /* make commands */ | 
| 368 | ||
| 55648 
38f264741609
tuned signature -- avoid obscure default arguments;
 wenzelm parents: 
55622diff
changeset | 369 | def apply( | 
| 
38f264741609
tuned signature -- avoid obscure default arguments;
 wenzelm parents: 
55622diff
changeset | 370 | id: Document_ID.Command, | 
| 
38f264741609
tuned signature -- avoid obscure default arguments;
 wenzelm parents: 
55622diff
changeset | 371 | node_name: Document.Node.Name, | 
| 59702 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 wenzelm parents: 
59699diff
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: 
57842diff
changeset | 375 | val (source, span1) = span.compact_source | 
| 72722 
ade53fbc6f03
clarified signature: initial markup is_empty, not init_markup;
 wenzelm parents: 
72709diff
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: 
55622diff
changeset | 377 | } | 
| 49414 | 378 | |
| 57901 
e1abca2527da
more explicit type Span in Scala, according to ML version;
 wenzelm parents: 
57842diff
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: 
55622diff
changeset | 381 | |
| 
38f264741609
tuned signature -- avoid obscure default arguments;
 wenzelm parents: 
55622diff
changeset | 382 | def unparsed( | 
| 
38f264741609
tuned signature -- avoid obscure default arguments;
 wenzelm parents: 
55622diff
changeset | 383 | source: String, | 
| 72692 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 384 | theory: Boolean = false, | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
70780diff
changeset | 386 | node_name: Document.Node.Name = Document.Node.Name.empty, | 
| 72816 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
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: 
70780diff
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: 
70780diff
changeset | 391 | val (source1, span1) = Command_Span.unparsed(source, theory).compact_source | 
| 72816 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 392 | new Command(id, node_name, blobs_info, span1, source1, results, markups) | 
| 55648 
38f264741609
tuned signature -- avoid obscure default arguments;
 wenzelm parents: 
55622diff
changeset | 393 | } | 
| 49414 | 394 | |
| 72692 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
52527diff
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: 
72709diff
changeset | 398 | unparsed(XML.content(body), id = id, results = results, | 
| 
ade53fbc6f03
clarified signature: initial markup is_empty, not init_markup;
 wenzelm parents: 
72709diff
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: 
49037diff
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: 
44384diff
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: 
56782diff
changeset | 413 | def is_empty: Boolean = commands.isEmpty | 
| 
df1b3452d71c
more explicit discrimination of empty nodes -- suppress from Theories panel;
 wenzelm parents: 
56782diff
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: 
73115diff
changeset | 418 | require(!cmds1.exists(_.is_undefined), "cmds1 not defined") | 
| 
c3589f2dff31
more informative errors: simplify diagnosis of spurious failures reported by users;
 wenzelm parents: 
73115diff
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: 
44384diff
changeset | 423 | } | 
| 59689 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 wenzelm parents: 
59684diff
changeset | 424 | |
| 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 wenzelm parents: 
59684diff
changeset | 425 | |
| 59702 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 wenzelm parents: 
59699diff
changeset | 426 | /* blobs: inlined errors and auxiliary files */ | 
| 59689 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 wenzelm parents: 
59684diff
changeset | 427 | |
| 59702 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 wenzelm parents: 
59699diff
changeset | 428 | def blobs_info( | 
| 59699 | 429 | resources: Resources, | 
| 63584 
68751fe1c036
tuned signature -- prover-independence is presently theoretical;
 wenzelm parents: 
62969diff
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: 
59699diff
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: 
59699diff
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: 
72747diff
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: 
69891diff
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: 
69891diff
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: 
70638diff
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: 
59706diff
changeset | 457 | } | 
| 72814 | 458 | Blobs_Info.errors(errors) | 
| 59702 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 wenzelm parents: 
59699diff
changeset | 459 | |
| 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 wenzelm parents: 
59699diff
changeset | 460 | // auxiliary files | 
| 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 wenzelm parents: 
59699diff
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: 
59699diff
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: 
59699diff
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: 
72745diff
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: 
72745diff
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: 
72745diff
changeset | 469 | Blob(name, src_path, content) | 
| 59702 
58dfaa369c11
hybrid use of command blobs: inlined errors and auxiliary files;
 wenzelm parents: 
59699diff
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: 
59699diff
changeset | 472 | } | 
| 59689 
7968c57ea240
simplified Command.resolve_files in ML, using blobs_index from Scala;
 wenzelm parents: 
59684diff
changeset | 473 | } | 
| 72816 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 474 | |
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 475 | def build_blobs_info( | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 476 | syntax: Outer_Syntax, | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
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: 
72814diff
changeset | 480 | val blobs = | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 481 |       for {
 | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 482 | span <- load_commands | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 483 | file <- span.loaded_files(syntax).files | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 484 |       } yield {
 | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 485 |         (Exn.capture {
 | 
| 72817 
1c378ab75d48
clarified signature, notably access to blob files;
 wenzelm parents: 
72816diff
changeset | 486 | val dir = node_name.master_dir_path | 
| 72816 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 487 | val src_path = Path.explode(file) | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 488 | val name = Document.Node.Name((dir + src_path).expand.implode_symbolic) | 
| 72817 
1c378ab75d48
clarified signature, notably access to blob files;
 wenzelm parents: 
72816diff
changeset | 489 | Blob.read_file(name, src_path) | 
| 72816 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 490 | }).user_error | 
| 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
changeset | 491 | } | 
| 72846 | 492 | Blobs_Info(blobs) | 
| 72816 
ea4f86914cb2
support for PIDE markup for auxiliary files ("blobs");
 wenzelm parents: 
72814diff
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: 
57904diff
changeset | 511 | def is_proper: Boolean = span.kind.isInstanceOf[Command_Span.Command_Span] | 
| 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 wenzelm parents: 
57904diff
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: 
54517diff
changeset | 521 | /* blobs */ | 
| 
5fed81762406
maintain blobs within document state: digest + text in ML, digest-only in Scala;
 wenzelm parents: 
54517diff
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: 
59699diff
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: 
54524diff
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: 
54524diff
changeset | 531 | |
| 60916 
a6e2a667b0a8
resolve undefined blobs by default, e.g. relevant for ML debugger to avoid reset of breakpoints after reload;
 wenzelm parents: 
60215diff
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: 
60215diff
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: 
57615diff
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: 
57615diff
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: 
57615diff
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: 
54517diff
changeset | 540 | |
| 55432 
9c53198dbb1c
maintain multiple command chunks and markup trees: for main chunk and loaded files;
 wenzelm parents: 
55431diff
changeset | 541 | |
| 56462 
b64b0cb845fe
more explicit Command.Chunk types, less ooddities;
 wenzelm parents: 
56395diff
changeset | 542 | /* source chunks */ | 
| 55431 
e0f20a44ff9d
common Command.Chunk for command source and auxiliary files (static Symbol.Index without actual String content);
 wenzelm parents: 
55430diff
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: 
72814diff
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: 
57842diff
changeset | 555 | Text.Range(0, | 
| 76234 | 556 | span.content.reverseIterator.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: 
38564diff
changeset | 559 | |
| 38370 
8b15d0f98962
explicit Document.State value, instead of individual state variables in Session, Command, Document;
 wenzelm parents: 
38367diff
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: 
70780diff
changeset | 578 | /* reported positions */ | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
70780diff
changeset | 583 |     pos match {
 | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 584 | case Position.Id(id) => | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 585 | val chunk_name = | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 586 |           pos match {
 | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
70780diff
changeset | 588 | Symbol.Text_Chunk.File(name) | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 589 | case _ => Symbol.Text_Chunk.Default | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 590 | } | 
| 72826 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 wenzelm parents: 
72824diff
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: 
70780diff
changeset | 592 | case _ => None | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 593 | } | 
| 72826 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 wenzelm parents: 
72824diff
changeset | 594 | } | 
| 72692 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 595 | |
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 596 | def message_positions( | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 597 | self_id: Document_ID.Generic => Boolean, | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 598 | chunk_name: Symbol.Text_Chunk.Name, | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
70780diff
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: 
70780diff
changeset | 603 |       reported_position(props) match {
 | 
| 72826 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 wenzelm parents: 
72824diff
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: 
70780diff
changeset | 605 | val opt_range = | 
| 72826 
fa5d8f486380
proper treatment of singleton Position.Offset within blob (amending cb9d5af781b4);
 wenzelm parents: 
72824diff
changeset | 606 |             reported_range orElse {
 | 
| 72692 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
73031diff
changeset | 608 | Position.Range.unapply(span.position) | 
| 72692 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 609 | else None | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 610 | } | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 611 |           opt_range match {
 | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 612 | case Some(symbol_range) => | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 613 |               chunk.incorporate(symbol_range) match {
 | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 614 | case Some(range) => set + range | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 615 | case _ => set | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 616 | } | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 617 | case None => set | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 618 | } | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 619 | case _ => set | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 620 | } | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
70780diff
changeset | 622 |       t match {
 | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
70780diff
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: 
70780diff
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: 
70780diff
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: 
70780diff
changeset | 627 | case XML.Text(_) => set | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 628 | } | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 629 | |
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 630 | val set = tree(Set.empty, message) | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
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: 
70780diff
changeset | 632 | else set | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 633 | } | 
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 634 | |
| 
22aeec526ffd
support for PIDE markup in batch build (inactive due to pide_reports=false);
 wenzelm parents: 
70780diff
changeset | 635 | |
| 38370 
8b15d0f98962
explicit Document.State value, instead of individual state variables in Session, Command, Document;
 wenzelm parents: 
38367diff
changeset | 636 | /* accumulated results */ | 
| 
8b15d0f98962
explicit Document.State value, instead of individual state variables in Session, Command, Document;
 wenzelm parents: 
38367diff
changeset | 637 | |
| 50501 
6f41f1646617
more careful handling of Dialog_Result, with active area and color feedback;
 wenzelm parents: 
50500diff
changeset | 638 | val init_state: Command.State = | 
| 72722 
ade53fbc6f03
clarified signature: initial markup is_empty, not init_markup;
 wenzelm parents: 
72709diff
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: 
52524diff
changeset | 640 | |
| 
dbac84eab3bc
separate exec_id assignment for Command.print states, without affecting result of eval;
 wenzelm parents: 
52524diff
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: 
34675diff
changeset | 642 | } |