aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Gavin <danielgavin5@hotmail.com>2022-06-12 23:59:29 +0200
committerDaniel Gavin <danielgavin5@hotmail.com>2022-06-12 23:59:29 +0200
commitca3569c57c838be037fa4fcc71bdcabb6e7d0c93 (patch)
tree2d9cb8e749eff21b43dc45479b44922a03250a11 /src
parent56c9ed263cd7a9ff638987f3eaa7619642b22b87 (diff)
Fix union error with pointers
Diffstat (limited to 'src')
-rw-r--r--src/common/ast.odin129
-rw-r--r--src/server/completion.odin4
2 files changed, 68 insertions, 65 deletions
diff --git a/src/common/ast.odin b/src/common/ast.odin
index 841c519..2b581c1 100644
--- a/src/common/ast.odin
+++ b/src/common/ast.odin
@@ -708,10 +708,11 @@ node_equal_node :: proc(a, b: ^ast.Node) -> bool {
/*
Returns the string representation of a type. This allows us to print the signature without storing it in the indexer as a string(saving memory).
*/
-node_to_string :: proc(node: ^ast.Node) -> string {
+
+node_to_string :: proc(node: ^ast.Node, remove_pointers := false) -> string {
builder := strings.make_builder(context.temp_allocator)
- build_string(node, &builder)
+ build_string(node, &builder, remove_pointers)
return strings.to_string(builder)
}
@@ -722,19 +723,19 @@ build_string :: proc{
build_string_node,
}
-build_string_dynamic_array :: proc(array: $A/[]^$T, builder: ^strings.Builder) {
+build_string_dynamic_array :: proc(array: $A/[]^$T, builder: ^strings.Builder, remove_pointers: bool) {
for elem, i in array {
- build_string(elem, builder)
+ build_string(elem, builder, remove_pointers)
}
}
-build_string_ast_array :: proc(array: $A/[dynamic]^$T, builder: ^strings.Builder) {
+build_string_ast_array :: proc(array: $A/[dynamic]^$T, builder: ^strings.Builder, remove_pointers: bool) {
for elem, i in array {
- build_string(elem, builder)
+ build_string(elem, builder, remove_pointers)
}
}
-build_string_node :: proc(node: ^ast.Node, builder: ^strings.Builder) {
+build_string_node :: proc(node: ^ast.Node, builder: ^strings.Builder, remove_pointers: bool) {
using ast
@@ -759,73 +760,73 @@ build_string_node :: proc(node: ^ast.Node, builder: ^strings.Builder) {
strings.write_string(builder, n.name)
case ^Implicit_Selector_Expr:
strings.write_string(builder, ".")
- build_string(n.field, builder)
+ build_string(n.field, builder, remove_pointers)
case ^Ellipsis:
strings.write_string(builder, "..")
- build_string(n.expr, builder)
+ build_string(n.expr, builder, remove_pointers)
case ^Proc_Lit:
- build_string(n.type, builder)
- build_string(n.body, builder)
+ build_string(n.type, builder, remove_pointers)
+ build_string(n.body, builder, remove_pointers)
case ^Comp_Lit:
- build_string(n.type, builder)
+ build_string(n.type, builder, remove_pointers)
strings.write_string(builder, "{")
for elem, i in n.elems {
- build_string(elem, builder)
+ build_string(elem, builder, remove_pointers)
if len(n.elems) - 1 != i {
strings.write_string(builder, ", ")
}
}
strings.write_string(builder, "}")
case ^Tag_Expr:
- build_string(n.expr, builder)
+ build_string(n.expr, builder, remove_pointers)
case ^Unary_Expr:
- build_string(n.expr, builder)
+ build_string(n.expr, builder, remove_pointers)
case ^Binary_Expr:
- build_string(n.left, builder)
- build_string(n.right, builder)
+ build_string(n.left, builder, remove_pointers)
+ build_string(n.right, builder, remove_pointers)
case ^Paren_Expr:
strings.write_string(builder, "(")
- build_string(n.expr, builder)
+ build_string(n.expr, builder, remove_pointers)
strings.write_string(builder, ")")
case ^Call_Expr:
- build_string(n.expr, builder)
+ build_string(n.expr, builder, remove_pointers)
strings.write_string(builder, "(")
for arg, i in n.args {
- build_string(arg, builder)
+ build_string(arg, builder, remove_pointers)
if len(n.args) - 1 != i {
strings.write_string(builder, ", ")
}
}
strings.write_string(builder, ")")
case ^Selector_Expr:
- build_string(n.expr, builder)
+ build_string(n.expr, builder, remove_pointers)
strings.write_string(builder, ".")
- build_string(n.field, builder)
+ build_string(n.field, builder, remove_pointers)
case ^Index_Expr:
- build_string(n.expr, builder)
+ build_string(n.expr, builder, remove_pointers)
strings.write_string(builder, "[")
- build_string(n.index, builder)
+ build_string(n.index, builder, remove_pointers)
strings.write_string(builder, "]")
case ^Deref_Expr:
- build_string(n.expr, builder)
+ build_string(n.expr, builder, remove_pointers)
case ^Slice_Expr:
- build_string(n.expr, builder)
- build_string(n.low, builder)
- build_string(n.high, builder)
+ build_string(n.expr, builder, remove_pointers)
+ build_string(n.low, builder, remove_pointers)
+ build_string(n.high, builder, remove_pointers)
case ^Field_Value:
- build_string(n.field, builder)
+ build_string(n.field, builder, remove_pointers)
strings.write_string(builder, ": ")
- build_string(n.value, builder)
+ build_string(n.value, builder, remove_pointers)
case ^Type_Cast:
- build_string(n.type, builder)
- build_string(n.expr, builder)
+ build_string(n.type, builder, remove_pointers)
+ build_string(n.expr, builder, remove_pointers)
case ^Bad_Stmt:
case ^Bad_Decl:
case ^Attribute:
- build_string(n.elems, builder)
+ build_string(n.elems, builder, remove_pointers)
case ^Field:
for name, i in n.names {
- build_string(name, builder)
+ build_string(name, builder, remove_pointers)
if len(n.names) - 1 != i {
strings.write_string(builder, ", ")
}
@@ -833,7 +834,7 @@ build_string_node :: proc(node: ^ast.Node, builder: ^strings.Builder) {
if len(n.names) > 0 && n.type != nil {
strings.write_string(builder, ": ")
- build_string(n.type, builder)
+ build_string(n.type, builder, remove_pointers)
if n.default_value != nil && n.type != nil {
strings.write_string(builder, " = ")
@@ -842,72 +843,74 @@ build_string_node :: proc(node: ^ast.Node, builder: ^strings.Builder) {
} else if len(n.names) > 0 && n.default_value != nil {
strings.write_string(builder, " := ")
} else {
- build_string(n.type, builder)
+ build_string(n.type, builder, remove_pointers)
}
- build_string(n.default_value, builder)
+ build_string(n.default_value, builder, remove_pointers)
case ^Field_List:
for field, i in n.list {
- build_string(field, builder)
+ build_string(field, builder, remove_pointers)
if len(n.list) - 1 != i {
strings.write_string(builder, ",")
}
}
case ^Typeid_Type:
strings.write_string(builder, "$")
- build_string(n.specialization, builder)
+ build_string(n.specialization, builder, remove_pointers)
case ^Helper_Type:
- build_string(n.type, builder)
+ build_string(n.type, builder, remove_pointers)
case ^Distinct_Type:
- build_string(n.type, builder)
+ build_string(n.type, builder, remove_pointers)
case ^Poly_Type:
strings.write_string(builder, "$")
- build_string(n.type, builder)
+ build_string(n.type, builder, remove_pointers)
if n.specialization != nil {
strings.write_string(builder, "/")
- build_string(n.specialization, builder)
+ build_string(n.specialization, builder, remove_pointers)
}
case ^Proc_Type:
strings.write_string(builder, "proc(")
- build_string(n.params, builder)
+ build_string(n.params, builder, remove_pointers)
strings.write_string(builder, ") -> ")
- build_string(n.results, builder)
+ build_string(n.results, builder, remove_pointers)
case ^Pointer_Type:
- strings.write_string(builder, "^")
- build_string(n.elem, builder)
+ if !remove_pointers {
+ strings.write_string(builder, "^")
+ }
+ build_string(n.elem, builder, remove_pointers)
case ^Array_Type:
strings.write_string(builder, "[")
- build_string(n.len, builder)
+ build_string(n.len, builder, remove_pointers)
strings.write_string(builder, "]")
- build_string(n.elem, builder)
+ build_string(n.elem, builder, remove_pointers)
case ^Dynamic_Array_Type:
strings.write_string(builder, "[dynamic]")
- build_string(n.elem, builder)
+ build_string(n.elem, builder, remove_pointers)
case ^Struct_Type:
- build_string(n.poly_params, builder)
- build_string(n.align, builder)
- build_string(n.fields, builder)
+ build_string(n.poly_params, builder, remove_pointers)
+ build_string(n.align, builder, remove_pointers)
+ build_string(n.fields, builder, remove_pointers)
case ^Union_Type:
- build_string(n.poly_params, builder)
- build_string(n.align, builder)
- build_string(n.variants, builder)
+ build_string(n.poly_params, builder, remove_pointers)
+ build_string(n.align, builder, remove_pointers)
+ build_string(n.variants, builder, remove_pointers)
case ^Enum_Type:
- build_string(n.base_type, builder)
- build_string(n.fields, builder)
+ build_string(n.base_type, builder, remove_pointers)
+ build_string(n.fields, builder, remove_pointers)
case ^Bit_Set_Type:
- build_string(n.elem, builder)
- build_string(n.underlying, builder)
+ build_string(n.elem, builder, remove_pointers)
+ build_string(n.underlying, builder, remove_pointers)
case ^Map_Type:
strings.write_string(builder, "map")
strings.write_string(builder, "[")
- build_string(n.key, builder)
+ build_string(n.key, builder, remove_pointers)
strings.write_string(builder, "]")
- build_string(n.value, builder)
+ build_string(n.value, builder, remove_pointers)
case ^ast.Multi_Pointer_Type:
strings.write_string(builder, "[^]")
- build_string(n.elem, builder)
+ build_string(n.elem, builder, remove_pointers)
}
}
diff --git a/src/server/completion.odin b/src/server/completion.odin
index c8d9d11..ed5ee84 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -352,9 +352,9 @@ get_selector_completion :: proc(ast_context: ^AstContext, position_context: ^Doc
}
if symbol.pkg == ast_context.document_package || base == "runtime" || base == "$builtin" {
- item.label = fmt.aprintf("(%v%v)", common.repeat("^", symbol.pointers, context.temp_allocator), common.node_to_string(type))
+ item.label = fmt.aprintf("(%v%v)", common.repeat("^", symbol.pointers, context.temp_allocator), common.node_to_string(type, true))
} else {
- item.label = fmt.aprintf("(%v%v.%v)", common.repeat("^", symbol.pointers, context.temp_allocator), path.base(symbol.pkg, false, context.temp_allocator), common.node_to_string(type))
+ item.label = fmt.aprintf("(%v%v.%v)", common.repeat("^", symbol.pointers, context.temp_allocator), path.base(symbol.pkg, false, context.temp_allocator), common.node_to_string(type, true))
}
append(&items, item)