diff --git a/examples/type_metadata/generated/meta_types.c b/examples/type_metadata/generated/meta_types.c index f49ad16..67ac7c7 100644 --- a/examples/type_metadata/generated/meta_types.c +++ b/examples/type_metadata/generated/meta_types.c @@ -1,22 +1,81 @@ -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:949 -TypeInfoMember MagicalPoint2D_members[0] = { +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:993 +TypeInfoMember Circle_members[2] = { +{"r", 1, -1, &F32_type_info}, +{"pos", 3, -1, &V2F32_type_info}, }; -TypeInfoMember BackwardsArray_members[2] = { -{"vals", 4, -1, &U32_type_info}, +TypeInfoMember RoundedSegment_members[3] = { +{"r", 1, -1, &F32_type_info}, +{"p1", 2, -1, &V2F32_type_info}, +{"p2", 2, -1, &V2F32_type_info}, +}; +TypeInfoMember RoundedPolygon_members[3] = { +{"r", 1, -1, &F32_type_info}, {"count", 5, -1, &U32_type_info}, -}; -TypeInfoMember TwinType_members[1] = { -{"val", 3, -1, &U32_type_info}, +{"p", 1, 1, &V2F32_type_info}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:988 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1032 +TypeInfoEnumerant Shape_members[3] = { +{"Circle", 6, 1}, +{"Segment", 7, 2}, +{"Polygon", 7, 3}, +}; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1024 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1068 TypeInfo U32_type_info = {TypeKind_Basic, "U32", 3, 4, 0, 0}; -TypeInfo MagicalPoint2D_type_info = {TypeKind_Struct, "MagicalPoint2D", 14, 0, MagicalPoint2D_members, 0}; -TypeInfo BackwardsArray_type_info = {TypeKind_Struct, "BackwardsArray", 14, 2, BackwardsArray_members, 0}; -TypeInfo TwinType_type_info = {TypeKind_Basic, "TwinType", 8, 4, 0, 0}; -TypeInfo TwinType_type_info = {TypeKind_Struct, "TwinType", 8, 1, TwinType_members, 0}; +TypeInfo F32_type_info = {TypeKind_Basic, "F32", 3, 4, 0, 0}; +TypeInfo V2F32_type_info = {TypeKind_Basic, "V2F32", 5, 8, 0, 0}; +TypeInfo Circle_type_info = {TypeKind_Struct, "Circle", 6, 2, Circle_members, 0}; +TypeInfo RoundedSegment_type_info = {TypeKind_Struct, "RoundedSegment", 14, 3, RoundedSegment_members, 0}; +TypeInfo RoundedPolygon_type_info = {TypeKind_Struct, "RoundedPolygon", 14, 3, RoundedPolygon_members, 0}; +TypeInfo Shape_type_info = {TypeKind_Enum, "Shape", 5, 3, Shape_members, &U32_type_info}; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1084 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1128 +TypeInfo* +type_info_from_shape(Shape v) +{ +TypeInfo* result; +switch (v) +{ +default: +{ +result = 0; +}break; +case Shape_Circle: +{ +result = &Circle_type_info; +}break; +case Shape_Segment: +{ +result = &RoundedSegment_type_info; +}break; +case Shape_Polygon: +{ +result = &RoundedPolygon_type_info; +}break; +} +return(result); +} +U32 +max_slot_from_shape(Shape v) +{ +U32 result; +switch (v) +{ +default: +{ +result = 0; +}break; +case Shape_Circle: +case Shape_Segment: +{ +result = 64; +}break; +case Shape_Polygon: +{ +result = 12; +}break; +} +return(result); +} diff --git a/examples/type_metadata/generated/meta_types.h b/examples/type_metadata/generated/meta_types.h index 665118f..8251a53 100644 --- a/examples/type_metadata/generated/meta_types.h +++ b/examples/type_metadata/generated/meta_types.h @@ -1,29 +1,45 @@ #if !defined(META_TYPES_H) #define META_TYPES_H -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:826 -typedef struct MagicalPoint2D MagicalPoint2D; -struct MagicalPoint2D +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:870 +typedef struct Circle Circle; +struct Circle { +F32 r; +V2F32 pos; }; -typedef struct BackwardsArray BackwardsArray; -struct BackwardsArray +typedef struct RoundedSegment RoundedSegment; +struct RoundedSegment { -U32 vals; +F32 r; +V2F32 p1; +V2F32 p2; +}; +typedef struct RoundedPolygon RoundedPolygon; +struct RoundedPolygon +{ +F32 r; U32 count; +V2F32 *p; }; -typedef struct TwinType TwinType; -struct TwinType +typedef U32 Shape; +enum { -U32 val; +Shape_Circle = 1, +Shape_Segment = 2, +Shape_Polygon = 3, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:910 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:954 +TypeInfo* type_info_from_shape(Shape v); +U32 max_slot_from_shape(Shape v); -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:933 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:977 extern TypeInfo U32_type_info; -extern TypeInfo MagicalPoint2D_type_info; -extern TypeInfo BackwardsArray_type_info; -extern TypeInfo TwinType_type_info; -extern TypeInfo TwinType_type_info; +extern TypeInfo F32_type_info; +extern TypeInfo V2F32_type_info; +extern TypeInfo Circle_type_info; +extern TypeInfo RoundedSegment_type_info; +extern TypeInfo RoundedPolygon_type_info; +extern TypeInfo Shape_type_info; #endif // META_TYPES_H diff --git a/examples/type_metadata/type_metadata.c b/examples/type_metadata/type_metadata.c index ae795a3..56c34f6 100644 --- a/examples/type_metadata/type_metadata.c +++ b/examples/type_metadata/type_metadata.c @@ -64,8 +64,6 @@ FILE *error_file = 0; // We also use the MD_Map helper to create a string -> pointer mapping so that // we can look up the "processed" info pointers by name after the initial // gather stage. -// -// TODO notes on managing output files. GEN_TypeInfo *first_type = 0; GEN_TypeInfo *last_type = 0; @@ -111,14 +109,6 @@ gen_resolve_type_info_from_referencer(MD_Node *reference) return(result); } -void -gen_type_resolve_error(MD_Node *reference) -{ - MD_CodeLoc loc = MD_CodeLocFromNode(reference); - MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error, - "could not resolve type name '%.*s'", MD_S8VArg(reference->string)); -} - GEN_TypeEnumerant* gen_enumerant_from_name(GEN_TypeInfo *enum_type, MD_String8 name) { @@ -153,6 +143,57 @@ gen_map_case_from_enumerant(GEN_MapInfo *map, GEN_TypeEnumerant *enumerant) return(result); } +MD_Node* +gen_get_symbol_md_node_by_name(MD_String8 name) +{ + MD_Node *result = MD_NilNode(); + MD_MapSlot *type_slot = MD_MapLookup(&type_map, MD_MapKeyStr(name)); + if (type_slot != 0) + { + GEN_TypeInfo *type_info = (GEN_TypeInfo*)type_slot->val; + result = type_info->node; + } + MD_MapSlot *map_slot = MD_MapLookup(&map_map, MD_MapKeyStr(name)); + if (map_slot != 0) + { + GEN_MapInfo *map_info = (GEN_MapInfo*)map_slot->val; + result = map_info->node; + } + return(result); +} + +void +gen_type_resolve_error(MD_Node *reference) +{ + MD_CodeLoc loc = MD_CodeLocFromNode(reference); + MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error, + "could not resolve type name '%.*s'", MD_S8VArg(reference->string)); +} + +void +gen_duplicate_symbol_error(MD_Node *new_node, MD_Node *existing_node) +{ + MD_CodeLoc loc = MD_CodeLocFromNode(new_node); + MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error, + "Symbol name '%.*s' is already used", + MD_S8VArg(new_node->string)); + MD_CodeLoc existing_loc = MD_CodeLocFromNode(existing_node); + MD_PrintMessageFmt(error_file, existing_loc, MD_MessageKind_Note, + "See '%.*s' is already used", + MD_S8VArg(existing_node->string)); +} + +void +gen_check_and_do_duplicate_symbol_error(MD_Node *new_node) +{ + MD_Node *existing = gen_get_symbol_md_node_by_name(new_node->string); + if (!MD_NodeIsNil(existing)) + { + gen_duplicate_symbol_error(new_node, existing); + } +} + + //~ analyzers ///////////////////////////////////////////////////////////////// // @notes The first stage of processing is to loop over the top level nodes @@ -177,7 +218,7 @@ gen_gather_types_and_maps(MD_Node *list) if (!MD_NodeIsNil(type_tag)) { - // TODO(allen): check for duplicates + gen_check_and_do_duplicate_symbol_error(node); GEN_TypeKind kind = GEN_TypeKind_Null; MD_Node *tag_arg_node = type_tag->first_child; @@ -215,7 +256,7 @@ gen_gather_types_and_maps(MD_Node *list) // gather map if (MD_NodeHasTag(node, MD_S8Lit("map"), 0)) { - // TODO(allen): check for duplicates + gen_check_and_do_duplicate_symbol_error(node); GEN_MapInfo *map_info = MD_PushArrayZero(arena, GEN_MapInfo, 1); map_info->node = node; @@ -1189,15 +1230,6 @@ gen_function_definitions_from_maps(FILE *out) int main(int argc, char **argv) { -#if 1 - char *argv_dummy[2] = { - 0, - "W:/metadesk/examples/type_metadata/bad_types.mdesk" - }; - argc = 2; - argv = argv_dummy; -#endif - // setup the global arena arena = MD_ArenaAlloc(); diff --git a/examples/type_metadata/type_metadata.h b/examples/type_metadata/type_metadata.h index 5cfbc9c..90f1bf3 100644 --- a/examples/type_metadata/type_metadata.h +++ b/examples/type_metadata/type_metadata.h @@ -104,12 +104,18 @@ MD_Node* gen_get_child_value(MD_Node *parent, MD_String8 child_name); GEN_TypeInfo* gen_resolve_type_info_from_string(MD_String8 name); GEN_TypeInfo* gen_resolve_type_info_from_referencer(MD_Node *reference); -void gen_type_resolve_error(MD_Node *reference); GEN_TypeEnumerant* gen_enumerant_from_name(GEN_TypeInfo *enum_type, MD_String8 name); GEN_MapCase* gen_map_case_from_enumerant(GEN_MapInfo *map, GEN_TypeEnumerant *enumerant); +MD_Node* gen_get_symbol_md_node_by_name(MD_String8 name); + +void gen_type_resolve_error(MD_Node *reference); +void gen_duplicate_symbol_error(MD_Node *new_node, MD_Node *existing_node); + +void gen_check_and_do_duplicate_symbol_error(MD_Node *new_node); + //~ analyzers ///////////////////////////////////////////////////////////////// void gen_gather_types_and_maps(MD_Node *list); void gen_check_duplicate_member_names(void);