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);
 | 
					    try self.handles.putNoClobber(uri, handle);
 | 
				
			||||||
    return handle;
 | 
					    return handle;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -359,16 +367,14 @@ pub fn getHandle(self: *DocumentStore, uri: []const u8) ?*Handle {
 | 
				
			|||||||
    return self.handles.get(uri);
 | 
					    return self.handles.get(uri);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn refreshDocument(self: *DocumentStore, handle: *Handle, zig_lib_path: ?[]const u8) !void {
 | 
					fn collectImportUris(self: *DocumentStore, handle: *Handle) ![]const []const u8 {
 | 
				
			||||||
    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);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    var new_imports = std.ArrayList([]const u8).init(self.allocator);
 | 
					    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);
 | 
					    try analysis.collectImports(&new_imports, handle.tree);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Convert to URIs
 | 
					    // Convert to URIs
 | 
				
			||||||
@ -382,9 +388,27 @@ fn refreshDocument(self: *DocumentStore, handle: *Handle, zig_lib_path: ?[]const
 | 
				
			|||||||
            _ = new_imports.swapRemove(i);
 | 
					            _ = 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;
 | 
					    const old_imports = handle.import_uris;
 | 
				
			||||||
    handle.import_uris = new_imports.toOwnedSlice();
 | 
					    handle.import_uris = new_imports;
 | 
				
			||||||
    defer {
 | 
					    defer {
 | 
				
			||||||
        for (old_imports) |uri| {
 | 
					        for (old_imports) |uri| {
 | 
				
			||||||
            self.allocator.free(uri);
 | 
					            self.allocator.free(uri);
 | 
				
			||||||
@ -392,11 +416,11 @@ fn refreshDocument(self: *DocumentStore, handle: *Handle, zig_lib_path: ?[]const
 | 
				
			|||||||
        self.allocator.free(old_imports);
 | 
					        self.allocator.free(old_imports);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    i = 0;
 | 
					    var i: usize = 0;
 | 
				
			||||||
    while (i < handle.imports_used.items.len) {
 | 
					    while (i < handle.imports_used.items.len) {
 | 
				
			||||||
        const old = handle.imports_used.items[i];
 | 
					        const old = handle.imports_used.items[i];
 | 
				
			||||||
        still_exists: {
 | 
					        still_exists: {
 | 
				
			||||||
            for (new_imports.items) |new| {
 | 
					            for (new_imports) |new| {
 | 
				
			||||||
                if (std.mem.eql(u8, new, old)) {
 | 
					                if (std.mem.eql(u8, new, old)) {
 | 
				
			||||||
                    break :still_exists;
 | 
					                    break :still_exists;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -429,7 +453,6 @@ pub fn applyChanges(
 | 
				
			|||||||
    handle: *Handle,
 | 
					    handle: *Handle,
 | 
				
			||||||
    content_changes: std.json.Array,
 | 
					    content_changes: std.json.Array,
 | 
				
			||||||
    offset_encoding: offsets.Encoding,
 | 
					    offset_encoding: offsets.Encoding,
 | 
				
			||||||
    zig_lib_path: ?[]const u8,
 | 
					 | 
				
			||||||
) !void {
 | 
					) !void {
 | 
				
			||||||
    const document = &handle.document;
 | 
					    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(
 | 
					pub fn uriFromImportStr(
 | 
				
			||||||
 | 
				
			|||||||
@ -1364,7 +1364,7 @@ fn changeDocumentHandler(arena: *std.heap.ArenaAllocator, id: types.RequestId, r
 | 
				
			|||||||
        return;
 | 
					        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);
 | 
					    try publishDiagnostics(arena, handle.*, config);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user