src/Pure/System/session.scala
changeset 43722 9b5dadb0c28d
parent 43721 fad8634cee62
child 43746 a41f618c641d
equal deleted inserted replaced
43721:fad8634cee62 43722:9b5dadb0c28d
   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 =>