From 8ce66a8dff5101cd7769cd0864b8f890225df387 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 25 Sep 2021 20:43:53 -0700 Subject: [PATCH] [examples] type info: member name collision checker --- examples/type_metadata/generated/meta_types.c | 6 +-- examples/type_metadata/generated/meta_types.h | 6 +-- examples/type_metadata/type_metadata.c | 45 ++++++++++++++++--- examples/type_metadata/type_metadata.h | 1 + 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/examples/type_metadata/generated/meta_types.c b/examples/type_metadata/generated/meta_types.c index 446da07..4e35a2c 100644 --- a/examples/type_metadata/generated/meta_types.c +++ b/examples/type_metadata/generated/meta_types.c @@ -1,4 +1,4 @@ -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:524 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:557 TypeInfoMember Circle_members[2] = { {"r", 1, -1, &F32_type_info}, {"pos", 3, -1, &V2F32_type_info}, @@ -14,14 +14,14 @@ TypeInfoMember RoundedPolygon_members[3] = { {"p", 1, 1, &V2F32_type_info}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:563 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:596 TypeInfoEnumerant Shape_members[3] = { {"Circle", 6, 1}, {"Segment", 7, 2}, {"Polygon", 7, 3}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:599 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:632 TypeInfo U32_type_info = {TypeKind_Basic, "U32", 3, 4, 0, 0}; TypeInfo F32_type_info = {TypeKind_Basic, "F32", 3, 4, 0, 0}; TypeInfo V2F32_type_info = {TypeKind_Basic, "V2F32", 5, 8, 0, 0}; diff --git a/examples/type_metadata/generated/meta_types.h b/examples/type_metadata/generated/meta_types.h index a39c139..14f3ffa 100644 --- a/examples/type_metadata/generated/meta_types.h +++ b/examples/type_metadata/generated/meta_types.h @@ -1,6 +1,6 @@ #if !defined(META_TYPES_H) #define META_TYPES_H -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:400 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:432 typedef struct Circle Circle; struct Circle { @@ -29,11 +29,11 @@ Shape_Segment = 2, Shape_Polygon = 3, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:483 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:516 TypeInfo* type_info_from_shape(Shape v); U32 max_slot_from_shape(Shape v); -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:508 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:541 extern TypeInfo U32_type_info; extern TypeInfo F32_type_info; extern TypeInfo V2F32_type_info; diff --git a/examples/type_metadata/type_metadata.c b/examples/type_metadata/type_metadata.c index a2b45f4..e5a75c9 100644 --- a/examples/type_metadata/type_metadata.c +++ b/examples/type_metadata/type_metadata.c @@ -141,6 +141,38 @@ gen_gather_types_and_maps(MD_Node *list) } } +void +gen_check_duplicate_member_names(void) +{ + for (GEN_TypeInfo *type = first_type; + type != 0; + type = type->next) + { + MD_Node *type_root_node = type->node; + for (MD_EachNode(member_node, type_root_node->first_child)) + { + MD_String8 name = member_node->string; + for (MD_EachNode(check_node, type_root_node->first_child)) + { + if (member_node == check_node) + { + break; + } + if (MD_S8Match(name, check_node->string, 0)) + { + MD_CodeLoc my_loc = MD_CodeLocFromNode(member_node); + MD_CodeLoc og_loc = MD_CodeLocFromNode(check_node); + MD_PrintMessageFmt(error_file, my_loc, MD_MessageKind_Error, + "'%.*s' is already defined", MD_S8VArg(name)); + MD_PrintMessageFmt(error_file, og_loc, MD_MessageKind_Note, + "see previous definition of '%.*s'", MD_S8VArg(name)); + break; + } + } + } + } +} + void gen_equip_basic_type_size(void) { @@ -449,8 +481,9 @@ gen_type_definitions_from_types(FILE *out) { fprintf(out, "typedef enum %.*s\n", MD_S8VArg(enum_name)); } - fprintf(out, "{\n"); + + // enum body for (GEN_TypeEnumerant *enumerant = type->first_enumerant; enumerant != 0; enumerant = enumerant->next) @@ -672,7 +705,7 @@ main(int argc, char **argv) // parse all files passed to the command line MD_Node *list = MD_MakeList(arena); - for(int i = 1; i < argc; i += 1) + for (int i = 1; i < argc; i += 1) { // parse the file MD_String8 file_name = MD_S8CString(argv[i]); @@ -697,28 +730,26 @@ main(int argc, char **argv) // analysis phase gen_gather_types_and_maps(list); - // TODO no duplicate member names check + gen_check_duplicate_member_names(); gen_equip_basic_type_size(); gen_equip_struct_members(); gen_equip_enum_underlying_type(); gen_equip_enum_members(); // TODO check maps & build case lists - // generate meta types header + // generate header file { FILE *h = fopen("meta_types.h", "wb"); fprintf(h, "#if !defined(META_TYPES_H)\n"); fprintf(h, "#define META_TYPES_H\n"); - gen_type_definitions_from_types(h); gen_function_declarations_from_maps(h); gen_type_info_declarations_from_types(h); - fprintf(h, "#endif // META_TYPES_H\n"); fclose(h); } - // generate meta types code + // generate definitions file { // open output file FILE *c = fopen("meta_types.c", "wb"); diff --git a/examples/type_metadata/type_metadata.h b/examples/type_metadata/type_metadata.h index cbbab0f..9cd75ab 100644 --- a/examples/type_metadata/type_metadata.h +++ b/examples/type_metadata/type_metadata.h @@ -72,6 +72,7 @@ MD_Node* gen_get_md_child_value(MD_Node *parent, MD_String8 child_name); //~ analyzers ///////////////////////////////////////////////////////////////// void gen_gather_types_and_maps(MD_Node *list); +void gen_check_duplicate_member_names(void); void gen_equip_basic_type_size(void); void gen_equip_struct_members(void); void gen_equip_enum_underlying_type(void);