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