[examples] final pass over todos in the type metaprogram

This commit is contained in:
Allen Webster
2021-10-09 19:13:27 -07:00
parent ee3adcfb60
commit 670f5592f7
4 changed files with 164 additions and 51 deletions
+73 -14
View File
@@ -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);
}
+31 -15
View File
@@ -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
+53 -21
View File
@@ -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();
+7 -1
View File
@@ -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);