diff options
| -rw-r--r-- | src/server/analysis.odin | 100 | ||||
| -rw-r--r-- | src/server/caches.odin | 2 | ||||
| -rw-r--r-- | src/server/generics.odin | 33 | ||||
| -rw-r--r-- | tests/hover_test.odin | 4 |
4 files changed, 48 insertions, 91 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 4c21c81..fdc1956 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -1811,37 +1811,7 @@ resolve_local_identifier :: proc(ast_context: ^AstContext, node: ast.Ident, loca return_symbol, ok = make_symbol_bit_field_from_ast(ast_context, v, node.name), true return_symbol.name = node.name case ^ast.Proc_Lit: - if is_procedure_generic(v.type) { - return_symbol, ok = resolve_generic_function(ast_context, v^) - - if !ok && !ast_context.overloading { - return_symbol, ok = - make_symbol_procedure_from_ast( - ast_context, - local.rhs, - v.type^, - node.name, - {}, - false, - v.inlining, - v.where_clauses, - ), - true - } - } else { - return_symbol, ok = - make_symbol_procedure_from_ast( - ast_context, - local.rhs, - v.type^, - node.name, - {}, - false, - v.inlining, - v.where_clauses, - ), - true - } + return_symbol, ok = resolve_proc_lit(ast_context, local.rhs, v, node.name, {}, false) case ^ast.Proc_Group: return_symbol, ok = resolve_function_overload(ast_context, v^) case ^ast.Array_Type: @@ -1935,38 +1905,7 @@ resolve_global_identifier :: proc(ast_context: ^AstContext, node: ast.Ident, glo return_symbol, ok = make_symbol_bit_field_from_ast(ast_context, v, node.name), true return_symbol.name = node.name case ^ast.Proc_Lit: - if is_procedure_generic(v.type) { - return_symbol, ok = resolve_generic_function(ast_context, v^) - - //If we are not overloading just show the unresolved generic function - if !ok && !ast_context.overloading { - return_symbol, ok = - make_symbol_procedure_from_ast( - ast_context, - global.expr, - v.type^, - node.name, - global.attributes, - false, - v.inlining, - v.where_clauses, - ), - true - } - } else { - return_symbol, ok = - make_symbol_procedure_from_ast( - ast_context, - global.expr, - v.type^, - node.name, - global.attributes, - false, - v.inlining, - v.where_clauses, - ), - true - } + return_symbol, ok = resolve_proc_lit(ast_context, global.expr, v, node.name, global.attributes, false) case ^ast.Proc_Group: return_symbol, ok = resolve_function_overload(ast_context, v^) case ^ast.Array_Type: @@ -2013,6 +1952,38 @@ resolve_global_identifier :: proc(ast_context: ^AstContext, node: ast.Ident, glo return return_symbol, ok } +resolve_proc_lit :: proc( + ast_context: ^AstContext, + node: ^ast.Node, + proc_lit: ^ast.Proc_Lit, + name: string, + attributes: []^ast.Attribute, + type: bool, +) -> ( + Symbol, + bool, +) { + symbol := make_symbol_procedure_from_ast( + ast_context, + node, + proc_lit.type^, + name, + attributes, + type, + proc_lit.inlining, + proc_lit.where_clauses, + ) + + if is_procedure_generic(proc_lit.type) { + if generic_symbol, ok := resolve_generic_function(ast_context, proc_lit^, symbol); ok { + return generic_symbol, ok + } else if ast_context.overloading { + return {}, false + } + } + return symbol, true +} + struct_type_from_identifier :: proc(ast_context: ^AstContext, node: ast.Ident) -> (^ast.Struct_Type, bool) { if check_node_recursion(ast_context, node.derived.(^ast.Ident)) { return {}, false @@ -2533,8 +2504,7 @@ resolve_symbol_return :: proc(ast_context: ^AstContext, symbol: Symbol, ok := tr v.arg_types, v.return_types, v.inlining, - symbol.range, - symbol.uri, + symbol, ); ok { return resolved_symbol, ok } else { diff --git a/src/server/caches.odin b/src/server/caches.odin index 423e568..ff7a422 100644 --- a/src/server/caches.odin +++ b/src/server/caches.odin @@ -2,8 +2,6 @@ package server import "src:common" -import "core:fmt" -import "core:log" import "core:mem/virtual" import "core:os" import "core:path/filepath" diff --git a/src/server/generics.odin b/src/server/generics.odin index ed35c65..37546a2 100644 --- a/src/server/generics.odin +++ b/src/server/generics.odin @@ -1,19 +1,9 @@ package server -import "core:fmt" -import "core:log" -import "core:mem" import "core:odin/ast" -import "core:odin/parser" import "core:odin/tokenizer" -import "core:path/filepath" -import path "core:path/slashpath" import "core:reflect" -import "core:slice" -import "core:sort" -import "core:strconv" import "core:strings" -import "core:unicode/utf8" import "src:common" @@ -487,7 +477,14 @@ resolve_generic_function :: proc { resolve_generic_function_symbol, } -resolve_generic_function_ast :: proc(ast_context: ^AstContext, proc_lit: ast.Proc_Lit) -> (Symbol, bool) { +resolve_generic_function_ast :: proc( + ast_context: ^AstContext, + proc_lit: ast.Proc_Lit, + proc_symbol: Symbol, +) -> ( + Symbol, + bool, +) { if ast_context.call == nil { return Symbol{}, false } @@ -504,7 +501,7 @@ resolve_generic_function_ast :: proc(ast_context: ^AstContext, proc_lit: ast.Pro range := common.get_token_range(proc_lit, ast_context.file.src) uri := common.create_uri(proc_lit.pos.file, ast_context.allocator).uri - return resolve_generic_function_symbol(ast_context, params, results, proc_lit.inlining, range, uri) + return resolve_generic_function_symbol(ast_context, params, results, proc_lit.inlining, proc_symbol) } @@ -513,8 +510,7 @@ resolve_generic_function_symbol :: proc( params: []^ast.Field, results: []^ast.Field, inlining: ast.Proc_Inlining, - proc_range: common.Range, - proc_uri: string, + proc_symbol: Symbol, ) -> ( Symbol, bool, @@ -619,14 +615,6 @@ resolve_generic_function_symbol :: proc( return {}, false } - symbol := Symbol { - range = proc_range, - type = .Function, - name = function_name, - uri = proc_uri, - pkg = get_package_from_filepath(proc_uri), - } - return_types := make([dynamic]^ast.Field, ast_context.allocator) argument_types := make([dynamic]^ast.Field, ast_context.allocator) @@ -680,6 +668,7 @@ resolve_generic_function_symbol :: proc( } + symbol := proc_symbol symbol.value = SymbolProcedureValue { return_types = return_types[:], arg_types = argument_types[:], diff --git a/tests/hover_test.odin b/tests/hover_test.odin index 2f33d73..4a99d19 100644 --- a/tests/hover_test.odin +++ b/tests/hover_test.odin @@ -5354,7 +5354,7 @@ ast_hover_parapoly_other_package :: proc(t: ^testing.T) { append(&packages, test.Package{pkg = "my_package", source = `package my_package // Docs! - bar :: proc(_: $T) {} + bar :: proc(_: $T) {} // Comment! `}) source := test.Source { main = `package test @@ -5366,7 +5366,7 @@ ast_hover_parapoly_other_package :: proc(t: ^testing.T) { `, packages = packages[:], } - test.expect_hover(t, &source, "my_package.bar :: proc(_: $T)") + test.expect_hover(t, &source, "my_package.bar :: proc(_: $T)\n Docs!\n\n// Comment!") } /* |