163 |
163 |
164 private case class Start(timeout: Time, args: List[String]) |
164 private case class Start(timeout: Time, args: List[String]) |
165 private case object Interrupt |
165 private case object Interrupt |
166 private case class Init_Node(name: String, header: Document.Node.Header, text: String) |
166 private case class Init_Node(name: String, header: Document.Node.Header, text: String) |
167 private case class Edit_Node(name: String, header: Document.Node.Header, edits: List[Text.Edit]) |
167 private case class Edit_Node(name: String, header: Document.Node.Header, edits: List[Text.Edit]) |
168 private case class Change_Node(name: String, header: Document.Node.Header, change: Document.Change) |
168 private case class Change_Node( |
|
169 name: String, |
|
170 doc_edits: List[Document.Edit_Command], |
|
171 header_edits: List[(String, Thy_Header.Header)], |
|
172 previous: Document.Version, |
|
173 version: Document.Version) |
169 |
174 |
170 private val (_, session_actor) = Simple_Thread.actor("session_actor", daemon = true) |
175 private val (_, session_actor) = Simple_Thread.actor("session_actor", daemon = true) |
171 { |
176 { |
172 val this_actor = self |
177 val this_actor = self |
173 var prover: Option[Isabelle_Process with Isar_Document] = None |
178 var prover: Option[Isabelle_Process with Isar_Document] = None |
180 //{{{ |
185 //{{{ |
181 { |
186 { |
182 val syntax = current_syntax() |
187 val syntax = current_syntax() |
183 val previous = global_state().history.tip.version |
188 val previous = global_state().history.tip.version |
184 val doc_edits = edits.map(edit => (name, edit)) |
189 val doc_edits = edits.map(edit => (name, edit)) |
185 val result = Future.fork { Thy_Syntax.text_edits(syntax, previous.join, doc_edits) } |
190 val result = Future.fork { |
186 val change = global_state.change_yield(_.extend_history(previous, doc_edits, result)) |
191 Thy_Syntax.text_edits(syntax, previous.join, doc_edits, List((name, header))) |
187 |
192 } |
188 change.version.map(_ => { |
193 val change = |
189 assignments.await { global_state().is_assigned(previous.get_finished) } |
194 global_state.change_yield(_.extend_history(previous, doc_edits, result.map(_._3))) |
190 this_actor ! Change_Node(name, header, change) }) |
195 |
|
196 result.map { |
|
197 case (doc_edits, header_edits, _) => |
|
198 assignments.await { global_state().is_assigned(previous.get_finished) } |
|
199 this_actor ! |
|
200 Change_Node(name, doc_edits, header_edits, previous.join, change.version.join) |
|
201 } |
191 } |
202 } |
192 //}}} |
203 //}}} |
193 |
204 |
194 |
205 |
195 /* resulting changes */ |
206 /* resulting changes */ |
196 |
207 |
197 def handle_change(name: String, header: Document.Node.Header, change: Document.Change) |
208 def handle_change(change: Change_Node) |
198 //{{{ |
209 //{{{ |
199 { |
210 { |
200 val previous = change.previous.get_finished |
211 val previous = change.previous |
201 val (node_edits, version) = change.result.get_finished |
212 val version = change.version |
|
213 val name = change.name |
|
214 val doc_edits = change.doc_edits |
|
215 val header_edits = change.header_edits |
202 |
216 |
203 var former_assignment = global_state().the_assignment(previous).get_finished |
217 var former_assignment = global_state().the_assignment(previous).get_finished |
204 for { |
218 for { |
205 (name, Some(cmd_edits)) <- node_edits |
219 (name, Some(cmd_edits)) <- doc_edits |
206 (prev, None) <- cmd_edits |
220 (prev, None) <- cmd_edits |
207 removed <- previous.nodes(name).commands.get_after(prev) |
221 removed <- previous.nodes(name).commands.get_after(prev) |
208 } former_assignment -= removed |
222 } former_assignment -= removed |
209 |
223 |
210 def id_command(command: Command): Document.Command_ID = |
224 def id_command(command: Command): Document.Command_ID = |
214 prover.get.define_command(command.id, Symbol.encode(command.source)) |
228 prover.get.define_command(command.id, Symbol.encode(command.source)) |
215 } |
229 } |
216 command.id |
230 command.id |
217 } |
231 } |
218 val id_edits = |
232 val id_edits = |
219 node_edits map { |
233 doc_edits map { |
220 case (name, edits) => |
234 case (name, edits) => |
221 val ids = |
235 val ids = |
222 edits.map(_.map { case (c1, c2) => (c1.map(id_command), c2.map(id_command)) }) |
236 edits.map(_.map { case (c1, c2) => (c1.map(id_command), c2.map(id_command)) }) |
223 (name, ids) |
237 (name, ids) |
224 } |
238 } |
|
239 |
225 global_state.change(_.define_version(version, former_assignment)) |
240 global_state.change(_.define_version(version, former_assignment)) |
226 prover.get.edit_version(previous.id, version.id, id_edits) |
241 prover.get.edit_version(previous.id, version.id, id_edits, header_edits) |
227 } |
242 } |
228 //}}} |
243 //}}} |
229 |
244 |
230 |
245 |
231 /* prover results */ |
246 /* prover results */ |
313 |
328 |
314 case Edit_Node(name, header, text_edits) if prover.isDefined => |
329 case Edit_Node(name, header, text_edits) if prover.isDefined => |
315 handle_edits(name, header, List(Some(text_edits))) |
330 handle_edits(name, header, List(Some(text_edits))) |
316 reply(()) |
331 reply(()) |
317 |
332 |
318 case Change_Node(name, header, change) if prover.isDefined => |
333 case change: Change_Node if prover.isDefined => |
319 handle_change(name, header, change) |
334 handle_change(change) |
320 |
335 |
321 case input: Isabelle_Process.Input => |
336 case input: Isabelle_Process.Input => |
322 raw_messages.event(input) |
337 raw_messages.event(input) |
323 |
338 |
324 case result: Isabelle_Process.Result => |
339 case result: Isabelle_Process.Result => |