aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-07-26 20:16:28 -0400
committerBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-07-29 15:49:11 -0400
commit58b0861ada89c42539931050ebabe4572b0b4c29 (patch)
treea1d910fc6d30c47a81352cc0a6a922bbd308bda6 /src
parentca14a7b8462d4f0d996dd502ac7183dc426f4a74 (diff)
Update selector completions
Diffstat (limited to 'src')
-rw-r--r--src/server/completion.odin159
-rw-r--r--src/server/methods.odin5
2 files changed, 82 insertions, 82 deletions
diff --git a/src/server/completion.odin b/src/server/completion.odin
index 24aa323..5097ba4 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -160,7 +160,7 @@ get_completion_list :: proc(
case .Implicit:
get_implicit_completion(&ast_context, &position_context, &list)
case .Selector:
- get_selector_completion(&ast_context, &position_context, &list)
+ is_incomplete = get_selector_completion(&ast_context, &position_context, &results)
case .Switch_Type:
get_type_switch_completion(&ast_context, &position_context, &list)
case .Directive:
@@ -278,7 +278,7 @@ get_directive_completion :: proc(
get_comp_lit_completion :: proc(
ast_context: ^AstContext,
position_context: ^DocumentPositionContext,
- list: ^[dynamic]CompletionResult,
+ results: ^[dynamic]CompletionResult,
) -> bool {
if symbol, ok := resolve_comp_literal(ast_context, position_context); ok {
#partial switch v in symbol.value {
@@ -296,7 +296,7 @@ get_comp_lit_completion :: proc(
}
construct_struct_field_symbol(&symbol, symbol.name, v, i)
- append(list, CompletionResult{symbol = symbol})
+ append(results, CompletionResult{symbol = symbol})
}
}
case SymbolBitFieldValue:
@@ -313,7 +313,7 @@ get_comp_lit_completion :: proc(
}
construct_bit_field_field_symbol(&symbol, symbol.name, v, i)
- append(list, CompletionResult{symbol = symbol})
+ append(results, CompletionResult{symbol = symbol})
}
}
case SymbolFixedArrayValue:
@@ -325,7 +325,7 @@ get_comp_lit_completion :: proc(
}
construct_enum_field_symbol(&symbol, v, i)
- append(list, CompletionResult{symbol = symbol})
+ append(results, CompletionResult{symbol = symbol})
}
}
}
@@ -338,28 +338,27 @@ get_comp_lit_completion :: proc(
get_selector_completion :: proc(
ast_context: ^AstContext,
position_context: ^DocumentPositionContext,
- list: ^CompletionList,
-) {
- items := make([dynamic]CompletionItem, context.temp_allocator)
-
+ results: ^[dynamic]CompletionResult,
+) -> bool {
ast_context.current_package = ast_context.document_package
selector: Symbol
ok: bool
+ is_incomplete := false
reset_ast_context(ast_context)
selector, ok = resolve_type_expression(ast_context, position_context.selector)
if !ok {
- return
+ return is_incomplete
}
if selector.type != .Variable &&
selector.type != .Package &&
selector.type != .Enum &&
selector.type != .Function {
- return
+ return is_incomplete
}
set_ast_package_from_symbol_scoped(ast_context, selector)
@@ -380,19 +379,19 @@ get_selector_completion :: proc(
if s, ok := selector.value.(SymbolProcedureValue); ok {
if len(s.return_types) == 1 {
if selector, ok = resolve_type_expression(ast_context, s.return_types[0].type); !ok {
- return
+ return false
}
}
}
if common.config.enable_fake_method {
- append_method_completion(ast_context, selector, position_context, &items, receiver)
+ append_method_completion(ast_context, selector, position_context, results, receiver)
}
#partial switch v in selector.value {
case SymbolFixedArrayValue:
- list.isIncomplete = true
- append_magic_array_like_completion(position_context, selector, &items)
+ is_incomplete = true
+ append_magic_array_like_completion(position_context, selector, results)
containsColor := 1
containsCoord := 1
@@ -415,7 +414,7 @@ get_selector_completion :: proc(
} else if _, ok := swizzle_coord_map[c]; ok {
containsCoord += 1
} else {
- return
+ return is_incomplete
}
}
}
@@ -434,7 +433,7 @@ get_selector_completion :: proc(
kind = .Property,
detail = fmt.tprintf("%v%v: %v", field, k, node_to_string(v.expr)),
}
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
}
expr_len = save
@@ -451,7 +450,7 @@ get_selector_completion :: proc(
kind = .Property,
detail = fmt.tprintf("%v%v: %v", field, k, node_to_string(v.expr)),
}
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
}
}
@@ -468,7 +467,7 @@ get_selector_completion :: proc(
kind = .Property,
detail = fmt.tprintf("%v%v: [%v]%v", field, k, containsColor, node_to_string(v.expr)),
}
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
}
} else if containsCoord > 1 {
for k in swizzle_coord_components {
@@ -483,13 +482,13 @@ get_selector_completion :: proc(
kind = .Property,
detail = fmt.tprintf("%v%v: [%v]%v", field, k, containsCoord, node_to_string(v.expr)),
}
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
}
}
case SymbolUnionValue:
- list.isIncomplete = false
+ is_incomplete = false
- append_magic_union_completion(position_context, selector, &items)
+ append_magic_union_completion(position_context, selector, results)
for type in v.types {
if symbol, ok := resolve_type_expression(ast_context, type); ok {
@@ -521,13 +520,12 @@ get_selector_completion :: proc(
node_to_string(type, true),
)
}
-
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
}
}
case SymbolEnumValue:
- list.isIncomplete = false
+ is_incomplete = false
for name in v.names {
item := CompletionItem {
@@ -535,11 +533,11 @@ get_selector_completion :: proc(
kind = .EnumMember,
detail = fmt.tprintf("%v.%v", selector.name, name),
}
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
}
case SymbolBitSetValue:
- list.isIncomplete = false
+ is_incomplete = false
enumv, ok := unwrap_bitset(ast_context, selector)
if !ok {break}
@@ -562,18 +560,20 @@ get_selector_completion :: proc(
for name in enumv.names {
append(
- &items,
- CompletionItem {
- label = fmt.tprintf(".%s", name),
- kind = .EnumMember,
- detail = fmt.tprintf("%s.%s", selector.name, name),
- additionalTextEdits = additionalTextEdits,
- },
+ results,
+ CompletionResult{
+ completion_item = CompletionItem{
+ label = fmt.tprintf(".%s", name),
+ kind = .EnumMember,
+ detail = fmt.tprintf("%s.%s", selector.name, name),
+ additionalTextEdits = additionalTextEdits,
+ },
+ }
)
}
case SymbolStructValue:
- list.isIncomplete = false
+ is_incomplete = false
for name, i in v.names {
if name == "_" {
@@ -610,7 +610,7 @@ get_selector_completion :: proc(
documentation = symbol.doc,
}
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
} else {
//just give some generic symbol with name.
item := CompletionItem {
@@ -620,12 +620,12 @@ get_selector_completion :: proc(
documentation = symbol.doc,
}
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
}
}
case SymbolBitFieldValue:
- list.isIncomplete = false
+ is_incomplete = false
for name, i in v.names {
if name == "_" {
@@ -647,7 +647,7 @@ get_selector_completion :: proc(
documentation = symbol.doc,
}
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
} else {
//just give some generic symbol with name.
item := CompletionItem {
@@ -656,13 +656,12 @@ get_selector_completion :: proc(
detail = fmt.tprintf("%v: %v", name, node_to_string(v.types[i])),
documentation = symbol.doc,
}
-
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
}
}
case SymbolPackageValue:
- list.isIncomplete = true
+ is_incomplete = true
pkg := selector.pkg
@@ -695,30 +694,30 @@ get_selector_completion :: proc(
item.deprecated = .Deprecated in symbol.flags
}
- append(&items, item)
+ append(results, CompletionResult{completion_item = item})
}
} else {
log.errorf("Failed to fuzzy search, field: %v, package: %v", field, selector.pkg)
- return
+ return is_incomplete
}
case SymbolDynamicArrayValue:
- list.isIncomplete = false
- append_magic_array_like_completion(position_context, selector, &items)
+ is_incomplete = false
+ append_magic_array_like_completion(position_context, selector, results)
case SymbolSliceValue:
- list.isIncomplete = false
- append_magic_array_like_completion(position_context, selector, &items)
+ is_incomplete = false
+ append_magic_array_like_completion(position_context, selector, results)
case SymbolMapValue:
- list.isIncomplete = false
- append_magic_map_completion(position_context, selector, &items)
+ is_incomplete = false
+ append_magic_map_completion(position_context, selector, results)
case SymbolBasicValue:
if selector.signature == "string" {
- append_magic_array_like_completion(position_context, selector, &items)
+ append_magic_array_like_completion(position_context, selector, results)
}
}
- list.items = items[:]
+ return is_incomplete
}
get_implicit_completion :: proc(
@@ -1267,7 +1266,7 @@ get_implicit_completion :: proc(
get_identifier_completion :: proc(
ast_context: ^AstContext,
position_context: ^DocumentPositionContext,
- list: ^[dynamic]CompletionResult,
+ results: ^[dynamic]CompletionResult,
) -> bool {
lookup_name := ""
@@ -1288,13 +1287,13 @@ get_identifier_completion :: proc(
append(&pkgs, ast_context.document_package)
append(&pkgs, "$builtin")
- if results, ok := fuzzy_search(lookup_name, pkgs[:]); ok {
- for r in results {
+ if fuzzy_results, ok := fuzzy_search(lookup_name, pkgs[:]); ok {
+ for r in fuzzy_results {
r := r
resolve_unresolved_symbol(ast_context, &r.symbol)
uri, _ := common.parse_uri(r.symbol.uri, context.temp_allocator)
if uri.path != ast_context.fullpath {
- append(list, CompletionResult{score = r.score, symbol = r.symbol})
+ append(results, CompletionResult{score = r.score, symbol = r.symbol})
}
}
}
@@ -1307,7 +1306,7 @@ get_identifier_completion :: proc(
}
//combined is sorted and should do binary search instead.
- for result in list {
+ for result in results {
if result.symbol.name == k {
continue global
}
@@ -1323,7 +1322,7 @@ get_identifier_completion :: proc(
if symbol, ok := resolve_type_identifier(ast_context, ident^); ok {
symbol.name = k
if score, ok := common.fuzzy_match(matcher, ident.name); ok == 1 {
- append(list, CompletionResult{score = score * 1.1, symbol = symbol})
+ append(results, CompletionResult{score = score * 1.1, symbol = symbol})
}
}
}
@@ -1350,7 +1349,7 @@ get_identifier_completion :: proc(
if symbol, ok := resolve_type_identifier(ast_context, ident^); ok {
if score, ok := common.fuzzy_match(matcher, ident.name); ok == 1 {
symbol.name = clean_ident(ident.name)
- append(list, CompletionResult{score = score * 1.7, symbol = symbol})
+ append(results, CompletionResult{score = score * 1.7, symbol = symbol})
}
}
}
@@ -1367,7 +1366,7 @@ get_identifier_completion :: proc(
}
if score, ok := common.fuzzy_match(matcher, symbol.name); ok == 1 {
- append(list, CompletionResult{score = score * 1.1, symbol = symbol})
+ append(results, CompletionResult{score = score * 1.1, symbol = symbol})
}
}
@@ -1378,7 +1377,7 @@ get_identifier_completion :: proc(
}
if score, ok := common.fuzzy_match(matcher, keyword); ok == 1 {
- append(list, CompletionResult{score = score, symbol = symbol})
+ append(results, CompletionResult{score = score, symbol = symbol})
}
}
@@ -1389,7 +1388,7 @@ get_identifier_completion :: proc(
}
if score, ok := common.fuzzy_match(matcher, keyword); ok == 1 {
- append(list, CompletionResult{score = score * 1.1, symbol = symbol})
+ append(results, CompletionResult{score = score * 1.1, symbol = symbol})
}
}
@@ -1399,7 +1398,7 @@ get_identifier_completion :: proc(
symbol := Symbol {
name = k,
}
- append(list, CompletionResult{score = score * 1.1, snippet = v, symbol = symbol})
+ append(results, CompletionResult{score = score * 1.1, snippet = v, symbol = symbol})
}
}
}
@@ -1713,6 +1712,7 @@ append_non_imported_packages :: proc(
position_context: ^DocumentPositionContext,
items: ^[dynamic]CompletionItem,
) {
+ // Keep these as is for now with the completion items as they are a special case
if !common.config.enable_auto_import {
return
}
@@ -1765,7 +1765,7 @@ append_non_imported_packages :: proc(
append_magic_map_completion :: proc(
position_context: ^DocumentPositionContext,
symbol: Symbol,
- items: ^[dynamic]CompletionItem,
+ results: ^[dynamic]CompletionResult,
) {
range, ok := get_range_from_selection_start_to_dot(position_context)
@@ -1780,7 +1780,7 @@ append_magic_map_completion :: proc(
kind = .Field,
detail = fmt.tprintf("%v.%v: %v", "Raw_Map", "allocator", "runtime.Allocator"),
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
remove_range := common.Range {
@@ -1818,7 +1818,7 @@ append_magic_map_completion :: proc(
InsertTextMode = .adjustIndentation,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
//len
@@ -1833,7 +1833,7 @@ append_magic_map_completion :: proc(
additionalTextEdits = additionalTextEdits,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
//cap
@@ -1848,7 +1848,7 @@ append_magic_map_completion :: proc(
additionalTextEdits = additionalTextEdits,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
prefix := "&"
@@ -1873,7 +1873,7 @@ append_magic_map_completion :: proc(
additionalTextEdits = additionalTextEdits,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
map_builtins_with_args := []string{"delete_key", "reserve", "map_insert", "map_upsert", "map_entry"}
@@ -1892,9 +1892,10 @@ append_magic_map_completion :: proc(
InsertTextMode = .adjustIndentation,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
}
+
get_expression_string_from_position_context :: proc(position_context: ^DocumentPositionContext) -> string {
src := position_context.file.src
if position_context.call != nil {
@@ -1920,7 +1921,7 @@ get_expression_string_from_position_context :: proc(position_context: ^DocumentP
append_magic_array_like_completion :: proc(
position_context: ^DocumentPositionContext,
symbol: Symbol,
- items: ^[dynamic]CompletionItem,
+ results: ^[dynamic]CompletionResult,
) {
range, ok := get_range_from_selection_start_to_dot(position_context)
@@ -1960,7 +1961,7 @@ append_magic_array_like_completion :: proc(
additionalTextEdits = additionalTextEdits,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
//for
@@ -1978,7 +1979,7 @@ append_magic_array_like_completion :: proc(
InsertTextMode = .adjustIndentation,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
// This proc is shared between slices and dynamic arrays.
@@ -1998,7 +1999,7 @@ append_magic_array_like_completion :: proc(
additionalTextEdits = additionalTextEdits,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
// allocator
@@ -2008,7 +2009,7 @@ append_magic_array_like_completion :: proc(
kind = .Field,
detail = fmt.tprintf("%v.%v: %v", "Raw_Dynamic_Array", "allocator", "runtime.Allocator"),
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
prefix := "&"
@@ -2033,7 +2034,7 @@ append_magic_array_like_completion :: proc(
additionalTextEdits = additionalTextEdits,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
dynamic_array_builtins := []string {
@@ -2065,14 +2066,14 @@ append_magic_array_like_completion :: proc(
InsertTextMode = .adjustIndentation,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
}
append_magic_union_completion :: proc(
position_context: ^DocumentPositionContext,
symbol: Symbol,
- items: ^[dynamic]CompletionItem,
+ items: ^[dynamic]CompletionResult,
) {
range, ok := get_range_from_selection_start_to_dot(position_context)
@@ -2108,7 +2109,7 @@ append_magic_union_completion :: proc(
InsertTextMode = .adjustIndentation,
}
- append(items, item)
+ append(items, CompletionResult{completion_item = item})
}
}
diff --git a/src/server/methods.odin b/src/server/methods.odin
index 4b8e74e..bcd96c0 100644
--- a/src/server/methods.odin
+++ b/src/server/methods.odin
@@ -46,7 +46,7 @@ append_method_completion :: proc(
ast_context: ^AstContext,
selector_symbol: Symbol,
position_context: ^DocumentPositionContext,
- items: ^[dynamic]CompletionItem,
+ results: ^[dynamic]CompletionResult,
receiver: string,
) {
if selector_symbol.type != .Variable && selector_symbol.type != .Struct {
@@ -125,7 +125,6 @@ append_method_completion :: proc(
} else {
new_text = fmt.tprintf("%v(%v%v%v)$0", new_text, references, receiver, dereferences)
}
- build_documentation(ast_context, &symbol)
item := CompletionItem {
label = symbol.name,
@@ -138,7 +137,7 @@ append_method_completion :: proc(
documentation = symbol.doc,
}
- append(items, item)
+ append(results, CompletionResult{completion_item = item})
}
}
}