aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/odin/printer/visit.odin4
-rw-r--r--src/server/collector.odin3
-rw-r--r--src/server/completion.odin1
-rw-r--r--src/server/documentation.odin3
-rw-r--r--src/server/symbol.odin4
-rw-r--r--tests/hover_test.odin4
6 files changed, 17 insertions, 2 deletions
diff --git a/src/odin/printer/visit.odin b/src/odin/printer/visit.odin
index 8c820d4..6294dbe 100644
--- a/src/odin/printer/visit.odin
+++ b/src/odin/printer/visit.odin
@@ -1613,6 +1613,10 @@ visit_expr :: proc(
document = cons_with_nopl(document, text("#no_copy"))
}
+ if v.is_all_or_none {
+ document = cons_with_nopl(document, text("#all_or_none"))
+ }
+
if v.align != nil {
document = cons_with_nopl(document, text("#align"))
document = cons_with_nopl(document, visit_expr(p, v.align))
diff --git a/src/server/collector.odin b/src/server/collector.odin
index 8dcb794..3491f63 100644
--- a/src/server/collector.odin
+++ b/src/server/collector.odin
@@ -166,6 +166,9 @@ collect_struct_fields :: proc(
b.align = clone_expr(struct_type.align, collection.allocator, &collection.unique_strings)
b.max_field_align = clone_expr(struct_type.max_field_align, collection.allocator, &collection.unique_strings)
b.min_field_align = clone_expr(struct_type.min_field_align, collection.allocator, &collection.unique_strings)
+ if struct_type.is_all_or_none {
+ b.tags |= {.Is_All_Or_None}
+ }
if struct_type.is_no_copy {
b.tags |= {.Is_No_Copy}
}
diff --git a/src/server/completion.odin b/src/server/completion.odin
index 44916d7..4b1e099 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -586,6 +586,7 @@ DIRECTIVE_NAME_LIST :: []string {
"packed",
"raw_union",
"align",
+ "all_or_none",
/* union type */
"no_nil",
"shared_nil",
diff --git a/src/server/documentation.odin b/src/server/documentation.odin
index 3ae3c53..0069ac4 100644
--- a/src/server/documentation.odin
+++ b/src/server/documentation.odin
@@ -634,6 +634,9 @@ write_struct_hover :: proc(sb: ^strings.Builder, ast_context: ^AstContext, v: Sy
case .Is_No_Copy:
wrote_tag = true
strings.write_string(sb, " #no_copy")
+ case .Is_All_Or_None:
+ wrote_tag = true
+ strings.write_string(sb, " #all_or_none")
}
}
diff --git a/src/server/symbol.odin b/src/server/symbol.odin
index 5181ca3..d10178d 100644
--- a/src/server/symbol.odin
+++ b/src/server/symbol.odin
@@ -16,6 +16,7 @@ SymbolStructTag :: enum {
Is_Packed,
Is_Raw_Union,
Is_No_Copy,
+ Is_All_Or_None,
}
SymbolStructTags :: bit_set[SymbolStructTag]
@@ -427,6 +428,9 @@ write_struct_type :: proc(
b.align = v.align
b.max_field_align = v.max_field_align
b.min_field_align = v.min_field_align
+ if v.is_all_or_none {
+ b.tags |= {.Is_All_Or_None}
+ }
if v.is_no_copy {
b.tags |= {.Is_No_Copy}
}
diff --git a/tests/hover_test.odin b/tests/hover_test.odin
index 09f4bb9..8a41efc 100644
--- a/tests/hover_test.odin
+++ b/tests/hover_test.odin
@@ -3972,11 +3972,11 @@ ast_hover_struct_tags :: proc(t: ^testing.T) {
ast_hover_struct_tags_packed :: proc(t: ^testing.T) {
source := test.Source {
main = `package test
- Fo{*}o :: struct($T: typeid) #packed {
+ Fo{*}o :: struct($T: typeid) #packed #all_or_none {
}
`,
}
- test.expect_hover(t, &source, "test.Foo :: struct($T: typeid) #packed {}")
+ test.expect_hover(t, &source, "test.Foo :: struct($T: typeid) #packed #all_or_none {}")
}
@(test)