diff options
| author | Daniel Gavin <danielgavin5@hotmail.com> | 2021-04-23 17:45:13 +0200 |
|---|---|---|
| committer | Daniel Gavin <danielgavin5@hotmail.com> | 2021-04-23 17:45:13 +0200 |
| commit | 5e95c4203fe7c3128408f4e69f268850069deafc (patch) | |
| tree | a3d634132a5574f40838b1b60a2a410779793b92 /src/server | |
| parent | f9ce5fd6cc6548bb4a1a332ea057a30be165b3d0 (diff) | |
semantic work
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/completion.odin | 3 | ||||
| -rw-r--r-- | src/server/semantic_tokens.odin | 16 |
2 files changed, 13 insertions, 6 deletions
diff --git a/src/server/completion.odin b/src/server/completion.odin index 4925bac..cf26b9c 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -79,6 +79,9 @@ get_completion_list :: proc(document: ^Document, position: common.Position, comp if assign, ok := position_context.switch_type_stmt.tag.derived.(ast.Assign_Stmt); ok && assign.rhs != nil && len(assign.rhs) == 1 { + ast_context.use_globals = true; + ast_context.use_locals = true; + if symbol, ok := resolve_type_expression(&ast_context, assign.rhs[0]); ok { if union_value, ok := symbol.value.(index.SymbolUnionValue); ok { diff --git a/src/server/semantic_tokens.odin b/src/server/semantic_tokens.odin index 86b184c..4feced5 100644 --- a/src/server/semantic_tokens.odin +++ b/src/server/semantic_tokens.odin @@ -182,7 +182,7 @@ resolve_and_write_ident :: proc(node: ^ast.Node, builder: ^SemanticTokenBuilder, return; } -write_semantic_tokens :: proc{ +write_semantic_tokens :: proc { write_semantic_tokens_node, write_semantic_tokens_dynamic_array, write_semantic_tokens_array, @@ -208,7 +208,6 @@ write_semantic_tokens_stmt :: proc(node: ^ast.Stmt, builder: ^SemanticTokenBuild ast_context.use_globals = true; ast_context.use_locals = true; builder.selector_member = false; - builder.selector_package = false; write_semantic_tokens_node(node, builder, ast_context); } @@ -542,13 +541,18 @@ write_semantic_selector :: proc(selector: ^ast.Selector_Expr, builder: ^Semantic using ast; - if ident, ok := selector.expr.derived.(Ident); ok { + if _, ok := selector.expr.derived.(Selector_Expr); !ok { get_locals_at(builder.current_function, selector.expr, ast_context); - 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; + if symbol, ok := resolve_type_expression(ast_context, selector.expr); ok { + + #partial switch v in symbol.value { + case index.SymbolStructValue: + builder.selector_member = true; + } + } + } else { write_semantic_tokens(selector.expr, builder, ast_context); } |