Add doc-format support for bit_field

This commit is contained in:
gingerBill
2024-02-22 17:37:42 +00:00
parent 59479b2ba6
commit dcbcf75269
4 changed files with 35 additions and 7 deletions

View File

@@ -10,8 +10,8 @@ Array :: struct($T: typeid) {
String :: distinct Array(byte)
Version_Type_Major :: 0
Version_Type_Minor :: 2
Version_Type_Patch :: 4
Version_Type_Minor :: 3
Version_Type_Patch :: 0
Version_Type :: struct {
major, minor, patch: u8,
@@ -110,6 +110,8 @@ Entity_Flag :: enum u32le {
Param_No_Alias = 7, // #no_alias
Param_Any_Int = 8, // #any_int
Bit_Field_Field = 19,
Type_Alias = 20,
Builtin_Pkg_Builtin = 30,
@@ -137,6 +139,7 @@ Entity :: struct {
// May be used by (Struct fields and procedure fields):
// .Variable
// .Constant
// This is equal to the "bit size" it this is a `bit_field`s field
field_group_index: i32le,
// May used by:
@@ -187,6 +190,7 @@ Type_Kind :: enum u32le {
Multi_Pointer = 22,
Matrix = 23,
Soa_Pointer = 24,
Bit_Field = 25,
}
Type_Elems_Cap :: 4

View File

@@ -11174,7 +11174,6 @@ gb_internal gbString write_expr_to_string(gbString str, Ast *node, bool shorthan
}
str = write_expr_to_string(str, bf->fields[i], false);
}
return str;
}
str = gb_string_appendc(str, "}");
case_end;

View File

@@ -14,8 +14,8 @@ struct OdinDocVersionType {
};
#define OdinDocVersionType_Major 0
#define OdinDocVersionType_Minor 2
#define OdinDocVersionType_Patch 4
#define OdinDocVersionType_Minor 3
#define OdinDocVersionType_Patch 0
struct OdinDocHeaderBase {
u8 magic[8];
@@ -84,6 +84,7 @@ enum OdinDocTypeKind : u32 {
OdinDocType_MultiPointer = 22,
OdinDocType_Matrix = 23,
OdinDocType_SoaPointer = 24,
OdinDocType_BitField = 25,
};
enum OdinDocTypeFlag_Basic : u32 {
@@ -170,6 +171,8 @@ enum OdinDocEntityFlag : u64 {
OdinDocEntityFlag_Param_NoAlias = 1ull<<7,
OdinDocEntityFlag_Param_AnyInt = 1ull<<8,
OdinDocEntityFlag_BitField_Field = 1ull<<19,
OdinDocEntityFlag_Type_Alias = 1ull<<20,
OdinDocEntityFlag_Builtin_Pkg_Builtin = 1ull<<30,
@@ -192,7 +195,7 @@ struct OdinDocEntity {
u32 reserved_for_init;
OdinDocString comment; // line comment
OdinDocString docs; // preceding comment
i32 field_group_index;
i32 field_group_index; // For `bit_field`s this is the "bit_size"
OdinDocEntityIndex foreign_library;
OdinDocString link_name;
OdinDocArray<OdinDocAttribute> attributes;

View File

@@ -615,6 +615,19 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) {
doc_type.types = odin_write_slice(w, types, gb_count_of(types));
}
break;
case Type_BitField:
doc_type.kind = OdinDocType_BitField;
{
auto fields = array_make<OdinDocEntityIndex>(heap_allocator(), type->BitField.fields.count);
defer (array_free(&fields));
for_array(i, type->BitField.fields) {
fields[i] = odin_doc_add_entity(w, type->BitField.fields[i]);
}
doc_type.entities = odin_write_slice(w, fields.data, fields.count);
}
break;
case Type_Struct:
doc_type.kind = OdinDocType_Struct;
if (type->Struct.soa_kind != StructSoa_None) {
@@ -863,6 +876,10 @@ gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e)
}
break;
case Entity_Variable:
if (e->flags & EntityFlag_BitFieldField) {
flags |= OdinDocEntityFlag_BitField_Field;
}
if (e->Variable.is_foreign) { flags |= OdinDocEntityFlag_Foreign; }
if (e->Variable.is_export) { flags |= OdinDocEntityFlag_Export; }
if (e->Variable.thread_local_model != "") {
@@ -873,7 +890,12 @@ gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e)
if (init_expr == nullptr) {
init_expr = e->Variable.init_expr;
}
field_group_index = e->Variable.field_group_index;
if (e->flags & EntityFlag_BitFieldField) {
field_group_index = cast(i32)e->Variable.bit_field_bit_size;
} else {
field_group_index = e->Variable.field_group_index;
}
break;
case Entity_Constant:
field_group_index = e->Constant.field_group_index;