From fd568075da8bf95ca37159454f37e085d5134b1d Mon Sep 17 00:00:00 2001 From: Daniel Gavin Date: Mon, 13 Jun 2022 21:27:04 +0200 Subject: Fix stackoverflow error with unresolved generic expression. --- src/server/analysis.odin | 12 +++++++++--- src/server/collector.odin | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 62b3da9..0686743 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -1431,7 +1431,9 @@ resolve_symbol_return :: proc(ast_context: ^AstContext, symbol: Symbol, ok := tr symbol := symbol if symbol.type == .Unresolved { - resolve_unresolved_symbol(ast_context, &symbol) + if !resolve_unresolved_symbol(ast_context, &symbol) { + return {}, false + } } #partial switch v in &symbol.value { @@ -1490,9 +1492,9 @@ resolve_symbol_return :: proc(ast_context: ^AstContext, symbol: Symbol, ok := tr return symbol, true } -resolve_unresolved_symbol :: proc(ast_context: ^AstContext, symbol: ^Symbol) { +resolve_unresolved_symbol :: proc(ast_context: ^AstContext, symbol: ^Symbol) -> bool { if symbol.type != .Unresolved { - return + return true } #partial switch v in symbol.value { @@ -1513,8 +1515,12 @@ resolve_unresolved_symbol :: proc(ast_context: ^AstContext, symbol: ^Symbol) { if ret, ok := resolve_type_expression(ast_context, v.expr); ok { symbol.type = ret.type symbol.signature = ret.signature + } else { + return false } } + + return true } resolve_location_identifier :: proc(ast_context: ^AstContext, node: ast.Ident) -> (Symbol, bool) { diff --git a/src/server/collector.odin b/src/server/collector.odin index 632a94c..47ebb98 100644 --- a/src/server/collector.odin +++ b/src/server/collector.odin @@ -391,7 +391,7 @@ collect_symbols :: proc(collection: ^SymbolCollection, file: ast.File, uri: stri if expr.builtin || strings.contains(uri, "builtin.odin") { symbol.pkg = "$builtin" - } else if strings.contains(uri, "builtin.odin") { + } else if strings.contains(uri, "intrinsics.odin") { symbol.pkg = "$intrinsics" } else { symbol.pkg = get_index_unique_string(collection, directory) -- cgit v1.2.3