diff options
Diffstat (limited to 'src/server/documentation.odin')
| -rw-r--r-- | src/server/documentation.odin | 108 |
1 files changed, 85 insertions, 23 deletions
diff --git a/src/server/documentation.odin b/src/server/documentation.odin index b52d259..b86147f 100644 --- a/src/server/documentation.odin +++ b/src/server/documentation.odin @@ -2,6 +2,7 @@ package server import "core:fmt" import "core:log" +import "core:odin/ast" import path "core:path/slashpath" import "core:strings" @@ -9,8 +10,7 @@ import "core:strings" get_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { is_variable := symbol.type == .Variable - pointer_prefix := repeat("^", symbol.pointers, context.temp_allocator) - + pointer_prefix := repeat("^", symbol.pointers, ast_context.allocator) #partial switch v in symbol.value { case SymbolEnumValue: @@ -19,6 +19,13 @@ get_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { append_variable_full_name(&sb, ast_context, symbol, pointer_prefix) strings.write_string(&sb, " :: ") } + if len(v.names) == 0 { + strings.write_string(&sb, "enum {}") + if symbol.comment != "" { + fmt.sbprintf(&sb, " %s", symbol.comment) + } + return strings.to_string(sb) + } longestNameLen := 0 for name in v.names { @@ -71,6 +78,10 @@ get_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { append_variable_full_name(&sb, ast_context, symbol, pointer_prefix) strings.write_string(&sb, " :: ") } + if len(v.types) == 0 { + strings.write_string(&sb, "union {}") + return strings.to_string(sb) + } strings.write_string(&sb, "union {\n") for i in 0 ..< len(v.types) { strings.write_string(&sb, "\t") @@ -80,7 +91,7 @@ get_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { strings.write_string(&sb, "}") return strings.to_string(sb) case SymbolAggregateValue: - sb := strings.builder_make(context.temp_allocator) + sb := strings.builder_make(ast_context.allocator) strings.write_string(&sb, "proc {\n") for symbol in v.symbols { if value, ok := symbol.value.(SymbolProcedureValue); ok { @@ -91,6 +102,53 @@ get_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { } strings.write_string(&sb, "}") return strings.to_string(sb) + case SymbolBitFieldValue: + sb := strings.builder_make(ast_context.allocator) + if is_variable { + 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(&sb, "%s%s :: ", pointer_prefix, symbol.type_name) + } else { + pkg_name := get_pkg_name(ast_context, symbol.type_pkg) + fmt.sbprintf(&sb, "%s%s.%s :: ", pointer_prefix, pkg_name, symbol.type_name) + } + } + strings.write_string(&sb, "bit_field ") + build_string_node(v.backing_type, &sb, false) + if len(v.names) == 0 { + strings.write_string(&sb, " {}") + return strings.to_string(sb) + } + strings.write_string(&sb, " {\n") + longest_name_len := 0 + for name in v.names { + if len(name) > longest_name_len { + longest_name_len = len(name) + } + } + longest_type_len := 0 + type_names := make([dynamic]string, 0, len(v.types), ast_context.allocator) + for t in v.types { + type_name := node_to_string(t) + append(&type_names, type_name) + if len(type_name) > longest_type_len { + longest_type_len = len(type_name) + } + } + + for name, i in v.names { + append_docs(&sb, v.docs, i) + fmt.sbprintf(&sb, "\t%s:%*s", v.names[i], longest_name_len - len(name) + 1, "") + fmt.sbprintf(&sb, "%s%*s| ", type_names[i], longest_type_len - len(type_names[i]) + 1, "") + build_string_node(v.bit_sizes[i], &sb, false) + strings.write_string(&sb, ",") + append_comments(&sb, v.comments, i) + strings.write_string(&sb, "\n") + } + strings.write_string(&sb, "}") + return strings.to_string(sb) } return get_short_signature(ast_context, symbol) @@ -99,7 +157,7 @@ get_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { get_short_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string { is_variable := symbol.type == .Variable - pointer_prefix := repeat("^", symbol.pointers, context.temp_allocator) + pointer_prefix := repeat("^", symbol.pointers, ast_context.allocator) #partial switch v in symbol.value { case SymbolBasicValue: sb := strings.builder_make(ast_context.allocator) @@ -139,7 +197,7 @@ get_short_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string allocator = ast_context.allocator, ) case SymbolProcedureValue: - sb := strings.builder_make(context.temp_allocator) + sb := strings.builder_make(ast_context.allocator) if symbol.type_pkg != "" && symbol.type_name != "" { pkg_name := get_pkg_name(ast_context, symbol.type_pkg) fmt.sbprintf(&sb, "%s%s.%s :: ", pointer_prefix, pkg_name, symbol.type_name) @@ -227,8 +285,8 @@ get_short_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string return "" } -get_enum_field_signature :: proc(value: SymbolEnumValue, index: int) -> string { - sb := strings.builder_make(context.temp_allocator) +get_enum_field_signature :: proc(value: SymbolEnumValue, index: int, allocator := context.temp_allocator) -> string { + sb := strings.builder_make(allocator) fmt.sbprintf(&sb, ".%s", value.names[index]) if index < len(value.values) && value.values[index] != nil { strings.write_string(&sb, " = ") @@ -342,12 +400,7 @@ write_struct_hover :: proc(ast_context: ^AstContext, sb: ^strings.Builder, v: Sy 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) - } - } - + append_docs(sb, v.docs, i) strings.write_string(sb, "\t") name_len := len(v.names[i]) @@ -355,18 +408,11 @@ write_struct_hover :: proc(ast_context: ^AstContext, sb: ^strings.Builder, v: Sy 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, "") + fmt.sbprintf(sb, "%s:%*s", v.names[i], 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") - } + append_comments(sb, v.comments, i) + strings.write_string(sb, "\n") } strings.write_string(sb, "}") } @@ -386,6 +432,22 @@ append_variable_full_name :: proc( return } +append_docs :: proc(sb: ^strings.Builder, docs: []^ast.Comment_Group, index: int) { + if index < len(docs) && docs[index] != nil { + for c in docs[index].list { + fmt.sbprintf(sb, "\t%s\n", c.text) + } + } +} + +append_comments :: proc(sb: ^strings.Builder, comments: []^ast.Comment_Group, index: int) { + if index < len(comments) && comments[index] != nil { + for c in comments[index].list { + fmt.sbprintf(sb, " %s", c.text) + } + } +} + concatenate_symbol_information :: proc { concatenate_raw_symbol_information, concatenate_raw_string_information, |