diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2024-04-16 00:02:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-16 00:02:57 +0200 |
| commit | 4c4b525a9730bcb2c932b8be678d7eaef96e3ff1 (patch) | |
| tree | 8e4cbc91fdd7999c0aacd8c9ee6d0945d67d6b5f /src/common | |
| parent | 63758dad45f4d0b6881c81727528ecc7d39ec5c7 (diff) | |
| parent | 25de95df4262c318de7ded5bdc5ca027ab6d4872 (diff) | |
Merge pull request #351 from laytan/bit-field-support
support bit_fields
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/ast.odin | 38 |
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) } } |