aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/odin/doc-format/doc_format.odin8
-rw-r--r--src/check_expr.cpp1
-rw-r--r--src/docs_format.cpp9
-rw-r--r--src/docs_writer.cpp24
4 files changed, 35 insertions, 7 deletions
diff --git a/core/odin/doc-format/doc_format.odin b/core/odin/doc-format/doc_format.odin
index d22dafd27..360ba0d85 100644
--- a/core/odin/doc-format/doc_format.odin
+++ b/core/odin/doc-format/doc_format.odin
@@ -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
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 9b15ae3b2..aba2f5831 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -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;
diff --git a/src/docs_format.cpp b/src/docs_format.cpp
index d0bca214b..779190e62 100644
--- a/src/docs_format.cpp
+++ b/src/docs_format.cpp
@@ -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;
diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp
index 6816ae8eb..88d9df40c 100644
--- a/src/docs_writer.cpp
+++ b/src/docs_writer.cpp
@@ -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;