From edbc1c6ea624f7feee2dbf4804543c9329eef738 Mon Sep 17 00:00:00 2001 From: DanielGavin Date: Wed, 8 Mar 2023 18:27:37 +0100 Subject: Add support for completion with usings and compound literals --- src/server/analysis.odin | 17 +++++------------ src/server/collector.odin | 4 ++-- src/server/completion.odin | 8 ++++++++ src/server/symbol.odin | 2 +- 4 files changed, 16 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 06d1fd3..ffafa46 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -1941,12 +1941,7 @@ expand_struct_usings :: proc( field_expr: ^ast.Expr - for name, i in value.names { - - if name == k && v { - field_expr = value.types[i] - } - } + field_expr = value.types[k] if field_expr == nil { continue @@ -2959,16 +2954,17 @@ make_symbol_struct_from_ast :: proc( names := make([dynamic]string, ast_context.allocator) types := make([dynamic]^ast.Expr, ast_context.allocator) - usings := make(map[string]bool, 0, ast_context.allocator) + usings := make(map[int]bool, 0, ast_context.allocator) ranges := make([dynamic]common.Range, 0, ast_context.allocator) for field in v.fields.list { for n in field.names { if identifier, ok := n.derived.(^ast.Ident); ok && field.type != nil { - if identifier.name == "_" { - continue + if .Using in field.flags { + usings[len(types)] = true } + append(&names, identifier.name) if v.poly_params != nil { append( @@ -2978,9 +2974,6 @@ make_symbol_struct_from_ast :: proc( } else { append(&types, field.type) } - if .Using in field.flags { - usings[identifier.name] = true - } append( &ranges, diff --git a/src/server/collector.odin b/src/server/collector.odin index d17f567..6dcfa53 100644 --- a/src/server/collector.odin +++ b/src/server/collector.odin @@ -157,7 +157,7 @@ collect_struct_fields :: proc( ) -> SymbolStructValue { names := make([dynamic]string, 0, collection.allocator) types := make([dynamic]^ast.Expr, 0, collection.allocator) - usings := make(map[string]bool, 0, collection.allocator) + usings := make(map[int]bool, 0, collection.allocator) ranges := make([dynamic]common.Range, 0, collection.allocator) for field in struct_type.fields.list { @@ -174,7 +174,7 @@ collect_struct_fields :: proc( append(&types, cloned) if .Using in field.flags { - usings[names[len(names) - 1]] = true + usings[len(names) - 1] = true } append(&ranges, common.get_token_range(n, file.src)) diff --git a/src/server/completion.odin b/src/server/completion.odin index fa7d206..4111a79 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -235,6 +235,10 @@ get_comp_lit_completion :: proc( #partial switch v in comp_symbol.value { case SymbolStructValue: for name, i in v.names { + if name == "_" { + continue + } + ast_context.current_package = comp_symbol.pkg if resolved, ok := resolve_type_expression( @@ -504,6 +508,10 @@ get_selector_completion :: proc( list.isIncomplete = false for name, i in v.names { + if name == "_" { + continue + } + if selector.pkg != "" { ast_context.current_package = selector.pkg } else { diff --git a/src/server/symbol.odin b/src/server/symbol.odin index e6a21c3..3cba7ae 100644 --- a/src/server/symbol.odin +++ b/src/server/symbol.odin @@ -20,7 +20,7 @@ SymbolStructValue :: struct { names: []string, ranges: []common.Range, types: []^ast.Expr, - usings: map[string]bool, + usings: map[int]bool, poly: ^ast.Field_List, } -- cgit v1.2.3