aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorBradley Lewis <22850972+BradLewis@users.noreply.github.com>2025-08-23 09:11:37 -0400
committerGitHub <noreply@github.com>2025-08-23 09:11:37 -0400
commita2a28c1c0c908b6a3fbe5a4c177b879dcae2d465 (patch)
tree94687fa30d2642ef8f90b897b1a18add14d52c7c /src/server
parent51c8693023acb0d5b2e6b80fbb9a31f44fc37fd6 (diff)
parent7c4cfe65d740c80d1f439ec557a9b90e73667ce6 (diff)
Merge pull request #925 from BradLewis/fix/container-allocator-hover
Fix/container allocator hover
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin51
-rw-r--r--src/server/hover.odin13
2 files changed, 64 insertions, 0 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 076a7e7..053273a 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -1460,7 +1460,14 @@ resolve_selector_expression :: proc(ast_context: ^AstContext, node: ^ast.Selecto
case SymbolSliceValue:
return resolve_soa_selector_field(ast_context, selector, s.expr, nil, node.field.name)
case SymbolDynamicArrayValue:
+ if node.field.name == "allocator" {
+ return resolve_container_allocator(ast_context, "Raw_Dynamic_Array")
+ }
return resolve_soa_selector_field(ast_context, selector, s.expr, nil, node.field.name)
+ case SymbolMapValue:
+ if node.field.name == "allocator" {
+ return resolve_container_allocator(ast_context, "Raw_Map")
+ }
}
}
@@ -2625,6 +2632,43 @@ resolve_location_implicit_selector :: proc(
return symbol, ok
}
+resolve_container_allocator :: proc(ast_context: ^AstContext, container_name: string) -> (Symbol, bool) {
+ for built in indexer.builtin_packages {
+ if symbol, ok := lookup(container_name, built, ast_context.fullpath); ok {
+ if v, ok := symbol.value.(SymbolStructValue); ok {
+ for name, i in v.names {
+ if name == "allocator" {
+ if symbol, ok := resolve_type_expression(ast_context, v.types[i]); ok {
+ construct_struct_field_symbol(&symbol, container_name, v, i)
+ build_documentation(ast_context, &symbol, true)
+ return symbol, true
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return {}, false
+}
+
+resolve_container_allocator_location :: proc(ast_context: ^AstContext, container_name: string) -> (Symbol, bool) {
+ for built in indexer.builtin_packages {
+ if symbol, ok := lookup(container_name, built, ast_context.fullpath); ok {
+ if v, ok := symbol.value.(SymbolStructValue); ok {
+ for name, i in v.names {
+ if name == "allocator" {
+ symbol.range = v.ranges[i]
+ return symbol, true
+ }
+ }
+ }
+ }
+ }
+
+ return {}, false
+}
+
resolve_location_selector :: proc(ast_context: ^AstContext, selector_expr: ^ast.Node) -> (symbol: Symbol, ok: bool) {
reset_ast_context(ast_context)
@@ -2692,9 +2736,16 @@ resolve_symbol_selector :: proc(
case SymbolSliceValue:
return resolve_soa_selector_field(ast_context, symbol, v.expr, nil, field)
case SymbolDynamicArrayValue:
+ if field == "allocator" {
+ return resolve_container_allocator_location(ast_context, "Raw_Dynamic_Array")
+ }
return resolve_soa_selector_field(ast_context, symbol, v.expr, nil, field)
case SymbolFixedArrayValue:
return resolve_soa_selector_field(ast_context, symbol, v.expr, v.len, field)
+ case SymbolMapValue:
+ if field == "allocator" {
+ return resolve_container_allocator_location(ast_context, "Raw_Map")
+ }
}
return symbol, true
diff --git a/src/server/hover.odin b/src/server/hover.odin
index bf64967..86fd6a8 100644
--- a/src/server/hover.odin
+++ b/src/server/hover.odin
@@ -356,9 +356,22 @@ get_hover_information :: proc(document: ^Document, position: common.Position) ->
case SymbolSliceValue:
return get_soa_field_hover(&ast_context, selector, v.expr, nil, field)
case SymbolDynamicArrayValue:
+ if field == "allocator" {
+ if symbol, ok := resolve_container_allocator(&ast_context, "Raw_Dynamic_Array"); ok {
+ hover.contents = write_hover_content(&ast_context, symbol)
+ return hover, true, true
+ }
+ }
return get_soa_field_hover(&ast_context, selector, v.expr, nil, field)
case SymbolFixedArrayValue:
return get_soa_field_hover(&ast_context, selector, v.expr, v.len, field)
+ case SymbolMapValue:
+ if field == "allocator" {
+ if symbol, ok := resolve_container_allocator(&ast_context, "Raw_Map"); ok {
+ hover.contents = write_hover_content(&ast_context, symbol)
+ return hover, true, true
+ }
+ }
}
} else if position_context.implicit_selector_expr != nil {
implicit_selector := position_context.implicit_selector_expr