diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2024-06-11 21:59:11 +0200 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2024-06-11 21:59:11 +0200 |
| commit | a7bb78679028f2ade9c0975c4ec895db3fd62d9e (patch) | |
| tree | bf57262f2fbfb696d353fc21bdac7282935706c4 /src/server/analysis.odin | |
| parent | b88ec3cd61dddb43f2434e270835ba341ba31b3f (diff) | |
Add more stability to prevent crashes + more tests with renaming
Diffstat (limited to 'src/server/analysis.odin')
| -rw-r--r-- | src/server/analysis.odin | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 61855ef..99b2acb 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -133,14 +133,17 @@ make_ast_context :: proc( } set_ast_package_deferred :: proc(ast_context: ^AstContext, pkg: string) { + assert(ast_context.deferred_count > 0) ast_context.deferred_count -= 1 ast_context.current_package = ast_context.deferred_package[ast_context.deferred_count] - assert(ast_context.deferred_count >= 0) } @(deferred_in = set_ast_package_deferred) set_ast_package_set_scoped :: proc(ast_context: ^AstContext, pkg: string) { + if ast_context.deferred_count >= DeferredDepth { + return + } ast_context.deferred_package[ast_context.deferred_count] = ast_context.current_package ast_context.deferred_count += 1 @@ -148,14 +151,17 @@ set_ast_package_set_scoped :: proc(ast_context: ^AstContext, pkg: string) { } set_ast_package_none_deferred :: proc(ast_context: ^AstContext) { + assert(ast_context.deferred_count > 0) ast_context.deferred_count -= 1 ast_context.current_package = ast_context.deferred_package[ast_context.deferred_count] - assert(ast_context.deferred_count >= 0) } @(deferred_in = set_ast_package_none_deferred) set_ast_package_scoped :: proc(ast_context: ^AstContext) { + if ast_context.deferred_count >= DeferredDepth { + return + } ast_context.deferred_package[ast_context.deferred_count] = ast_context.current_package ast_context.deferred_count += 1 @@ -165,10 +171,10 @@ set_ast_package_from_symbol_deferred :: proc( ast_context: ^AstContext, symbol: Symbol, ) { + assert(ast_context.deferred_count > 0) ast_context.deferred_count -= 1 ast_context.current_package = ast_context.deferred_package[ast_context.deferred_count] - assert(ast_context.deferred_count >= 0) } @(deferred_in = set_ast_package_from_symbol_deferred) @@ -176,6 +182,10 @@ set_ast_package_from_symbol_scoped :: proc( ast_context: ^AstContext, symbol: Symbol, ) { + if ast_context.deferred_count >= DeferredDepth { + return + } + ast_context.deferred_package[ast_context.deferred_count] = ast_context.current_package ast_context.deferred_count += 1 @@ -822,11 +832,6 @@ resolve_type_expression :: proc( Symbol, bool, ) { - //Try to prevent stack overflows and prevent indexing out of bounds. - if ast_context.deferred_count >= DeferredDepth { - return {}, false - } - clear(&ast_context.recursion_map) return internal_resolve_type_expression(ast_context, node) } @@ -842,6 +847,11 @@ internal_resolve_type_expression :: proc( return {}, false } + //Try to prevent stack overflows and prevent indexing out of bounds. + if ast_context.deferred_count >= DeferredDepth { + return {}, false + } + set_ast_package_scoped(ast_context) if check_node_recursion(ast_context, node) { @@ -1317,11 +1327,6 @@ resolve_type_identifier :: proc( Symbol, bool, ) { - //Try to prevent stack overflows and prevent indexing out of bounds. - if ast_context.deferred_count > DeferredDepth { - return {}, false - } - return internal_resolve_type_identifier(ast_context, node) } @@ -1338,6 +1343,11 @@ internal_resolve_type_identifier :: proc( return {}, false } + //Try to prevent stack overflows and prevent indexing out of bounds. + if ast_context.deferred_count >= DeferredDepth { + return {}, false + } + set_ast_package_scoped(ast_context) if v, ok := common.keyword_map[node.name]; ok { @@ -2326,6 +2336,15 @@ resolve_location_implicit_selector :: proc( symbol.range = v.ranges[i] } } + case SymbolUnionValue: + enum_value := unwrap_super_enum(ast_context, v) or_return + for name, i in enum_value.names { + if strings.compare(name, implicit_selector.field.name) == 0 { + symbol.range = enum_value.ranges[i] + } + } + case: + ok = false } return symbol, ok |