src/Tools/Code/code_target.ML
changeset 59479 b36379a730f4
parent 59430 b65809f05dc9
child 59480 61d6d5cbbcd3
equal deleted inserted replaced
59478:1755b24e8b44 59479:b36379a730f4
    34 
    34 
    35   type serializer
    35   type serializer
    36   type literals = Code_Printer.literals
    36   type literals = Code_Printer.literals
    37   type language
    37   type language
    38   type ancestry
    38   type ancestry
       
    39   val assert_target: theory -> string -> string
    39   val add_language: string * language -> theory -> theory
    40   val add_language: string * language -> theory -> theory
    40   val add_derived_target: string * ancestry -> theory -> theory
    41   val add_derived_target: string * ancestry -> theory -> theory
    41   val assert_target: Proof.context -> string -> string
       
    42   val the_literals: Proof.context -> string -> literals
    42   val the_literals: Proof.context -> string -> literals
    43   type serialization
    43   type serialization
    44   val parse_args: 'a parser -> Token.T list -> 'a
    44   val parse_args: 'a parser -> Token.T list -> 'a
    45   val serialization: (int -> Path.T option -> 'a -> unit)
    45   val serialization: (int -> Path.T option -> 'a -> unit)
    46     -> (Code_Symbol.T list -> int -> 'a -> (string * string) list * (Code_Symbol.T -> string option))
    46     -> (Code_Symbol.T list -> int -> 'a -> (string * string) list * (Code_Symbol.T -> string option))
   201     ) (targets1, targets2)
   201     ) (targets1, targets2)
   202 );
   202 );
   203 
   203 
   204 fun exists_target thy = Symtab.defined (Targets.get thy);
   204 fun exists_target thy = Symtab.defined (Targets.get thy);
   205 fun lookup_target_data thy = Symtab.lookup (Targets.get thy);
   205 fun lookup_target_data thy = Symtab.lookup (Targets.get thy);
       
   206 fun assert_target thy target_name =
       
   207   if exists_target thy target_name
       
   208   then target_name
       
   209   else error ("Unknown code target language: " ^ quote target_name);
   206 
   210 
   207 fun fold1 f xs = fold f (tl xs) (hd xs);
   211 fun fold1 f xs = fold f (tl xs) (hd xs);
   208 
   212 
   209 fun join_ancestry thy target_name =
   213 fun join_ancestry thy target_name =
   210   let
   214   let
       
   215     val _ = assert_target thy target_name; 
   211     val the_target_data = the o lookup_target_data thy;
   216     val the_target_data = the o lookup_target_data thy;
   212     val (target, this_data) = the_target_data target_name;
   217     val (target, this_data) = the_target_data target_name;
   213     val ancestry = #ancestry target;
   218     val ancestry = #ancestry target;
   214     val modifies = rev (map snd ancestry);
   219     val modifies = rev (map snd ancestry);
   215     val modify = fold (curry (op o)) modifies I;
   220     val modify = fold (curry (op o)) modifies I;
   216     val datas = rev (map (snd o the_target_data o fst) ancestry) @ [this_data];
   221     val datas = rev (map (snd o the_target_data o fst) ancestry) @ [this_data];
   217     val data = fold1 (fn data' => fn data => Code_Printer.merge_data (data, data')) datas;
   222     val data = fold1 (fn data' => fn data => Code_Printer.merge_data (data, data')) datas;
   218   in (modify, (target, data)) end;
   223   in (modify, (target, data)) end;
   219 
   224 
   220 fun assert_target ctxt target_name =
   225   fun allocate_target target_name target thy =
   221   if exists_target (Proof_Context.theory_of ctxt) target_name
       
   222   then target_name
       
   223   else error ("Unknown code target language: " ^ quote target_name);
       
   224 
       
   225 fun allocate_target target_name target thy =
       
   226   let
   226   let
   227     val _ = if exists_target thy target_name
   227     val _ = if exists_target thy target_name
   228       then error ("Attempt to overwrite existing target " ^ quote target_name)
   228       then error ("Attempt to overwrite existing target " ^ quote target_name)
   229       else ();
   229       else ();
   230   in
   230   in
   254       ancestry = ancestry } thy 
   254       ancestry = ancestry } thy 
   255   end;
   255   end;
   256   
   256   
   257 fun map_data target_name f thy =
   257 fun map_data target_name f thy =
   258   let
   258   let
   259     val _ = assert_target (Proof_Context.init_global thy) target_name;
   259     val _ = assert_target thy target_name;
   260   in
   260   in
   261     thy
   261     thy
   262     |> (Targets.map o Symtab.map_entry target_name o apsnd o Code_Printer.map_data) f
   262     |> (Targets.map o Symtab.map_entry target_name o apsnd o Code_Printer.map_data) f
   263   end;
   263   end;
   264 
   264