super basic completion, tons of things to iron out
This commit is contained in:
parent
a3067f88b1
commit
9ae912efdd
62
src/main.zig
62
src/main.zig
@ -298,27 +298,53 @@ fn completeGlobal(id: i64, document: *types.TextDocument, config: Config) !void
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn completeFieldAccess(id: i64, document: *types.TextDocument, index: usize, config: Config) !void {
|
fn completeFieldAccess(id: i64, document: *types.TextDocument, position: types.Position, config: Config) !void {
|
||||||
var tree = try std.zig.parse(allocator, sane_text);
|
if (document.sane_text) |sane_text| {
|
||||||
defer tree.deinit();
|
var tree = try std.zig.parse(allocator, sane_text);
|
||||||
|
defer tree.deinit();
|
||||||
|
|
||||||
// We use a local arena allocator to deallocate all temporary data without iterating
|
// We use a local arena allocator to deallocate all temporary data without iterating
|
||||||
var arena = std.heap.ArenaAllocator.init(allocator);
|
var arena = std.heap.ArenaAllocator.init(allocator);
|
||||||
var completions = std.ArrayList(types.CompletionItem).init(&arena.allocator);
|
var completions = std.ArrayList(types.CompletionItem).init(&arena.allocator);
|
||||||
// Deallocate all temporary data.
|
// Deallocate all temporary data.
|
||||||
defer arena.deinit();
|
defer arena.deinit();
|
||||||
|
|
||||||
try log("{}", .{});
|
var line = try document.getLine(@intCast(usize, position.line));
|
||||||
|
try log("{}", .{line});
|
||||||
|
var tokenizer = std.zig.Tokenizer.init(line);
|
||||||
|
|
||||||
try send(types.Response{
|
if (analysis.getNodeFromTokens(tree, &tree.root_node.base, &tokenizer)) |node| {
|
||||||
.id = .{.Integer = id},
|
var index: usize = 0;
|
||||||
.result = .{
|
while (node.iterate(index)) |child_node| {
|
||||||
.CompletionList = .{
|
try completions.append(.{
|
||||||
.isIncomplete = false,
|
.label = analysis.nodeToString(tree, child_node),
|
||||||
.items = completions.items,
|
.kind = .Variable,
|
||||||
|
});
|
||||||
|
|
||||||
|
index += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try send(types.Response{
|
||||||
|
.id = .{.Integer = id},
|
||||||
|
.result = .{
|
||||||
|
.CompletionList = .{
|
||||||
|
.isIncomplete = false,
|
||||||
|
.items = completions.items,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
});
|
||||||
});
|
} else {
|
||||||
|
return try send(types.Response{
|
||||||
|
.id = .{.Integer = id},
|
||||||
|
.result = .{
|
||||||
|
.CompletionList = .{
|
||||||
|
.isIncomplete = false,
|
||||||
|
.items = &[_]types.CompletionItem{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute builtin completions at comptime.
|
// Compute builtin completions at comptime.
|
||||||
@ -588,7 +614,7 @@ fn processJsonRpc(parser: *std.json.Parser, json: []const u8, config: Config) !v
|
|||||||
} else if (pos_context == .var_access or pos_context == .empty) {
|
} else if (pos_context == .var_access or pos_context == .empty) {
|
||||||
try completeGlobal(id, document, config);
|
try completeGlobal(id, document, config);
|
||||||
} else if (pos_context == .field_access) {
|
} else if (pos_context == .field_access) {
|
||||||
try completeFieldAccess(id, document, pos_index, config);
|
try completeFieldAccess(id, document, pos, config);
|
||||||
} else {
|
} else {
|
||||||
try respondGeneric(id, no_completions_response);
|
try respondGeneric(id, no_completions_response);
|
||||||
}
|
}
|
||||||
|
@ -158,6 +158,18 @@ pub const TextDocument = struct {
|
|||||||
|
|
||||||
return @intCast(usize, index);
|
return @intCast(usize, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn getLine(self: TextDocument, target_line: usize) ![]const u8 {
|
||||||
|
var split_iterator = std.mem.split(self.text, "\n");
|
||||||
|
|
||||||
|
var line: i64 = 0;
|
||||||
|
while (line < target_line) : (line += 1) {
|
||||||
|
_ = split_iterator.next() orelse return error.InvalidParams;
|
||||||
|
}
|
||||||
|
if (split_iterator.next()) |next| {
|
||||||
|
return next;
|
||||||
|
} else return error.InvalidParams;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const TextEdit = struct {
|
pub const TextEdit = struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user