diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2025-07-07 01:39:11 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-07 01:39:11 +0200 |
| commit | ef5257da82356caadf7e561f1684c329376191d2 (patch) | |
| tree | 8051eaa922b11de60e4d82a282f139f830df223b /src/server | |
| parent | 696edc2f3beb989405ef1247664d084f579174b0 (diff) | |
| parent | cd82b7cb50fe63730560291028ba5765f19a4a4f (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.odin | 12 | ||||
| -rw-r--r-- | src/server/completion.odin | 88 | ||||
| -rw-r--r-- | src/server/hover.odin | 2 | ||||
| -rw-r--r-- | src/server/references.odin | 1 | ||||
| -rw-r--r-- | src/server/rename.odin | 16 |
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) |