aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2025-07-07 01:39:11 +0200
committerGitHub <noreply@github.com>2025-07-07 01:39:11 +0200
commitef5257da82356caadf7e561f1684c329376191d2 (patch)
tree8051eaa922b11de60e4d82a282f139f830df223b /src/server
parent696edc2f3beb989405ef1247664d084f579174b0 (diff)
parentcd82b7cb50fe63730560291028ba5765f19a4a4f (diff)
Merge pull request #724 from BradLewis/feat/enumerated-array
Improvements to resolving enumerated arrays
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin12
-rw-r--r--src/server/completion.odin88
-rw-r--r--src/server/hover.odin2
-rw-r--r--src/server/references.odin1
-rw-r--r--src/server/rename.odin16
5 files changed, 75 insertions, 44 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 7914d2f..4573f02 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -305,6 +305,10 @@ resolve_type_comp_literal :: proc(
}
}
}
+ } else if s, ok := current_symbol.value.(SymbolFixedArrayValue); ok {
+ if symbol, ok := resolve_type_expression(ast_context, s.expr); ok {
+ return resolve_type_comp_literal(ast_context, position_context, symbol, comp_lit)
+ }
}
}
} else if comp_value, ok := elem.derived.(^ast.Comp_Lit); ok { //indexed
@@ -4016,6 +4020,14 @@ field_exists_in_comp_lit :: proc(comp_lit: ^ast.Comp_Lit, name: string) -> bool
if ident.name == name {
return true
}
+ } else if selector, ok := field.field.derived.(^ast.Implicit_Selector_Expr); ok {
+ if selector.field != nil {
+ if ident, ok := selector.field.derived.(^ast.Ident); ok {
+ if ident.name == name {
+ return true
+ }
+ }
+ }
}
}
} else if selector, ok := elem.derived.(^ast.Implicit_Selector_Expr); ok {
diff --git a/src/server/completion.odin b/src/server/completion.odin
index 53d4fb9..13a589d 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -311,6 +311,24 @@ get_comp_lit_completion :: proc(
append(&items, item)
}
}
+ case SymbolFixedArrayValue:
+ if symbol, ok := resolve_type_expression(ast_context, v.len); ok {
+ if v, ok := symbol.value.(SymbolEnumValue); ok {
+ for name, i in v.names {
+ if field_exists_in_comp_lit(position_context.comp_lit, name) {
+ continue
+ }
+
+ item := CompletionItem {
+ label = name,
+ detail = fmt.tprintf(".%s", name),
+ documentation = symbol.doc,
+ }
+
+ append(&items, item)
+ }
+ }
+ }
}
}
@@ -726,47 +744,47 @@ get_implicit_completion :: proc(
//value decl infer a : My_Enum = .*
if position_context.value_decl != nil && position_context.value_decl.type != nil {
- enum_value: Maybe(SymbolEnumValue)
- exclude_names := make([dynamic]string, context.temp_allocator)
+ if enum_value, ok := unwrap_enum(ast_context, position_context.value_decl.type); ok {
+ for name in enum_value.names {
+ if position_context.comp_lit != nil && field_exists_in_comp_lit(position_context.comp_lit, name) {
+ continue
+ }
+ item := CompletionItem {
+ label = name,
+ kind = .EnumMember,
+ detail = name,
+ }
+ append(&items, item)
+ }
- if _enum_value, ok := unwrap_enum(ast_context, position_context.value_decl.type); ok {
- enum_value = _enum_value
+ list.items = items[:]
+ return
}
if position_context.comp_lit != nil {
- if symbol, ok := resolve_type_expression(ast_context, position_context.value_decl.type); ok {
+ if symbol, ok := resolve_comp_literal(ast_context, position_context); ok {
if v, ok := symbol.value.(SymbolFixedArrayValue); ok {
- if _enum_value, ok := unwrap_enum(ast_context, v.len); ok {
- enum_value = _enum_value
- }
- }
- }
- for elem in position_context.comp_lit.elems {
- if expr, ok := elem.derived.(^ast.Implicit_Selector_Expr); ok {
- if expr.field.name != "_" {
- append(&exclude_names, expr.field.name)
- }
- }
- }
- }
+ if symbol, ok := resolve_type_expression(ast_context, v.len); ok {
+ if v, ok := symbol.value.(SymbolEnumValue); ok {
+ for name, i in v.names {
+ if field_exists_in_comp_lit(position_context.comp_lit, name) {
+ continue
+ }
- if ev, ok := enum_value.?; ok {
- for name in ev.names {
- if !slice.contains(exclude_names[:], name) {
- if position_context.comp_lit != nil && field_exists_in_comp_lit(position_context.comp_lit, name) {
- continue
- }
- item := CompletionItem {
- label = name,
- kind = .EnumMember,
- detail = name,
+ item := CompletionItem {
+ label = name,
+ detail = name,
+ documentation = symbol.doc,
+ }
+
+ append(&items, item)
+ }
+ list.items = items[:]
+ return
+ }
}
- append(&items, item)
}
}
-
- list.items = items[:]
- return
}
}
@@ -1594,7 +1612,11 @@ get_type_switch_completion :: proc(
if union_value, ok := unwrap_union(ast_context, assign.rhs[0]); ok {
for type, i in union_value.types {
if symbol, ok := resolve_type_expression(ast_context, union_value.types[i]); ok {
+
name := symbol.name
+ if _, ok := used_unions[name]; ok {
+ continue
+ }
item := CompletionItem {
kind = .EnumMember,
@@ -1602,6 +1624,7 @@ get_type_switch_completion :: proc(
if symbol.pkg == ast_context.document_package {
item.label = fmt.aprintf("%v%v", repeat("^", symbol.pointers, context.temp_allocator), name)
+ item.detail = item.label
} else {
item.label = fmt.aprintf(
"%v%v.%v",
@@ -1609,6 +1632,7 @@ get_type_switch_completion :: proc(
get_symbol_pkg_name(ast_context, symbol),
name,
)
+ item.detail = item.label
}
append(&items, item)
diff --git a/src/server/hover.odin b/src/server/hover.odin
index 7dd1e51..7ced6c1 100644
--- a/src/server/hover.odin
+++ b/src/server/hover.odin
@@ -238,7 +238,6 @@ get_hover_information :: proc(document: ^Document, position: common.Position) ->
} else if v, ok := comp_symbol.value.(SymbolBitFieldValue); ok {
for name, i in v.names {
if name == field.name {
- log.info("here?")
if symbol, ok := resolve_type_expression(&ast_context, v.types[i]); ok {
symbol.name = name
symbol.pkg = comp_symbol.name
@@ -414,7 +413,6 @@ get_hover_information :: proc(document: ^Document, position: common.Position) ->
}
}
}
-
}
}
return {}, false, true
diff --git a/src/server/references.odin b/src/server/references.odin
index fed58bd..5f189ef 100644
--- a/src/server/references.odin
+++ b/src/server/references.odin
@@ -330,7 +330,6 @@ resolve_references :: proc(
if _, ok := v.node.derived.(^ast.Implicit_Selector_Expr); ok {
range.start.character += 1
}
-
location := common.Location {
range = range,
uri = strings.clone(node_uri.uri, ast_context.allocator),
diff --git a/src/server/rename.odin b/src/server/rename.odin
index 95d53a5..30c8296 100644
--- a/src/server/rename.odin
+++ b/src/server/rename.odin
@@ -186,6 +186,13 @@ prepare_rename :: proc(
return
}
+ } else if position_context.implicit {
+ range := common.get_token_range(position_context.implicit_selector_expr, ast_context.file.src)
+ // Skip the `.`
+ range.start.character += 1
+ symbol = Symbol{
+ range = range,
+ }
} else if position_context.field_value != nil &&
position_context.comp_lit != nil &&
!is_expr_basic_lit(position_context.field_value.field) &&
@@ -208,16 +215,7 @@ prepare_rename :: proc(
if selector, ok := position_context.selector_expr.derived.(^ast.Selector_Expr); ok {
symbol.range = common.get_token_range(selector.field.expr_base, ast_context.file.src)
}
-
}
- } else if position_context.implicit {
- range := common.get_token_range(position_context.implicit_selector_expr, ast_context.file.src)
- // Skip the `.`
- range.start.character += 1
- symbol = Symbol{
- range = range,
- }
-
} else if position_context.identifier != nil {
ident := position_context.identifier.derived.(^ast.Ident)