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, |
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 |