aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2024-04-18 22:48:46 +0200
committerGitHub <noreply@github.com>2024-04-18 22:48:46 +0200
commit44035ebcf7df40cd24482cef5145394945284ca0 (patch)
tree8936b49f3eb798b17b55b5050c8a211396ccd673 /src
parent545e6a2874fe96c3d6dbce294705cca2f452b449 (diff)
parentbbd6f7fc5226a2b28f7aa15211f957e85f5418f1 (diff)
Merge pull request #359 from harold-b/fake-methods-receiver
Emit proc "receiver" when using fake methods.
Diffstat (limited to 'src')
-rw-r--r--src/server/completion.odin5
-rw-r--r--src/server/methods.odin47
2 files changed, 43 insertions, 9 deletions
diff --git a/src/server/completion.odin b/src/server/completion.odin
index f917498..5cae51e 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -345,6 +345,10 @@ get_selector_completion :: proc(
}
}
+ receiver_start := position_context.selector.expr_base.pos.offset
+ receiver_end := position_context.selector.expr_base.end.offset
+ receiver := position_context.file.src[receiver_start:receiver_end]
+
if s, ok := selector.value.(SymbolProcedureValue); ok {
if len(s.return_types) == 1 {
if selector, ok = resolve_type_expression(
@@ -362,6 +366,7 @@ get_selector_completion :: proc(
selector,
position_context,
&items,
+ receiver,
)
}
diff --git a/src/server/methods.odin b/src/server/methods.odin
index 5eca99e..4b8efa8 100644
--- a/src/server/methods.odin
+++ b/src/server/methods.odin
@@ -49,11 +49,12 @@ create_remove_edit :: proc(
append_method_completion :: proc(
ast_context: ^AstContext,
- symbol: Symbol,
+ selector_symbol: Symbol,
position_context: ^DocumentPositionContext,
items: ^[dynamic]CompletionItem,
+ receiver: string,
) {
- if symbol.type != .Variable {
+ if selector_symbol.type != .Variable && selector_symbol.type != .Struct {
return
}
@@ -65,8 +66,8 @@ append_method_completion :: proc(
for k, v in indexer.index.collection.packages {
method := Method {
- name = symbol.name,
- pkg = symbol.pkg,
+ name = selector_symbol.name,
+ pkg = selector_symbol.pkg,
}
if symbols, ok := &v.methods[method]; ok {
for &symbol in symbols {
@@ -103,17 +104,27 @@ append_method_completion :: proc(
continue
}
- pointers_to_add := first_arg.pointers - symbol.pointers
+ pointers_to_add :=
+ first_arg.pointers - selector_symbol.pointers
- if pointers_to_add != 1 {
- pointers_to_add = 0
+ references := ""
+ dereferences := ""
+
+ if pointers_to_add > 0 {
+ for i in 0 ..< pointers_to_add {
+ references = fmt.tprintf("%v&", references)
+ }
+ } else if pointers_to_add < 0 {
+ for i in pointers_to_add ..< 0 {
+ dereferences = fmt.tprintf("%v^", dereferences)
+ }
}
new_text := ""
if symbol.pkg != ast_context.document_package {
new_text = fmt.tprintf(
- "%v.%v($0)",
+ "%v.%v",
path.base(
get_symbol_pkg_name(ast_context, symbol),
false,
@@ -122,7 +133,25 @@ append_method_completion :: proc(
symbol.name,
)
} else {
- new_text = fmt.tprintf("%v($0)", symbol.name)
+ new_text = fmt.tprintf("%v", symbol.name)
+ }
+
+ if len(symbol.value.(SymbolProcedureValue).arg_types) > 1 {
+ new_text = fmt.tprintf(
+ "%v(%v%v%v$0)",
+ new_text,
+ references,
+ receiver,
+ dereferences,
+ )
+ } else {
+ new_text = fmt.tprintf(
+ "%v(%v%v%v)$0",
+ new_text,
+ references,
+ receiver,
+ dereferences,
+ )
}
item := CompletionItem {