diff options
| author | Daniel Gavin <danielgavin5@hotmail.com> | 2021-04-29 20:24:47 +0200 |
|---|---|---|
| committer | Daniel Gavin <danielgavin5@hotmail.com> | 2021-04-29 20:24:47 +0200 |
| commit | 637b892fd53e61e320e94be0e5b22137ad92a7ba (patch) | |
| tree | 8649912fa1e6b722fb141564c8b322b56d49ba1c /src/server | |
| parent | 7ce7eed0eada14fd650b327fcfdee6b302f231aa (diff) | |
more refractor + tests
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 89 | ||||
| -rw-r--r-- | src/server/completion.odin | 82 | ||||
| -rw-r--r-- | src/server/signature.odin | 69 |
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 |