aboutsummaryrefslogtreecommitdiff
path: root/src/server/documentation.odin
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/documentation.odin')
-rw-r--r--src/server/documentation.odin108
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,