aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/clone.odin20
-rw-r--r--src/server/collector.odin7
-rw-r--r--src/server/symbol.odin2
3 files changed, 27 insertions, 2 deletions
diff --git a/src/server/clone.odin b/src/server/clone.odin
index c49152d..43f8d24 100644
--- a/src/server/clone.odin
+++ b/src/server/clone.odin
@@ -33,6 +33,7 @@ clone_type :: proc {
clone_expr,
clone_array,
clone_dynamic_array,
+ clone_comment_group,
}
clone_array :: proc(array: $A/[]^$T, allocator: mem.Allocator, unique_strings: ^map[string]string) -> A {
@@ -279,8 +280,27 @@ clone_node :: proc(node: ^ast.Node, allocator: mem.Allocator, unique_strings: ^m
case ^Or_Else_Expr:
r.x = clone_type(r.x, allocator, unique_strings)
r.y = clone_type(r.y, allocator, unique_strings)
+ case ^Comment_Group:
+ list := make([dynamic]tokenizer.Token, 0, len(r.list), allocator)
+ for t in r.list {
+ append(&list, tokenizer.Token {
+ text = strings.clone(t.text, allocator),
+ kind = t.kind,
+ pos = tokenizer.Pos {
+ file = strings.clone(t.pos.file, allocator),
+ offset = t.pos.offset,
+ line = t.pos.line,
+ column = t.pos.column,
+ },
+ })
+ }
+ r.list = list[:]
case:
}
return res
}
+
+clone_comment_group :: proc(node: ^ast.Comment_Group, allocator: mem.Allocator, unique_strings: ^map[string]string) -> ^ast.Comment_Group {
+ return cast(^ast.Comment_Group)clone_node(node, allocator, unique_strings)
+}
diff --git a/src/server/collector.odin b/src/server/collector.odin
index 1bbe569..667e8c8 100644
--- a/src/server/collector.odin
+++ b/src/server/collector.odin
@@ -136,12 +136,15 @@ collect_struct_fields :: proc(
if .Using in field.flags {
append(&b.unexpanded_usings, len(b.names) - 1)
+ b.usings[len(b.names) - 1] = struct{}{}
}
append(&b.ranges, common.get_token_range(n, file.src))
- append(&b.docs, field.docs)
- append(&b.comments, field.comment)
+ cloned_docs := clone_type(field.docs, collection.allocator, &collection.unique_strings)
+ append(&b.docs, cloned_docs)
+ cloned_comment := clone_type(field.comment, collection.allocator, &collection.unique_strings)
+ append(&b.comments, cloned_comment)
append(&b.from_usings, -1)
}
}
diff --git a/src/server/symbol.odin b/src/server/symbol.odin
index 7bd6cd2..a458f9e 100644
--- a/src/server/symbol.odin
+++ b/src/server/symbol.odin
@@ -255,6 +255,7 @@ symbol_struct_value_builder_make_symbol_symbol_struct_value :: proc(
ranges = slice.to_dynamic(v.ranges, allocator),
docs = slice.to_dynamic(v.docs, allocator),
comments = slice.to_dynamic(v.comments, allocator),
+ usings = v.usings,
from_usings = slice.to_dynamic(v.from_usings, allocator),
unexpanded_usings = slice.to_dynamic(v.unexpanded_usings, allocator),
}
@@ -304,6 +305,7 @@ write_struct_type :: proc(
if identifier, ok := n.derived.(^ast.Ident); ok && field.type != nil {
if .Using in field.flags {
append(&b.unexpanded_usings, len(b.types))
+ b.usings[len(b.types)] = struct{}{}
}
append(&b.names, identifier.name)