aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2021-03-17 17:03:43 +0100
committerDanielGavin <danielgavin5@hotmail.com>2021-03-17 17:03:43 +0100
commit63fd34ef37a8ba977e6bfcdcb72cd890aafac2a8 (patch)
treea2571e2b52dbfc33c1992c35589e6f560868e305 /src/server
parenta8abe7726ac2b717f0b7e2e1b31c8ec0566d9374 (diff)
semantic token fix on package selector, more union completion
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin12
-rw-r--r--src/server/completion.odin22
-rw-r--r--src/server/semantic_tokens.odin7
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;