src/Pure/Tools/generated_files.ML
author wenzelm
Sat, 02 Feb 2019 15:52:14 +0100
changeset 69784 24bbc4e30e5b
parent 69662 fd86ed39aea4
child 70012 36aeb535a801
permissions -rw-r--r--
clarified signature: Path.T as in Generated_Files;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69383
747f8b052e59 clarified modules;
wenzelm
parents: 69381
diff changeset
     1
(*  Title:      Pure/Tools/generated_files.ML
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
     3
69383
747f8b052e59 clarified modules;
wenzelm
parents: 69381
diff changeset
     4
Generated source files for other languages: with antiquotations, without Isabelle symbols.
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
     5
*)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
     6
69383
747f8b052e59 clarified modules;
wenzelm
parents: 69381
diff changeset
     7
signature GENERATED_FILES =
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
     8
sig
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
     9
  val add_files: (Path.T * Position.T) * string -> theory -> theory
69662
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    10
  val get_files: theory -> {path: Path.T, pos: Position.T, text: string} list
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    11
  val write_files: theory -> Path.T -> (Path.T * Position.T) list
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    12
  val export_files: theory -> theory list -> (Path.T * Position.T) list
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    13
  type file_type =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    14
    {name: string, ext: string, make_comment: string -> string, make_string: string -> string}
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    15
  val file_type:
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    16
    binding -> {ext: string, make_comment: string -> string, make_string: string -> string} ->
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    17
    theory -> theory
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    18
  val antiquotation: binding -> 'a Token.context_parser ->
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    19
    ({context: Proof.context, source: Token.src, file_type: file_type, argument: 'a} -> string) ->
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    20
    theory -> theory
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    21
  val set_string: string -> Proof.context -> Proof.context
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    22
  val generate_file_cmd: (string * Position.T) * Input.source -> local_theory -> local_theory
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    23
end;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    24
69383
747f8b052e59 clarified modules;
wenzelm
parents: 69381
diff changeset
    25
structure Generated_Files: GENERATED_FILES =
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    26
struct
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    27
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    28
(** context data **)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    29
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    30
type file_type =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    31
  {name: string, ext: string, make_comment: string -> string, make_string: string -> string};
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    32
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    33
type antiquotation = Token.src -> Proof.context -> file_type -> string;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    34
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    35
structure Data = Theory_Data
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    36
(
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    37
  type T =
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    38
    (Path.T * (Position.T * string)) list *  (*files for current theory*)
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    39
    file_type Name_Space.table *  (*file types*)
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    40
    antiquotation Name_Space.table;  (*antiquotations*)
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    41
  val empty =
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    42
    ([],
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    43
     Name_Space.empty_table Markup.file_typeN,
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    44
     Name_Space.empty_table Markup.antiquotationN);
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    45
  val extend = @{apply 3(1)} (K []);
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    46
  fun merge ((_, types1, antiqs1), (_, types2, antiqs2)) =
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    47
    ([],
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    48
     Name_Space.merge_tables (types1, types2),
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    49
     Name_Space.merge_tables (antiqs1, antiqs2));
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    50
);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    51
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    52
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    53
(* files *)
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    54
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    55
fun add_files ((path0, pos), text) =
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    56
  let
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    57
    val path = Path.expand path0;
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    58
    fun err msg ps = error (msg ^ ": " ^ Path.print path ^ Position.here_list ps);
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    59
    val _ =
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    60
      if Path.is_absolute path then err "Illegal absolute path" [pos]
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    61
      else if Path.has_parent path then err "Illegal parent path" [pos]
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    62
      else ();
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    63
  in
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    64
    (Data.map o @{apply 3(1)}) (fn files =>
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    65
      (case AList.lookup (op =) files path of
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    66
        SOME (pos', _) => err "Duplicate generated file" [pos, pos']
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    67
      | NONE => (path, (pos, text)) :: files))
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    68
  end;
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    69
69662
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    70
val get_files =
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    71
  map (fn (path, (pos, text)) => {path = path, pos = pos, text = text}) o rev o #1 o Data.get;
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    72
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    73
fun write_files thy dir =
69662
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    74
  get_files thy |> map (fn {path, pos, text} =>
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    75
    let
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    76
      val path' = Path.expand (Path.append dir path);
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    77
      val _ = Isabelle_System.mkdirs (Path.dir path');
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    78
      val _ = File.generate path' text;
69662
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    79
    in (path, pos) end);
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    80
69662
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    81
fun export_files thy other_thys =
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    82
  other_thys |> maps (fn other_thy =>
fd86ed39aea4 added command 'export_generated_files';
wenzelm
parents: 69628
diff changeset
    83
    get_files other_thy |> map (fn {path, pos, text} =>
69784
24bbc4e30e5b clarified signature: Path.T as in Generated_Files;
wenzelm
parents: 69662
diff changeset
    84
      (Export.export thy path [text]; (path, pos))));
69628
a2fbfdc5e62d export generated files;
wenzelm
parents: 69385
diff changeset
    85
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    86
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    87
(* file types *)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    88
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    89
fun the_file_type thy ext =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    90
  if ext = "" then error "Bad file extension"
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    91
  else
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
    92
    (#2 (Data.get thy), NONE) |-> Name_Space.fold_table
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    93
      (fn (_, file_type) => fn res =>
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    94
        if #ext file_type = ext then SOME file_type else res)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    95
    |> (fn SOME file_type => file_type
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    96
         | NONE => error ("Unknown file type for extension " ^ quote ext));
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    97
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    98
fun file_type binding {ext, make_comment, make_string} thy =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
    99
  let
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   100
    val name = Binding.name_of binding;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   101
    val pos = Binding.pos_of binding;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   102
    val file_type = {name = name, ext = ext, make_comment = make_comment, make_string = make_string};
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   103
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
   104
    val table = #2 (Data.get thy);
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   105
    val space = Name_Space.space_of_table table;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   106
    val context = Context.Theory thy |> Name_Space.map_naming (K Name_Space.global_naming);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   107
    val (_, data') = table |> Name_Space.define context true (Binding.make (name, pos), file_type);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   108
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   109
    val _ =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   110
      (case try (#name o the_file_type thy) ext of
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   111
        NONE => ()
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   112
      | SOME name' =>
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   113
          error ("Extension " ^ quote ext ^ " already registered for file type " ^
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   114
            quote (Markup.markup (Name_Space.markup space name') name') ^ Position.here pos));
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
   115
  in thy |> (Data.map o @{apply 3(2)}) (K data') end;
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   116
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   117
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   118
(* antiquotations *)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   119
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
   120
val get_antiquotations = #3 o Data.get o Proof_Context.theory_of;
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   121
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   122
fun antiquotation name scan body thy =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   123
  let
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   124
    fun ant src ctxt file_type : string =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   125
      let val (x, ctxt') = Token.syntax scan src ctxt
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   126
      in body {context = ctxt', source = src, file_type = file_type, argument = x} end;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   127
  in
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   128
    thy
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
   129
    |> (Data.map o @{apply 3(3)}) (Name_Space.define (Context.Theory thy) true (name, ant) #> #2)
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   130
  end;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   131
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   132
val scan_antiq =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   133
  Antiquote.scan_control >> Antiquote.Control ||
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   134
  Scan.one (Symbol.not_eof o Symbol_Pos.symbol) >> (Antiquote.Text o Symbol_Pos.symbol);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   135
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   136
fun read_source ctxt (file_type: file_type) source =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   137
  let
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   138
    val _ =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   139
      Context_Position.report ctxt (Input.pos_of source)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   140
        (Markup.language
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   141
          {name = #name file_type, symbols = false, antiquotes = true,
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   142
            delimited = Input.is_delimited source});
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   143
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   144
    val (input, _) =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   145
      Input.source_explode source
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   146
      |> Scan.error (Scan.finite Symbol_Pos.stopper (Scan.repeat scan_antiq));
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   147
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   148
    val _ = Context_Position.reports ctxt (Antiquote.antiq_reports input);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   149
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   150
    fun expand antiq =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   151
      (case antiq of
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   152
        Antiquote.Text s => s
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   153
      | Antiquote.Control {name, body, ...} =>
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   154
          let
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   155
            val src = Token.make_src name (if null body then [] else [Token.read_cartouche body]);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   156
            val (src', ant) = Token.check_src ctxt get_antiquotations src;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   157
          in ant src' ctxt file_type end
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   158
      | Antiquote.Antiq antiq => error ("Bad antiquotation " ^ Position.here (#1 (#range antiq))));
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   159
  in implode (map expand input) end;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   160
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   161
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   162
(* generate files *)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   163
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   164
fun generate_file_cmd ((file, pos), source) lthy =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   165
  let
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   166
    val thy = Proof_Context.theory_of lthy;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   167
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
   168
    val path = Path.explode file;
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   169
    val file_type =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   170
      the_file_type thy (#2 (Path.split_ext path))
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   171
        handle ERROR msg => error (msg ^ Position.here pos);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   172
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   173
    val header = #make_comment file_type " generated by Isabelle ";
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   174
    val text = header ^ "\n" ^ read_source lthy file_type source;
69385
be9f187dcd50 clarified signature: allow to add_files/get_files by other tools;
wenzelm
parents: 69383
diff changeset
   175
  in lthy |> (Local_Theory.background_theory o add_files) ((path, pos), text) end;
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   176
69383
747f8b052e59 clarified modules;
wenzelm
parents: 69381
diff changeset
   177
 
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   178
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   179
(** concrete file types **)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   180
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   181
val _ =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   182
  Theory.setup
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   183
    (file_type \<^binding>\<open>Haskell\<close>
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   184
      {ext = "hs",
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   185
       make_comment = enclose "{-" "-}",
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   186
       make_string = GHC.print_string});
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   187
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   188
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   189
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   190
(** concrete antiquotations **)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   191
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   192
(* ML expression as string literal *)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   193
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   194
structure Local_Data = Proof_Data
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   195
(
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   196
  type T = string option;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   197
  fun init _ = NONE;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   198
);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   199
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   200
val set_string = Local_Data.put o SOME;
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   201
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   202
fun the_string ctxt =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   203
  (case Local_Data.get ctxt of
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   204
    SOME s => s
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   205
  | NONE => raise Fail "No result string");
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   206
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   207
val _ =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   208
  Theory.setup
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   209
    (antiquotation \<^binding>\<open>cartouche\<close> (Scan.lift Args.cartouche_input)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   210
      (fn {context = ctxt, file_type, argument, ...} =>
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   211
        ctxt |> Context.proof_map
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   212
          (ML_Context.expression (Input.pos_of argument)
69383
747f8b052e59 clarified modules;
wenzelm
parents: 69381
diff changeset
   213
            (ML_Lex.read "Theory.local_setup (Generated_Files.set_string (" @
69381
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   214
             ML_Lex.read_source argument @ ML_Lex.read "))"))
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   215
        |> the_string |> #make_string file_type));
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   216
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   217
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   218
(* file-system paths *)
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   219
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   220
fun path_antiquotation binding check =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   221
  antiquotation binding
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   222
    (Args.context -- Scan.lift (Parse.position Parse.path) >>
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   223
      (fn (ctxt, (name, pos)) => (check ctxt Path.current (name, pos) |> Path.implode)))
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   224
    (fn {file_type, argument, ...} => #make_string file_type argument);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   225
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   226
val _ =
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   227
  Theory.setup
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   228
   (path_antiquotation \<^binding>\<open>path\<close> Resources.check_path #>
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   229
    path_antiquotation \<^binding>\<open>file\<close> Resources.check_file #>
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   230
    path_antiquotation \<^binding>\<open>dir\<close> Resources.check_dir);
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   231
4c9b4e2c5460 more general command 'generate_file' for registered file types, notably Haskell;
wenzelm
parents:
diff changeset
   232
end;