aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2024-04-16 00:02:57 +0200
committerGitHub <noreply@github.com>2024-04-16 00:02:57 +0200
commit4c4b525a9730bcb2c932b8be678d7eaef96e3ff1 (patch)
tree8e4cbc91fdd7999c0aacd8c9ee6d0945d67d6b5f /src/common
parent63758dad45f4d0b6881c81727528ecc7d39ec5c7 (diff)
parent25de95df4262c318de7ded5bdc5ca027ab6d4872 (diff)
Merge pull request #351 from laytan/bit-field-support
support bit_fields
Diffstat (limited to 'src/common')
-rw-r--r--src/common/ast.odin38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/common/ast.odin b/src/common/ast.odin
index 1036b04..dbe236a 100644
--- a/src/common/ast.odin
+++ b/src/common/ast.odin
@@ -705,6 +705,13 @@ free_ast_node :: proc(node: ^ast.Node, allocator: mem.Allocator) {
case ^Relative_Type:
free_ast(n.tag, allocator)
free_ast(n.type, allocator)
+ case ^Bit_Field_Type:
+ free_ast(n.backing_type, allocator)
+ for field in n.fields do free_ast(field, allocator)
+ case ^Bit_Field_Field:
+ free_ast(n.name, allocator)
+ free_ast(n.type, allocator)
+ free_ast(n.bit_size, allocator)
case:
panic(fmt.aprintf("free Unhandled node kind: %v", node.derived))
}
@@ -913,6 +920,22 @@ node_equal_node :: proc(a, b: ^ast.Node) -> bool {
ret &= node_equal(n.args, m.args)
return ret
}
+ case ^Bit_Field_Type:
+ if n, ok := a.derived.(^Bit_Field_Type); ok {
+ if len(n.fields) != len(m.fields) do return false
+ ret := node_equal(n.backing_type, m.backing_type)
+ for i in 0..<len(n.fields) {
+ ret &= node_equal(n.fields[i], m.fields[i])
+ }
+ return ret
+ }
+ case ^Bit_Field_Field:
+ if n, ok := a.derived.(^Bit_Field_Field); ok {
+ ret := node_equal(n.name, m.name)
+ ret &= node_equal(n.type, m.type)
+ ret &= node_equal(n.bit_size, m.bit_size)
+ return ret
+ }
case ^Typeid_Type:
return true
case:
@@ -1148,6 +1171,21 @@ build_string_node :: proc(
case ^ast.Multi_Pointer_Type:
strings.write_string(builder, "[^]")
build_string(n.elem, builder, remove_pointers)
+ case ^ast.Bit_Field_Type:
+ strings.write_string(builder, "bit_field")
+ build_string(n.backing_type, builder, remove_pointers)
+ for field, i in n.fields {
+ build_string(field, builder, remove_pointers)
+ if len(n.fields) - 1 != i {
+ strings.write_string(builder, ",")
+ }
+ }
+ case ^ast.Bit_Field_Field:
+ build_string(n.name, builder, remove_pointers)
+ strings.write_string(builder, ": ")
+ build_string(n.type, builder, remove_pointers)
+ strings.write_string(builder, " | ")
+ build_string(n.bit_size, builder, remove_pointers)
}
}