Fixed documentPositionIndex, added tests
This commit is contained in:
parent
b3006745a0
commit
e54a6d2522
@ -149,7 +149,7 @@ pub const TextDocument = struct {
|
|||||||
|
|
||||||
var index = @intCast(i64, split_iterator.index.?) + position.character;
|
var index = @intCast(i64, split_iterator.index.?) + position.character;
|
||||||
|
|
||||||
if (index < 0 or index >= @intCast(i64, self.text.len)) {
|
if (index < 0 or index > @intCast(i64, self.text.len)) {
|
||||||
return error.InvalidParams;
|
return error.InvalidParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,12 +13,12 @@ const initialized_message = \\{"jsonrpc":"2.0","method":"initialized","params":{
|
|||||||
const shutdown_message = \\{"jsonrpc":"2.0", "id":"STDWN", "method":"shutdown","params":{}}
|
const shutdown_message = \\{"jsonrpc":"2.0", "id":"STDWN", "method":"shutdown","params":{}}
|
||||||
;
|
;
|
||||||
|
|
||||||
fn sendRequest(req: []const u8, process: var) !void {
|
fn sendRequest(req: []const u8, process: *std.ChildProcess) !void {
|
||||||
try process.stdin.?.writer().print("Content-Length: {}\r\n\r\n", .{req.len});
|
try process.stdin.?.writer().print("Content-Length: {}\r\n\r\n", .{req.len});
|
||||||
try process.stdin.?.writeAll(req);
|
try process.stdin.?.writeAll(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn readResponses(process: var) !void {
|
fn readResponses(process: *std.ChildProcess) !void {
|
||||||
while (true) {
|
while (true) {
|
||||||
const header = headerPkg.readRequestHeader(allocator, process.stdout.?.reader()) catch |err| {
|
const header = headerPkg.readRequestHeader(allocator, process.stdout.?.reader()) catch |err| {
|
||||||
switch(err) {
|
switch(err) {
|
||||||
@ -36,9 +36,8 @@ fn readResponses(process: var) !void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
test "Open file, ask for semantic tokens" {
|
fn startZls() !*std.ChildProcess {
|
||||||
var process = try std.ChildProcess.init(&[_][]const u8{ "zig-cache/bin/zls" ++ suffix }, allocator);
|
var process = try std.ChildProcess.init(&[_][]const u8{ "zig-cache/bin/zls" ++ suffix }, allocator);
|
||||||
defer process.deinit();
|
|
||||||
process.stdin_behavior = .Pipe;
|
process.stdin_behavior = .Pipe;
|
||||||
process.stdout_behavior = .Pipe;
|
process.stdout_behavior = .Pipe;
|
||||||
process.stderr_behavior = std.ChildProcess.StdIo.Inherit;
|
process.stderr_behavior = std.ChildProcess.StdIo.Inherit;
|
||||||
@ -48,6 +47,30 @@ test "Open file, ask for semantic tokens" {
|
|||||||
return err;
|
return err;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return process;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn waitNoError(process: *std.ChildProcess) !void {
|
||||||
|
const result = try process.wait();
|
||||||
|
switch (result) {
|
||||||
|
.Exited => |code| if (code == 0) {
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
else => {},
|
||||||
|
}
|
||||||
|
return error.ShutdownWithError;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn consumeOutputAndWait(process: *std.ChildProcess) !void {
|
||||||
|
process.stdin.?.close();
|
||||||
|
process.stdin = null;
|
||||||
|
try readResponses(process);
|
||||||
|
try waitNoError(process);
|
||||||
|
process.deinit();
|
||||||
|
}
|
||||||
|
|
||||||
|
test "Open file, ask for semantic tokens" {
|
||||||
|
var process = try startZls();
|
||||||
try sendRequest(initialize_message, process);
|
try sendRequest(initialize_message, process);
|
||||||
try sendRequest(initialized_message, process);
|
try sendRequest(initialized_message, process);
|
||||||
|
|
||||||
@ -57,26 +80,37 @@ test "Open file, ask for semantic tokens" {
|
|||||||
const sem_toks_req = \\{"jsonrpc":"2.0","id":2,"method":"textDocument/semanticTokens","params":{"textDocument":{"uri":"file:///test.zig"}}}
|
const sem_toks_req = \\{"jsonrpc":"2.0","id":2,"method":"textDocument/semanticTokens","params":{"textDocument":{"uri":"file:///test.zig"}}}
|
||||||
;
|
;
|
||||||
try sendRequest(sem_toks_req, process);
|
try sendRequest(sem_toks_req, process);
|
||||||
|
|
||||||
try sendRequest(shutdown_message, process);
|
try sendRequest(shutdown_message, process);
|
||||||
|
try consumeOutputAndWait(process);
|
||||||
process.stdin.?.close();
|
|
||||||
process.stdin = null;
|
|
||||||
|
|
||||||
try readResponses(process);
|
|
||||||
const result = try process.wait();
|
|
||||||
|
|
||||||
// const stderr_bytes = try process.stderr.?.reader().readAllAlloc(allocator, std.math.maxInt(usize));
|
|
||||||
// defer allocator.free(stderr_bytes);
|
|
||||||
// if (stderr_bytes.len != 0) {
|
|
||||||
// std.debug.print("Stderr output\n{}\n", .{stderr_bytes});
|
|
||||||
// }
|
|
||||||
|
|
||||||
switch (result) {
|
|
||||||
.Exited => |code| if (code == 0) {
|
|
||||||
return;
|
|
||||||
},
|
|
||||||
else => {},
|
|
||||||
}
|
}
|
||||||
return error.ShutdownWithError;
|
|
||||||
|
test "Requesting a completion in an empty file" {
|
||||||
|
var process = try startZls();
|
||||||
|
try sendRequest(initialize_message, process);
|
||||||
|
try sendRequest(initialized_message, process);
|
||||||
|
|
||||||
|
const new_file_req = \\{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///test.zig","languageId":"zig","version":420,"text":""}}}
|
||||||
|
;
|
||||||
|
try sendRequest(new_file_req, process);
|
||||||
|
const completion_req = \\{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///test.zig"}, "position":{"line":0,"character":0}}}
|
||||||
|
;
|
||||||
|
try sendRequest(completion_req, process);
|
||||||
|
try sendRequest(shutdown_message, process);
|
||||||
|
try consumeOutputAndWait(process);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "Requesting a completion with no trailing whitespace" {
|
||||||
|
var process = try startZls();
|
||||||
|
try sendRequest(initialize_message, process);
|
||||||
|
try sendRequest(initialized_message, process);
|
||||||
|
|
||||||
|
const new_file_req = \\{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///test.zig","languageId":"zig","version":420,"text":"const std = @import(\"std\");\nc"}}}
|
||||||
|
;
|
||||||
|
try sendRequest(new_file_req, process);
|
||||||
|
const completion_req = \\{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///test.zig"}, "position":{"line":1,"character":1}}}
|
||||||
|
;
|
||||||
|
try sendRequest(completion_req, process);
|
||||||
|
try sendRequest(shutdown_message, process);
|
||||||
|
try consumeOutputAndWait(process);
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user