Added encoding offset aware documentRange
This commit is contained in:
parent
28b3cafc3f
commit
6bf2c9a1c7
@ -1245,7 +1245,7 @@ fn formattingHandler(arena: *std.heap.ArenaAllocator, id: types.RequestId, req:
|
||||
.result = .{
|
||||
.TextEdits = &[1]types.TextEdit{
|
||||
.{
|
||||
.range = handle.document.range(),
|
||||
.range = try offsets.documentRange(handle.document, offset_encoding),
|
||||
.newText = stdout_bytes,
|
||||
},
|
||||
},
|
||||
|
@ -113,3 +113,49 @@ pub fn tokenLength(tree: *std.zig.ast.Tree, token: std.zig.ast.TokenIndex, encod
|
||||
}
|
||||
return utf16_len;
|
||||
}
|
||||
|
||||
pub fn documentRange(doc: types.TextDocument, encoding: Encoding) !types.Range {
|
||||
var line_idx: i64 = 0;
|
||||
var curr_line: []const u8 = doc.text;
|
||||
|
||||
var split_iterator = std.mem.split(doc.text, "\n");
|
||||
while (split_iterator.next()) |line| : (line_idx += 1) {
|
||||
curr_line = line;
|
||||
}
|
||||
|
||||
if (encoding == .utf8) {
|
||||
return types.Range{
|
||||
.start = .{
|
||||
.line = 0,
|
||||
.character = 0,
|
||||
},
|
||||
.end = .{
|
||||
.line = line_idx,
|
||||
.character = @intCast(i64, curr_line.len),
|
||||
},
|
||||
};
|
||||
} else {
|
||||
var utf16_len: usize = 0;
|
||||
var line_utf8_idx: usize = 0;
|
||||
while (line_utf8_idx < curr_line.len) {
|
||||
const n = try std.unicode.utf8ByteSequenceLength(curr_line[line_utf8_idx]);
|
||||
const codepoint = try std.unicode.utf8Decode(curr_line[line_utf8_idx .. line_utf8_idx + n]);
|
||||
if (codepoint < 0x10000) {
|
||||
utf16_len += 1;
|
||||
} else {
|
||||
utf16_len += 2;
|
||||
}
|
||||
line_utf8_idx += n;
|
||||
}
|
||||
return types.Range{
|
||||
.start = .{
|
||||
.line = 0,
|
||||
.character = 0,
|
||||
},
|
||||
.end = .{
|
||||
.line = line_idx,
|
||||
.character = @intCast(i64, utf16_len),
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -138,27 +138,6 @@ pub const TextDocument = struct {
|
||||
text: String,
|
||||
// This holds the memory that we have actually allocated.
|
||||
mem: []u8,
|
||||
|
||||
pub fn range(self: TextDocument) Range {
|
||||
var line_idx: i64 = 0;
|
||||
var curr_line: []const u8 = self.text;
|
||||
|
||||
var split_iterator = std.mem.split(self.text, "\n");
|
||||
while (split_iterator.next()) |line| : (line_idx += 1) {
|
||||
curr_line = line;
|
||||
}
|
||||
|
||||
return .{
|
||||
.start = .{
|
||||
.line = 0,
|
||||
.character = 0,
|
||||
},
|
||||
.end = .{
|
||||
.line = line_idx,
|
||||
.character = @intCast(i64, curr_line.len),
|
||||
},
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
pub const WorkspaceEdit = struct {
|
||||
|
Loading…
Reference in New Issue
Block a user