src/Pure/Tools/build.scala
changeset 59367 6193bbbbe564
parent 59366 e94df7f6b608
child 59369 7090199d3f78
equal deleted inserted replaced
59366:e94df7f6b608 59367:6193bbbbe564
  1027   }
  1027   }
  1028 
  1028 
  1029 
  1029 
  1030   /* PIDE protocol */
  1030   /* PIDE protocol */
  1031 
  1031 
  1032   val handler_name = "isabelle.Build$Handler"
       
  1033 
       
  1034   def build_theories(
  1032   def build_theories(
  1035     session: Session, master_dir: Path, theories: List[(Options, List[Path])]): Promise[Boolean] =
  1033     session: Session, master_dir: Path, theories: List[(Options, List[Path])]): Promise[Boolean] =
  1036       session.get_protocol_handler(handler_name) match {
  1034       session.get_protocol_handler(classOf[Handler].getName) match {
  1037         case Some(handler: Handler) => handler.build_theories(session, master_dir, theories)
  1035         case Some(handler: Handler) => handler.build_theories(session, master_dir, theories)
  1038         case _ => error("Cannot invoke build_theories: bad protocol handler")
  1036         case _ => error("Cannot invoke build_theories: bad protocol handler")
  1039       }
  1037       }
  1040 
  1038 
  1041   class Handler extends Session.Protocol_Handler
  1039   class Handler(progress: Progress, session_name: String) extends Session.Protocol_Handler
  1042   {
  1040   {
  1043     private val pending = Synchronized(Map.empty[String, Promise[Boolean]])
  1041     private val pending = Synchronized(Map.empty[String, Promise[Boolean]])
  1044 
  1042 
  1045     def build_theories(
  1043     def build_theories(
  1046       session: Session, master_dir: Path, theories: List[(Options, List[Path])]): Promise[Boolean] =
  1044       session: Session, master_dir: Path, theories: List[(Options, List[Path])]): Promise[Boolean] =
  1049       val id = Document_ID.make().toString
  1047       val id = Document_ID.make().toString
  1050       pending.change(promises => promises + (id -> promise))
  1048       pending.change(promises => promises + (id -> promise))
  1051       session.build_theories(id, master_dir, theories)
  1049       session.build_theories(id, master_dir, theories)
  1052       promise
  1050       promise
  1053     }
  1051     }
       
  1052 
       
  1053     private def loading_theory(prover: Prover, msg: Prover.Protocol_Output): Boolean =
       
  1054       msg.properties match {
       
  1055         case Markup.Loading_Theory(name) => progress.theory(session_name, name); true
       
  1056         case _ => false
       
  1057       }
  1054 
  1058 
  1055     private def build_theories_result(prover: Prover, msg: Prover.Protocol_Output): Boolean =
  1059     private def build_theories_result(prover: Prover, msg: Prover.Protocol_Output): Boolean =
  1056       msg.properties match {
  1060       msg.properties match {
  1057         case Markup.Build_Theories_Result(id, ok) =>
  1061         case Markup.Build_Theories_Result(id, ok) =>
  1058           pending.change_result(promises =>
  1062           pending.change_result(promises =>
  1064       }
  1068       }
  1065 
  1069 
  1066     override def stop(prover: Prover): Unit =
  1070     override def stop(prover: Prover): Unit =
  1067       pending.change(promises => { for ((_, promise) <- promises) promise.cancel; Map.empty })
  1071       pending.change(promises => { for ((_, promise) <- promises) promise.cancel; Map.empty })
  1068 
  1072 
  1069     val functions = Map(Markup.BUILD_THEORIES_RESULT -> build_theories_result _)
  1073     val functions =
       
  1074       Map(
       
  1075         Markup.BUILD_THEORIES_RESULT -> build_theories_result _,
       
  1076         Markup.LOADING_THEORY -> loading_theory _)
  1070   }
  1077   }
  1071 }
  1078 }
  1072 
  1079