Add compact language assistance rails
This commit is contained in:
+46
@@ -163,6 +163,52 @@ pub fn missingProviderRowAlloc(allocator: std.mem.Allocator, capability: Provide
|
||||
return std.fmt.allocPrint(allocator, "provider:missing:{s}", .{@tagName(capability)});
|
||||
}
|
||||
|
||||
pub fn compactHoverCardAlloc(allocator: std.mem.Allocator, row: []const u8, width: usize) ![]u8 {
|
||||
const provider = providerIdFromRow(row) catch "unknown";
|
||||
const payload = providerPayloadFromRow(row) catch row;
|
||||
const prefix = "lsp:hover:";
|
||||
const body = if (std.mem.startsWith(u8, payload, prefix)) payload[prefix.len..] else payload;
|
||||
const split = std.mem.indexOfScalar(u8, body, '|') orelse body.len;
|
||||
const headline = body[0..split];
|
||||
const docs = if (split < body.len) body[split + 1 ..] else "";
|
||||
const budget = if (width > provider.len + headline.len + 8) width - provider.len - headline.len - 8 else 0;
|
||||
const excerpt_len = @min(docs.len, budget);
|
||||
return std.fmt.allocPrint(allocator, "[{s}] {s}{s}{s}", .{ provider, headline, if (excerpt_len > 0) " — " else "", docs[0..excerpt_len] });
|
||||
}
|
||||
|
||||
pub fn expandedHoverRowsAlloc(allocator: std.mem.Allocator, row: []const u8, width: usize) ![][]const u8 {
|
||||
const provider = providerIdFromRow(row) catch "unknown";
|
||||
const payload = providerPayloadFromRow(row) catch row;
|
||||
const prefix = "lsp:hover:";
|
||||
const body = if (std.mem.startsWith(u8, payload, prefix)) payload[prefix.len..] else payload;
|
||||
var rows = std.ArrayList([]const u8).empty;
|
||||
errdefer {
|
||||
for (rows.items) |item| allocator.free(item);
|
||||
rows.deinit(allocator);
|
||||
}
|
||||
try rows.append(allocator, try std.fmt.allocPrint(allocator, "hover_provider:{s}", .{provider}));
|
||||
var start: usize = 0;
|
||||
const wrap = @max(width, 8);
|
||||
while (start < body.len) {
|
||||
const end = @min(start + wrap, body.len);
|
||||
const wrapped = try allocator.dupe(u8, body[start..end]);
|
||||
for (wrapped) |*byte| {
|
||||
if (byte.* <= 0x20 or byte.* == '|') byte.* = '_';
|
||||
}
|
||||
try rows.append(allocator, wrapped);
|
||||
start = end;
|
||||
}
|
||||
return rows.toOwnedSlice(allocator);
|
||||
}
|
||||
|
||||
pub fn compactSignatureCardAlloc(allocator: std.mem.Allocator, row: []const u8) ![]u8 {
|
||||
const provider = providerIdFromRow(row) catch "unknown";
|
||||
const payload = providerPayloadFromRow(row) catch row;
|
||||
const prefix = "lsp:signature:";
|
||||
const body = if (std.mem.startsWith(u8, payload, prefix)) payload[prefix.len..] else payload;
|
||||
return std.fmt.allocPrint(allocator, "[{s}] {s}", .{ provider, body });
|
||||
}
|
||||
|
||||
pub fn providerPickerRowsAlloc(allocator: std.mem.Allocator, capability: ProviderCapability, providers: []const Provider) ![][]const u8 {
|
||||
var rows = std.ArrayList([]const u8).empty;
|
||||
errdefer {
|
||||
|
||||
Reference in New Issue
Block a user