diff options
| author | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-06-29 19:04:37 -0400 |
|---|---|---|
| committer | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-06-29 19:04:37 -0400 |
| commit | d2261ff9dad96d8afe6212f5a8c7fc3e470575ab (patch) | |
| tree | 27a4e9f27a64aff9d45ec792effbb32c05835085 /src/server | |
| parent | 386ba7d4ca2adf72800dd64f338dcc2ff4b7572d (diff) | |
Correct hover information for distinct types on fields
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/documentation.odin | 130 |
1 files changed, 64 insertions, 66 deletions
diff --git a/src/server/documentation.odin b/src/server/documentation.odin index 663d32a..386dea1 100644 --- a/src/server/documentation.odin +++ b/src/server/documentation.odin @@ -7,10 +7,6 @@ import "core:strings" get_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { - if .Distinct in symbol.flags { - return symbol.name - } - is_variable := symbol.type == .Variable pointer_prefix := repeat("^", symbol.pointers, context.temp_allocator) @@ -18,77 +14,73 @@ get_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { #partial switch v in symbol.value { case SymbolEnumValue: - builder := strings.builder_make(ast_context.allocator) + sb := strings.builder_make(ast_context.allocator) if is_variable { - append_variable_full_name(&builder, ast_context, symbol, pointer_prefix) - strings.write_string(&builder, " :: ") + append_variable_full_name(&sb, ast_context, symbol, pointer_prefix) + strings.write_string(&sb, " :: ") } - strings.write_string(&builder, "enum {\n") + strings.write_string(&sb, "enum {\n") for i in 0 ..< len(v.names) { - strings.write_string(&builder, "\t") - strings.write_string(&builder, v.names[i]) - strings.write_string(&builder, ",\n") + strings.write_string(&sb, "\t") + strings.write_string(&sb, v.names[i]) + strings.write_string(&sb, ",\n") } - strings.write_string(&builder, "}") - return strings.to_string(builder) + strings.write_string(&sb, "}") + return strings.to_string(sb) case SymbolStructValue: - builder := strings.builder_make(ast_context.allocator) + sb := strings.builder_make(ast_context.allocator) if is_variable { - append_variable_full_name(&builder, ast_context, symbol, pointer_prefix) - strings.write_string(&builder, " :: ") + append_variable_full_name(&sb, ast_context, symbol, pointer_prefix) + strings.write_string(&sb, " :: ") } else if symbol.type_name != "" { if symbol.type_pkg == "" { - fmt.sbprintf(&builder, "%s%s :: ", pointer_prefix, symbol.type_name) + fmt.sbprintf(&sb, "%s%s :: ", pointer_prefix, symbol.type_name) } else { pkg_name := get_pkg_name(ast_context, symbol.type_pkg) - fmt.sbprintf(&builder, "%s%s.%s :: ", pointer_prefix, pkg_name, symbol.type_name) + fmt.sbprintf(&sb, "%s%s.%s :: ", pointer_prefix, pkg_name, symbol.type_name) } } if len(v.names) == 0 { - strings.write_string(&builder, "struct {}") + strings.write_string(&sb, "struct {}") if symbol.comment != "" { - fmt.sbprintf(&builder, " %s", symbol.comment) + fmt.sbprintf(&sb, " %s", symbol.comment) } - return strings.to_string(builder) + return strings.to_string(sb) } - write_struct_hover(ast_context, &builder, v) - return strings.to_string(builder) + write_struct_hover(ast_context, &sb, v) + return strings.to_string(sb) case SymbolUnionValue: - builder := strings.builder_make(ast_context.allocator) + sb := strings.builder_make(ast_context.allocator) if is_variable { - append_variable_full_name(&builder, ast_context, symbol, pointer_prefix) - strings.write_string(&builder, " :: ") + append_variable_full_name(&sb, ast_context, symbol, pointer_prefix) + strings.write_string(&sb, " :: ") } - strings.write_string(&builder, "union {\n") + strings.write_string(&sb, "union {\n") for i in 0 ..< len(v.types) { - strings.write_string(&builder, "\t") - build_string_node(v.types[i], &builder, false) - strings.write_string(&builder, ",\n") + strings.write_string(&sb, "\t") + build_string_node(v.types[i], &sb, false) + strings.write_string(&sb, ",\n") } - strings.write_string(&builder, "}") - return strings.to_string(builder) + strings.write_string(&sb, "}") + return strings.to_string(sb) case SymbolAggregateValue: - builder := strings.builder_make(context.temp_allocator) - strings.write_string(&builder, "proc {\n") + sb := strings.builder_make(context.temp_allocator) + strings.write_string(&sb, "proc {\n") for symbol in v.symbols { if value, ok := symbol.value.(SymbolProcedureValue); ok { - fmt.sbprintf(&builder, "\t%s :: ", symbol.name) - write_procedure_symbol_signature(&builder, value) - strings.write_string(&builder, ",\n") + fmt.sbprintf(&sb, "\t%s :: ", symbol.name) + write_procedure_symbol_signature(&sb, value) + strings.write_string(&sb, ",\n") } } - strings.write_string(&builder, "}") - return strings.to_string(builder) + strings.write_string(&sb, "}") + return strings.to_string(sb) } return get_short_signature(ast_context, symbol) } get_short_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { - if .Distinct in symbol.flags { - return symbol.name - } - is_variable := symbol.type == .Variable pointer_prefix := repeat("^", symbol.pointers, context.temp_allocator) @@ -96,66 +88,72 @@ get_short_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string #partial switch v in symbol.value { case SymbolBasicValue: - builder := strings.builder_make(ast_context.allocator) - fmt.sbprintf(&builder, "%s%s", pointer_prefix, node_to_string(v.ident)) + sb := strings.builder_make(ast_context.allocator) + if symbol.type_name != "" { + fmt.sbprintf(&sb, "%s%s", pointer_prefix, symbol.type_name) + } else if .Distinct in symbol.flags { + fmt.sbprintf(&sb, "%s%s", pointer_prefix, symbol.name) + } else { + fmt.sbprintf(&sb, "%s%s", pointer_prefix, node_to_string(v.ident)) + } if symbol.type == .Field && symbol.comment != "" { - fmt.sbprintf(&builder, " %s", symbol.comment) + fmt.sbprintf(&sb, " %s", symbol.comment) } - return strings.to_string(builder) + return strings.to_string(sb) case SymbolBitSetValue: return strings.concatenate( a = {pointer_prefix, "bit_set[", node_to_string(v.expr), "]"}, allocator = ast_context.allocator, ) case SymbolEnumValue: - builder := strings.builder_make(ast_context.allocator) + sb := strings.builder_make(ast_context.allocator) if is_variable { - append_variable_full_name(&builder, ast_context, symbol, pointer_prefix) + append_variable_full_name(&sb, ast_context, symbol, pointer_prefix) } else { - strings.write_string(&builder, "enum") + strings.write_string(&sb, "enum") } - return strings.to_string(builder) + return strings.to_string(sb) case SymbolMapValue: return strings.concatenate( a = {pointer_prefix, "map[", node_to_string(v.key), "]", node_to_string(v.value)}, allocator = ast_context.allocator, ) case SymbolProcedureValue: - builder := strings.builder_make(context.temp_allocator) + sb := strings.builder_make(context.temp_allocator) if symbol.type_pkg != "" { pkg_name := get_pkg_name(ast_context, symbol.type_pkg) - fmt.sbprintf(&builder, "%s%s.%s :: ", pointer_prefix, pkg_name, symbol.type_name) + fmt.sbprintf(&sb, "%s%s.%s :: ", pointer_prefix, pkg_name, symbol.type_name) } - write_procedure_symbol_signature(&builder, v) - return strings.to_string(builder) + write_procedure_symbol_signature(&sb, v) + return strings.to_string(sb) case SymbolAggregateValue: return "proc" case SymbolStructValue: - builder := strings.builder_make(ast_context.allocator) + sb := strings.builder_make(ast_context.allocator) if is_variable { - append_variable_full_name(&builder, ast_context, symbol, pointer_prefix) + append_variable_full_name(&sb, ast_context, symbol, pointer_prefix) } else if symbol.type_name != "" { pkg_name := get_pkg_name(ast_context, symbol.type_pkg) if pkg_name == "" { - fmt.sbprintf(&builder, "%s%s", pointer_prefix, symbol.type_name) + fmt.sbprintf(&sb, "%s%s", pointer_prefix, symbol.type_name) } else { - fmt.sbprintf(&builder, "%s%s.%s", pointer_prefix, pkg_name, symbol.type_name) + fmt.sbprintf(&sb, "%s%s.%s", pointer_prefix, pkg_name, symbol.type_name) } } else { - strings.write_string(&builder, "struct") + strings.write_string(&sb, "struct") } if symbol.comment != "" { - fmt.sbprintf(&builder, " %s", symbol.comment) + fmt.sbprintf(&sb, " %s", symbol.comment) } - return strings.to_string(builder) + return strings.to_string(sb) case SymbolUnionValue: - builder := strings.builder_make(ast_context.allocator) + sb := strings.builder_make(ast_context.allocator) if is_variable { - append_variable_full_name(&builder, ast_context, symbol, pointer_prefix) + append_variable_full_name(&sb, ast_context, symbol, pointer_prefix) } else { - strings.write_string(&builder, "union") + strings.write_string(&sb, "union") } - return strings.to_string(builder) + return strings.to_string(sb) case SymbolBitFieldValue: if is_variable { return strings.concatenate({pointer_prefix, symbol.name}, ast_context.allocator) |