From ca3569c57c838be037fa4fcc71bdcabb6e7d0c93 Mon Sep 17 00:00:00 2001 From: Daniel Gavin Date: Sun, 12 Jun 2022 23:59:29 +0200 Subject: Fix union error with pointers --- src/common/ast.odin | 129 +++++++++++++++++++++++---------------------- src/server/completion.odin | 4 +- 2 files changed, 68 insertions(+), 65 deletions(-) (limited to 'src') 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) -- cgit v1.2.3