src/Pure/Thy/thy_resources.scala
author wenzelm
Sun, 12 Nov 2017 16:38:13 +0100
changeset 67056 e35ae3eeec93
parent 67054 9498b7522a99
child 67057 0d8e4e777973
permissions -rw-r--r--
load theories via PIDE document update; theory nodes are always required;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
67054
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Thy/thy_resources.scala
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
     3
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
     4
PIDE resources for theory files.
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
     5
*/
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
     6
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
     7
package isabelle
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
     8
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
     9
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    10
object Thy_Resources
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    11
{
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    12
  /* internal state */
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    13
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    14
  sealed case class State(
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    15
    models: Map[Document.Node.Name, Thy_Document_Model] = Map.empty)
67056
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    16
  {
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    17
    def update_models(changed: List[Thy_Document_Model]): State =
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    18
      copy(models = models ++ changed.iterator.map(model => (model.node_name, model)))
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    19
  }
67054
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    20
}
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    21
67056
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    22
class Thy_Resources(session_base: Sessions.Base, log: Logger = No_Logger)
67054
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    23
  extends Resources(session_base, log = log)
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    24
{
67056
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    25
  resources =>
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    26
67054
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    27
  private val state = Synchronized(Thy_Resources.State())
67056
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    28
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    29
  def load_theories(
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    30
    session: Session,
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    31
    theories: List[(String, Position.T)],
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    32
    visible: Boolean = false,
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    33
    qualifier: String = Sessions.DRAFT,
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    34
    master_dir: String = ""): List[Document.Node.Name] =
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    35
  {
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    36
    val import_names =
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    37
      for ((thy, pos) <- theories)
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    38
      yield (import_name(qualifier, master_dir, thy), pos)
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    39
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    40
    val dependencies = resources.dependencies(import_names).check_errors
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    41
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    42
    val loaded_models =
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    43
      dependencies.names.map(name =>
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    44
        Thy_Document_Model.read_file(session, name, visible && import_names.contains(name)))
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    45
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    46
    val edits =
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    47
      state.change_result(st =>
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    48
      {
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    49
        val model_edits =
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    50
          for {
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    51
            model <- loaded_models
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    52
            edits = model.node_edits(st.models.get(model.node_name))
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    53
            if edits.nonEmpty
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    54
          } yield model -> edits
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    55
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    56
        val st1 = st.update_models(model_edits.map(_._1))
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    57
        (model_edits.flatMap(_._2), st1)
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    58
      })
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    59
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    60
    session.update(Document.Blobs.empty, edits)
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    61
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    62
    dependencies.names
e35ae3eeec93 load theories via PIDE document update;
wenzelm
parents: 67054
diff changeset
    63
  }
67054
9498b7522a99 PIDE resources for theory files;
wenzelm
parents:
diff changeset
    64
}