mirror of
https://github.com/Ed94/metadesk.git
synced 2026-06-12 23:51:37 -07:00
[examples] more robust array index checker in the type example
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:914
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:949
|
||||
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:953
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:988
|
||||
TypeInfoEnumerant Shape_members[3] = {
|
||||
{"Circle", 6, 1},
|
||||
{"Segment", 7, 2},
|
||||
{"Polygon", 7, 3},
|
||||
};
|
||||
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:989
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1024
|
||||
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};
|
||||
@@ -30,7 +30,7 @@ TypeInfo RoundedSegment_type_info = {TypeKind_Struct, "RoundedSegment", 14, 3, R
|
||||
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:1049
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:1084
|
||||
TypeInfo*
|
||||
type_info_from_shape(Shape v)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#if !defined(META_TYPES_H)
|
||||
#define META_TYPES_H
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:791
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:826
|
||||
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:875
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:910
|
||||
TypeInfo* type_info_from_shape(Shape v);
|
||||
U32 max_slot_from_shape(Shape v);
|
||||
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:898
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:933
|
||||
extern TypeInfo U32_type_info;
|
||||
extern TypeInfo F32_type_info;
|
||||
extern TypeInfo V2F32_type_info;
|
||||
|
||||
@@ -349,7 +349,7 @@ gen_equip_struct_members(void)
|
||||
// resolved type:
|
||||
if (got_list)
|
||||
{
|
||||
MD_Node *array_count = MD_NilNode();
|
||||
GEN_TypeMember *array_count = 0;
|
||||
MD_Node *array_tag = MD_TagFromString(type_name_node, MD_S8Lit("array"), 0);
|
||||
if (!MD_NodeIsNil(array_tag))
|
||||
{
|
||||
@@ -362,14 +362,35 @@ gen_equip_struct_members(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
array_count = MD_ChildFromString(type_root_node, array_count_referencer->string, 0);
|
||||
if (MD_NodeIsNil(array_count))
|
||||
MD_Node *array_count_member_node =
|
||||
MD_ChildFromString(type_root_node, array_count_referencer->string, 0);
|
||||
if (MD_NodeIsNil(array_count_member_node))
|
||||
{
|
||||
MD_CodeLoc loc = MD_CodeLocFromNode(array_count_referencer);
|
||||
MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error,
|
||||
"'%.*s' is not a member of %.*s",
|
||||
MD_S8VArg(array_count_referencer->string), MD_S8VArg(type_name));
|
||||
}
|
||||
else
|
||||
{
|
||||
for (GEN_TypeMember *member_it = first_member;
|
||||
member_it != 0;
|
||||
member_it = member_it->next)
|
||||
{
|
||||
if (member_it->node == array_count_member_node)
|
||||
{
|
||||
array_count = member_it;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (array_count == 0)
|
||||
{
|
||||
MD_CodeLoc loc = MD_CodeLocFromNode(array_count_referencer);
|
||||
MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error,
|
||||
"'%.*s' comes after this array",
|
||||
MD_S8VArg(array_count_referencer->string), MD_S8VArg(type_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -377,6 +398,7 @@ gen_equip_struct_members(void)
|
||||
member->node = member_node;
|
||||
member->type = type_info;
|
||||
member->array_count = array_count;
|
||||
member->member_index = member_count;
|
||||
MD_QueuePush(first_member, last_member, member);
|
||||
member_count += 1;
|
||||
}
|
||||
@@ -824,8 +846,7 @@ gen_type_definitions_from_types(FILE *out)
|
||||
{
|
||||
MD_String8 type_name = member->type->node->string;
|
||||
MD_String8 member_name = member->node->string;
|
||||
int is_array = (!MD_NodeIsNil(member->array_count));
|
||||
if (is_array)
|
||||
if (member->array_count != 0)
|
||||
{
|
||||
fprintf(out, "%.*s *%.*s;\n", MD_S8VArg(type_name), MD_S8VArg(member_name));
|
||||
}
|
||||
@@ -945,9 +966,9 @@ gen_struct_member_tables_from_types(FILE *out)
|
||||
MD_String8 member_name = member->node->string;
|
||||
MD_String8 member_type_name = member->type->node->string;
|
||||
int array_count_member_index = -1;
|
||||
if (!MD_NodeIsNil(member->array_count))
|
||||
if (member->array_count != 0)
|
||||
{
|
||||
array_count_member_index = MD_IndexFromNode(member->array_count);
|
||||
array_count_member_index = member->array_count->member_index;
|
||||
}
|
||||
fprintf(out, "{\"%.*s\", %d, %d, &%.*s_type_info},\n",
|
||||
MD_S8VArg(member_name), (int)member_name.size,
|
||||
|
||||
@@ -47,7 +47,9 @@ struct GEN_TypeMember
|
||||
GEN_TypeMember *next;
|
||||
MD_Node *node;
|
||||
GEN_TypeInfo *type;
|
||||
MD_Node *array_count;
|
||||
struct GEN_TypeMember *array_count;
|
||||
//MD_Node *array_count;
|
||||
int member_index;
|
||||
};
|
||||
|
||||
typedef struct GEN_TypeEnumerant GEN_TypeEnumerant;
|
||||
@@ -120,8 +122,6 @@ void gen_equip_map_cases(void);
|
||||
void gen_check_duplicate_cases(void);
|
||||
void gen_check_complete_map_cases(void);
|
||||
|
||||
// TODO: check array member indexes point to members from before the array
|
||||
|
||||
//~ generators ////////////////////////////////////////////////////////////////
|
||||
void gen_type_definitions_from_types(FILE *out);
|
||||
void gen_function_declarations_from_maps(FILE *out);
|
||||
|
||||
Reference in New Issue
Block a user