src/Pure/Thy/sessions.scala
changeset 65461 b6c2e30dc018
parent 65457 2bf0d2fcd506
child 65463 104502de757c
equal deleted inserted replaced
65460:fe4cf0de13cb 65461:b6c2e30dc018
     4 Cumulative session information.
     4 Cumulative session information.
     5 */
     5 */
     6 
     6 
     7 package isabelle
     7 package isabelle
     8 
     8 
       
     9 import java.io.{File => JFile}
     9 import java.nio.ByteBuffer
    10 import java.nio.ByteBuffer
    10 import java.nio.channels.FileChannel
    11 import java.nio.channels.FileChannel
    11 import java.nio.file.StandardOpenOption
    12 import java.nio.file.StandardOpenOption
    12 import java.sql.PreparedStatement
    13 import java.sql.PreparedStatement
    13 
    14 
    29 
    30 
    30     lazy val bootstrap: Base =
    31     lazy val bootstrap: Base =
    31       Base(keywords = Thy_Header.bootstrap_header, syntax = Thy_Header.bootstrap_syntax)
    32       Base(keywords = Thy_Header.bootstrap_header, syntax = Thy_Header.bootstrap_syntax)
    32 
    33 
    33     private[Sessions] def known_theories(bases: Iterable[Base], names: Iterable[Document.Node.Name])
    34     private[Sessions] def known_theories(bases: Iterable[Base], names: Iterable[Document.Node.Name])
    34       : Map[String, Document.Node.Name] =
    35       : (Map[String, Document.Node.Name], Map[JFile, List[Document.Node.Name]]) =
    35     {
    36     {
    36       val bases_iterator =
    37       def bases_iterator =
    37         for { base <- bases.iterator; (_, name) <- base.known_theories.iterator }
    38         for { base <- bases.iterator; (_, name) <- base.known_theories.iterator }
    38           yield name
    39           yield name
    39 
    40 
    40       (Map.empty[String, Document.Node.Name] /: (bases_iterator ++ names.iterator))({
    41       val known_theories =
    41         case (known, name) =>
    42         (Map.empty[String, Document.Node.Name] /: (bases_iterator ++ names.iterator))({
    42           known.get(name.theory) match {
    43           case (known, name) =>
    43             case Some(name1) if name != name1 =>
    44             known.get(name.theory) match {
    44               error("Duplicate theory " + quote(name.node) + " vs. " + quote(name1.node))
    45               case Some(name1) if name != name1 =>
    45             case _ => known + (name.theory -> name)
    46                 error("Duplicate theory " + quote(name.node) + " vs. " + quote(name1.node))
    46           }
    47               case _ => known + (name.theory -> name)
       
    48             }
       
    49           })
       
    50       val known_files =
       
    51         (Map.empty[JFile, List[Document.Node.Name]] /: (bases_iterator ++ names.iterator))({
       
    52           case (known, name) =>
       
    53             val file = Path.explode(name.node).file.getCanonicalFile
       
    54             val names1 = known.getOrElse(file, Nil)
       
    55             if (names1.exists(name1 => name.node == name1.node && name.theory == name1.theory))
       
    56               known
       
    57             else known + (file -> (name :: names1))
    47         })
    58         })
       
    59       (known_theories, known_files)
    48     }
    60     }
    49   }
    61   }
    50 
    62 
    51   sealed case class Base(
    63   sealed case class Base(
    52     global_theories: Map[String, String] = Map.empty,
    64     global_theories: Map[String, String] = Map.empty,
    53     loaded_theories: Map[String, Document.Node.Name] = Map.empty,
    65     loaded_theories: Map[String, Document.Node.Name] = Map.empty,
    54     known_theories: Map[String, Document.Node.Name] = Map.empty,
    66     known_theories: Map[String, Document.Node.Name] = Map.empty,
       
    67     known_files: Map[JFile, List[Document.Node.Name]] = Multi_Map.empty,
    55     keywords: Thy_Header.Keywords = Nil,
    68     keywords: Thy_Header.Keywords = Nil,
    56     syntax: Outer_Syntax = Outer_Syntax.empty,
    69     syntax: Outer_Syntax = Outer_Syntax.empty,
    57     sources: List[(Path, SHA1.Digest)] = Nil,
    70     sources: List[(Path, SHA1.Digest)] = Nil,
    58     session_graph: Graph_Display.Graph = Graph_Display.empty_graph)
    71     session_graph: Graph_Display.Graph = Graph_Display.empty_graph)
    59   {
    72   {
    73   {
    86   {
    74     def is_empty: Boolean = sessions.isEmpty
    87     def is_empty: Boolean = sessions.isEmpty
    75     def apply(name: String): Base = sessions(name)
    88     def apply(name: String): Base = sessions(name)
    76     def sources(name: String): List[SHA1.Digest] = sessions(name).sources.map(_._2)
    89     def sources(name: String): List[SHA1.Digest] = sessions(name).sources.map(_._2)
    77 
    90 
    78     def all_known_theories: Map[String, Document.Node.Name] =
    91     def all_known_theories: (Map[String, Document.Node.Name], Map[JFile, List[Document.Node.Name]]) =
    79       Base.known_theories(sessions.toList.map(_._2), Nil)
    92       Base.known_theories(sessions.toList.map(_._2), Nil)
    80   }
    93   }
    81 
    94 
    82   def deps(sessions: T,
    95   def deps(sessions: T,
    83       progress: Progress = No_Progress,
    96       progress: Progress = No_Progress,
   119             thy_deps.errors match {
   132             thy_deps.errors match {
   120               case Nil => thy_deps
   133               case Nil => thy_deps
   121               case errs => error(cat_lines(errs))
   134               case errs => error(cat_lines(errs))
   122             }
   135             }
   123           }
   136           }
       
   137 
       
   138           val (known_theories, known_files) =
       
   139             Base.known_theories(
       
   140               parent_base :: info.imports.map(sessions(_)), thy_deps.deps.map(_.name))
   124 
   141 
   125           val syntax = thy_deps.syntax
   142           val syntax = thy_deps.syntax
   126 
   143 
   127           val theory_files = thy_deps.deps.map(dep => Path.explode(dep.name.node))
   144           val theory_files = thy_deps.deps.map(dep => Path.explode(dep.name.node))
   128           val loaded_files =
   145           val loaded_files =
   152             Check_Keywords.check_keywords(progress, syntax.keywords, check_keywords, theory_files)
   169             Check_Keywords.check_keywords(progress, syntax.keywords, check_keywords, theory_files)
   153 
   170 
   154           val base =
   171           val base =
   155             Base(global_theories = global_theories,
   172             Base(global_theories = global_theories,
   156               loaded_theories = thy_deps.loaded_theories,
   173               loaded_theories = thy_deps.loaded_theories,
   157               known_theories =
   174               known_theories = known_theories,
   158                 Base.known_theories(
   175               known_files = known_files,
   159                   parent_base :: info.imports.map(sessions(_)), thy_deps.deps.map(_.name)),
       
   160               keywords = thy_deps.keywords,
   176               keywords = thy_deps.keywords,
   161               syntax = syntax,
   177               syntax = syntax,
   162               sources = all_files.map(p => (p, SHA1.digest(p.file))),
   178               sources = all_files.map(p => (p, SHA1.digest(p.file))),
   163               session_graph = thy_deps.session_graph(info.parent getOrElse "", parent_base))
   179               session_graph = thy_deps.session_graph(info.parent getOrElse "", parent_base))
   164 
   180 
   182     val global_theories = full_sessions.global_theories
   198     val global_theories = full_sessions.global_theories
   183     val selected_sessions = full_sessions.selection(Selection(sessions = List(session)))._2
   199     val selected_sessions = full_sessions.selection(Selection(sessions = List(session)))._2
   184 
   200 
   185     if (all_known_theories) {
   201     if (all_known_theories) {
   186       val deps = Sessions.deps(full_sessions, global_theories = global_theories)
   202       val deps = Sessions.deps(full_sessions, global_theories = global_theories)
   187       deps(session).copy(known_theories = deps.all_known_theories)
   203       val (known_theories, known_files) = deps.all_known_theories
       
   204       deps(session).copy(known_theories = known_theories, known_files = known_files)
   188     }
   205     }
   189     else
   206     else
   190       deps(selected_sessions, global_theories = global_theories)(session)
   207       deps(selected_sessions, global_theories = global_theories)(session)
   191   }
   208   }
   192 
   209