Correctly support utf16 offsets

This commit is contained in:
Alexandros Naskos
2020-07-03 02:31:28 +03:00
parent 8c154c2a60
commit d8aba7da0b
4 changed files with 54 additions and 81 deletions

View File

@@ -1249,11 +1249,11 @@ fn tokenRangeAppend(prev: SourceRange, token: std.zig.Token) SourceRange {
};
}
pub fn documentPositionContext(arena: *std.heap.ArenaAllocator, document: types.TextDocument, position: types.Position) !PositionContext {
const line = try document.getLine(@intCast(usize, position.line));
const pos_char = @intCast(usize, position.character);
const idx = if (pos_char > line.len) line.len else pos_char;
var tokenizer = std.zig.Tokenizer.init(line[0..idx]);
const DocumentPosition = @import("offsets.zig").DocumentPosition;
pub fn documentPositionContext(arena: *std.heap.ArenaAllocator, document: types.TextDocument, doc_position: DocumentPosition) !PositionContext {
const line = doc_position.line;
var tokenizer = std.zig.Tokenizer.init(line[0..doc_position.line_index]);
var stack = try std.ArrayList(StackState).initCapacity(&arena.allocator, 8);
while (true) {
@@ -1262,11 +1262,11 @@ pub fn documentPositionContext(arena: *std.heap.ArenaAllocator, document: types.
switch (tok.id) {
.Invalid, .Invalid_ampersands => {
// Single '@' do not return a builtin token so we check this on our own.
if (line[idx - 1] == '@') {
if (line[doc_position.line_index - 1] == '@') {
return PositionContext{
.builtin = .{
.start = idx - 1,
.end = idx,
.start = doc_position.line_index - 1,
.end = doc_position.line_index,
},
};
}