From c23e9c0aea54f116cb3ea9095f06575a6b8f6d3d Mon Sep 17 00:00:00 2001 From: Daniel Gavin Date: Mon, 24 Oct 2022 14:07:47 +0200 Subject: imporve the recursion check --- src/server/analysis.odin | 28 +++++++++++++++------------- src/server/definition.odin | 18 +++++++++--------- src/server/documents.odin | 2 +- src/server/memory_index.odin | 2 +- src/server/snippets.odin | 6 +++++- src/server/unmarshal.odin | 8 ++++---- 6 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 2630b79..e354d1d 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -868,8 +868,10 @@ resolve_function_overload :: proc( candidates := make([dynamic]Symbol, context.temp_allocator) for arg_expr in group.args { - next_fn: if f, ok := resolve_type_expression(ast_context, arg_expr); - ok { + next_fn: if f, ok := internal_resolve_type_expression( + ast_context, + arg_expr, + ); ok { if call_expr == nil || len(call_expr.args) == 0 { append(&candidates, f) break next_fn @@ -903,7 +905,7 @@ resolve_function_overload :: proc( //named parameter if field, is_field := arg.derived.(^ast.Field_Value); is_field { - call_symbol, ok = resolve_type_expression( + call_symbol, ok = internal_resolve_type_expression( ast_context, field.value, ) @@ -921,7 +923,7 @@ resolve_function_overload :: proc( break next_fn } } else { - call_symbol, ok = resolve_type_expression( + call_symbol, ok = internal_resolve_type_expression( ast_context, arg, ) @@ -935,7 +937,7 @@ resolve_function_overload :: proc( if len(p.return_types) != 1 { break next_fn } - if s, ok := resolve_type_expression( + if s, ok := internal_resolve_type_expression( ast_context, p.return_types[0].type, ); ok { @@ -944,12 +946,12 @@ resolve_function_overload :: proc( } if procedure.arg_types[i].type != nil { - arg_symbol, ok = resolve_type_expression( + arg_symbol, ok = internal_resolve_type_expression( ast_context, procedure.arg_types[i].type, ) } else { - arg_symbol, ok = resolve_type_expression( + arg_symbol, ok = internal_resolve_type_expression( ast_context, procedure.arg_types[i].default_value, ) @@ -1172,7 +1174,8 @@ internal_resolve_type_expression :: proc( case ^Binary_Expr: return resolve_first_symbol_from_binary_expression(ast_context, v) case ^Ident: - return resolve_type_identifier(ast_context, v^) + delete_key(&ast_context.recursion_map, v) + return internal_resolve_type_identifier(ast_context, v^) case ^Basic_Lit: return resolve_basic_lit(ast_context, v^) case ^Type_Cast: @@ -1514,7 +1517,6 @@ resolve_type_identifier :: proc( Symbol, bool, ) { - clear(&ast_context.recursion_map) return internal_resolve_type_identifier(ast_context, node) } @@ -3557,7 +3559,7 @@ resolve_entire_decl :: proc( } case ^ast.Selector_Expr: if symbol, ok := resolve_type_expression(ast_context, &v.node); - ok { + ok { data.symbols[cast(uintptr)node] = SymbolAndNode { node = v, symbol = symbol, @@ -3570,7 +3572,7 @@ resolve_entire_decl :: proc( } case ^ast.Call_Expr: if symbol, ok := resolve_type_expression(ast_context, &v.node); - ok { + ok { data.symbols[cast(uintptr)node] = SymbolAndNode { node = v, symbol = symbol, @@ -3597,7 +3599,7 @@ resolve_entire_decl :: proc( ) if symbol, ok := resolve_location_selector(ast_context, v); - ok { + ok { data.symbols[cast(uintptr)node] = SymbolAndNode { node = v.field, symbol = symbol, @@ -3641,7 +3643,7 @@ resolve_entire_decl :: proc( } if symbol, ok := resolve_location_identifier(ast_context, v^); - ok { + ok { data.symbols[cast(uintptr)node] = SymbolAndNode { node = v, symbol = symbol, diff --git a/src/server/definition.odin b/src/server/definition.odin index 309cde1..fbea155 100644 --- a/src/server/definition.odin +++ b/src/server/definition.odin @@ -67,9 +67,9 @@ get_definition_location :: proc( if position_in_node(base, position_context.position) { if resolved, ok := resolve_location_identifier( - &ast_context, - ident^, - ); ok { + &ast_context, + ident^, + ); ok { location.range = resolved.range if resolved.uri == "" { @@ -88,17 +88,17 @@ get_definition_location :: proc( } if resolved, ok := resolve_location_selector( - &ast_context, - position_context.selector_expr, - ); ok { + &ast_context, + position_context.selector_expr, + ); ok { location.range = resolved.range uri = resolved.uri } } else if position_context.identifier != nil { if resolved, ok := resolve_location_identifier( - &ast_context, - position_context.identifier.derived.(^ast.Ident)^, - ); ok { + &ast_context, + position_context.identifier.derived.(^ast.Ident)^, + ); ok { location.range = resolved.range uri = resolved.uri } else { diff --git a/src/server/documents.odin b/src/server/documents.odin index 5adfdfb..65b176e 100644 --- a/src/server/documents.odin +++ b/src/server/documents.odin @@ -456,7 +456,7 @@ parse_imports :: proc(document: ^Document, config: ^common.Config) { //collection specified if i := strings.index(imp.fullpath, ":"); - i != -1 && i > 1 && i < len(imp.fullpath) - 1 { + i != -1 && i > 1 && i < len(imp.fullpath) - 1 { if len(imp.fullpath) < 2 { continue } diff --git a/src/server/memory_index.odin b/src/server/memory_index.odin index f609ca2..a211b94 100644 --- a/src/server/memory_index.odin +++ b/src/server/memory_index.odin @@ -65,7 +65,7 @@ memory_index_fuzzy_search :: proc( if pkg, ok := index.collection.packages[pkg]; ok { for _, symbol in pkg { if score, ok := common.fuzzy_match(fuzzy_matcher, symbol.name); - ok == 1 { + ok == 1 { result := FuzzyResult { symbol = symbol, score = score, diff --git a/src/server/snippets.odin b/src/server/snippets.odin index c6a93aa..cd790a9 100644 --- a/src/server/snippets.odin +++ b/src/server/snippets.odin @@ -17,7 +17,11 @@ snippets: map[string]Snippet_Info = { packages = []string{"fmt"}, detail = "println", }, - "if" = {insert = "if ${1} {\n\t${0}\n}", packages = {}, detail = "if statement"}, + "if" = { + insert = "if ${1} {\n\t${0}\n}", + packages = {}, + detail = "if statement", + }, "forr" = { insert = "for ${2:elem} in ${1:range} {\n\t${0}\n}", packages = {}, diff --git a/src/server/unmarshal.odin b/src/server/unmarshal.odin index bda15a7..7f520fc 100644 --- a/src/server/unmarshal.odin +++ b/src/server/unmarshal.odin @@ -41,10 +41,10 @@ unmarshal :: proc( //TEMP most likely have to rewrite the entire unmarshal using tags instead, because i sometimes have to support names like 'context', which can't be written like that if field[len(field) - 1] == '_' { if ret := unmarshal( - j[field[:len(field) - 1]], - a, - allocator, - ); ret != nil { + j[field[:len(field) - 1]], + a, + allocator, + ); ret != nil { return ret } } else { -- cgit v1.2.3