From b203d0ac67873467103efabf2c649fdccae0ee83 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 25 Sep 2021 21:35:51 -0700 Subject: [PATCH] [examples] check case values when building case lists --- examples/type_metadata/generated/meta_types.c | 6 +- examples/type_metadata/generated/meta_types.h | 6 +- examples/type_metadata/type_metadata.c | 96 +++++++++++-------- 3 files changed, 61 insertions(+), 47 deletions(-) diff --git a/examples/type_metadata/generated/meta_types.c b/examples/type_metadata/generated/meta_types.c index 0d73734..e73169b 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:693 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:707 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:732 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:746 TypeInfoEnumerant Shape_members[3] = { {"Circle", 6, 1}, {"Segment", 7, 2}, {"Polygon", 7, 3}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:768 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:782 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 cc65ce0..25dd5de 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:561 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:575 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:645 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:659 TypeInfo* type_info_from_shape(Shape v); U32 max_slot_from_shape(Shape v); -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:677 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:691 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 e947bd9..4a27a20 100644 --- a/examples/type_metadata/type_metadata.c +++ b/examples/type_metadata/type_metadata.c @@ -500,55 +500,69 @@ gen_equip_map_cases(void) map = map->next) { - // build the list - MD_b32 got_list = 1; - GEN_MapCase *first_case = 0; - GEN_MapCase *last_case = 0; - int case_count = 0; - - MD_Node *map_root_node = map->node; - - for (MD_Node *case_node = map_root_node->first_child, *next = 0; - !MD_NodeIsNil(case_node); - case_node = next) + if (map->types_are_good) { - MD_Node *next = MD_FirstNodeWithFlags(case_node, MD_NodeFlag_IsAfterComma); + GEN_TypeInfo *in_type = map->in; - // extract in & out - MD_Node *in = case_node; - MD_Node *arrow = in->next; - MD_Node *out = arrow->next; - if (!MD_S8Match(arrow->string, MD_S8Lit("->"), 0) || - MD_NodeIsNil(out)) + // build the list + MD_b32 got_list = 1; + GEN_MapCase *first_case = 0; + GEN_MapCase *last_case = 0; + int case_count = 0; + + MD_Node *map_root_node = map->node; + + for (MD_Node *case_node = map_root_node->first_child, *next = 0; + !MD_NodeIsNil(case_node); + case_node = next) { - MD_CodeLoc loc = MD_CodeLocFromNode(in); - MD_PrintMessage(error_file, loc, MD_MessageKind_Error, - MD_S8Lit("a map's case should be specified like: `in -> out,`")); - got_list = 0; - goto skip_case; + MD_Node *next = MD_FirstNodeWithFlags(case_node, MD_NodeFlag_IsAfterComma); + + // extract in & out + MD_Node *in = case_node; + MD_Node *arrow = in->next; + MD_Node *out = arrow->next; + if (!MD_S8Match(arrow->string, MD_S8Lit("->"), 0) || + MD_NodeIsNil(out)) + { + MD_CodeLoc loc = MD_CodeLocFromNode(in); + MD_PrintMessage(error_file, loc, MD_MessageKind_Error, + MD_S8Lit("a map's case should be specified like: `in -> out,`")); + got_list = 0; + goto skip_case; + } + + // check that in is a value of in_type + if (!MD_NodeHasChild(in_type->node, in->string, 0)) + { + MD_CodeLoc loc = MD_CodeLocFromNode(in); + MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error, + "'%.*s' is not a value in the enum '%.*s'", + MD_S8VArg(in->string), MD_S8VArg(in_type->node->string)); + got_list = 0; + goto skip_case; + } + + // save case + if (got_list) + { + GEN_MapCase *map_case = MD_PushArray(arena, GEN_MapCase, 1); + map_case->in = in; + map_case->out = out; + MD_QueuePush(first_case, last_case, map_case); + case_count += 1; + } + + skip_case:; } - // TODO check in is a value of in type - - // save case + // save the list if (got_list) { - GEN_MapCase *map_case = MD_PushArray(arena, GEN_MapCase, 1); - map_case->in = in; - map_case->out = out; - MD_QueuePush(first_case, last_case, map_case); - case_count += 1; + map->first_case = first_case; + map->last_case = last_case; + map->case_count = case_count; } - - skip_case:; - } - - // save the list - if (got_list) - { - map->first_case = first_case; - map->last_case = last_case; - map->case_count = case_count; } } }