src/Tools/VSCode/src/build_vscode.scala
author wenzelm
Fri, 25 Feb 2022 15:47:47 +0100
changeset 75149 105820b79d8f
parent 75147 f9d2a9e94138
child 75152 1011ae2b524c
permissions -rw-r--r--
clarified extension name (again), corresponding to qualified resources within VSCode (settings, commands, etc.);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65367
83c30e290702 tuned headers;
wenzelm
parents: 65251
diff changeset
     1
/*  Title:      Tools/VSCode/src/build_vscode.scala
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
     3
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
     4
Build VSCode configuration and extension module for Isabelle.
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
     5
*/
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
     6
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
     7
package isabelle.vscode
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
     8
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
     9
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    10
import isabelle._
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    11
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    12
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    13
object Build_VSCode
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    14
{
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    15
  val extension_dir = Path.explode("~~/src/Tools/VSCode/extension")
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    16
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    17
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    18
  /* grammar */
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    19
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 72767
diff changeset
    20
  def build_grammar(options: Options, progress: Progress = new Progress): Unit =
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    21
  {
72767
f6bf65554764 clarified files;
wenzelm
parents: 72763
diff changeset
    22
    val logic = TextMate_Grammar.default_logic
72627
8d83acc5062e clarified signature;
wenzelm
parents: 71726
diff changeset
    23
    val keywords = Sessions.base_info(options, logic).check.base.overall_syntax.keywords
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    24
72767
f6bf65554764 clarified files;
wenzelm
parents: 72763
diff changeset
    25
    val output_path = extension_dir + Path.explode(TextMate_Grammar.default_output(logic))
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    26
    progress.echo(output_path.implode)
72767
f6bf65554764 clarified files;
wenzelm
parents: 72763
diff changeset
    27
    File.write_backup(output_path, TextMate_Grammar.generate(keywords))
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    28
  }
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    29
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    30
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    31
  /* extension */
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    32
75144
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    33
  def uninstall_extension(progress: Progress = new Progress): Unit =
75149
105820b79d8f clarified extension name (again), corresponding to qualified resources within VSCode (settings, commands, etc.);
wenzelm
parents: 75147
diff changeset
    34
    progress.bash("isabelle vscode --uninstall-extension isabelle.isabelle").check
75144
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    35
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    36
  def install_extension(vsix_path: Path, progress: Progress = new Progress): Unit =
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    37
    progress.bash("isabelle vscode --install-extension " +
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    38
      File.bash_platform_path(vsix_path))
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    39
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    40
  def build_extension(progress: Progress = new Progress): Path =
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    41
  {
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    42
    val output_path = extension_dir + Path.explode("out")
75143
4b740c1740eb support local .vsix installation;
wenzelm
parents: 73340
diff changeset
    43
    Isabelle_System.rm_tree(output_path)
4b740c1740eb support local .vsix installation;
wenzelm
parents: 73340
diff changeset
    44
    Isabelle_System.make_directory(output_path)
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    45
    progress.echo(output_path.implode)
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    46
75143
4b740c1740eb support local .vsix installation;
wenzelm
parents: 73340
diff changeset
    47
    val result =
4b740c1740eb support local .vsix installation;
wenzelm
parents: 73340
diff changeset
    48
      progress.bash("npm install && npm update --dev && vsce package",
4b740c1740eb support local .vsix installation;
wenzelm
parents: 73340
diff changeset
    49
        cwd = extension_dir.file, echo = true).check
4b740c1740eb support local .vsix installation;
wenzelm
parents: 73340
diff changeset
    50
75149
105820b79d8f clarified extension name (again), corresponding to qualified resources within VSCode (settings, commands, etc.);
wenzelm
parents: 75147
diff changeset
    51
    val Pattern = """.*Packaged:.*(isabelle-.*\.vsix).*""".r
75144
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    52
    result.out_lines.collectFirst(
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    53
      { case Pattern(vsix_name) => extension_dir + Path.basic(vsix_name) })
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    54
      .getOrElse(error("Failed to guess resulting .vsix file name"))
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    55
  }
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    56
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    57
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    58
  /* Isabelle tool wrapper */
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    59
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    60
  val isabelle_tool =
72763
3cc73d00553c added document antiquotation @{tool};
wenzelm
parents: 72627
diff changeset
    61
    Isabelle_Tool("build_vscode", "build Isabelle/VSCode extension module",
3cc73d00553c added document antiquotation @{tool};
wenzelm
parents: 72627
diff changeset
    62
      Scala_Project.here, args =>
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    63
    {
75143
4b740c1740eb support local .vsix installation;
wenzelm
parents: 73340
diff changeset
    64
      var install = false
75144
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    65
      var uninstall = false
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    66
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    67
      val getopts = Getopts("""
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    68
Usage: isabelle build_vscode
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    69
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    70
  Options are:
75143
4b740c1740eb support local .vsix installation;
wenzelm
parents: 73340
diff changeset
    71
    -I           install resulting extension
75144
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    72
    -U           uninstall extension (no build)
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    73
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    74
Build Isabelle/VSCode extension module in directory
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    75
""" + extension_dir.expand + """
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    76
75143
4b740c1740eb support local .vsix installation;
wenzelm
parents: 73340
diff changeset
    77
This requires node.js/npm and the vsce build tool.
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    78
""",
75144
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    79
        "I" -> (_ => install = true),
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    80
        "U" -> (_ => uninstall = true))
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    81
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    82
      val more_args = getopts(args)
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    83
      if (more_args.nonEmpty) getopts.usage()
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    84
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    85
      val options = Options.init()
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    86
      val progress = new Console_Progress()
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    87
75144
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    88
      if (uninstall) {
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    89
        uninstall_extension(progress = progress)
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    90
      }
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    91
      else {
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    92
        build_grammar(options, progress = progress)
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    93
        val path = build_extension(progress = progress)
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    94
        if (install) install_extension(path, progress = progress)
883d610a1a91 clarified options;
wenzelm
parents: 75143
diff changeset
    95
      }
69277
258bef08b31e support for user-defined Isabelle/Scala command-line tools;
wenzelm
parents: 66976
diff changeset
    96
    })
65138
64dfee6bd243 added admin tool "isabelle build_vscode";
wenzelm
parents:
diff changeset
    97
}