179 if (node_name.is_theory && reader.source.length > 0) { |
179 if (node_name.is_theory && reader.source.length > 0) { |
180 try { |
180 try { |
181 val header = Thy_Header.read(reader, start, strict) |
181 val header = Thy_Header.read(reader, start, strict) |
182 |
182 |
183 val base_name = node_name.theory_base_name |
183 val base_name = node_name.theory_base_name |
184 val (name, pos) = header.name |
184 if (base_name != header.name) |
185 if (base_name != name) |
185 error("Bad theory name " + quote(header.name) + |
186 error("Bad theory name " + quote(name) + |
186 " for file " + thy_path(Path.basic(base_name)) + Position.here(header.pos) + |
187 " for file " + thy_path(Path.basic(base_name)) + Position.here(pos) + |
187 Completion.report_theories(header.pos, List(base_name))) |
188 Completion.report_theories(pos, List(base_name))) |
188 |
189 |
189 val imports_pos = |
190 val imports = |
190 header.imports_pos.map({ case (s, pos) => |
191 header.imports.map({ case (s, pos) => |
|
192 val name = import_name(node_name, s) |
191 val name = import_name(node_name, s) |
193 if (Sessions.exclude_theory(name.theory_base_name)) |
192 if (Sessions.exclude_theory(name.theory_base_name)) |
194 error("Bad theory name " + quote(name.theory_base_name) + Position.here(pos)) |
193 error("Bad theory name " + quote(name.theory_base_name) + Position.here(pos)) |
195 (name, pos) |
194 (name, pos) |
196 }) |
195 }) |
197 Document.Node.Header(imports, header.keywords, header.abbrevs) |
196 Document.Node.Header(imports_pos, header.keywords, header.abbrevs) |
198 } |
197 } |
199 catch { case exn: Throwable => Document.Node.bad_header(Exn.message(exn)) } |
198 catch { case exn: Throwable => Document.Node.bad_header(Exn.message(exn)) } |
200 } |
199 } |
201 else Document.Node.no_header |
200 else Document.Node.no_header |
202 } |
201 } |
307 progress.expose_interrupt() |
306 progress.expose_interrupt() |
308 val header = |
307 val header = |
309 try { check_thy(name, Token.Pos.file(name.node)).cat_errors(message) } |
308 try { check_thy(name, Token.Pos.file(name.node)).cat_errors(message) } |
310 catch { case ERROR(msg) => cat_error(msg, message) } |
309 catch { case ERROR(msg) => cat_error(msg, message) } |
311 val entry = Document.Node.Entry(name, header) |
310 val entry = Document.Node.Entry(name, header) |
312 dependencies1.require_thys(adjunct, header.imports, |
311 dependencies1.require_thys(adjunct, header.imports_pos, |
313 initiators = name :: initiators, progress = progress).cons(entry) |
312 initiators = name :: initiators, progress = progress).cons(entry) |
314 } |
313 } |
315 catch { |
314 catch { |
316 case e: Throwable => |
315 case e: Throwable => |
317 dependencies1.cons(Document.Node.Entry(name, Document.Node.bad_header(Exn.message(e)))) |
316 dependencies1.cons(Document.Node.Entry(name, Document.Node.bad_header(Exn.message(e)))) |
340 } |
339 } |
341 |
340 |
342 lazy val loaded_theories: Graph[String, Outer_Syntax] = |
341 lazy val loaded_theories: Graph[String, Outer_Syntax] = |
343 (session_base.loaded_theories /: entries)({ case (graph, entry) => |
342 (session_base.loaded_theories /: entries)({ case (graph, entry) => |
344 val name = entry.name.theory |
343 val name = entry.name.theory |
345 val imports = entry.header.imports.map(p => p._1.theory) |
344 val imports = entry.header.imports.map(_.theory) |
346 |
345 |
347 val graph1 = (graph /: (name :: imports))(_.default_node(_, Outer_Syntax.empty)) |
346 val graph1 = (graph /: (name :: imports))(_.default_node(_, Outer_Syntax.empty)) |
348 val graph2 = (graph1 /: imports)(_.add_edge(_, name)) |
347 val graph2 = (graph1 /: imports)(_.add_edge(_, name)) |
349 |
348 |
350 val syntax0 = if (name == Thy_Header.PURE) List(Thy_Header.bootstrap_syntax) else Nil |
349 val syntax0 = if (name == Thy_Header.PURE) List(Thy_Header.bootstrap_syntax) else Nil |