src/Pure/Tools/dump.scala
author wenzelm
Tue, 07 Apr 2020 21:49:36 +0200
changeset 71726 a5fda30edae2
parent 71678 6fff34b5293e
child 71807 cdfa8f027bb9
permissions -rw-r--r--
clarified signature: more uniform treatment of stopped/interrupted state;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
68308
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/dump.scala
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
     3
68348
2ac3a5c07dfa documentation for "isabelle dump";
wenzelm
parents: 68347
diff changeset
     4
Dump cumulative PIDE session database.
68308
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
     5
*/
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
     6
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
     7
package isabelle
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
     8
71534
f10bffaa2bae more scalable output of YXML files;
wenzelm
parents: 71161
diff changeset
     9
import java.io.{BufferedWriter, FileOutputStream, OutputStreamWriter}
f10bffaa2bae more scalable output of YXML files;
wenzelm
parents: 71161
diff changeset
    10
68308
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
    11
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
    12
object Dump
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents:
diff changeset
    13
{
68316
a1e5de3681f0 more formal dump aspects;
wenzelm
parents: 68308
diff changeset
    14
  /* aspects */
a1e5de3681f0 more formal dump aspects;
wenzelm
parents: 68308
diff changeset
    15
a1e5de3681f0 more formal dump aspects;
wenzelm
parents: 68308
diff changeset
    16
  sealed case class Aspect_Args(
68355
67a4db47e4f6 more args;
wenzelm
parents: 68348
diff changeset
    17
    options: Options,
70640
5f4b8a505090 more explicit type Dump.Session, with context information;
wenzelm
parents: 70634
diff changeset
    18
    deps: Sessions.Deps,
68355
67a4db47e4f6 more args;
wenzelm
parents: 68348
diff changeset
    19
    progress: Progress,
69896
be7243b97c41 tuned signature;
wenzelm
parents: 69857
diff changeset
    20
    output_dir: Path,
68929
10cbb5d99081 tuned signature;
wenzelm
parents: 68927
diff changeset
    21
    snapshot: Document.Snapshot,
69534
913970ae2324 tuned, according to Isabelle/MMT;
wenzelm
parents: 69533
diff changeset
    22
    status: Document_Status.Node_Status)
68319
2e168460a9c3 more operations;
wenzelm
parents: 68318
diff changeset
    23
  {
71534
f10bffaa2bae more scalable output of YXML files;
wenzelm
parents: 71161
diff changeset
    24
    def write_path(file_name: Path): Path =
68319
2e168460a9c3 more operations;
wenzelm
parents: 68318
diff changeset
    25
    {
68929
10cbb5d99081 tuned signature;
wenzelm
parents: 68927
diff changeset
    26
      val path = output_dir + Path.basic(snapshot.node_name.theory) + file_name
68319
2e168460a9c3 more operations;
wenzelm
parents: 68318
diff changeset
    27
      Isabelle_System.mkdirs(path.dir)
71534
f10bffaa2bae more scalable output of YXML files;
wenzelm
parents: 71161
diff changeset
    28
      path
68319
2e168460a9c3 more operations;
wenzelm
parents: 68318
diff changeset
    29
    }
2e168460a9c3 more operations;
wenzelm
parents: 68318
diff changeset
    30
71534
f10bffaa2bae more scalable output of YXML files;
wenzelm
parents: 71161
diff changeset
    31
    def write(file_name: Path, bytes: Bytes): Unit =
f10bffaa2bae more scalable output of YXML files;
wenzelm
parents: 71161
diff changeset
    32
      Bytes.write(write_path(file_name), bytes)
f10bffaa2bae more scalable output of YXML files;
wenzelm
parents: 71161
diff changeset
    33
68365
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    34
    def write(file_name: Path, text: String): Unit =
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    35
      write(file_name, Bytes(text))
68332
7cb681615d0e store Isabelle symbols in canonical form;
wenzelm
parents: 68331
diff changeset
    36
68365
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    37
    def write(file_name: Path, body: XML.Body): Unit =
71534
f10bffaa2bae more scalable output of YXML files;
wenzelm
parents: 71161
diff changeset
    38
      using(File.writer(write_path(file_name).file))(
f10bffaa2bae more scalable output of YXML files;
wenzelm
parents: 71161
diff changeset
    39
        writer => YXML.traversal(s => writer.write(Symbol.encode(s)), body))
68319
2e168460a9c3 more operations;
wenzelm
parents: 68318
diff changeset
    40
  }
68316
a1e5de3681f0 more formal dump aspects;
wenzelm
parents: 68308
diff changeset
    41
68347
9e6e7ab77434 more dump aspects, with options;
wenzelm
parents: 68345
diff changeset
    42
  sealed case class Aspect(name: String, description: String, operation: Aspect_Args => Unit,
9e6e7ab77434 more dump aspects, with options;
wenzelm
parents: 68345
diff changeset
    43
    options: List[String] = Nil)
68345
5bc1e1ac7955 clarified default: all aspects;
wenzelm
parents: 68332
diff changeset
    44
  {
5bc1e1ac7955 clarified default: all aspects;
wenzelm
parents: 68332
diff changeset
    45
    override def toString: String = name
5bc1e1ac7955 clarified default: all aspects;
wenzelm
parents: 68332
diff changeset
    46
  }
68316
a1e5de3681f0 more formal dump aspects;
wenzelm
parents: 68308
diff changeset
    47
69521
wenzelm
parents: 69520
diff changeset
    48
  val known_aspects: List[Aspect] =
68316
a1e5de3681f0 more formal dump aspects;
wenzelm
parents: 68308
diff changeset
    49
    List(
68365
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    50
      Aspect("markup", "PIDE markup (YXML format)",
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    51
        { case args =>
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    52
            args.write(Path.explode("markup.yxml"),
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    53
              args.snapshot.markup_to_XML(Text.Range.full, Markup.Elements.full))
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    54
        }),
68319
2e168460a9c3 more operations;
wenzelm
parents: 68318
diff changeset
    55
      Aspect("messages", "output messages (YXML format)",
2e168460a9c3 more operations;
wenzelm
parents: 68318
diff changeset
    56
        { case args =>
68365
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    57
            args.write(Path.explode("messages.yxml"),
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    58
              args.snapshot.messages.iterator.map(_._1).toList)
68347
9e6e7ab77434 more dump aspects, with options;
wenzelm
parents: 68345
diff changeset
    59
        }),
9e6e7ab77434 more dump aspects, with options;
wenzelm
parents: 68345
diff changeset
    60
      Aspect("latex", "generated LaTeX source",
9e6e7ab77434 more dump aspects, with options;
wenzelm
parents: 68345
diff changeset
    61
        { case args =>
68365
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    62
            for (entry <- args.snapshot.exports if entry.name == "document.tex")
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    63
              args.write(Path.explode(entry.name), entry.uncompressed())
69533
1d2e6a4e073f clarified options: ensure consolidated Node_Status and thus percentage = 100% for progress;
wenzelm
parents: 69532
diff changeset
    64
        }, options = List("export_document")),
68347
9e6e7ab77434 more dump aspects, with options;
wenzelm
parents: 68345
diff changeset
    65
      Aspect("theory", "foundational theory content",
9e6e7ab77434 more dump aspects, with options;
wenzelm
parents: 68345
diff changeset
    66
        { case args =>
9e6e7ab77434 more dump aspects, with options;
wenzelm
parents: 68345
diff changeset
    67
            for {
68365
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    68
              entry <- args.snapshot.exports
68347
9e6e7ab77434 more dump aspects, with options;
wenzelm
parents: 68345
diff changeset
    69
              if entry.name.startsWith(Export_Theory.export_prefix)
68365
f9379279f98c clarified signature: prefer Document.Snapshot;
wenzelm
parents: 68355
diff changeset
    70
            } args.write(Path.explode(entry.name), entry.uncompressed())
69533
1d2e6a4e073f clarified options: ensure consolidated Node_Status and thus percentage = 100% for progress;
wenzelm
parents: 69532
diff changeset
    71
        }, options = List("export_theory"))
68345
5bc1e1ac7955 clarified default: all aspects;
wenzelm
parents: 68332
diff changeset
    72
    ).sortBy(_.name)
68316
a1e5de3681f0 more formal dump aspects;
wenzelm
parents: 68308
diff changeset
    73
a1e5de3681f0 more formal dump aspects;
wenzelm
parents: 68308
diff changeset
    74
  def show_aspects: String =
68345
5bc1e1ac7955 clarified default: all aspects;
wenzelm
parents: