diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 12 | ||||
| -rw-r--r-- | src/server/completion.odin | 22 | ||||
| -rw-r--r-- | src/server/semantic_tokens.odin | 7 |
3 files changed, 30 insertions, 11 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 2e95c3a..c8c1827 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -1164,11 +1164,19 @@ make_symbol_union_from_ast :: proc (ast_context: ^AstContext, v: ast.Union_Type, if ident, ok := variant.derived.(ast.Ident); ok { append(&names, ident.name); } + + else if selector, ok := variant.derived.(ast.Selector_Expr); ok { + + if ident, ok := selector.field.derived.(ast.Ident); ok { + append(&names, ident.name); + } + } } symbol.value = index.SymbolUnionValue { - names = names[:] - }; + names = names[:], + types = v.variants, + }; return symbol; } diff --git a/src/server/completion.odin b/src/server/completion.odin index 40f633c..e19bd0a 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -242,12 +242,22 @@ get_selector_completion :: proc (ast_context: ^AstContext, position_context: ^Do case index.SymbolUnionValue: list.isIncomplete = false; - for name in v.names { - symbol: index.Symbol; - symbol.name = fmt.aprintf("(%v)", name); - symbol.pkg = selector.name; - symbol.type = .EnumMember; - append(&symbols, symbol); + for name, i in v.names { + + if symbol, ok := resolve_type_expression(ast_context, v.types[i]); ok { + + if symbol.pkg == ast_context.document_package { + symbol.name = fmt.aprintf("(%v)", name); + } + + else { + symbol.name = fmt.aprintf("(%v.%v)", path.base(symbol.pkg, false, context.temp_allocator), name); + } + + symbol.pkg = selector.name; + symbol.type = .EnumMember; + append(&symbols, symbol); + } } case index.SymbolEnumValue: diff --git a/src/server/semantic_tokens.odin b/src/server/semantic_tokens.odin index 8e65841..ab0d6a2 100644 --- a/src/server/semantic_tokens.odin +++ b/src/server/semantic_tokens.odin @@ -139,10 +139,11 @@ write_semantic_token_pos :: proc (builder: ^SemanticTokenBuilder, pos: tokenizer builder.current_start = pos.offset; } -resolve_and_write_ident :: proc (node: ^ast.Node, builder: ^SemanticTokenBuilder, ast_context: ^AstContext) -> (is_member: bool, is_package: bool) { +resolve_and_write_ident :: proc (node: ^ast.Node, builder: ^SemanticTokenBuilder, ast_context: ^AstContext) -> (is_member: bool, is_package: bool, package_name: string) { n := node.derived.(ast.Ident); + package_name = ast_context.document_package; ast_context.current_package = ast_context.document_package; ast_context.use_globals = true; ast_context.use_locals = true; @@ -151,11 +152,11 @@ resolve_and_write_ident :: proc (node: ^ast.Node, builder: ^SemanticTokenBuilder write_semantic_node(builder, node, ast_context.file.src, .Variable, .None); is_member = true; } else if symbol, ok := resolve_type_identifier(ast_context, n); ok { - #partial switch v in symbol.value { case index.SymbolPackageValue: write_semantic_node(builder, node, ast_context.file.src, .Namespace, .None); is_package = true; + package_name = symbol.pkg; case index.SymbolStructValue: write_semantic_node(builder, node, ast_context.file.src, .Struct, .None); case index.SymbolEnumValue: @@ -531,7 +532,7 @@ write_semantic_selector :: proc (selector: ^ast.Selector_Expr, builder: ^Semanti if ident, ok := selector.expr.derived.(Ident); ok { get_locals_at(builder.current_function, selector.expr, ast_context); - builder.selector_member, builder.selector_package = resolve_and_write_ident(selector.expr, builder, ast_context); //base + builder.selector_member, builder.selector_package, ast_context.current_package = resolve_and_write_ident(selector.expr, builder, ast_context); //base if builder.selector_package && selector.field != nil && resolve_ident_is_variable(ast_context, selector.field^) { builder.selector_member = true; |