Yet more import resolution fixes
This commit is contained in:
		
							parent
							
								
									40edfadc26
								
							
						
					
					
						commit
						6edd686668
					
				@ -268,6 +268,14 @@ fn newDocument(self: *DocumentStore, uri: []const u8, text: []u8) anyerror!*Hand
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    handle.import_uris = try self.collectImportUris(handle);
 | 
			
		||||
    errdefer {
 | 
			
		||||
        for (handle.import_uris) |imp_uri| {
 | 
			
		||||
            self.allocator.free(imp_uri);
 | 
			
		||||
        }
 | 
			
		||||
        self.allocator.free(handle.import_uris);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try self.handles.putNoClobber(uri, handle);
 | 
			
		||||
    return handle;
 | 
			
		||||
}
 | 
			
		||||
@ -359,16 +367,14 @@ pub fn getHandle(self: *DocumentStore, uri: []const u8) ?*Handle {
 | 
			
		||||
    return self.handles.get(uri);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn refreshDocument(self: *DocumentStore, handle: *Handle, zig_lib_path: ?[]const u8) !void {
 | 
			
		||||
    log.debug("New text for document {s}", .{handle.uri()});
 | 
			
		||||
    handle.tree.deinit(self.allocator);
 | 
			
		||||
    handle.tree = try std.zig.parse(self.allocator, handle.document.text);
 | 
			
		||||
 | 
			
		||||
    handle.document_scope.deinit(self.allocator);
 | 
			
		||||
    handle.document_scope = try analysis.makeDocumentScope(self.allocator, handle.tree);
 | 
			
		||||
 | 
			
		||||
fn collectImportUris(self: *DocumentStore, handle: *Handle) ![]const []const u8 {
 | 
			
		||||
    var new_imports = std.ArrayList([]const u8).init(self.allocator);
 | 
			
		||||
    errdefer new_imports.deinit();
 | 
			
		||||
    errdefer {
 | 
			
		||||
        for (new_imports.items) |imp| {
 | 
			
		||||
            self.allocator.free(imp);
 | 
			
		||||
        }
 | 
			
		||||
        new_imports.deinit();
 | 
			
		||||
    }
 | 
			
		||||
    try analysis.collectImports(&new_imports, handle.tree);
 | 
			
		||||
 | 
			
		||||
    // Convert to URIs
 | 
			
		||||
@ -382,9 +388,27 @@ fn refreshDocument(self: *DocumentStore, handle: *Handle, zig_lib_path: ?[]const
 | 
			
		||||
            _ = new_imports.swapRemove(i);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return new_imports.toOwnedSlice();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn refreshDocument(self: *DocumentStore, handle: *Handle) !void {
 | 
			
		||||
    log.debug("New text for document {s}", .{handle.uri()});
 | 
			
		||||
    handle.tree.deinit(self.allocator);
 | 
			
		||||
    handle.tree = try std.zig.parse(self.allocator, handle.document.text);
 | 
			
		||||
 | 
			
		||||
    handle.document_scope.deinit(self.allocator);
 | 
			
		||||
    handle.document_scope = try analysis.makeDocumentScope(self.allocator, handle.tree);
 | 
			
		||||
 | 
			
		||||
    const new_imports = try self.collectImportUris(handle);
 | 
			
		||||
    errdefer {
 | 
			
		||||
        for (new_imports) |imp| {
 | 
			
		||||
            self.allocator.free(imp);
 | 
			
		||||
        }
 | 
			
		||||
        self.allocator.free(new_imports);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const old_imports = handle.import_uris;
 | 
			
		||||
    handle.import_uris = new_imports.toOwnedSlice();
 | 
			
		||||
    handle.import_uris = new_imports;
 | 
			
		||||
    defer {
 | 
			
		||||
        for (old_imports) |uri| {
 | 
			
		||||
            self.allocator.free(uri);
 | 
			
		||||
@ -392,11 +416,11 @@ fn refreshDocument(self: *DocumentStore, handle: *Handle, zig_lib_path: ?[]const
 | 
			
		||||
        self.allocator.free(old_imports);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    i = 0;
 | 
			
		||||
    var i: usize = 0;
 | 
			
		||||
    while (i < handle.imports_used.items.len) {
 | 
			
		||||
        const old = handle.imports_used.items[i];
 | 
			
		||||
        still_exists: {
 | 
			
		||||
            for (new_imports.items) |new| {
 | 
			
		||||
            for (new_imports) |new| {
 | 
			
		||||
                if (std.mem.eql(u8, new, old)) {
 | 
			
		||||
                    break :still_exists;
 | 
			
		||||
                }
 | 
			
		||||
@ -429,7 +453,6 @@ pub fn applyChanges(
 | 
			
		||||
    handle: *Handle,
 | 
			
		||||
    content_changes: std.json.Array,
 | 
			
		||||
    offset_encoding: offsets.Encoding,
 | 
			
		||||
    zig_lib_path: ?[]const u8,
 | 
			
		||||
) !void {
 | 
			
		||||
    const document = &handle.document;
 | 
			
		||||
 | 
			
		||||
@ -492,7 +515,7 @@ pub fn applyChanges(
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try self.refreshDocument(handle, zig_lib_path);
 | 
			
		||||
    try self.refreshDocument(handle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn uriFromImportStr(
 | 
			
		||||
 | 
			
		||||
@ -1364,7 +1364,7 @@ fn changeDocumentHandler(arena: *std.heap.ArenaAllocator, id: types.RequestId, r
 | 
			
		||||
        return;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    try document_store.applyChanges(handle, req.params.contentChanges.Array, offset_encoding, config.zig_lib_path);
 | 
			
		||||
    try document_store.applyChanges(handle, req.params.contentChanges.Array, offset_encoding);
 | 
			
		||||
    try publishDiagnostics(arena, handle.*, config);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user