diff --git a/ds_generator.anubis b/ds_generator.anubis index f891719..57fd1ba 100644 --- a/ds_generator.anubis +++ b/ds_generator.anubis @@ -12,7 +12,7 @@ transmit types/densaku.anubis public type DS_Generator_API: ds_api( - ((List(DS_Type), List(DS_Message), String) -> Maybe(One)) generate_type_files). + ((List(DS_Type_File), List(DS_Message), String) -> Maybe(One)) generate_type_files). public define Maybe(DS_Generator_API) load_ds_generator diff --git a/types/ds_types.anubis b/types/ds_types.anubis index 6890c56..d5a022f 100644 --- a/types/ds_types.anubis +++ b/types/ds_types.anubis @@ -125,16 +125,57 @@ public define DS_Type )= ds_type(type_name, message, ds_alts) . + +public type DS_Type_File_Output_Dir: + auto, //auto generated by densaku to given dir (in argument) + /types/generated/ + relative_path(String rel_path), //given dir (in argument) + path + absolute_path(String abs_path) //abs_path +. + +public type DS_Type_File_Output_Name: + auto, //auto generated by densaku name of the type + name(String name) +. + +public type DS_Type_File: + ds_type_file ( + DS_Type_File_Output_Dir output_path, + DS_Type_File_Output_Name file_name, + List(DS_Type) types + ) +. public type Extern_type: extern(String type_name, String ext_read) . +define Bool +/* check if type_name is in the list beside_type. + * if yes return true and means the type is defined in same file + */ + is_exists + ( + String type_name, + List(DS_Type) beside_type + )= + if beside_type is + { + [] then false, + [h . t] then + since h is ds_type(name, _, _), + if type_name = name then + true + else + is_exists(type_name, t) + } +. + define List(Extern_type) extract_extern_type ( List(DS_Component) components, - List(Extern_type) so_far + List(Extern_type) so_far, + List(DS_Type) beside_type )= if components is { @@ -142,13 +183,16 @@ define List(Extern_type) [h . t] then since h is component(_b_list, _anb_type, _name, _comment), if _anb_type is ds_type(_type_name) then - extract_extern_type( - t, append_once(so_far, extern(_type_name, "types/generated/"+to_lower(_type_name)+".anubis"))) + if is_exists(_type_name, beside_type) then + extract_extern_type(t, so_far, beside_type) + else + extract_extern_type( + t, append_once(so_far, extern(_type_name, "types/generated/"+to_lower(_type_name)+".anubis")), beside_type) else if _anb_type is extern_type(_type_name, read_file) then extract_extern_type( - t, append_once(so_far, extern(_type_name, read_file))) + t, append_once(so_far, extern(_type_name, read_file)), beside_type) else - extract_extern_type(t, so_far) + extract_extern_type(t, so_far, beside_type) } . @@ -156,7 +200,8 @@ define List(Extern_type) extract_extern_type ( List(DS_Alternative) alt, - List(Extern_type) so_far + List(Extern_type) so_far, + List(DS_Type) beside_type )= if alt is { @@ -164,9 +209,9 @@ define List(Extern_type) [h . t] then if h is { - enum(_ , _) then extract_extern_type(t, so_far) + enum(_ , _) then extract_extern_type(t, so_far, beside_type) alternative(_, _, components) then - extract_extern_type(t, extract_extern_type(components, so_far)) + extract_extern_type(t, extract_extern_type(components, so_far, beside_type), beside_type) } } . @@ -174,10 +219,11 @@ define List(Extern_type) public define List(Extern_type) get_all_extern_type ( - DS_Type ds_type + DS_Type ds_type, //Type from which we want to extract the extern types + List(DS_Type) beside_type //all known type in same file )= since ds_type is ds_type(_, _, ds_alternatives), - extract_extern_type(ds_alternatives, []) + extract_extern_type(ds_alternatives, [], beside_type) . /******************* DUMP function *****************************/ -- libgit2 0.21.4