aboutsummaryrefslogtreecommitdiff
path: root/src/server/analysis.odin
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2024-06-11 21:59:11 +0200
committerDanielGavin <danielgavin5@hotmail.com>2024-06-11 21:59:11 +0200
commita7bb78679028f2ade9c0975c4ec895db3fd62d9e (patch)
treebf57262f2fbfb696d353fc21bdac7282935706c4 /src/server/analysis.odin
parentb88ec3cd61dddb43f2434e270835ba341ba31b3f (diff)
Add more stability to prevent crashes + more tests with renaming
Diffstat (limited to 'src/server/analysis.odin')
-rw-r--r--src/server/analysis.odin45
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