fix textDocument/rename
This commit is contained in:
parent
2ac8ab6ce9
commit
605c4e2988
@ -1071,10 +1071,9 @@ fn renameDefinitionGlobal(
|
|||||||
|
|
||||||
const decl = (try server.getSymbolGlobal(pos_index, handle)) orelse return try respondGeneric(writer, id, null_result_response);
|
const decl = (try server.getSymbolGlobal(pos_index, handle)) orelse return try respondGeneric(writer, id, null_result_response);
|
||||||
|
|
||||||
var workspace_edit = types.WorkspaceEdit{
|
var workspace_edit = types.WorkspaceEdit{ .changes = .{} };
|
||||||
.changes = std.StringHashMapUnmanaged([]types.TextEdit){},
|
try rename.renameSymbol(&server.arena, &server.document_store, decl, new_name, &workspace_edit.changes, server.offset_encoding);
|
||||||
};
|
|
||||||
try rename.renameSymbol(&server.arena, &server.document_store, decl, new_name, &workspace_edit.changes.?, server.offset_encoding);
|
|
||||||
try send(writer, server.arena.allocator(), types.Response{
|
try send(writer, server.arena.allocator(), types.Response{
|
||||||
.id = id,
|
.id = id,
|
||||||
.result = .{ .WorkspaceEdit = workspace_edit },
|
.result = .{ .WorkspaceEdit = workspace_edit },
|
||||||
@ -1095,10 +1094,9 @@ fn renameDefinitionFieldAccess(
|
|||||||
|
|
||||||
const decl = (try server.getSymbolFieldAccess(handle, position, range)) orelse return try respondGeneric(writer, id, null_result_response);
|
const decl = (try server.getSymbolFieldAccess(handle, position, range)) orelse return try respondGeneric(writer, id, null_result_response);
|
||||||
|
|
||||||
var workspace_edit = types.WorkspaceEdit{
|
var workspace_edit = types.WorkspaceEdit{ .changes = .{} };
|
||||||
.changes = std.StringHashMapUnmanaged([]types.TextEdit){},
|
try rename.renameSymbol(&server.arena, &server.document_store, decl, new_name, &workspace_edit.changes, server.offset_encoding);
|
||||||
};
|
|
||||||
try rename.renameSymbol(&server.arena, &server.document_store, decl, new_name, &workspace_edit.changes.?, server.offset_encoding);
|
|
||||||
try send(writer, server.arena.allocator(), types.Response{
|
try send(writer, server.arena.allocator(), types.Response{
|
||||||
.id = id,
|
.id = id,
|
||||||
.result = .{ .WorkspaceEdit = workspace_edit },
|
.result = .{ .WorkspaceEdit = workspace_edit },
|
||||||
@ -1118,10 +1116,9 @@ fn renameDefinitionLabel(
|
|||||||
|
|
||||||
const decl = (try getLabelGlobal(pos_index, handle)) orelse return try respondGeneric(writer, id, null_result_response);
|
const decl = (try getLabelGlobal(pos_index, handle)) orelse return try respondGeneric(writer, id, null_result_response);
|
||||||
|
|
||||||
var workspace_edit = types.WorkspaceEdit{
|
var workspace_edit = types.WorkspaceEdit{ .changes = .{} };
|
||||||
.changes = std.StringHashMapUnmanaged([]types.TextEdit){},
|
try rename.renameLabel(&server.arena, decl, new_name, &workspace_edit.changes, server.offset_encoding);
|
||||||
};
|
|
||||||
try rename.renameLabel(&server.arena, decl, new_name, &workspace_edit.changes.?, server.offset_encoding);
|
|
||||||
try send(writer, server.arena.allocator(), types.Response{
|
try send(writer, server.arena.allocator(), types.Response{
|
||||||
.id = id,
|
.id = id,
|
||||||
.result = .{ .WorkspaceEdit = workspace_edit },
|
.result = .{ .WorkspaceEdit = workspace_edit },
|
||||||
|
@ -8,24 +8,26 @@ const offsets = @import("offsets.zig");
|
|||||||
// TODO Use a map to array lists and collect at the end instead?
|
// TODO Use a map to array lists and collect at the end instead?
|
||||||
const RefHandlerContext = struct {
|
const RefHandlerContext = struct {
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
edits: *std.StringHashMapUnmanaged([]types.TextEdit),
|
edits: *std.StringHashMapUnmanaged(std.ArrayListUnmanaged(types.TextEdit)),
|
||||||
new_name: []const u8,
|
new_name: []const u8,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn refHandler(context: RefHandlerContext, loc: types.Location) !void {
|
fn refHandler(context: RefHandlerContext, loc: types.Location) !void {
|
||||||
var text_edits = if (context.edits.get(loc.uri)) |slice|
|
const gop = try context.edits.getOrPutValue(context.allocator, loc.uri, .{});
|
||||||
std.ArrayListUnmanaged(types.TextEdit){ .items = slice }
|
try gop.value_ptr.append(context.allocator, .{
|
||||||
else
|
|
||||||
std.ArrayListUnmanaged(types.TextEdit){};
|
|
||||||
|
|
||||||
(try text_edits.addOne(context.allocator)).* = .{
|
|
||||||
.range = loc.range,
|
.range = loc.range,
|
||||||
.newText = context.new_name,
|
.newText = context.new_name,
|
||||||
};
|
});
|
||||||
try context.edits.put(context.allocator, loc.uri, text_edits.toOwnedSlice(context.allocator));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn renameSymbol(arena: *std.heap.ArenaAllocator, store: *DocumentStore, decl_handle: analysis.DeclWithHandle, new_name: []const u8, edits: *std.StringHashMapUnmanaged([]types.TextEdit), encoding: offsets.Encoding) !void {
|
pub fn renameSymbol(
|
||||||
|
arena: *std.heap.ArenaAllocator,
|
||||||
|
store: *DocumentStore,
|
||||||
|
decl_handle: analysis.DeclWithHandle,
|
||||||
|
new_name: []const u8,
|
||||||
|
edits: *std.StringHashMapUnmanaged(std.ArrayListUnmanaged(types.TextEdit)),
|
||||||
|
encoding: offsets.Encoding,
|
||||||
|
) !void {
|
||||||
std.debug.assert(decl_handle.decl.* != .label_decl);
|
std.debug.assert(decl_handle.decl.* != .label_decl);
|
||||||
try references.symbolReferences(arena, store, decl_handle, encoding, true, RefHandlerContext{
|
try references.symbolReferences(arena, store, decl_handle, encoding, true, RefHandlerContext{
|
||||||
.edits = edits,
|
.edits = edits,
|
||||||
@ -34,7 +36,13 @@ pub fn renameSymbol(arena: *std.heap.ArenaAllocator, store: *DocumentStore, decl
|
|||||||
}, refHandler, true, true);
|
}, refHandler, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn renameLabel(arena: *std.heap.ArenaAllocator, decl_handle: analysis.DeclWithHandle, new_name: []const u8, edits: *std.StringHashMapUnmanaged([]types.TextEdit), encoding: offsets.Encoding) !void {
|
pub fn renameLabel(
|
||||||
|
arena: *std.heap.ArenaAllocator,
|
||||||
|
decl_handle: analysis.DeclWithHandle,
|
||||||
|
new_name: []const u8,
|
||||||
|
edits: *std.StringHashMapUnmanaged(std.ArrayListUnmanaged(types.TextEdit)),
|
||||||
|
encoding: offsets.Encoding,
|
||||||
|
) !void {
|
||||||
std.debug.assert(decl_handle.decl.* == .label_decl);
|
std.debug.assert(decl_handle.decl.* == .label_decl);
|
||||||
try references.labelReferences(arena, decl_handle, encoding, true, RefHandlerContext{
|
try references.labelReferences(arena, decl_handle, encoding, true, RefHandlerContext{
|
||||||
.edits = edits,
|
.edits = edits,
|
||||||
|
@ -152,25 +152,21 @@ pub const TextDocument = struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
pub const WorkspaceEdit = struct {
|
pub const WorkspaceEdit = struct {
|
||||||
changes: ?std.StringHashMapUnmanaged([]TextEdit),
|
changes: std.StringHashMapUnmanaged(std.ArrayListUnmanaged(TextEdit)),
|
||||||
|
|
||||||
pub fn jsonStringify(self: WorkspaceEdit, options: std.json.StringifyOptions, writer: anytype) @TypeOf(writer).Error!void {
|
pub fn jsonStringify(self: WorkspaceEdit, options: std.json.StringifyOptions, writer: anytype) @TypeOf(writer).Error!void {
|
||||||
try writer.writeByte('{');
|
try writer.writeAll("{\"changes\": {");
|
||||||
if (self.changes) |changes| {
|
var it = self.changes.iterator();
|
||||||
try writer.writeAll("\"changes\": {");
|
var idx: usize = 0;
|
||||||
var it = changes.iterator();
|
while (it.next()) |entry| : (idx += 1) {
|
||||||
var idx: usize = 0;
|
if (idx != 0) try writer.writeAll(", ");
|
||||||
while (it.next()) |entry| : (idx += 1) {
|
|
||||||
if (idx != 0) try writer.writeAll(", ");
|
|
||||||
|
|
||||||
try writer.writeByte('"');
|
try writer.writeByte('"');
|
||||||
try writer.writeAll(entry.key_ptr.*);
|
try writer.writeAll(entry.key_ptr.*);
|
||||||
try writer.writeAll("\":");
|
try writer.writeAll("\":");
|
||||||
try std.json.stringify(entry.value_ptr.*, options, writer);
|
try std.json.stringify(entry.value_ptr.items, options, writer);
|
||||||
}
|
|
||||||
try writer.writeByte('}');
|
|
||||||
}
|
}
|
||||||
try writer.writeByte('}');
|
try writer.writeAll("}}");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user