src/Pure/System/isabelle_tool.scala
author wenzelm
Mon, 28 May 2018 22:25:10 +0200
changeset 68308 119fc05f6b00
parent 68116 ac82ee617a75
child 69168 68816d1c73a7
permissions -rw-r--r--
support to dump build database produced by PIDE session;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/System/isabelle_tool.scala
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
     3
    Author:     Lars Hupel
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
     4
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
     5
Isabelle system tools: external executables or internal Scala functions.
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
     6
*/
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
     7
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
     8
package isabelle
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
     9
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    10
import java.net.URLClassLoader
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    11
import scala.reflect.runtime.universe
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    12
import scala.tools.reflect.{ToolBox,ToolBoxError}
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    13
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    14
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    15
object Isabelle_Tool
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    16
{
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    17
  /* Scala source tools */
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    18
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    19
  abstract class Body extends Function[List[String], Unit]
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    20
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    21
  private def compile(path: Path): Body =
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    22
  {
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    23
    def err(msg: String): Nothing =
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    24
      cat_error(msg, "The error(s) above occurred in Isabelle/Scala tool " + path)
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    25
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    26
    val source = File.read(path)
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    27
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    28
    val class_loader = new URLClassLoader(Array(), getClass.getClassLoader)
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    29
    val tool_box = universe.runtimeMirror(class_loader).mkToolBox()
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    30
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    31
    try {
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    32
      val symbol = tool_box.parse(source) match {
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    33
        case tree: universe.ModuleDef => tool_box.define(tree)
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    34
        case _ => err("Source does not describe a module (Scala object)")
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    35
      }
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    36
      tool_box.compile(universe.Ident(symbol))() match {
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    37
        case body: Body => body
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    38
        case _ => err("Ill-typed source: Isabelle_Tool.Body expected")
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    39
      }
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    40
    }
63519
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    41
    catch {
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    42
      case e: ToolBoxError =>
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    43
        if (tool_box.frontEnd.hasErrors) {
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    44
          val infos = tool_box.frontEnd.infos.toList
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    45
          val msgs = infos.map(info => "Error in line " + info.pos.line + ":\n" + info.msg)
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    46
          err(msgs.mkString("\n"))
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    47
        }
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    48
        else
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    49
          err(e.toString)
78401d628718 more precise error information for dynamic Scala tools
Lars Hupel <lars.hupel@mytum.de>
parents: 63226
diff changeset
    50
    }
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    51
  }
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    52
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    53
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    54
  /* external tools */
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    55
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    56
  private def dirs(): List[Path] = Path.split(Isabelle_System.getenv_strict("ISABELLE_TOOLS"))
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    57
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    58
  private def is_external(dir: Path, file_name: String): Boolean =
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    59
  {
65450
b0a73039ddaa more robust: user could provide name with "/" etc.;
wenzelm
parents: 65138
diff changeset
    60
    val file = (dir + Path.explode(file_name)).file
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    61
    try {
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    62
      file.isFile && file.canRead &&
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    63
        (file_name.endsWith(".scala") || file.canExecute) &&
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    64
        !file_name.endsWith("~") && !file_name.endsWith(".orig")
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    65
    }
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    66
    catch { case _: SecurityException => false }
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    67
  }
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    68
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    69
  private def list_external(): List[(String, String)] =
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    70
  {
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    71
    val Description = """.*\bDESCRIPTION: *(.*)""".r
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    72
    for {
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    73
      dir <- dirs() if dir.is_dir
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    74
      file_name <- File.read_dir(dir) if is_external(dir, file_name)
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    75
    } yield {
65450
b0a73039ddaa more robust: user could provide name with "/" etc.;
wenzelm
parents: 65138
diff changeset
    76
      val source = File.read(dir + Path.explode(file_name))
65606
wenzelm
parents: 65557
diff changeset
    77
      val name = Library.perhaps_unsuffix(".scala", file_name)
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    78
      val description =
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    79
        split_lines(source).collectFirst({ case Description(s) => s }) getOrElse ""
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    80
      (name, description)
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    81
    }
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    82
  }
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    83
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
    84
  private def find_external(name: String): Option[List[String] => Unit] =
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    85
    dirs.collectFirst({
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    86
      case dir if is_external(dir, name + ".scala") =>
65450
b0a73039ddaa more robust: user could provide name with "/" etc.;
wenzelm
parents: 65138
diff changeset
    87
        compile(dir + Path.explode(name + ".scala"))
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    88
      case dir if is_external(dir, name) =>
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    89
        (args: List[String]) =>
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    90
          {
65450
b0a73039ddaa more robust: user could provide name with "/" etc.;
wenzelm
parents: 65138
diff changeset
    91
            val tool = dir + Path.explode(name)
64304
96bc94c87a81 clarified modules;
wenzelm
parents: 64161
diff changeset
    92
            val result = Isabelle_System.bash(File.bash_path(tool) + " " + Bash.strings(args))
63226
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    93
            sys.exit(result.print_stdout.rc)
d8884c111bca support for .scala tools;
wenzelm
parents: 62960
diff changeset
    94
          }
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    95
    })
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    96
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    97
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    98
  /* internal tools */
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
    99
62960
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   100
  private val internal_tools: List[Isabelle_Tool] =
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   101
    List(
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   102
      Build.isabelle_tool,
65071
9ed87c82cbe7 proper Isabelle/Scala tool;
wenzelm
parents: 64929
diff changeset
   103
      Build_Cygwin.isabelle_tool,
62960
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   104
      Build_Doc.isabelle_tool,
64890
d8ccbd5305bf build docker image from Isabelle application bundle for Linux;
wenzelm
parents: 64872
diff changeset
   105
      Build_Docker.isabelle_tool,
64929
3b4e5fad4dc2 build_jdk in Scala;
wenzelm
parents: 64890
diff changeset
   106
      Build_JDK.isabelle_tool,
65880
54c6ec4166a4 clarified build_polyml_component;
wenzelm
parents: 65743
diff changeset
   107
      Build_PolyML.isabelle_tool1,
54c6ec4166a4 clarified build_polyml_component;
wenzelm
parents: 65743
diff changeset
   108
      Build_PolyML.isabelle_tool2,
65743
4847ca570454 clarified name;
wenzelm
parents: 65606
diff changeset
   109
      Build_Status.isabelle_tool,
62960
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   110
      Check_Sources.isabelle_tool,
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   111
      Doc.isabelle_tool,
68308
119fc05f6b00 support to dump build database produced by PIDE session;
wenzelm
parents: 68116
diff changeset
   112
      Dump.isabelle_tool,
68116
ac82ee617a75 command-line tool "isabelle export";
wenzelm
parents: 67433
diff changeset
   113
      Export.isabelle_tool,
65557
29c69a599743 clarified tool name -- more official status;
wenzelm
parents: 65518
diff changeset
   114
      Imports.isabelle_tool,
67041
f8b0367046bd converted to Isabelle/Scala;
wenzelm
parents: 66845
diff changeset
   115
      Mkroot.isabelle_tool,
62960
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   116
      ML_Process.isabelle_tool,
64369
6a9816764b37 proper Admin tool;
wenzelm
parents: 64311
diff changeset
   117
      NEWS.isabelle_tool,
62960
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   118
      Options.isabelle_tool,
67176
13b5c3ff1954 re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
wenzelm
parents: 67173
diff changeset
   119
      Present.isabelle_tool,
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents: 64304
diff changeset
   120
      Profiling_Report.isabelle_tool,
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents: 63688
diff changeset
   121
      Remote_DMG.isabelle_tool,
66845
6847eb01ae47 reactivated unfinished tool (cf. a3a847c4fbdb);
wenzelm
parents: 66530
diff changeset
   122
      Server.isabelle_tool,
62960
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   123
      Update_Cartouches.isabelle_tool,
67433
e0c0c1f0e3e7 more specific tool "isabelle update_comments", for uniformity with formal comments in embedded languages;
wenzelm
parents: 67176
diff changeset
   124
      Update_Comments.isabelle_tool,
62960
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   125
      Update_Header.isabelle_tool,
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   126
      Update_Then.isabelle_tool,
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents: 64500
diff changeset
   127
      Update_Theorems.isabelle_tool,
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents: 65071
diff changeset
   128
      isabelle.vscode.Build_VSCode.isabelle_tool,
64738
bcdecd466cb2 generate static TextMate grammar for VSCode editor;
wenzelm
parents: 64605
diff changeset
   129
      isabelle.vscode.Grammar.isabelle_tool,
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents: 65071
diff changeset
   130
      isabelle.vscode.Server.isabelle_tool)
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   131
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   132
  private def list_internal(): List[(String, String)] =
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
   133
    for (tool <- internal_tools.toList if tool.accessible)
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
   134
      yield (tool.name, tool.description)
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   135
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   136
  private def find_internal(name: String): Option[List[String] => Unit] =
62960
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   137
    internal_tools.collectFirst({
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
   138
      case tool if tool.name == name && tool.accessible =>
62960
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   139
        args => Command_Line.tool0 { tool.body(args) }
cfbb6a5b427c simplified -- avoid odd mutable state, which potentially causes problems with module initialization;
wenzelm
parents: 62838
diff changeset
   140
      })
62831
5560905a32ae prefer internal tool;
wenzelm
parents: 62830
diff changeset
   141
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   142
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   143
  /* command line entry point */
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   144
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   145
  def main(args: Array[String])
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   146
  {
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   147
    Command_Line.tool0 {
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   148
      args.toList match {
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   149
        case Nil | List("-?") =>
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   150
          val tool_descriptions =
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   151
            (list_external() ::: list_internal()).sortBy(_._1).
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   152
              map({ case (a, "") => a case (a, b) => a + " - " + b })
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   153
          Getopts("""
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   154
Usage: isabelle TOOL [ARGS ...]
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   155
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   156
  Start Isabelle TOOL with ARGS; pass "-?" for tool-specific help.
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   157
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   158
Available tools:""" + tool_descriptions.mkString("\n  ", "\n  ", "\n")).usage
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   159
        case tool_name :: tool_args =>
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   160
          find_external(tool_name) orElse find_internal(tool_name) match {
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   161
            case Some(tool) => tool(tool_args)
62829
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   162
            case None => error("Unknown Isabelle tool: " + quote(tool_name))
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   163
          }
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   164
      }
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   165
    }
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   166
  }
4141c2a8458b clarified Isabelle tool wrapper: bash, Scala, no perl, no ML;
wenzelm
parents:
diff changeset
   167
}
62830
85024c0e953d support for internal tools;
wenzelm
parents: 62829
diff changeset
   168
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
   169
sealed case class Isabelle_Tool(
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
   170
  name: String, description: String, body: List[String] => Unit, admin: Boolean = false)
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
   171
{
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
   172
  def accessible: Boolean = !admin || Isabelle_System.admin()
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
   173
}