feat(completion): forward completion entries to current editor

This commit is contained in:
CJ van den Berg 2025-05-26 22:42:39 +02:00
parent f59125f74a
commit 8934bf5cd0
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9
4 changed files with 77 additions and 22 deletions

View file

@ -1030,28 +1030,30 @@ fn send_completion_item(to: tp.pid_ref, file_path: []const u8, row: usize, col:
const insert = textEdit_insert orelse return error.InvalidMessageField;
const replace = textEdit_replace orelse return error.InvalidMessageField;
return to.send(.{
"completion_item",
file_path,
row,
col,
is_incomplete,
label,
label_detail,
label_description,
kind,
detail,
documentation,
sortText,
insertTextFormat,
textEdit_newText,
insert.start.line,
insert.start.character,
insert.end.line,
insert.end.character,
replace.start.line,
replace.start.character,
replace.end.line,
replace.end.character,
"cmd", "add_completion", .{
file_path,
row,
col,
is_incomplete,
label,
label_detail,
label_description,
kind,
detail,
documentation,
documentation_kind,
sortText,
insertTextFormat,
textEdit_newText,
insert.start.line,
insert.start.character,
insert.end.line,
insert.end.character,
replace.start.line,
replace.start.character,
replace.end.line,
replace.end.character,
},
}) catch error.ClientFailed;
}

View file

@ -39,6 +39,7 @@ pub const ArgumentType = enum {
string,
integer,
float,
boolean,
object,
array,
};

View file

@ -5476,6 +5476,14 @@ pub const Editor = struct {
self.need_render();
}
pub fn add_completion(self: *Self, row: usize, col: usize, is_incomplete: bool, msg: tp.message) Result {
_ = self;
_ = row;
_ = col;
_ = is_incomplete;
_ = msg;
}
pub fn select(self: *Self, ctx: Context) Result {
var sel: Selection = .{};
if (!try ctx.args.match(.{ tp.extract(&sel.begin.row), tp.extract(&sel.begin.col), tp.extract(&sel.end.row), tp.extract(&sel.end.col) }))

View file

@ -726,6 +726,50 @@ const cmds = struct {
}
pub const add_diagnostic_meta: Meta = .{ .arguments = &.{ .string, .string, .string, .string, .integer, .integer, .integer, .integer, .integer } };
pub fn add_completion(self: *Self, ctx: Ctx) Result {
var file_path: []const u8 = undefined;
var row: usize = undefined;
var col: usize = undefined;
var is_incomplete: bool = undefined;
if (!try ctx.args.match(.{
tp.extract(&file_path),
tp.extract(&row),
tp.extract(&col),
tp.extract(&is_incomplete),
tp.more,
})) return error.InvalidAddDiagnosticArgument;
file_path = project_manager.normalize_file_path(file_path);
if (self.get_active_editor()) |editor| if (std.mem.eql(u8, file_path, editor.file_path orelse ""))
try editor.add_completion(row, col, is_incomplete, ctx.args);
}
pub const add_completion_meta: Meta = .{
.arguments = &.{
.string, // file_path
.integer, // row
.integer, // col
.boolean, // is_incomplete
.string, // label
.string, // label_detail
.string, // label_description
.integer, // kind
.string, // detail
.string, // documentation
.string, // documentation_kind
.string, // sortText
.integer, // insertTextFormat
.string, // textEdit_newText
.integer, // insert.begin.row
.integer, // insert.begin.col
.integer, // insert.end.row
.integer, // insert.end.col
.integer, // replace.begin.row
.integer, // replace.begin.col
.integer, // replace.end.row
.integer, // replace.end.col
},
};
pub fn rename_symbol_item(self: *Self, ctx: Ctx) Result {
const editor = self.get_active_editor() orelse return;
// because the incoming message is an array of Renames, we manuallly