aboutsummaryrefslogtreecommitdiff
path: root/src/server/analysis.odin
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/analysis.odin')
-rw-r--r--src/server/analysis.odin27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 7170935..597c2cd 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -1842,8 +1842,11 @@ resolve_implicit_selector :: proc(
}
}
- if array, ok := symbol.value.(SymbolFixedArrayValue); ok {
- return resolve_type_expression(ast_context, array.len)
+ #partial switch value in symbol.value {
+ case SymbolFixedArrayValue:
+ return resolve_type_expression(ast_context, value.len)
+ case SymbolMapValue:
+ return resolve_type_expression(ast_context, value.key)
}
}
@@ -2754,33 +2757,37 @@ make_symbol_enum_from_ast :: proc(
names := make([dynamic]string, ast_context.allocator)
ranges := make([dynamic]common.Range, ast_context.allocator)
+ values := make([dynamic]^ast.Expr, ast_context.allocator)
for n in v.fields {
- name, range := get_enum_field_name_and_range(n, ast_context.file.src)
+ name, range, value := get_enum_field_name_range_value(n, ast_context.file.src)
append(&names, name)
append(&ranges, range)
+ append(&values, value)
}
symbol.value = SymbolEnumValue {
- names = names[:],
- ranges = ranges[:],
+ names = names[:],
+ ranges = ranges[:],
+ base_type = v.base_type,
+ values = values[:],
}
return symbol
}
-get_enum_field_name_and_range :: proc(n: ^ast.Expr, document_text: string) -> (string, common.Range) {
+get_enum_field_name_range_value :: proc(n: ^ast.Expr, document_text: string) -> (string, common.Range, ^ast.Expr) {
if ident, ok := n.derived.(^ast.Ident); ok {
- return ident.name, common.get_token_range(ident, document_text)
+ return ident.name, common.get_token_range(ident, document_text), nil
}
if field, ok := n.derived.(^ast.Field_Value); ok {
if ident, ok := field.field.derived.(^ast.Ident); ok {
- return ident.name, common.get_token_range(ident, document_text)
+ return ident.name, common.get_token_range(ident, document_text), field.value
} else if binary, ok := field.field.derived.(^ast.Binary_Expr); ok {
- return binary.left.derived.(^ast.Ident).name, common.get_token_range(binary, document_text)
+ return binary.left.derived.(^ast.Ident).name, common.get_token_range(binary, document_text), binary.right
}
}
- return "", {}
+ return "", {}, nil
}
make_symbol_bitset_from_ast :: proc(