implement goto definition for cImport
This commit is contained in:
parent
5f0d3bb886
commit
66b7d7ad58
@ -1052,6 +1052,38 @@ fn gotoDefinitionGlobal(
|
||||
return try server.gotoDefinitionSymbol(decl, resolve_alias);
|
||||
}
|
||||
|
||||
fn gotoDefinitionBuiltin(
|
||||
server: *Server,
|
||||
handle: *const DocumentStore.Handle,
|
||||
loc: offsets.Loc,
|
||||
) error{OutOfMemory}!?types.Location {
|
||||
const tracy_zone = tracy.trace(@src());
|
||||
defer tracy_zone.end();
|
||||
|
||||
const name = offsets.tokenIndexToSlice(handle.tree.source, loc.start);
|
||||
if (std.mem.eql(u8, name, "@cImport")) {
|
||||
const index = for (handle.cimports.items(.node)) |cimport_node, index| {
|
||||
const main_token = handle.tree.nodes.items(.main_token)[cimport_node];
|
||||
if (loc.start == offsets.tokenToIndex(handle.tree, main_token)) break index;
|
||||
} else return null;
|
||||
const hash = handle.cimports.items(.hash)[index];
|
||||
|
||||
const result = server.document_store.cimports.get(hash) orelse return null;
|
||||
switch (result) {
|
||||
.failure => return null,
|
||||
.success => |uri| return types.Location{
|
||||
.uri = uri,
|
||||
.range = .{
|
||||
.start = .{ .line = 0, .character = 0 },
|
||||
.end = .{ .line = 0, .character = 0 },
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
fn hoverDefinitionLabel(server: *Server, pos_index: usize, handle: *const DocumentStore.Handle) error{OutOfMemory}!?types.Hover {
|
||||
const tracy_zone = tracy.trace(@src());
|
||||
defer tracy_zone.end();
|
||||
@ -2251,6 +2283,7 @@ fn gotoHandler(server: *Server, request: types.TextDocumentPositionParams, resol
|
||||
const pos_context = try analysis.getPositionContext(server.arena.allocator(), handle.text, source_index, true);
|
||||
|
||||
return switch (pos_context) {
|
||||
.builtin => |loc| try server.gotoDefinitionBuiltin(handle, loc),
|
||||
.var_access => try server.gotoDefinitionGlobal(source_index, handle, resolve_alias),
|
||||
.field_access => |loc| try server.gotoDefinitionFieldAccess(handle, source_index, loc, resolve_alias),
|
||||
.import_string_literal => try server.gotoDefinitionString(source_index, handle),
|
||||
|
Loading…
Reference in New Issue
Block a user