mirror of
https://github.com/Ed94/metadesk.git
synced 2026-06-19 02:22:24 -07: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
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user