Before documentPositionContext returns .empty, check if an identifier
immediately follows the cursor and return .var_access if it does instead. This allows hover and go to definition to work when the cursor is immediately before an identifier.
This commit is contained in:
parent
3c609ff47d
commit
8cf6029f1a
@ -1549,7 +1549,11 @@ fn tokenRangeAppend(prev: SourceRange, token: std.zig.Token) SourceRange {
|
|||||||
|
|
||||||
const DocumentPosition = @import("offsets.zig").DocumentPosition;
|
const DocumentPosition = @import("offsets.zig").DocumentPosition;
|
||||||
|
|
||||||
pub fn documentPositionContext(arena: *std.heap.ArenaAllocator, document: types.TextDocument, doc_position: DocumentPosition) !PositionContext {
|
pub fn documentPositionContext(
|
||||||
|
arena: *std.heap.ArenaAllocator,
|
||||||
|
document: types.TextDocument,
|
||||||
|
doc_position: DocumentPosition,
|
||||||
|
) !PositionContext {
|
||||||
const line = doc_position.line;
|
const line = doc_position.line;
|
||||||
var tokenizer = std.zig.Tokenizer.init(line[0..doc_position.line_index]);
|
var tokenizer = std.zig.Tokenizer.init(line[0..doc_position.line_index]);
|
||||||
var stack = try std.ArrayList(StackState).initCapacity(&arena.allocator, 8);
|
var stack = try std.ArrayList(StackState).initCapacity(&arena.allocator, 8);
|
||||||
@ -1639,7 +1643,30 @@ pub fn documentPositionContext(arena: *std.heap.ArenaAllocator, document: types.
|
|||||||
}
|
}
|
||||||
|
|
||||||
return block: {
|
return block: {
|
||||||
if (stack.popOrNull()) |state| break :block state.ctx;
|
if (stack.popOrNull()) |state| {
|
||||||
|
switch (state.ctx) {
|
||||||
|
.empty => {},
|
||||||
|
.label => |filled| {
|
||||||
|
// We need to check this because the state could be a filled
|
||||||
|
// label if only a space follows it
|
||||||
|
const last_char = line[doc_position.line_index - 1];
|
||||||
|
if (!filled or last_char != ' ') {
|
||||||
|
break :block state.ctx;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
else => break :block state.ctx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (doc_position.line_index < line.len) {
|
||||||
|
switch (line[doc_position.line_index]) {
|
||||||
|
'a'...'z', 'A'...'Z', '_', '@' => {},
|
||||||
|
else => break :block .empty,
|
||||||
|
}
|
||||||
|
tokenizer = std.zig.Tokenizer.init(line[doc_position.line_index..]);
|
||||||
|
const tok = tokenizer.next();
|
||||||
|
if (tok.tag == .identifier)
|
||||||
|
break :block PositionContext{ .var_access = tok.loc };
|
||||||
|
}
|
||||||
break :block .empty;
|
break :block .empty;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
12
src/main.zig
12
src/main.zig
@ -357,8 +357,6 @@ fn nodeToCompletion(
|
|||||||
const node_tags = tree.nodes.items(.tag);
|
const node_tags = tree.nodes.items(.tag);
|
||||||
const datas = tree.nodes.items(.data);
|
const datas = tree.nodes.items(.data);
|
||||||
const token_tags = tree.tokens.items(.tag);
|
const token_tags = tree.tokens.items(.tag);
|
||||||
if (tree.errors.len > 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const doc_kind: types.MarkupContent.Kind = if (client_capabilities.completion_doc_supports_md)
|
const doc_kind: types.MarkupContent.Kind = if (client_capabilities.completion_doc_supports_md)
|
||||||
.Markdown
|
.Markdown
|
||||||
@ -1681,17 +1679,17 @@ fn processJsonRpc(arena: *std.heap.ArenaAllocator, parser: *std.json.Parser, jso
|
|||||||
logger.debug("Method without return value not implemented: {s}", .{method});
|
logger.debug("Method without return value not implemented: {s}", .{method});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn launchWizard() !void {
|
fn launchWizard() !void {
|
||||||
const dest =
|
const dest =
|
||||||
(try known_folders.getPath(allocator, .local_configuration))
|
(try known_folders.getPath(allocator, .local_configuration)) orelse (try known_folders.getPath(allocator, .executable_dir)) orelse return error.NoConfigPathFound;
|
||||||
orelse (try known_folders.getPath(allocator, .executable_dir))
|
|
||||||
orelse return error.NoConfigPathFound;
|
|
||||||
defer allocator.free(dest);
|
defer allocator.free(dest);
|
||||||
try setup.wizard(allocator, dest);
|
try setup.wizard(allocator, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
const stack_frames = switch (std.builtin.mode) { .Debug => 10, else => 0 };
|
const stack_frames = switch (std.builtin.mode) {
|
||||||
|
.Debug => 10,
|
||||||
|
else => 0,
|
||||||
|
};
|
||||||
var gpa_state = std.heap.GeneralPurposeAllocator(.{ .stack_trace_frames = stack_frames }){};
|
var gpa_state = std.heap.GeneralPurposeAllocator(.{ .stack_trace_frames = stack_frames }){};
|
||||||
|
|
||||||
pub fn main() anyerror!void {
|
pub fn main() anyerror!void {
|
||||||
|
@ -30,7 +30,11 @@ pub fn documentPosition(doc: types.TextDocument, position: types.Position, encod
|
|||||||
if (index < 0 or index > @intCast(i64, doc.text.len)) {
|
if (index < 0 or index > @intCast(i64, doc.text.len)) {
|
||||||
return error.InvalidParams;
|
return error.InvalidParams;
|
||||||
}
|
}
|
||||||
return DocumentPosition{ .line = line, .absolute_index = @intCast(usize, index), .line_index = @intCast(usize, position.character) };
|
return DocumentPosition{
|
||||||
|
.line = line,
|
||||||
|
.absolute_index = @intCast(usize, index),
|
||||||
|
.line_index = @intCast(usize, position.character),
|
||||||
|
};
|
||||||
} else {
|
} else {
|
||||||
const utf8 = doc.text[line_start_idx..];
|
const utf8 = doc.text[line_start_idx..];
|
||||||
var utf8_idx: usize = 0;
|
var utf8_idx: usize = 0;
|
||||||
@ -50,7 +54,11 @@ pub fn documentPosition(doc: types.TextDocument, position: types.Position, encod
|
|||||||
}
|
}
|
||||||
utf8_idx = next_utf8_idx;
|
utf8_idx = next_utf8_idx;
|
||||||
}
|
}
|
||||||
return DocumentPosition{ .line = line, .absolute_index = line_start_idx + utf8_idx, .line_index = utf8_idx };
|
return DocumentPosition{
|
||||||
|
.line = line,
|
||||||
|
.absolute_index = line_start_idx + utf8_idx,
|
||||||
|
.line_index = utf8_idx,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user