src/Pure/PIDE/document_info.scala
author wenzelm
Fri, 19 Aug 2022 20:07:41 +0200
changeset 75907 091edca12219
child 75910 529e4ac56904
permissions -rw-r--r--
clarified modules;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75907
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/PIDE/document_info.scala
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
     3
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
     4
Persistent document information --- for presentation purposes.
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
     6
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
     8
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
     9
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    10
object Document_Info {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    11
  sealed case class Session(
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    12
    name: String,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    13
    used_theories: List[String],
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    14
    loaded_theories: Map[String, Theory])
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    15
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    16
  object Theory {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    17
    def apply(
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    18
      name: String,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    19
      files: List[String],
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    20
      static_session: String,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    21
      dynamic_session: String,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    22
      entities: List[Export_Theory.Entity0],
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    23
      others: List[String]
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    24
    ): Theory = {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    25
      val entities1 =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    26
        entities.filter(e => e.file.nonEmpty && Position.Range.unapply(e.pos).isDefined)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    27
      new Theory(name, files, static_session, dynamic_session, entities1, others)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    28
    }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    29
  }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    30
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    31
  class Theory private(
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    32
    val name: String,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    33
    val files: List[String],
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    34
    val static_session: String,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    35
    val dynamic_session: String,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    36
    entities: List[Export_Theory.Entity0],
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    37
    others: List[String]
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    38
  ) {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    39
    override def toString: String = name
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    40
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    41
    val (thy_file, blobs_files) =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    42
      files match {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    43
        case Nil => error("Unknown theory file for " + quote(name))
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    44
        case a :: bs =>
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    45
          def for_theory: String = " for theory " + quote(name)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    46
          if (!File.is_thy(a)) error("Bad .thy file " + quote(a) + for_theory)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    47
          for (b <- bs if File.is_thy(b)) error("Bad auxiliary file " + quote(b) + for_theory)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    48
          (a, bs)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    49
      }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    50
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    51
    def home_session: Boolean = static_session == dynamic_session
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    52
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    53
    def print_short: String =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    54
      if (home_session) Long_Name.base_name(name) else name
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    55
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    56
    def print_long: String =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    57
      "theory " + quote(name) +
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    58
      (if (home_session) "" else " (session " + quote(dynamic_session) + ")")
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    59
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    60
    private lazy val by_file_range: Map[(String, Symbol.Range), List[Export_Theory.Entity0]] =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    61
      entities.groupBy(entity => (entity.file, entity.range))
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    62
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    63
    private lazy val by_file_kname: Map[(String, String), Export_Theory.Entity0] =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    64
      (for {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    65
        entity <- entities
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    66
        file <- Position.File.unapply(entity.pos)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    67
      } yield (file, entity.kname) -> entity).toMap
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    68
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    69
    def get_defs(file: String, range: Symbol.Range): List[Export_Theory.Entity0] =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    70
      by_file_range.getOrElse((file, range), Nil)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    71
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    72
    def get_def(file: String, kind: String, name: String): Option[Export_Theory.Entity0] =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    73
      by_file_kname.get((file, Export_Theory.export_kind_name(kind, name)))
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    74
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    75
    def elements(elements: Presentation.Elements): Presentation.Elements =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    76
      elements.copy(entity = others.foldLeft(elements.entity)(_ + _))
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    77
  }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    78
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    79
  val empty: Document_Info = new Document_Info(Map.empty)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    80
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    81
  def read(
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    82
    database_context: Export.Database_Context,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    83
    deps: Sessions.Deps,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    84
    sessions: List[String]
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    85
  ): Document_Info = {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    86
    val sessions_domain = sessions.toSet
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    87
    val sessions_structure = deps.sessions_structure
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    88
    val sessions_requirements = sessions_structure.build_requirements(sessions)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    89
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    90
    def read_theory(theory_context: Export.Theory_Context): Document_Info.Theory =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    91
    {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    92
      val session_name = theory_context.session_context.session_name
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    93
      val theory_name = theory_context.theory
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    94
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    95
      val files = theory_context.files0(permissive = true)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    96
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    97
      val (entities, others) =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    98
        if (sessions_domain(session_name)) {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
    99
          val theory = Export_Theory.read_theory(theory_context, permissive = true)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   100
          (theory.entity_iterator.toList,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   101
           theory.others.keySet.toList)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   102
        }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   103
        else (Nil, Nil)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   104
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   105
      Theory(theory_name,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   106
        static_session = sessions_structure.theory_qualifier(theory_name),
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   107
        dynamic_session = session_name,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   108
        files = files,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   109
        entities = entities,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   110
        others = others)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   111
    }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   112
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   113
    def read_session(session_name: String): Document_Info.Session = {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   114
      val used_theories = deps(session_name).used_theories.map(_._1.theory)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   115
      val loaded_theories0 =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   116
        using(database_context.open_session(deps.base_info(session_name))) { session_context =>
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   117
          for (theory_name <- used_theories)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   118
            yield theory_name -> read_theory(session_context.theory(theory_name))
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   119
        }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   120
      Session(session_name, used_theories, loaded_theories0.toMap)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   121
    }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   122
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   123
    val result0 =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   124
      (for (session <- Par_List.map(read_session, sessions_requirements).iterator)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   125
        yield session.name -> session).toMap
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   126
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   127
    val result1 =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   128
      sessions_requirements.foldLeft(Map.empty[String, Session]) {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   129
        case (seen, session_name) =>
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   130
          val session0 = result0(session_name)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   131
          val loaded_theories1 =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   132
            sessions_structure(session_name).parent.map(seen) match {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   133
              case None => session0.loaded_theories
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   134
              case Some(parent_session) =>
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   135
                parent_session.loaded_theories ++ session0.loaded_theories
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   136
            }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   137
          val session1 = session0.copy(loaded_theories = loaded_theories1)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   138
          seen + (session_name -> session1)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   139
      }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   140
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   141
    new Document_Info(result1)
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   142
  }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   143
}
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   144
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   145
class Document_Info private(sessions: Map[String, Document_Info.Session]) {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   146
  override def toString: String =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   147
    sessions.keysIterator.toList.sorted.mkString("Document_Info(", ", ", ")")
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   148
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   149
  def the_session(session: String): Document_Info.Session =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   150
    sessions.getOrElse(session,
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   151
      error("Unknown document information for session: " + quote(session)))
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   152
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   153
  def theory_by_name(session: String, theory: String): Option[Document_Info.Theory] =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   154
    by_session_and_theory_name.get((session, theory))
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   155
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   156
  def theory_by_file(session: String, file: String): Option[Document_Info.Theory] =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   157
    by_session_and_theory_file.get((session, file))
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   158
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   159
  private lazy val by_session_and_theory_name: Map[(String, String), Document_Info.Theory] =
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   160
    (for {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   161
      session <- sessions.valuesIterator
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   162
      theory <- session.loaded_theories.valuesIterator
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   163
    } yield (session.name, theory.name) -> theory).toMap
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   164
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   165
  private lazy val by_session_and_theory_file: Map[(String, String), Document_Info.Theory] = {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   166
    (for {
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   167
      session <- sessions.valuesIterator
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   168
      theory <- session.loaded_theories.valuesIterator
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   169
      file <- theory.files.iterator
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   170
    } yield (session.name, file) -> theory).toMap
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   171
  }
091edca12219 clarified modules;
wenzelm
parents:
diff changeset
   172
}