| author | wenzelm | 
| Tue, 22 Oct 2024 12:45:38 +0200 | |
| changeset 81229 | e18600daa904 | 
| parent 80886 | 5d562dd387ae | 
| permissions | -rw-r--r-- | 
| 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 | 10 | object Check_Keywords {
 | 
| 80886 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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 | 13 | def check_keywords( | 
| 80886 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 14 | options: Options, | 
| 59895 | 15 | check: Set[String], | 
| 80886 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 16 | dirs: List[Path] = Nil, | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 17 | progress: Progress, | 
| 75393 | 18 |   ): Unit = {
 | 
| 80886 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 19 | val deps = Sessions.deps(Sessions.load_structure(options, dirs = dirs), progress = progress) | 
| 59895 | 20 | |
| 21 | val bad = | |
| 80886 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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: 
80884diff
changeset | 23 |         { case (keywords, input, start) =>
 | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 24 | progress.expose_interrupt() | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 25 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 26 |           object Parsers extends Parse.Parsers {
 | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 27 | private val conflict = | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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: 
80884diff
changeset | 29 |             private val other = token("token", _ => true)
 | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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: 
80884diff
changeset | 31 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 32 | val result: List[(Token, Position.T)] = | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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: 
80884diff
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: 
80884diff
changeset | 35 | case bad => error(bad.toString) | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 36 | } | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 37 | } | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 38 | Parsers.result | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 39 | }, | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 40 | List.from( | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 41 |           for {
 | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 42 | session <- deps.sessions_structure.imports_topological_order.iterator | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 43 | base = deps(session) | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 44 | node_name <- base.proper_session_theories | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 45 |           } yield {
 | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 46 | val path = node_name.path | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 47 | val input = File.read(path) | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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: 
80884diff
changeset | 49 | (base.overall_syntax.keywords, input, start) | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 50 | }) | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 51 | ) | 
| 59895 | 52 | |
| 53 |     for ((tok, pos) <- bad) {
 | |
| 65827 | 54 | progress.echo_warning( | 
| 55 | "keyword conflict: " + tok.kind.toString + " " + quote(tok.content) + Position.here(pos)) | |
| 59895 | 56 | } | 
| 57 | } | |
| 80886 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 58 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 59 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 60 | /* Isabelle tool wrapper */ | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 61 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 62 | val isabelle_tool = | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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: 
80884diff
changeset | 64 | Scala_Project.here, | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 65 |       { args =>
 | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 66 | var dirs: List[Path] = Nil | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 67 | var options = Options.init() | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 68 | var verbose = false | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 69 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 70 |         val getopts = Getopts("""
 | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 71 | Usage: isabelle check_keywords [OPTIONS] KEYWORDS | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 72 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 73 | Options are: | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 74 | -d DIR include session directory | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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: 
80884diff
changeset | 76 | -v verbose | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 77 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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: 
80884diff
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: 
80884diff
changeset | 80 | identifiers that would have to be quoted. | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 81 | """, | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 82 | "d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))), | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 83 | "o:" -> (arg => options = options + arg), | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 84 | "v" -> (_ => verbose = true)) | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 85 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 86 | val keywords = getopts(args) | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 87 | if (keywords.isEmpty) getopts.usage() | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 88 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 89 | val progress = new Console_Progress(verbose = verbose) | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 90 | |
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 91 |         progress.interrupt_handler {
 | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
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: 
80884diff
changeset | 93 | } | 
| 
5d562dd387ae
discontinued "isabelle build -k": superseded by admin-tool "isabelle check_keywords";
 wenzelm parents: 
80884diff
changeset | 94 | }) | 
| 59891 
9ce697050455
added isabelle build option -k, for fast off-line checking of theory sources;
 wenzelm parents: diff
changeset | 95 | } |