aboutsummaryrefslogtreecommitdiff
path: root/src/server/analysis.odin
diff options
context:
space:
mode:
authorBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-06-25 21:23:29 -0400
committerBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-06-27 20:10:21 -0400
commit747bd0539895fdf2ef9f47ba35238e86f3021fcc (patch)
treeaed05bd361f2db6f9186ab0eec47db4e9e09d4b5 /src/server/analysis.odin
parent4eae668a145df223c6cfc7b8929cdd49d436756d (diff)
Consolidate documentation writing code into new file and base it around symbols
Diffstat (limited to 'src/server/analysis.odin')
-rw-r--r--src/server/analysis.odin298
1 files changed, 0 insertions, 298 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index b43dce7..3798adc 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -3753,53 +3753,6 @@ clear_locals :: proc(ast_context: ^AstContext) {
clear(&ast_context.usings)
}
-concatenate_symbol_information :: proc {
- concatenate_raw_symbol_information,
- concatenate_raw_string_information,
-}
-
-concatenate_raw_symbol_information :: proc(ast_context: ^AstContext, symbol: Symbol, is_completion: bool) -> string {
- return concatenate_raw_string_information(
- ast_context,
- symbol.pkg,
- symbol.name,
- symbol.signature,
- symbol.type,
- symbol.comment,
- is_completion,
- )
-}
-
-concatenate_raw_string_information :: proc(
- ast_context: ^AstContext,
- pkg: string,
- name: string,
- signature: string,
- type: SymbolType,
- comment: string,
- is_completion: bool,
-) -> string {
- pkg := path.base(pkg, false, context.temp_allocator)
-
- if type == .Package {
- return fmt.tprintf("%v: package", name)
- } else if type == .Keyword && is_completion {
- return name
- } else if type == .Function {
- if comment != "" {
- return fmt.tprintf("%v\n%v.%v: %v", comment, pkg, name, signature)
- }
- return fmt.tprintf("%v.%v: %v", pkg, name, signature)
-
- } else {
- if signature != "" {
- return fmt.tprintf("%v.%v: %v", pkg, name, signature)
- } else {
- return fmt.tprintf("%v.%v", pkg, name)
- }
- }
-}
-
unwrap_procedure_until_struct_bit_field_or_package :: proc(
ast_context: ^AstContext,
node: ^ast.Expr,
@@ -3925,257 +3878,6 @@ unwrap_bitset :: proc(ast_context: ^AstContext, bitset_symbol: Symbol) -> (Symbo
return {}, false
}
-append_variable_full_name :: proc(
- sb: ^strings.Builder,
- ast_context: ^AstContext,
- symbol: Symbol,
- pointer_prefix: string,
-) {
- pkg_name := get_symbol_pkg_name(ast_context, symbol)
- if pkg_name == "" {
- fmt.sbprintf(sb, "%s%s :: ", pointer_prefix, symbol.name)
- return
- }
- fmt.sbprintf(sb, "%s%s.%s :: ", pointer_prefix, pkg_name, symbol.name)
- return
-}
-
-make_comment_map :: proc(groups: []^ast.Comment_Group, allocator: mem.Allocator) -> map[int]^ast.Comment_Group {
- comment_map := make(map[int]^ast.Comment_Group, allocator = allocator)
-
- for cg in groups {
- comment_map[cg.pos.line] = cg
- }
-
- return comment_map
-}
-
-get_signature :: proc(
- ast_context: ^AstContext,
- symbol: Symbol,
- was_variable := false,
- short_signature := false,
-) -> string {
- if symbol.type == .Function {
- return symbol.signature
- }
-
- if .Distinct in symbol.flags {
- return symbol.name
- }
-
- is_variable := symbol.type == .Variable
- is_field := symbol.type == .Field
-
- pointer_prefix := repeat("^", symbol.pointers, context.temp_allocator)
-
-
- #partial switch v in symbol.value {
- case SymbolBasicValue:
- return strings.concatenate({pointer_prefix, node_to_string(v.ident)}, ast_context.allocator)
- case SymbolBitSetValue:
- return strings.concatenate(
- a = {pointer_prefix, "bit_set[", node_to_string(v.expr), "]"},
- allocator = ast_context.allocator,
- )
- case SymbolEnumValue:
- if short_signature {
- builder := strings.builder_make(ast_context.allocator)
- if is_variable {
- append_variable_full_name(&builder, ast_context, symbol, pointer_prefix)
- }
- strings.write_string(&builder, "enum")
- return strings.to_string(builder)
- }
- builder := strings.builder_make(ast_context.allocator)
- if is_variable {
- append_variable_full_name(&builder, ast_context, symbol, pointer_prefix)
- }
- strings.write_string(&builder, "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(&builder, "}")
- return strings.to_string(builder)
- 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:
- return "proc"
- case SymbolStructValue:
- if short_signature {
- builder := strings.builder_make(ast_context.allocator)
- if is_variable {
- append_variable_full_name(&builder, ast_context, symbol, pointer_prefix)
- }
- strings.write_string(&builder, "struct")
- return strings.to_string(builder)
- }
- builder := strings.builder_make(ast_context.allocator)
- if is_variable {
- append_variable_full_name(&builder, ast_context, symbol, pointer_prefix)
- } else if is_field {
- pkg_name := get_pkg_name(ast_context, symbol.type_pkg)
- if pkg_name == "" {
- fmt.sbprintf(&builder, "%s%s", pointer_prefix, symbol.type_name)
- } else {
- fmt.sbprintf(&builder, "%s%s.%s", pointer_prefix, pkg_name, symbol.type_name)
- }
- if symbol.comment != "" {
- fmt.sbprintf(&builder, " %s", symbol.comment)
- }
- return strings.to_string(builder)
- } else if symbol.type_name != "" {
- if symbol.type_pkg == "" {
- fmt.sbprintf(&builder, "%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)
- }
- }
- if len(v.names) == 0 {
- strings.write_string(&builder, "struct {}")
- return strings.to_string(builder)
- }
- write_struct_hover(ast_context, &builder, v)
- return strings.to_string(builder)
- case SymbolUnionValue:
- if short_signature {
- builder := strings.builder_make(ast_context.allocator)
- if is_variable {
- append_variable_full_name(&builder, ast_context, symbol, pointer_prefix)
- }
- strings.write_string(&builder, "union")
- return strings.to_string(builder)
- }
- builder := strings.builder_make(ast_context.allocator)
- if is_variable {
- append_variable_full_name(&builder, ast_context, symbol, pointer_prefix)
- }
- strings.write_string(&builder, "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(&builder, "}")
- return strings.to_string(builder)
- case SymbolBitFieldValue:
- if is_variable {
- return strings.concatenate({pointer_prefix, symbol.name}, ast_context.allocator)
- } else {
- return "bit_field"
- }
- case SymbolMultiPointerValue:
- return strings.concatenate(
- a = {pointer_prefix, "[^]", node_to_string(v.expr)},
- allocator = ast_context.allocator,
- )
- case SymbolDynamicArrayValue:
- return strings.concatenate(
- a = {pointer_prefix, "[dynamic]", node_to_string(v.expr)},
- allocator = ast_context.allocator,
- )
- case SymbolSliceValue:
- return strings.concatenate(
- a = {pointer_prefix, "[]", node_to_string(v.expr)},
- allocator = ast_context.allocator,
- )
- case SymbolFixedArrayValue:
- return strings.concatenate(
- a = {pointer_prefix, "[", node_to_string(v.len), "]", node_to_string(v.expr)},
- allocator = ast_context.allocator,
- )
- case SymbolMatrixValue:
- return strings.concatenate(
- a = {
- pointer_prefix,
- "matrix",
- "[",
- node_to_string(v.x),
- ",",
- node_to_string(v.y),
- "]",
- node_to_string(v.expr),
- },
- allocator = ast_context.allocator,
- )
- case SymbolPackageValue:
- return "package"
- case SymbolUntypedValue:
- switch v.type {
- case .Float:
- return "float"
- case .String:
- return "string"
- case .Bool:
- return "bool"
- case .Integer:
- return "int"
- }
- }
-
- return ""
-}
-
-write_struct_hover :: proc(ast_context: ^AstContext, sb: ^strings.Builder, v: SymbolStructValue) {
- using_prefix := "using "
- longestNameLen := 0
- for name, i in v.names {
- l := len(name)
- if _, ok := v.usings[i]; ok {
- l += len(using_prefix)
- }
- if l > longestNameLen {
- longestNameLen = len(name)
- }
- }
-
- using_index := -1
-
- strings.write_string(sb, "struct {\n")
- for i in 0 ..< len(v.names) {
- if i < len(v.from_usings) {
- if index := v.from_usings[i]; index != using_index {
- fmt.sbprintf(sb, "\n\t// from `using %s: ", v.names[index])
- build_string_node(v.types[index], sb, false)
- strings.write_string(sb, "`\n")
- using_index = index
- }
- }
- if i < len(v.docs) && v.docs[i] != nil {
- for c in v.docs[i].list {
- fmt.sbprintf(sb, "\t%s\n", c.text)
- }
- }
-
- strings.write_string(sb, "\t")
-
- name_len := len(v.names[i])
- if _, ok := v.usings[i]; ok {
- strings.write_string(sb, using_prefix)
- name_len += len(using_prefix)
- }
- strings.write_string(sb, v.names[i])
- fmt.sbprintf(sb, ":%*s", longestNameLen - name_len + 1, "")
- build_string_node(v.types[i], sb, false)
- strings.write_string(sb, ",")
-
- if i < len(v.comments) && v.comments[i] != nil {
- for c in v.comments[i].list {
- fmt.sbprintf(sb, " %s\n", c.text)
- }
- } else {
- strings.write_string(sb, "\n")
- }
- }
- strings.write_string(sb, "}")
-}
-
position_in_proc_decl :: proc(position_context: ^DocumentPositionContext) -> bool {
if position_context.value_decl == nil {
return false