[examples] generating type info definitions

This commit is contained in:
Allen Webster
2021-09-25 19:52:36 -07:00
parent 6db244045d
commit c30f4e4a74
4 changed files with 88 additions and 7 deletions
+11 -2
View File
@@ -1,4 +1,4 @@
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:193
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:197
TypeInfoMember Circle_members[2] = {
{"r", 1, -1, &F32_type_info},
{"pos", 3, -1, &V2F32_type_info},
@@ -14,10 +14,19 @@ TypeInfoMember RoundedPolygon_members[3] = {
{"p", 1, 1, &V2F32_type_info},
};
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:232
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:236
TypeInfoEnumerant Shape_members[3] = {
{"Circle", 6, 1},
{"Segment", 7, 2},
{"Polygon", 7, 3},
};
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:272
TypeInfo U32_type_info = {TypeKind_Basic, "U32", 3, 0, 0, 0};
TypeInfo F32_type_info = {TypeKind_Basic, "F32", 3, 0, 0, 0};
TypeInfo V2F32_type_info = {TypeKind_Basic, "V2F32", 5, 0, 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, 0};
@@ -1,6 +1,6 @@
#if !defined(META_TYPES_H)
#define META_TYPES_H
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:93
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:97
typedef struct Circle Circle;
struct Circle
{
@@ -28,11 +28,11 @@ Shape_Segment = 2,
Shape_Polygon = 3,
} Shape;
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:152
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:156
TypeInfo* type_info_from_shape(Shape v);
U32 max_slot_from_shape(Shape v);
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:177
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:181
extern TypeInfo U32_type_info;
extern TypeInfo F32_type_info;
extern TypeInfo V2F32_type_info;
+2
View File
@@ -36,6 +36,8 @@ struct TypeInfo
// struct: TypeInfoMember*
// enum: TypeInfoMember*
void *children;
// enum
TypeInfo *underlying_type;
};
typedef struct TypeInfoMember TypeInfoMember;
+72 -2
View File
@@ -31,15 +31,19 @@ struct TypeInfo
TypeKind kind;
MD_Node *node;
// member list
// basic
int size;
// structs
struct TypeMember *first_member;
struct TypeMember *last_member;
int member_count;
// enumerant list
// enums
struct TypeEnumerant *first_enumerant;
struct TypeEnumerant *last_enumerant;
int enumerant_count;
TypeInfo *underlying_type;
};
typedef struct TypeMember TypeMember;
@@ -260,6 +264,66 @@ generate_enum_member_tables_from_types(FILE *out, TypeInfo *first_type)
fprintf(out, "\n");
}
void
generate_type_info_definitions_from_types(FILE *out, TypeInfo *first_type)
{
MD_ArenaTemp scratch = MD_GetScratch(0, 0);
MD_PrintGenNoteCComment(out);
for (TypeInfo *type = first_type;
type != 0;
type = type->next)
{
MD_String8 type_name = type->node->string;
switch (type->kind)
{
default:break;
case TypeKind_Basic:
{
int size = type->size;
fprintf(out, "TypeInfo %.*s_type_info = "
"{TypeKind_Basic, \"%.*s\", %d, %d, 0, 0};\n",
MD_S8VArg(type_name),
MD_S8VArg(type_name), (int)type_name.size, size);
}break;
case TypeKind_Struct:
{
int child_count = type->member_count;
fprintf(out, "TypeInfo %.*s_type_info = "
"{TypeKind_Struct, \"%.*s\", %d, %d, %.*s_members, 0};\n",
MD_S8VArg(type_name),
MD_S8VArg(type_name), (int)type_name.size, child_count, MD_S8VArg(type_name));
}break;
case TypeKind_Enum:
{
MD_String8 underlying_type_ptr_expression = MD_S8Lit("0");
if (type->underlying_type != 0)
{
MD_String8 underlying_type_name = type->underlying_type->node->string;
underlying_type_ptr_expression = MD_S8Fmt(scratch.arena, "&%.*s_type_info",
MD_S8VArg(underlying_type_name));
}
int child_count = type->enumerant_count;
fprintf(out, "TypeInfo %.*s_type_info = "
"{TypeKind_Enum, \"%.*s\", %d, %d, %.*s_members, %.*s};\n",
MD_S8VArg(type_name),
MD_S8VArg(type_name), (int)type_name.size, child_count, MD_S8VArg(type_name),
MD_S8VArg(underlying_type_ptr_expression));
}break;
}
}
fprintf(out, "\n");
MD_ReleaseScratch(scratch);
}
//~ main //////////////////////////////////////////////////////////////////////
@@ -411,6 +475,8 @@ main(int argc, char **argv)
// TODO no duplicate member names check
// TODO basic type sizes
// build member lists
for (TypeInfo *type = first_type;
type != 0;
@@ -503,6 +569,8 @@ main(int argc, char **argv)
}
}
// TODO check enum base types
// build enumerant lists
for (TypeInfo *type = first_type;
type != 0;
@@ -510,6 +578,7 @@ main(int argc, char **argv)
{
if (type->kind == TypeKind_Enum)
{
// build the list
MD_b32 got_list = 1;
TypeEnumerant *first_enumerant = 0;
@@ -598,6 +667,7 @@ main(int argc, char **argv)
// generate metadata tables
generate_struct_member_tables_from_types(c, first_type);
generate_enum_member_tables_from_types(c, first_type);
generate_type_info_definitions_from_types(c, first_type);
// TODO generate function definitions