mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-06 07:38:45 +00:00
[examples] final pass over todos in the type metaprogram
This commit is contained in:
@@ -1,22 +1,81 @@
|
|||||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:949
|
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:993
|
||||||
TypeInfoMember MagicalPoint2D_members[0] = {
|
TypeInfoMember Circle_members[2] = {
|
||||||
|
{"r", 1, -1, &F32_type_info},
|
||||||
|
{"pos", 3, -1, &V2F32_type_info},
|
||||||
};
|
};
|
||||||
TypeInfoMember BackwardsArray_members[2] = {
|
TypeInfoMember RoundedSegment_members[3] = {
|
||||||
{"vals", 4, -1, &U32_type_info},
|
{"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},
|
{"count", 5, -1, &U32_type_info},
|
||||||
};
|
{"p", 1, 1, &V2F32_type_info},
|
||||||
TypeInfoMember TwinType_members[1] = {
|
|
||||||
{"val", 3, -1, &U32_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 U32_type_info = {TypeKind_Basic, "U32", 3, 4, 0, 0};
|
||||||
TypeInfo MagicalPoint2D_type_info = {TypeKind_Struct, "MagicalPoint2D", 14, 0, MagicalPoint2D_members, 0};
|
TypeInfo F32_type_info = {TypeKind_Basic, "F32", 3, 4, 0, 0};
|
||||||
TypeInfo BackwardsArray_type_info = {TypeKind_Struct, "BackwardsArray", 14, 2, BackwardsArray_members, 0};
|
TypeInfo V2F32_type_info = {TypeKind_Basic, "V2F32", 5, 8, 0, 0};
|
||||||
TypeInfo TwinType_type_info = {TypeKind_Basic, "TwinType", 8, 4, 0, 0};
|
TypeInfo Circle_type_info = {TypeKind_Struct, "Circle", 6, 2, Circle_members, 0};
|
||||||
TypeInfo TwinType_type_info = {TypeKind_Struct, "TwinType", 8, 1, TwinType_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,45 @@
|
|||||||
#if !defined(META_TYPES_H)
|
#if !defined(META_TYPES_H)
|
||||||
#define META_TYPES_H
|
#define META_TYPES_H
|
||||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:826
|
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:870
|
||||||
typedef struct MagicalPoint2D MagicalPoint2D;
|
typedef struct Circle Circle;
|
||||||
struct MagicalPoint2D
|
struct Circle
|
||||||
{
|
{
|
||||||
|
F32 r;
|
||||||
|
V2F32 pos;
|
||||||
};
|
};
|
||||||
typedef struct BackwardsArray BackwardsArray;
|
typedef struct RoundedSegment RoundedSegment;
|
||||||
struct BackwardsArray
|
struct RoundedSegment
|
||||||
{
|
{
|
||||||
U32 vals;
|
F32 r;
|
||||||
|
V2F32 p1;
|
||||||
|
V2F32 p2;
|
||||||
|
};
|
||||||
|
typedef struct RoundedPolygon RoundedPolygon;
|
||||||
|
struct RoundedPolygon
|
||||||
|
{
|
||||||
|
F32 r;
|
||||||
U32 count;
|
U32 count;
|
||||||
|
V2F32 *p;
|
||||||
};
|
};
|
||||||
typedef struct TwinType TwinType;
|
typedef U32 Shape;
|
||||||
struct TwinType
|
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 U32_type_info;
|
||||||
extern TypeInfo MagicalPoint2D_type_info;
|
extern TypeInfo F32_type_info;
|
||||||
extern TypeInfo BackwardsArray_type_info;
|
extern TypeInfo V2F32_type_info;
|
||||||
extern TypeInfo TwinType_type_info;
|
extern TypeInfo Circle_type_info;
|
||||||
extern TypeInfo TwinType_type_info;
|
extern TypeInfo RoundedSegment_type_info;
|
||||||
|
extern TypeInfo RoundedPolygon_type_info;
|
||||||
|
extern TypeInfo Shape_type_info;
|
||||||
|
|
||||||
#endif // META_TYPES_H
|
#endif // META_TYPES_H
|
||||||
|
|||||||
@@ -64,8 +64,6 @@ FILE *error_file = 0;
|
|||||||
// We also use the MD_Map helper to create a string -> pointer mapping so that
|
// 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
|
// we can look up the "processed" info pointers by name after the initial
|
||||||
// gather stage.
|
// gather stage.
|
||||||
//
|
|
||||||
// TODO notes on managing output files.
|
|
||||||
|
|
||||||
GEN_TypeInfo *first_type = 0;
|
GEN_TypeInfo *first_type = 0;
|
||||||
GEN_TypeInfo *last_type = 0;
|
GEN_TypeInfo *last_type = 0;
|
||||||
@@ -111,14 +109,6 @@ gen_resolve_type_info_from_referencer(MD_Node *reference)
|
|||||||
return(result);
|
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_TypeEnumerant*
|
||||||
gen_enumerant_from_name(GEN_TypeInfo *enum_type, MD_String8 name)
|
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);
|
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 /////////////////////////////////////////////////////////////////
|
//~ analyzers /////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// @notes The first stage of processing is to loop over the top level nodes
|
// @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))
|
if (!MD_NodeIsNil(type_tag))
|
||||||
{
|
{
|
||||||
// TODO(allen): check for duplicates
|
gen_check_and_do_duplicate_symbol_error(node);
|
||||||
|
|
||||||
GEN_TypeKind kind = GEN_TypeKind_Null;
|
GEN_TypeKind kind = GEN_TypeKind_Null;
|
||||||
MD_Node *tag_arg_node = type_tag->first_child;
|
MD_Node *tag_arg_node = type_tag->first_child;
|
||||||
@@ -215,7 +256,7 @@ gen_gather_types_and_maps(MD_Node *list)
|
|||||||
// gather map
|
// gather map
|
||||||
if (MD_NodeHasTag(node, MD_S8Lit("map"), 0))
|
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);
|
GEN_MapInfo *map_info = MD_PushArrayZero(arena, GEN_MapInfo, 1);
|
||||||
map_info->node = node;
|
map_info->node = node;
|
||||||
@@ -1189,15 +1230,6 @@ gen_function_definitions_from_maps(FILE *out)
|
|||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
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
|
// setup the global arena
|
||||||
arena = MD_ArenaAlloc();
|
arena = MD_ArenaAlloc();
|
||||||
|
|
||||||
|
|||||||
@@ -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_string(MD_String8 name);
|
||||||
GEN_TypeInfo* gen_resolve_type_info_from_referencer(MD_Node *reference);
|
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_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);
|
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 /////////////////////////////////////////////////////////////////
|
//~ analyzers /////////////////////////////////////////////////////////////////
|
||||||
void gen_gather_types_and_maps(MD_Node *list);
|
void gen_gather_types_and_maps(MD_Node *list);
|
||||||
void gen_check_duplicate_member_names(void);
|
void gen_check_duplicate_member_names(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user