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);
|
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 {
|
fn hoverDefinitionLabel(server: *Server, pos_index: usize, handle: *const DocumentStore.Handle) error{OutOfMemory}!?types.Hover {
|
||||||
const tracy_zone = tracy.trace(@src());
|
const tracy_zone = tracy.trace(@src());
|
||||||
defer tracy_zone.end();
|
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);
|
const pos_context = try analysis.getPositionContext(server.arena.allocator(), handle.text, source_index, true);
|
||||||
|
|
||||||
return switch (pos_context) {
|
return switch (pos_context) {
|
||||||
|
.builtin => |loc| try server.gotoDefinitionBuiltin(handle, loc),
|
||||||
.var_access => try server.gotoDefinitionGlobal(source_index, handle, resolve_alias),
|
.var_access => try server.gotoDefinitionGlobal(source_index, handle, resolve_alias),
|
||||||
.field_access => |loc| try server.gotoDefinitionFieldAccess(handle, source_index, loc, resolve_alias),
|
.field_access => |loc| try server.gotoDefinitionFieldAccess(handle, source_index, loc, resolve_alias),
|
||||||
.import_string_literal => try server.gotoDefinitionString(source_index, handle),
|
.import_string_literal => try server.gotoDefinitionString(source_index, handle),
|
||||||
|
Loading…
Reference in New Issue
Block a user