aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-06-08 22:02:43 -0400
committerBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-06-10 15:14:59 -0400
commit772c41211fe5051c405831e4992eaab54ed4ac7c (patch)
tree8bde26f9d59bfdb495544f763cc2a1ab55609250 /src/server
parent2c4c80e9f2d3c13c1b38c7266f89045aafd3bf32 (diff)
Enrich hover for proc group definitions by providing the definitions for the grouped procedures
Diffstat (limited to 'src/server')
-rw-r--r--src/server/hover.odin2
-rw-r--r--src/server/signature.odin70
2 files changed, 45 insertions, 27 deletions
diff --git a/src/server/hover.odin b/src/server/hover.odin
index 17cb07b..3c602c1 100644
--- a/src/server/hover.odin
+++ b/src/server/hover.odin
@@ -34,7 +34,7 @@ write_hover_content :: proc(ast_context: ^AstContext, symbol: Symbol) -> MarkupC
}
}
- build_procedure_symbol_signature(&symbol)
+ build_procedure_symbol_signature(&symbol, false)
cat := concatenate_symbol_information(ast_context, symbol, false)
diff --git a/src/server/signature.odin b/src/server/signature.odin
index 5dd910b..da4c6ce 100644
--- a/src/server/signature.odin
+++ b/src/server/signature.odin
@@ -49,43 +49,61 @@ ParameterInformation :: struct {
/*
Lazily build the signature and returns from ast.Nodes
*/
-build_procedure_symbol_signature :: proc(symbol: ^Symbol) {
+build_procedure_symbol_signature :: proc(symbol: ^Symbol, short_signature := true) {
if value, ok := symbol.value.(SymbolProcedureValue); ok {
builder := strings.builder_make(context.temp_allocator)
+ write_procedure_symbol_signature(&builder, &value)
+ symbol.signature = strings.to_string(builder)
+ } else if value, ok := symbol.value.(SymbolAggregateValue); ok {
+ if short_signature {
+ symbol.signature = "proc"
+ return
+ }
- strings.write_string(&builder, "proc")
- strings.write_string(&builder, "(")
- for arg, i in value.orig_arg_types {
- strings.write_string(&builder, common.node_to_string(arg))
- if i != len(value.orig_arg_types) - 1 {
- strings.write_string(&builder, ", ")
+ builder := strings.builder_make(context.temp_allocator)
+ strings.write_string(&builder, "proc {\n")
+ for symbol in value.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")
}
}
- strings.write_string(&builder, ")")
+ strings.write_string(&builder, "}")
+ symbol.signature = strings.to_string(builder)
+ }
+}
+
+write_procedure_symbol_signature :: proc(sb: ^strings.Builder, value: ^SymbolProcedureValue) {
+ strings.write_string(sb, "proc")
+ strings.write_string(sb, "(")
+ for arg, i in value.orig_arg_types {
+ strings.write_string(sb, common.node_to_string(arg))
+ if i != len(value.orig_arg_types) - 1 {
+ strings.write_string(sb, ", ")
+ }
+ }
+ strings.write_string(sb, ")")
- if len(value.orig_return_types) != 0 {
- strings.write_string(&builder, " -> ")
+ if len(value.orig_return_types) != 0 {
+ strings.write_string(sb, " -> ")
- if len(value.orig_return_types) > 1 {
- strings.write_string(&builder, "(")
- }
+ if len(value.orig_return_types) > 1 {
+ strings.write_string(sb, "(")
+ }
- for arg, i in value.orig_return_types {
- strings.write_string(&builder, common.node_to_string(arg))
- if i != len(value.orig_return_types) - 1 {
- strings.write_string(&builder, ", ")
- }
+ for arg, i in value.orig_return_types {
+ strings.write_string(sb, common.node_to_string(arg))
+ if i != len(value.orig_return_types) - 1 {
+ strings.write_string(sb, ", ")
}
+ }
- if len(value.orig_return_types) > 1 {
- strings.write_string(&builder, ")")
- }
- } else if value.diverging {
- strings.write_string(&builder, " -> !")
+ if len(value.orig_return_types) > 1 {
+ strings.write_string(sb, ")")
}
- symbol.signature = strings.to_string(builder)
- } else if value, ok := symbol.value.(SymbolAggregateValue); ok {
- symbol.signature = "proc"
+ } else if value.diverging {
+ strings.write_string(sb, " -> !")
}
}