Add compact language assistance rails

This commit is contained in:
slhx agent
2026-06-21 13:34:40 +02:00
parent 7e639dd87f
commit 264dedb47c
3 changed files with 280 additions and 11 deletions
+46
View File
@@ -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 {