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