src/Pure/Tools/keywords.scala
author wenzelm
Mon, 26 Aug 2013 21:56:08 +0200
changeset 53212 387b9f7cb0ac
parent 52442 d3c5195b7399
child 53371 47b23c582127
permissions -rw-r--r--
added SHA1 library integrity test, which is invoked at compile time and Isabelle_Process run-time;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52439
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/keywords.scala
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
     3
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
     4
Generate keyword files for Emacs Proof General.
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
     5
*/
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
     6
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
     7
package isabelle
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
     8
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
     9
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    10
import scala.collection.mutable
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    11
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    12
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    13
object Keywords
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    14
{
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    15
  /* keywords */
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    16
52442
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    17
  private val convert = Map(
52439
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    18
    "thy_begin" -> "theory-begin",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    19
    "thy_end" -> "theory-end",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    20
    "thy_heading1" -> "theory-heading",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    21
    "thy_heading2" -> "theory-heading",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    22
    "thy_heading3" -> "theory-heading",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    23
    "thy_heading4" -> "theory-heading",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    24
    "thy_load" -> "theory-decl",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    25
    "thy_decl" -> "theory-decl",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    26
    "thy_script" -> "theory-script",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    27
    "thy_goal" -> "theory-goal",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    28
    "qed_block" -> "qed-block",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    29
    "qed_global" -> "qed-global",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    30
    "prf_heading2" -> "proof-heading",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    31
    "prf_heading3" -> "proof-heading",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    32
    "prf_heading4" -> "proof-heading",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    33
    "prf_goal" -> "proof-goal",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    34
    "prf_block" -> "proof-block",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    35
    "prf_open" -> "proof-open",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    36
    "prf_close" -> "proof-close",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    37
    "prf_chain" -> "proof-chain",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    38
    "prf_decl" -> "proof-decl",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    39
    "prf_asm" -> "proof-asm",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    40
    "prf_asm_goal" -> "proof-asm-goal",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    41
    "prf_script" -> "proof-script"
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    42
  ).withDefault((s: String) => s)
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    43
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    44
  private val emacs_kinds = List(
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    45
    "major",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    46
    "minor",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    47
    "control",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    48
    "diag",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    49
    "theory-begin",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    50
    "theory-switch",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    51
    "theory-end",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    52
    "theory-heading",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    53
    "theory-decl",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    54
    "theory-script",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    55
    "theory-goal",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    56
    "qed",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    57
    "qed-block",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    58
    "qed-global",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    59
    "proof-heading",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    60
    "proof-goal",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    61
    "proof-block",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    62
    "proof-open",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    63
    "proof-close",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    64
    "proof-chain",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    65
    "proof-decl",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    66
    "proof-asm",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    67
    "proof-asm-goal",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    68
    "proof-script")
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    69
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    70
  def keywords(
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    71
    options: Options,
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    72
    name: String = "",
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    73
    dirs: List[Path] = Nil,
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    74
    sessions: List[String] = Nil)
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    75
  {
52442
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    76
    val relevant_sessions =
52439
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    77
      for {
52442
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    78
        (name, content) <-
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    79
          Build.session_dependencies(options, false, dirs, sessions).deps.toList
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    80
        keywords = content.keywords
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    81
        if !keywords.isEmpty
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    82
      } yield (name, keywords)
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    83
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    84
    val keywords_raw =
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    85
      (Map.empty[String, Set[String]].withDefaultValue(Set.empty) /: relevant_sessions) {
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    86
        case (map, (_, ks)) =>
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    87
          (map /: ks) {
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    88
            case (m, (name, Some(((kind, _), _)), _)) =>
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    89
              m + (name -> (m(name) + convert(kind)))
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    90
            case (m, (name, None, _)) =>
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    91
              m + (name -> (m(name) + "minor"))
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    92
          }
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    93
      }
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    94
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    95
    val keywords_unique =
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    96
      for ((name, kinds) <- keywords_raw) yield {
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    97
        kinds.toList match {
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
    98
          case List(kind) => (name, kind)
52439
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
    99
          case _ =>
52442
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
   100
            (kinds - "minor").toList match {
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
   101
              case List(kind) => (name, kind)
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
   102
              case _ =>
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
   103
                error("Inconsistent declaration of keyword " + quote(name) + ": " +
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
   104
                  kinds.toList.sorted.mkString(" vs "))
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
   105
            }
52439
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   106
        }
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   107
      }
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   108
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   109
    val output =
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   110
    {
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   111
      val out = new mutable.StringBuilder
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   112
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   113
      out ++= ";;\n"
52442
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
   114
      out ++= ";; Keyword classification tables for Isabelle/Isar.\n"
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
   115
      out ++= ";; Generated from " + relevant_sessions.map(_._1).sorted.mkString(" + ") + ".\n"
52439
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   116
      out ++= ";; *** DO NOT EDIT *** DO NOT EDIT *** DO NOT EDIT ***\n"
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   117
      out ++= ";;\n"
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   118
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   119
      for (kind <- emacs_kinds) {
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   120
        val names =
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   121
          (for {
52442
d3c5195b7399 misc tuning and clarification;
wenzelm
parents: 52439
diff changeset
   122
            (name, k) <- keywords_unique.iterator
52439
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   123
            if (if (kind == "major") k != "minor" else k == kind)
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   124
            if kind != "minor" || Symbol.is_ascii_identifier(name)
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   125
          } yield name).toList.sorted
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   126
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   127
        out ++= "\n(defconst isar-keywords-" + kind
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   128
        out ++= "\n  '("
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   129
        out ++=
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   130
          names.map(name => quote("""[\.\*\+\?\[\]\^\$]""".r replaceAllIn (name, """\\\\$0""")))
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   131
            .mkString("\n    ")
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   132
        out ++= "))\n"
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   133
      }
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   134
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   135
      out ++= "\n(provide 'isar-keywords)\n"
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   136
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   137
      out.toString
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   138
    }
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   139
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   140
    val file = if (name == "") "isar-keywords.el" else "isar-keywords-" + name + ".el"
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   141
    java.lang.System.err.println(file)
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   142
    File.write(Path.explode(file), output)
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   143
  }
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   144
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   145
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   146
  /* administrative update_keywords */
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   147
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   148
  def update_keywords(options: Options)
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   149
  {
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   150
    val tree = Build.find_sessions(options, Nil)
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   151
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   152
    def chapter(ch: String): List[String] =
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   153
      for ((name, info) <- tree.topological_order if info.chapter == ch) yield name
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   154
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   155
    keywords(options, sessions = chapter("HOL"))
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   156
    keywords(options, name = "ZF", sessions = chapter("ZF"))
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   157
  }
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   158
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   159
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   160
  /* command line entry point */
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   161
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   162
  def main(args: Array[String])
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   163
  {
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   164
    Command_Line.tool {
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   165
      args.toList match {
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   166
        case "keywords" :: name :: Command_Line.Chunks(dirs, sessions) =>
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   167
          keywords(Options.init(), name, dirs.map(Path.explode), sessions)
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   168
          0
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   169
        case "update_keywords" :: Nil =>
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   170
          update_keywords(Options.init())
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   171
          0
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   172
        case _ => error("Bad arguments:\n" + cat_lines(args))
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   173
      }
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   174
    }
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   175
  }
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   176
}
4cf3f6153eb8 improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
wenzelm
parents:
diff changeset
   177