1/*  Title:      Tools/VSCode/src/build_vscode.scala
2    Author:     Makarius
3
4Build VSCode configuration and extension module for Isabelle.
5*/
6
7package isabelle.vscode
8
9
10import isabelle._
11
12
13object Build_VSCode
14{
15  val extension_dir = Path.explode("~~/src/Tools/VSCode/extension")
16
17
18  /* grammar */
19
20  def build_grammar(options: Options, progress: Progress = No_Progress)
21  {
22    val logic = Grammar.default_logic
23    val keywords = Sessions.base_info(options, logic).check_base.overall_syntax.keywords
24
25    val output_path = extension_dir + Path.explode(Grammar.default_output(logic))
26    progress.echo(output_path.implode)
27    File.write_backup(output_path, Grammar.generate(keywords))
28  }
29
30
31  /* extension */
32
33  def build_extension(progress: Progress = No_Progress, publish: Boolean = false)
34  {
35    val output_path = extension_dir + Path.explode("out")
36    progress.echo(output_path.implode)
37
38    progress.bash(
39      "npm install && npm update --dev && vsce package" + (if (publish) " && vsce publish" else ""),
40      cwd = extension_dir.file, echo = true).check
41  }
42
43
44  /* Isabelle tool wrapper */
45
46  val isabelle_tool =
47    Isabelle_Tool("build_vscode", "build Isabelle/VSCode extension module", args =>
48    {
49      var publish = false
50
51      val getopts = Getopts("""
52Usage: isabelle build_vscode
53
54  Options are:
55    -P           publish the package
56
57Build Isabelle/VSCode extension module in directory
58""" + extension_dir.expand + """
59
60This requires npm and the vsce build and publishing tool, see also
61https://code.visualstudio.com/docs/tools/vscecli
62""",
63        "P" -> (_ => publish = true))
64
65      val more_args = getopts(args)
66      if (more_args.nonEmpty) getopts.usage()
67
68      val options = Options.init()
69      val progress = new Console_Progress()
70
71      build_grammar(options, progress)
72      build_extension(progress, publish = publish)
73    }, admin = true)
74}
75