src/Pure/Tools/check_keywords.scala
author haftmann
Thu, 19 Jun 2025 17:15:40 +0200
changeset 82734 89347c0cc6a3
parent 80886 5d562dd387ae
permissions -rw-r--r--
treat map_filter similar to list_all, list_ex, list_ex1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59891
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/check_keywords.scala
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
     3
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
     4
Check theory sources for conflicts with proposed keywords.
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
     5
*/
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
     6
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
     7
package isabelle
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
     8
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
     9
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    10
object Check_Keywords {
80886
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    11
  /* session theories for keyword conflicts */
59891
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
    12
59895
a68a0fec288d clarified module;
wenzelm
parents: 59891
diff changeset
    13
  def check_keywords(
80886
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    14
    options: Options,
59895
a68a0fec288d clarified module;
wenzelm
parents: 59891
diff changeset
    15
    check: Set[String],
80886
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    16
    dirs: List[Path] = Nil,
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    17
    progress: Progress,
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    18
  ): Unit = {
80886
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    19
    val deps = Sessions.deps(Sessions.load_structure(options, dirs = dirs), progress = progress)
59895
a68a0fec288d clarified module;
wenzelm
parents: 59891
diff changeset
    20
a68a0fec288d clarified module;
wenzelm
parents: 59891
diff changeset
    21
    val bad =
80886
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    22
      Par_List.maps[(Keyword.Keywords, String, Token.Pos), (Token, Position.T)](
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    23
        { case (keywords, input, start) =>
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    24
          progress.expose_interrupt()
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    25
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    26
          object Parsers extends Parse.Parsers {
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    27
            private val conflict =
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    28
              position(token("token", tok => !(tok.is_command || tok.is_keyword) && check(tok.source)))
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    29
            private val other = token("token", _ => true)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    30
            private val item = conflict ^^ (x => Some(x)) | other ^^ (_ => None)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    31
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    32
            val result: List[(Token, Position.T)] =
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    33
              parse_all(rep(item), Token.reader(Token.explode(keywords, input), start)) match {
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    34
                case Success(res, _) => for (case Some(x) <- res) yield x
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    35
                case bad => error(bad.toString)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    36
              }
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    37
          }
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    38
          Parsers.result
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    39
        },
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    40
        List.from(
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    41
          for {
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    42
            session <- deps.sessions_structure.imports_topological_order.iterator
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    43
            base = deps(session)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    44
            node_name <- base.proper_session_theories
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    45
          } yield {
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    46
            val path = node_name.path
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    47
            val input = File.read(path)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    48
            val start = Token.Pos.file(File.standard_path(path))
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    49
            (base.overall_syntax.keywords, input, start)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    50
          })
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    51
      )
59895
a68a0fec288d clarified module;
wenzelm
parents: 59891
diff changeset
    52
a68a0fec288d clarified module;
wenzelm
parents: 59891
diff changeset
    53
    for ((tok, pos) <- bad) {
65827
wenzelm
parents: 61276
diff changeset
    54
      progress.echo_warning(
wenzelm
parents: 61276
diff changeset
    55
        "keyword conflict: " + tok.kind.toString + " " + quote(tok.content) + Position.here(pos))
59895
a68a0fec288d clarified module;
wenzelm
parents: 59891
diff changeset
    56
    }
a68a0fec288d clarified module;
wenzelm
parents: 59891
diff changeset
    57
  }
80886
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    58
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    59
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    60
  /* Isabelle tool wrapper */
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    61
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    62
  val isabelle_tool =
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    63
    Isabelle_Tool("check_keywords", "check theory sources for conflicts with proposed keywords",
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    64
      Scala_Project.here,
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    65
      { args =>
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    66
        var dirs: List[Path] = Nil
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    67
        var options = Options.init()
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    68
        var verbose = false
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    69
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    70
        val getopts = Getopts("""
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    71
Usage: isabelle check_keywords [OPTIONS] KEYWORDS
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    72
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    73
  Options are:
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    74
    -d DIR       include session directory
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    75
    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    76
    -v           verbose
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    77
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    78
  Check theory sources from all session directories for conflicts with
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    79
  newly proposed keywords (outer syntax). This reveals occurrences of
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    80
  identifiers that would have to be quoted.
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    81
""",
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    82
        "d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))),
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    83
        "o:" -> (arg => options = options + arg),
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    84
        "v" -> (_ => verbose = true))
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    85
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    86
        val keywords = getopts(args)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    87
        if (keywords.isEmpty) getopts.usage()
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    88
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    89
        val progress = new Console_Progress(verbose = verbose)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    90
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    91
        progress.interrupt_handler {
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    92
          check_keywords(options, keywords.toSet, dirs = dirs, progress = progress)
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    93
        }
5d562dd387ae discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
wenzelm
parents: 80884
diff changeset
    94
      })
59891
9ce697050455 added isabelle build option -k, for fast off-line checking of theory sources;
wenzelm
parents:
diff changeset
    95
}