diff --git a/src/main.zig b/src/main.zig index 3dd9c3b..6dad69b 100644 --- a/src/main.zig +++ b/src/main.zig @@ -699,7 +699,7 @@ fn renameDefinitionGlobal(arena: *std.heap.ArenaAllocator, id: types.RequestId, var workspace_edit = types.WorkspaceEdit{ .changes = std.StringHashMap([]types.TextEdit).init(&arena.allocator), }; - try rename.renameSymbol(arena, &document_store, decl, new_name, &workspace_edit.changes.?); + try rename.renameSymbol(arena, &document_store, decl, new_name, &workspace_edit.changes.?, offset_encoding); try send(arena, types.Response{ .id = id, .result = .{ .WorkspaceEdit = workspace_edit }, @@ -720,7 +720,7 @@ fn renameDefinitionFieldAccess( var workspace_edit = types.WorkspaceEdit{ .changes = std.StringHashMap([]types.TextEdit).init(&arena.allocator), }; - try rename.renameSymbol(arena, &document_store, decl, new_name, &workspace_edit.changes.?); + try rename.renameSymbol(arena, &document_store, decl, new_name, &workspace_edit.changes.?, offset_encoding); try send(arena, types.Response{ .id = id, .result = .{ .WorkspaceEdit = workspace_edit }, @@ -733,7 +733,7 @@ fn renameDefinitionLabel(arena: *std.heap.ArenaAllocator, id: types.RequestId, h var workspace_edit = types.WorkspaceEdit{ .changes = std.StringHashMap([]types.TextEdit).init(&arena.allocator), }; - try rename.renameLabel(arena, decl, new_name, &workspace_edit.changes.?); + try rename.renameLabel(arena, decl, new_name, &workspace_edit.changes.?, offset_encoding); try send(arena, types.Response{ .id = id, .result = .{ .WorkspaceEdit = workspace_edit }, diff --git a/src/rename.zig b/src/rename.zig index 98d0f4c..237abf0 100644 --- a/src/rename.zig +++ b/src/rename.zig @@ -2,12 +2,12 @@ const std = @import("std"); const DocumentStore = @import("document_store.zig"); const analysis = @import("analysis.zig"); const types = @import("types.zig"); +const offsets = @import("offsets.zig"); const ast = std.zig.ast; -fn renameToken(handle: *DocumentStore.Handle, tok: ast.TokenIndex, new_name: []const u8, edits: *std.ArrayList(types.TextEdit)) !void { - // const handle.tree.tokenLocation(start_index: usize, token: Token.Loc) - const loc = handle.tree.tokenLocation(0, tok); +fn renameToken(handle: *DocumentStore.Handle, tok: ast.TokenIndex, new_name: []const u8, edits: *std.ArrayList(types.TextEdit), encoding: offsets.Encoding) !void { + const loc = offsets.tokenRelativeLocation(handle.tree, 0, tok, encoding) catch return; (try edits.addOne()).* = .{ .range = .{ .start = .{ @@ -16,14 +16,14 @@ fn renameToken(handle: *DocumentStore.Handle, tok: ast.TokenIndex, new_name: []c }, .end = .{ .line = @intCast(types.Integer, loc.line), - .character = @intCast(types.Integer, loc.column + handle.tree.token_locs[tok].end - handle.tree.token_locs[tok].start), + .character = @intCast(types.Integer, loc.column + offsets.tokenLength(handle.tree, tok, encoding)), }, }, .newText = new_name, }; } -pub fn renameLabel(arena: *std.heap.ArenaAllocator, decl: analysis.DeclWithHandle, new_name: []const u8, edits: *std.StringHashMap([]types.TextEdit)) !void { +pub fn renameLabel(arena: *std.heap.ArenaAllocator, decl: analysis.DeclWithHandle, new_name: []const u8, edits: *std.StringHashMap([]types.TextEdit), encoding: offsets.Encoding) !void { std.debug.assert(decl.decl.* == .label_decl); const handle = decl.handle; @@ -35,7 +35,7 @@ pub fn renameLabel(arena: *std.heap.ArenaAllocator, decl: analysis.DeclWithHandl const last_tok = decl.decl.label_decl.lastToken(); // The first token is always going to be the label - try renameToken(handle, first_tok, new_name, &text_edits); + try renameToken(handle, first_tok, new_name, &text_edits, encoding); var curr_tok = first_tok + 1; while (curr_tok < last_tok - 2) : (curr_tok += 1) { @@ -44,7 +44,7 @@ pub fn renameLabel(arena: *std.heap.ArenaAllocator, decl: analysis.DeclWithHandl handle.tree.token_ids[curr_tok + 2] == .Identifier) { if (std.mem.eql(u8, handle.tree.tokenSlice(curr_tok + 2), handle.tree.tokenSlice(first_tok))) { - try renameToken(handle, curr_tok + 2, new_name, &text_edits); + try renameToken(handle, curr_tok + 2, new_name, &text_edits, encoding); } } } @@ -59,6 +59,7 @@ fn renameSymbolInternal( decl: analysis.DeclWithHandle, new_name: []const u8, edits: *std.ArrayList(types.TextEdit), + encoding: offsets.Encoding, ) error{OutOfMemory}!void { const node = node_handle.node; const handle = node_handle.handle; @@ -67,35 +68,35 @@ fn renameSymbolInternal( .ContainerDecl, .Root, .Block => { var idx: usize = 0; while (node.iterate(idx)) |child| : (idx += 1) { - try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits, encoding); } }, .VarDecl => { const var_decl = node.cast(ast.Node.VarDecl).?; if (var_decl.type_node) |type_node| { - try renameSymbolInternal(arena, store, .{ .node = type_node, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = type_node, .handle = handle }, decl, new_name, edits, encoding); } if (var_decl.init_node) |init_node| { - try renameSymbolInternal(arena, store, .{ .node = init_node, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = init_node, .handle = handle }, decl, new_name, edits, encoding); } }, .Use => { const use = node.cast(ast.Node.Use).?; - try renameSymbolInternal(arena, store, .{ .node = use.expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = use.expr, .handle = handle }, decl, new_name, edits, encoding); }, .ContainerField => { const field = node.cast(ast.Node.ContainerField).?; if (field.type_expr) |type_node| { - try renameSymbolInternal(arena, store, .{ .node = type_node, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = type_node, .handle = handle }, decl, new_name, edits, encoding); } if (field.value_expr) |init_node| { - try renameSymbolInternal(arena, store, .{ .node = init_node, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = init_node, .handle = handle }, decl, new_name, edits, encoding); } }, .Identifier => { if (try analysis.lookupSymbolGlobal(store, arena, handle, handle.tree.getNodeSource(node), handle.tree.token_locs[node.firstToken()].start)) |child| { if (std.meta.eql(decl, child)) { - try renameToken(handle, node.firstToken(), new_name, edits); + try renameToken(handle, node.firstToken(), new_name, edits, encoding); } } }, @@ -104,90 +105,90 @@ fn renameSymbolInternal( for (fn_proto.paramsConst()) |param| { switch (param.param_type) { .type_expr => |type_node| { - try renameSymbolInternal(arena, store, .{ .node = type_node, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = type_node, .handle = handle }, decl, new_name, edits, encoding); }, else => {}, } } switch (fn_proto.return_type) { .Explicit, .InferErrorSet => |type_node| { - try renameSymbolInternal(arena, store, .{ .node = type_node, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = type_node, .handle = handle }, decl, new_name, edits, encoding); }, else => {}, } if (fn_proto.align_expr) |align_expr| { - try renameSymbolInternal(arena, store, .{ .node = align_expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = align_expr, .handle = handle }, decl, new_name, edits, encoding); } if (fn_proto.section_expr) |section_expr| { - try renameSymbolInternal(arena, store, .{ .node = section_expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = section_expr, .handle = handle }, decl, new_name, edits, encoding); } if (fn_proto.callconv_expr) |callconv_expr| { - try renameSymbolInternal(arena, store, .{ .node = callconv_expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = callconv_expr, .handle = handle }, decl, new_name, edits, encoding); } if (fn_proto.body_node) |body| { - try renameSymbolInternal(arena, store, .{ .node = body, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = body, .handle = handle }, decl, new_name, edits, encoding); } }, .AnyFrameType => { const anyframe_type = node.cast(ast.Node.AnyFrameType).?; if (anyframe_type.result) |result| { - try renameSymbolInternal(arena, store, .{ .node = result.return_type, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = result.return_type, .handle = handle }, decl, new_name, edits, encoding); } }, .Defer => { const defer_node = node.cast(ast.Node.Defer).?; - try renameSymbolInternal(arena, store, .{ .node = defer_node.expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = defer_node.expr, .handle = handle }, decl, new_name, edits, encoding); }, .Comptime => { const comptime_node = node.cast(ast.Node.Comptime).?; - try renameSymbolInternal(arena, store, .{ .node = comptime_node.expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = comptime_node.expr, .handle = handle }, decl, new_name, edits, encoding); }, .Nosuspend => { const nosuspend_node = node.cast(ast.Node.Nosuspend).?; - try renameSymbolInternal(arena, store, .{ .node = nosuspend_node.expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = nosuspend_node.expr, .handle = handle }, decl, new_name, edits, encoding); }, .Switch => { // TODO When renaming a union(enum) field, also rename switch items that refer to it. const switch_node = node.cast(ast.Node.Switch).?; - try renameSymbolInternal(arena, store, .{ .node = switch_node.expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = switch_node.expr, .handle = handle }, decl, new_name, edits, encoding); for (switch_node.casesConst()) |case| { if (case.*.cast(ast.Node.SwitchCase)) |case_node| { - try renameSymbolInternal(arena, store, .{ .node = case_node.expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = case_node.expr, .handle = handle }, decl, new_name, edits, encoding); } } }, .While => { const while_node = node.cast(ast.Node.While).?; - try renameSymbolInternal(arena, store, .{ .node = while_node.condition, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = while_node.condition, .handle = handle }, decl, new_name, edits, encoding); if (while_node.continue_expr) |cont_expr| { - try renameSymbolInternal(arena, store, .{ .node = cont_expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = cont_expr, .handle = handle }, decl, new_name, edits, encoding); } - try renameSymbolInternal(arena, store, .{ .node = while_node.body, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = while_node.body, .handle = handle }, decl, new_name, edits, encoding); if (while_node.@"else") |else_node| { - try renameSymbolInternal(arena, store, .{ .node = else_node.body, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = else_node.body, .handle = handle }, decl, new_name, edits, encoding); } }, .For => { const for_node = node.cast(ast.Node.For).?; - try renameSymbolInternal(arena, store, .{ .node = for_node.array_expr, .handle = handle }, decl, new_name, edits); - try renameSymbolInternal(arena, store, .{ .node = for_node.body, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = for_node.array_expr, .handle = handle }, decl, new_name, edits, encoding); + try renameSymbolInternal(arena, store, .{ .node = for_node.body, .handle = handle }, decl, new_name, edits, encoding); if (for_node.@"else") |else_node| { - try renameSymbolInternal(arena, store, .{ .node = else_node.body, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = else_node.body, .handle = handle }, decl, new_name, edits, encoding); } }, .If => { const if_node = node.cast(ast.Node.If).?; - try renameSymbolInternal(arena, store, .{ .node = if_node.condition, .handle = handle }, decl, new_name, edits); - try renameSymbolInternal(arena, store, .{ .node = if_node.body, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = if_node.condition, .handle = handle }, decl, new_name, edits, encoding); + try renameSymbolInternal(arena, store, .{ .node = if_node.body, .handle = handle }, decl, new_name, edits, encoding); if (if_node.@"else") |else_node| { - try renameSymbolInternal(arena, store, .{ .node = else_node.body, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = else_node.body, .handle = handle }, decl, new_name, edits, encoding); } }, .InfixOp => { const infix_op = node.cast(ast.Node.InfixOp).?; switch (infix_op.op) { .Period => { - try renameSymbolInternal(arena, store, .{ .node = infix_op.lhs, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = infix_op.lhs, .handle = handle }, decl, new_name, edits, encoding); const rhs_str = analysis.nodeToString(handle.tree, infix_op.rhs) orelse return; var bound_type_params = analysis.BoundTypeParams.init(&arena.allocator); @@ -214,13 +215,13 @@ fn renameSymbolInternal( !left_type.type.is_type_val, )) |child| { if (std.meta.eql(child, decl)) { - try renameToken(handle, infix_op.rhs.firstToken(), new_name, edits); + try renameToken(handle, infix_op.rhs.firstToken(), new_name, edits, encoding); } } }, else => { - try renameSymbolInternal(arena, store, .{ .node = infix_op.lhs, .handle = handle }, decl, new_name, edits); - try renameSymbolInternal(arena, store, .{ .node = infix_op.rhs, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = infix_op.lhs, .handle = handle }, decl, new_name, edits, encoding); + try renameSymbolInternal(arena, store, .{ .node = infix_op.rhs, .handle = handle }, decl, new_name, edits, encoding); }, } }, @@ -228,78 +229,78 @@ fn renameSymbolInternal( const prefix_op = node.cast(ast.Node.PrefixOp).?; switch (prefix_op.op) { .ArrayType => |info| { - try renameSymbolInternal(arena, store, .{ .node = info.len_expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = info.len_expr, .handle = handle }, decl, new_name, edits, encoding); if (info.sentinel) |sentinel| { - try renameSymbolInternal(arena, store, .{ .node = sentinel, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = sentinel, .handle = handle }, decl, new_name, edits, encoding); } }, .PtrType, .SliceType => |info| { if (info.align_info) |align_info| { - try renameSymbolInternal(arena, store, .{ .node = align_info.node, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = align_info.node, .handle = handle }, decl, new_name, edits, encoding); if (align_info.bit_range) |range| { - try renameSymbolInternal(arena, store, .{ .node = range.start, .handle = handle }, decl, new_name, edits); - try renameSymbolInternal(arena, store, .{ .node = range.end, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = range.start, .handle = handle }, decl, new_name, edits, encoding); + try renameSymbolInternal(arena, store, .{ .node = range.end, .handle = handle }, decl, new_name, edits, encoding); } } if (info.sentinel) |sentinel| { - try renameSymbolInternal(arena, store, .{ .node = sentinel, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = sentinel, .handle = handle }, decl, new_name, edits, encoding); } }, else => {}, } - try renameSymbolInternal(arena, store, .{ .node = prefix_op.rhs, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = prefix_op.rhs, .handle = handle }, decl, new_name, edits, encoding); }, .FieldInitializer => { // TODO Rename field initializer names when needed const field_init = node.cast(ast.Node.FieldInitializer).?; - try renameSymbolInternal(arena, store, .{ .node = field_init.expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = field_init.expr, .handle = handle }, decl, new_name, edits, encoding); }, .ArrayInitializer => { const array_init = node.cast(ast.Node.ArrayInitializer).?; - try renameSymbolInternal(arena, store, .{ .node = array_init.lhs, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = array_init.lhs, .handle = handle }, decl, new_name, edits, encoding); for (array_init.listConst()) |child| { - try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits, encoding); } }, .ArrayInitializerDot => { const array_init = node.cast(ast.Node.ArrayInitializerDot).?; for (array_init.listConst()) |child| { - try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits, encoding); } }, .StructInitializer => { // TODO Rename field initializer names when needed const struct_init = node.cast(ast.Node.StructInitializer).?; - try renameSymbolInternal(arena, store, .{ .node = struct_init.lhs, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = struct_init.lhs, .handle = handle }, decl, new_name, edits, encoding); for (struct_init.listConst()) |child| { - try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits, encoding); } }, .StructInitializerDot => { const struct_init = node.cast(ast.Node.StructInitializerDot).?; for (struct_init.listConst()) |child| { - try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = child, .handle = handle }, decl, new_name, edits, encoding); } }, .Call => { const call = node.cast(ast.Node.Call).?; - try renameSymbolInternal(arena, store, .{ .node = call.lhs, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = call.lhs, .handle = handle }, decl, new_name, edits, encoding); for (call.paramsConst()) |param| { - try renameSymbolInternal(arena, store, .{ .node = param, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = param, .handle = handle }, decl, new_name, edits, encoding); } }, .SuffixOp => { const suffix_op = node.cast(ast.Node.SuffixOp).?; - try renameSymbolInternal(arena, store, .{ .node = suffix_op.lhs, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = suffix_op.lhs, .handle = handle }, decl, new_name, edits, encoding); switch (suffix_op.op) { - .ArrayAccess => |acc| try renameSymbolInternal(arena, store, .{ .node = acc, .handle = handle }, decl, new_name, edits), + .ArrayAccess => |acc| try renameSymbolInternal(arena, store, .{ .node = acc, .handle = handle }, decl, new_name, edits, encoding), .Slice => |sl| { - try renameSymbolInternal(arena, store, .{ .node = sl.start, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = sl.start, .handle = handle }, decl, new_name, edits, encoding); if (sl.end) |end| { - try renameSymbolInternal(arena, store, .{ .node = end, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = end, .handle = handle }, decl, new_name, edits, encoding); } if (sl.sentinel) |sentinel| { - try renameSymbolInternal(arena, store, .{ .node = sentinel, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = sentinel, .handle = handle }, decl, new_name, edits, encoding); } }, else => {}, @@ -307,30 +308,30 @@ fn renameSymbolInternal( }, .GroupedExpression => { const grouped = node.cast(ast.Node.GroupedExpression).?; - try renameSymbolInternal(arena, store, .{ .node = grouped.expr, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = grouped.expr, .handle = handle }, decl, new_name, edits, encoding); }, .ControlFlowExpression => { const cfe = node.cast(ast.Node.ControlFlowExpression).?; if (cfe.rhs) |rhs| { - try renameSymbolInternal(arena, store, .{ .node = rhs, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = rhs, .handle = handle }, decl, new_name, edits, encoding); } }, .Suspend => { const suspend_node = node.cast(ast.Node.Suspend).?; if (suspend_node.body) |body| { - try renameSymbolInternal(arena, store, .{ .node = body, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = body, .handle = handle }, decl, new_name, edits, encoding); } }, .BuiltinCall => { const builtin_call = node.cast(ast.Node.BuiltinCall).?; for (builtin_call.paramsConst()) |param| { - try renameSymbolInternal(arena, store, .{ .node = param, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = param, .handle = handle }, decl, new_name, edits, encoding); } }, // TODO Inline asm expr .TestDecl => { const test_decl = node.cast(ast.Node.TestDecl).?; - try renameSymbolInternal(arena, store, .{ .node = test_decl.body_node, .handle = handle }, decl, new_name, edits); + try renameSymbolInternal(arena, store, .{ .node = test_decl.body_node, .handle = handle }, decl, new_name, edits, encoding); }, else => {}, } @@ -342,6 +343,7 @@ pub fn renameSymbol( decl_handle: analysis.DeclWithHandle, new_name: []const u8, edits: *std.StringHashMap([]types.TextEdit), + encoding: offsets.Encoding, ) !void { std.debug.assert(decl_handle.decl.* != .label_decl); const curr_handle = decl_handle.handle; @@ -356,10 +358,10 @@ pub fn renameSymbol( for (handles.items) |handle| { var text_edits = std.ArrayList(types.TextEdit).init(&arena.allocator); if (handle == curr_handle) { - try renameToken(curr_handle, decl_handle.nameToken(), new_name, &text_edits); + try renameToken(curr_handle, decl_handle.nameToken(), new_name, &text_edits, encoding); } - try renameSymbolInternal(arena, store, .{ .node = &handle.tree.root_node.base, .handle = handle }, decl_handle, new_name, &text_edits); + try renameSymbolInternal(arena, store, .{ .node = &handle.tree.root_node.base, .handle = handle }, decl_handle, new_name, &text_edits, encoding); if (text_edits.items.len > 0) { try edits.putNoClobber(handle.uri(), text_edits.items); } @@ -368,7 +370,7 @@ pub fn renameSymbol( .param_decl => |param| { var curr_doc_text_edits = std.ArrayList(types.TextEdit).init(&arena.allocator); // Rename the param tok. - try renameToken(curr_handle, decl_handle.nameToken(), new_name, &curr_doc_text_edits); + try renameToken(curr_handle, decl_handle.nameToken(), new_name, &curr_doc_text_edits, encoding); const fn_node = loop: for (curr_handle.document_scope.scopes) |scope| { switch (scope.data) { .function => |proto| { @@ -385,14 +387,14 @@ pub fn renameSymbol( return; }; if (fn_node.body_node) |body| { - try renameSymbolInternal(arena, store, .{ .node = body, .handle = curr_handle }, decl_handle, new_name, &curr_doc_text_edits); + try renameSymbolInternal(arena, store, .{ .node = body, .handle = curr_handle }, decl_handle, new_name, &curr_doc_text_edits, encoding); } try edits.putNoClobber(curr_handle.uri(), curr_doc_text_edits.items); }, .pointer_payload, .array_payload, .switch_payload => { var curr_doc_text_edits = std.ArrayList(types.TextEdit).init(&arena.allocator); - try renameToken(curr_handle, decl_handle.nameToken(), new_name, &curr_doc_text_edits); - try renameSymbolInternal(arena, store, .{ .node = &curr_handle.tree.root_node.base, .handle = curr_handle }, decl_handle, new_name, &curr_doc_text_edits); + try renameToken(curr_handle, decl_handle.nameToken(), new_name, &curr_doc_text_edits, encoding); + try renameSymbolInternal(arena, store, .{ .node = &curr_handle.tree.root_node.base, .handle = curr_handle }, decl_handle, new_name, &curr_doc_text_edits, encoding); try edits.putNoClobber(curr_handle.uri(), curr_doc_text_edits.items); }, .label_decl => unreachable,