add separate function for loading handles with getOrLoadHandle
This commit is contained in:
parent
89be8e0211
commit
2158a201ad
@ -107,10 +107,16 @@ pub fn deinit(self: *DocumentStore) void {
|
|||||||
|
|
||||||
/// returns a handle to the given document
|
/// returns a handle to the given document
|
||||||
pub fn getHandle(self: *DocumentStore, uri: Uri) ?*const Handle {
|
pub fn getHandle(self: *DocumentStore, uri: Uri) ?*const Handle {
|
||||||
return self.getHandleInternal(uri) catch null;
|
return self.handles.get(uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn getHandleInternal(self: *DocumentStore, uri: Uri) !?*const Handle {
|
/// returns a handle to the given document
|
||||||
|
/// will load the document from disk if it hasn't been already
|
||||||
|
pub fn getOrLoadHandle(self: *DocumentStore, uri: Uri) ?*const Handle {
|
||||||
|
return self.getOrLoadHandleInternal(uri) catch null;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getOrLoadHandleInternal(self: *DocumentStore, uri: Uri) !?*const Handle {
|
||||||
if (self.handles.get(uri)) |handle| return handle;
|
if (self.handles.get(uri)) |handle| return handle;
|
||||||
|
|
||||||
var handle = try self.allocator.create(Handle);
|
var handle = try self.allocator.create(Handle);
|
||||||
@ -569,7 +575,7 @@ fn uriInImports(
|
|||||||
// consider it checked even if a failure happens
|
// consider it checked even if a failure happens
|
||||||
try checked_uris.put(try self.allocator.dupe(u8, source_uri), {});
|
try checked_uris.put(try self.allocator.dupe(u8, source_uri), {});
|
||||||
|
|
||||||
const handle = self.getHandle(source_uri) orelse return false;
|
const handle = self.getOrLoadHandle(source_uri) orelse return false;
|
||||||
|
|
||||||
for (handle.import_uris.items) |import_uri| {
|
for (handle.import_uris.items) |import_uri| {
|
||||||
if (std.mem.eql(u8, uri, import_uri))
|
if (std.mem.eql(u8, uri, import_uri))
|
||||||
|
@ -914,14 +914,14 @@ pub fn resolveTypeOfNodeInternal(store: *DocumentStore, arena: *std.heap.ArenaAl
|
|||||||
const import_str = tree.tokenSlice(main_tokens[import_param]);
|
const import_str = tree.tokenSlice(main_tokens[import_param]);
|
||||||
const import_uri = (try store.uriFromImportStr(arena.allocator(), handle.*, import_str[1 .. import_str.len - 1])) orelse return null;
|
const import_uri = (try store.uriFromImportStr(arena.allocator(), handle.*, import_str[1 .. import_str.len - 1])) orelse return null;
|
||||||
|
|
||||||
const new_handle = store.getHandle(import_uri) orelse return null;
|
const new_handle = store.getOrLoadHandle(import_uri) orelse return null;
|
||||||
|
|
||||||
// reference to node '0' which is root
|
// reference to node '0' which is root
|
||||||
return TypeWithHandle.typeVal(.{ .node = 0, .handle = new_handle });
|
return TypeWithHandle.typeVal(.{ .node = 0, .handle = new_handle });
|
||||||
} else if (std.mem.eql(u8, call_name, "@cImport")) {
|
} else if (std.mem.eql(u8, call_name, "@cImport")) {
|
||||||
const cimport_uri = (try store.resolveCImport(handle.*, node)) orelse return null;
|
const cimport_uri = (try store.resolveCImport(handle.*, node)) orelse return null;
|
||||||
|
|
||||||
const new_handle = store.getHandle(cimport_uri) orelse return null;
|
const new_handle = store.getOrLoadHandle(cimport_uri) orelse return null;
|
||||||
|
|
||||||
// reference to node '0' which is root
|
// reference to node '0' which is root
|
||||||
return TypeWithHandle.typeVal(.{ .node = 0, .handle = new_handle });
|
return TypeWithHandle.typeVal(.{ .node = 0, .handle = new_handle });
|
||||||
|
Loading…
Reference in New Issue
Block a user