| author | wenzelm | 
| Tue, 22 Oct 2024 12:45:38 +0200 | |
| changeset 81229 | e18600daa904 | 
| parent 75906 | 2167b9e3157a | 
| permissions | -rw-r--r-- | 
| 67433 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 1 | /* Title: Pure/Tools/update_comments.scala | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 2 | Author: Makarius | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 3 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 4 | Update formal comments in outer syntax: \<comment> \<open>...\<close> | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 5 | */ | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 6 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 7 | package isabelle | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 8 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 9 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 10 | import scala.annotation.tailrec | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 11 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 12 | |
| 75393 | 13 | object Update_Comments {
 | 
| 14 |   def update_comments(path: Path): Unit = {
 | |
| 67442 
f075640b8868
uniform treatment of old-style and new-style comments;
 wenzelm parents: 
67436diff
changeset | 15 | def make_comment(tok: Token): String = | 
| 
f075640b8868
uniform treatment of old-style and new-style comments;
 wenzelm parents: 
67436diff
changeset | 16 | Symbol.comment + Symbol.space + Symbol.cartouche(Symbol.trim_blanks(tok.content)) | 
| 
f075640b8868
uniform treatment of old-style and new-style comments;
 wenzelm parents: 
67436diff
changeset | 17 | |
| 75393 | 18 |     @tailrec def update(toks: List[Token], result: List[String]): String = {
 | 
| 67433 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 19 |       toks match {
 | 
| 67442 
f075640b8868
uniform treatment of old-style and new-style comments;
 wenzelm parents: 
67436diff
changeset | 20 | case tok :: rest | 
| 
f075640b8868
uniform treatment of old-style and new-style comments;
 wenzelm parents: 
67436diff
changeset | 21 | if tok.source == "--" || tok.source == Symbol.comment => | 
| 67433 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 22 |           rest.dropWhile(_.is_space) match {
 | 
| 74887 | 23 | case tok1 :: rest1 if tok1.is_embedded => | 
| 67442 
f075640b8868
uniform treatment of old-style and new-style comments;
 wenzelm parents: 
67436diff
changeset | 24 | update(rest1, make_comment(tok1) :: result) | 
| 67433 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 25 | case _ => update(rest, tok.source :: result) | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 26 | } | 
| 67442 
f075640b8868
uniform treatment of old-style and new-style comments;
 wenzelm parents: 
67436diff
changeset | 27 | case tok :: rest if tok.is_formal_comment && tok.source.startsWith(Symbol.comment) => | 
| 
f075640b8868
uniform treatment of old-style and new-style comments;
 wenzelm parents: 
67436diff
changeset | 28 | update(rest, make_comment(tok) :: result) | 
| 67433 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 29 | case tok :: rest => update(rest, tok.source :: result) | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 30 | case Nil => result.reverse.mkString | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 31 | } | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 32 | } | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 33 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 34 | val text0 = File.read(path) | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 35 | val text1 = update(Token.explode(Keyword.Keywords.empty, text0), Nil) | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 36 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 37 |     if (text0 != text1) {
 | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 38 |       Output.writeln("changing " + path)
 | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 39 | File.write_backup2(path, text1) | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 40 | } | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 41 | } | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 42 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 43 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 44 | /* Isabelle tool wrapper */ | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 45 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 46 | val isabelle_tool = | 
| 72763 | 47 |     Isabelle_Tool("update_comments", "update formal comments in outer syntax",
 | 
| 75393 | 48 | Scala_Project.here, | 
| 75394 | 49 |       { args =>
 | 
| 50 |         val getopts = Getopts("""
 | |
| 67433 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 51 | Usage: isabelle update_comments [FILES|DIRS...] | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 52 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 53 | Recursively find .thy files and update formal comments in outer syntax. | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 54 | |
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 55 | Old versions of files are preserved by appending "~~". | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 56 | """) | 
| 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 57 | |
| 75394 | 58 | val specs = getopts(args) | 
| 59 | if (specs.isEmpty) getopts.usage() | |
| 67433 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 60 | |
| 75394 | 61 |         for {
 | 
| 62 | spec <- specs | |
| 75906 
2167b9e3157a
clarified signature: support for adhoc file types;
 wenzelm parents: 
75394diff
changeset | 63 | file <- File.find_files(Path.explode(spec).file, file => File.is_thy(file.getName)) | 
| 75394 | 64 | } update_comments(File.path(file)) | 
| 65 | }) | |
| 67433 
e0c0c1f0e3e7
more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
 wenzelm parents: diff
changeset | 66 | } |