aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorDaniel Gavin <danielgavin5@hotmail.com>2021-04-29 20:24:47 +0200
committerDaniel Gavin <danielgavin5@hotmail.com>2021-04-29 20:24:47 +0200
commit637b892fd53e61e320e94be0e5b22137ad92a7ba (patch)
tree8649912fa1e6b722fb141564c8b322b56d49ba1c /src/server
parent7ce7eed0eada14fd650b327fcfdee6b302f231aa (diff)
more refractor + tests
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin89
-rw-r--r--src/server/completion.odin82
-rw-r--r--src/server/signature.odin69
3 files changed, 131 insertions, 109 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 020f433..23a1404 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -366,17 +366,7 @@ resolve_generic_function_symbol :: proc(ast_context: ^AstContext, params: []^ast
continue;
}
- if poly, ok := param.type.derived.(Poly_Type); ok {
-
- if arg_eval, ok := resolve_type_expression(ast_context, call_expr.args[i]); ok {
-
- /*
- if value, ok := arg_eval.value.(index.SymbolGenericValue); ok {
- resolve_poly_spec_node(ast_context, value.expr, poly.specialization, &poly_map);
- }
- */
- }
- }
+ resolve_poly_spec_node(ast_context, call_expr.args[i], param.type, &poly_map);
i += 1;
}
@@ -392,7 +382,6 @@ resolve_generic_function_symbol :: proc(ast_context: ^AstContext, params: []^ast
function_name = selector.field.name;
function_range = common.get_token_range(selector, ast_context.file.src);
} else {
- log.debug("call expr expr could not be derived correctly");
return index.Symbol {}, false;
}
@@ -612,10 +601,6 @@ resolve_function_overload :: proc(ast_context: ^AstContext, group: ast.Proc_Grou
using ast;
- if ast_context.call == nil {
- return index.Symbol {}, false;
- }
-
call_expr := ast_context.call;
candidates := make([dynamic] index.Symbol, context.temp_allocator);
@@ -624,6 +609,11 @@ resolve_function_overload :: proc(ast_context: ^AstContext, group: ast.Proc_Grou
next_fn: if f, ok := resolve_type_expression(ast_context, arg_expr); ok {
+ if ast_context.call == nil {
+ append(&candidates, f);
+ break next_fn;
+ }
+
if procedure, ok := f.value.(index.SymbolProcedureValue); ok {
if len(procedure.arg_types) < len(call_expr.args) {
@@ -649,7 +639,6 @@ resolve_function_overload :: proc(ast_context: ^AstContext, group: ast.Proc_Grou
arg_symbol, ok = resolve_type_expression(ast_context, procedure.arg_types[i].type);
if !ok {
- fmt.println("arg_symbol failed");
break next_fn;
}
@@ -933,7 +922,9 @@ resolve_type_identifier :: proc(ast_context: ^AstContext, node: ast.Ident) -> (i
if !v.type.generic {
return_symbol, ok = make_symbol_procedure_from_ast(ast_context, local, v.type^, node.name), true;
} else {
- return_symbol, ok = resolve_generic_function(ast_context, v);
+ if return_symbol, ok = resolve_generic_function(ast_context, v); !ok {
+ return_symbol, ok = make_symbol_procedure_from_ast(ast_context, local, v.type^, node.name), true;
+ }
}
case Proc_Group:
return_symbol, ok = resolve_function_overload(ast_context, v);
@@ -989,7 +980,9 @@ resolve_type_identifier :: proc(ast_context: ^AstContext, node: ast.Ident) -> (i
if !v.type.generic {
return make_symbol_procedure_from_ast(ast_context, global, v.type^, node.name), true;
} else {
- return resolve_generic_function(ast_context, v);
+ if return_symbol, ok = resolve_generic_function(ast_context, v); !ok {
+ return_symbol, ok = make_symbol_procedure_from_ast(ast_context, global, v.type^, node.name), true;
+ }
}
case Proc_Group:
return_symbol, ok = resolve_function_overload(ast_context, v);
@@ -1190,7 +1183,11 @@ resolve_symbol_return :: proc(ast_context: ^AstContext, symbol: index.Symbol, ok
}
case index.SymbolProcedureValue:
if v.generic {
- return resolve_generic_function_symbol(ast_context, v.arg_types, v.return_types);
+ if resolved_symbol, ok := resolve_generic_function(ast_context, v.arg_types, v.return_types); ok {
+ return resolved_symbol, ok;
+ } else {
+ return symbol, true;
+ }
} else {
return symbol, true;
}
@@ -2047,6 +2044,8 @@ clear_locals :: proc(ast_context: ^AstContext) {
clear(&ast_context.usings);
}
+
+
concatenate_symbols_information :: proc(ast_context: ^AstContext, symbol: index.Symbol, is_completion: bool) -> string {
pkg := path.base(symbol.pkg, false, context.temp_allocator);
@@ -2241,56 +2240,6 @@ get_signature :: proc(ast_context: ^AstContext, ident: ast.Ident, symbol: index.
return ident.name;
}
-get_signature_information :: proc(document: ^Document, position: common.Position) -> (SignatureHelp, bool) {
-
- signature_help: SignatureHelp;
-
- ast_context := make_ast_context(document.ast, document.imports, document.package_name, document.uri.uri);
-
- position_context, ok := get_document_position_context(document, position, .SignatureHelp);
-
- if !ok {
- return signature_help, true;
- }
-
- if position_context.call == nil {
- return signature_help, true;
- }
-
- get_globals(document.ast, &ast_context);
-
- if position_context.function != nil {
- get_locals(document.ast, position_context.function, &ast_context, &position_context);
- }
-
- call: index.Symbol;
- call, ok = resolve_type_expression(&ast_context, position_context.call);
-
- signature_information := make([dynamic]SignatureInformation, 1, context.temp_allocator);
-
- if _, ok := call.value.(index.SymbolProcedureValue); ok {
- info := SignatureInformation {
- label = concatenate_symbols_information(&ast_context, call, false),
- documentation = call.doc,
- };
- append(&signature_information, info);
- } else if value, ok := call.value.(index.SymbolAggregateValue); ok {
- for symbol in value.symbols {
- info := SignatureInformation {
- label = concatenate_symbols_information(&ast_context, symbol, false),
- documentation = symbol.doc,
- };
- append(&signature_information, info);
- }
- }
-
- signature_help.signatures = signature_information[:];
- signature_help.activeSignature = len(signature_information);
- signature_help.activeParameter = 0;
-
- return signature_help, true;
-}
-
get_document_symbols :: proc(document: ^Document) -> []DocumentSymbol {
ast_context := make_ast_context(document.ast, document.imports, document.package_name, document.uri.uri);
diff --git a/src/server/completion.odin b/src/server/completion.odin
index cf26b9c..79c8d15 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -228,15 +228,10 @@ get_comp_lit_completion :: proc(ast_context: ^AstContext, position_context: ^Doc
continue;
}
- resolved.signature = index.node_to_string(v.types[i]);
- resolved.pkg = comp_symbol.name;
- resolved.name = name;
- resolved.type = .Field;
-
item := CompletionItem {
label = resolved.name,
- kind = cast(CompletionItemKind)resolved.type,
- detail = concatenate_symbols_information(ast_context, resolved, true),
+ kind = .Field,
+ detail = fmt.tprintf("%v.%v: %v", comp_symbol.name, resolved.name, index.node_to_string(v.types[i])),
documentation = resolved.doc,
};
@@ -256,8 +251,6 @@ get_selector_completion :: proc(ast_context: ^AstContext, position_context: ^Doc
ast_context.current_package = ast_context.document_package;
- symbols := make([dynamic]index.Symbol, context.temp_allocator);
-
selector: index.Symbol;
ok: bool;
@@ -319,9 +312,14 @@ get_selector_completion :: proc(ast_context: ^AstContext, position_context: ^Doc
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);
+ item := CompletionItem {
+ label = symbol.name,
+ kind = .EnumMember,
+ detail = fmt.tprintf("%v", selector.name),
+ documentation = symbol.doc,
+ };
+
+ append(&items, item);
}
}
@@ -329,11 +327,14 @@ get_selector_completion :: proc(ast_context: ^AstContext, position_context: ^Doc
list.isIncomplete = false;
for name in v.names {
- symbol: index.Symbol;
- symbol.name = name;
- symbol.pkg = selector.name;
- symbol.type = .EnumMember;
- append(&symbols, symbol);
+
+ item := CompletionItem {
+ label = name,
+ kind = .EnumMember,
+ detail = fmt.tprintf("%v.%v", selector.name, name),
+ };
+
+ append(&items, item);
}
case index.SymbolStructValue:
@@ -360,17 +361,24 @@ get_selector_completion :: proc(ast_context: ^AstContext, position_context: ^Doc
continue;
}
- symbol.name = name;
- symbol.type = .Field;
- symbol.pkg = selector.name;
- symbol.signature = index.node_to_string(v.types[i]);
- append(&symbols, symbol);
+ item := CompletionItem {
+ label = symbol.name,
+ kind = .Field,
+ detail = fmt.tprintf("%v.%v: %v", selector.name, name, index.node_to_string(v.types[i])),
+ documentation = symbol.doc,
+ };
+
+ append(&items, item);
} else {
//just give some generic symbol with name.
- symbol: index.Symbol;
- symbol.name = name;
- symbol.type = .Field;
- append(&symbols, symbol);
+ item := CompletionItem {
+ label = symbol.name,
+ kind = .Field,
+ detail = fmt.tprintf("%v: %v", name, index.node_to_string(v.types[i])),
+ documentation = symbol.doc,
+ };
+
+ append(&items, item);
}
}
@@ -381,7 +389,15 @@ get_selector_completion :: proc(ast_context: ^AstContext, position_context: ^Doc
if searched, ok := index.fuzzy_search(field, {selector.pkg}); ok {
for search in searched {
- append(&symbols, search.symbol);
+
+ item := CompletionItem {
+ label = search.symbol.name,
+ kind = .Field,
+ detail = fmt.tprintf("%v.%v: %v", search.symbol.pkg, search.symbol.name, search.symbol.signature),
+ documentation = search.symbol.doc,
+ };
+
+ append(&items, item);
}
} else {
log.errorf("Failed to fuzzy search, field: %v, package: %v", field, selector.pkg);
@@ -389,18 +405,6 @@ get_selector_completion :: proc(ast_context: ^AstContext, position_context: ^Doc
}
}
- for symbol, i in symbols {
-
- item := CompletionItem {
- label = symbol.name,
- kind = cast(CompletionItemKind)symbol.type,
- detail = concatenate_symbols_information(ast_context, symbol, true),
- documentation = symbol.doc,
- };
-
- append(&items, item);
- }
-
list.items = items[:];
}
diff --git a/src/server/signature.odin b/src/server/signature.odin
new file mode 100644
index 0000000..b2efc8d
--- /dev/null
+++ b/src/server/signature.odin
@@ -0,0 +1,69 @@
+package server
+
+import "core:odin/parser"
+import "core:odin/ast"
+import "core:odin/tokenizer"
+import "core:fmt"
+import "core:log"
+import "core:strings"
+import "core:path"
+import "core:mem"
+import "core:strconv"
+import "core:path/filepath"
+import "core:sort"
+import "core:slice"
+
+import "shared:common"
+import "shared:index"
+
+
+
+get_signature_information :: proc(document: ^Document, position: common.Position) -> (SignatureHelp, bool) {
+
+ signature_help: SignatureHelp;
+
+ ast_context := make_ast_context(document.ast, document.imports, document.package_name, document.uri.uri);
+
+ position_context, ok := get_document_position_context(document, position, .SignatureHelp);
+
+ if !ok {
+ return signature_help, true;
+ }
+
+ if position_context.call == nil {
+ return signature_help, true;
+ }
+
+ get_globals(document.ast, &ast_context);
+
+ if position_context.function != nil {
+ get_locals(document.ast, position_context.function, &ast_context, &position_context);
+ }
+
+ call: index.Symbol;
+ call, ok = resolve_type_expression(&ast_context, position_context.call);
+
+ signature_information := make([dynamic]SignatureInformation, context.temp_allocator);
+
+ if _, ok := call.value.(index.SymbolProcedureValue); ok {
+ info := SignatureInformation {
+ label = concatenate_symbols_information(&ast_context, call, false),
+ documentation = call.doc,
+ };
+ append(&signature_information, info);
+ } else if value, ok := call.value.(index.SymbolAggregateValue); ok {
+ for symbol in value.symbols {
+ info := SignatureInformation {
+ label = concatenate_symbols_information(&ast_context, symbol, false),
+ documentation = symbol.doc,
+ };
+ append(&signature_information, info);
+ }
+ }
+
+ signature_help.signatures = signature_information[:];
+ signature_help.activeSignature = 0;
+ signature_help.activeParameter = 0;
+
+ return signature_help, true;
+} \ No newline at end of file