Limit references to current document for documentHighlight

This commit is contained in:
Gregory Anders 2022-05-07 21:19:39 -06:00
parent 94770b86c6
commit b71a83b64a
3 changed files with 44 additions and 31 deletions

View File

@ -1151,6 +1151,7 @@ fn referencesDefinitionGlobal(
&locs, &locs,
std.ArrayList(types.Location).append, std.ArrayList(types.Location).append,
server.config.skip_std_references, server.config.skip_std_references,
!highlight,
); );
const result: types.ResponseParams = if (highlight) result: { const result: types.ResponseParams = if (highlight) result: {
@ -1185,7 +1186,17 @@ fn referencesDefinitionFieldAccess(
const decl = (try server.getSymbolFieldAccess(handle, arena, position, range)) orelse return try respondGeneric(id, null_result_response); const decl = (try server.getSymbolFieldAccess(handle, arena, position, range)) orelse return try respondGeneric(id, null_result_response);
var locs = std.ArrayList(types.Location).init(arena.allocator()); var locs = std.ArrayList(types.Location).init(arena.allocator());
try references.symbolReferences(arena, &server.document_store, decl, server.offset_encoding, include_decl, &locs, std.ArrayList(types.Location).append, server.config.skip_std_references); try references.symbolReferences(
arena,
&server.document_store,
decl,
server.offset_encoding,
include_decl,
&locs,
std.ArrayList(types.Location).append,
server.config.skip_std_references,
!highlight,
);
const result: types.ResponseParams = if (highlight) result: { const result: types.ResponseParams = if (highlight) result: {
var highlights = try std.ArrayList(types.DocumentHighlight).initCapacity(arena.allocator(), locs.items.len); var highlights = try std.ArrayList(types.DocumentHighlight).initCapacity(arena.allocator(), locs.items.len);
for (locs.items) |loc| { for (locs.items) |loc| {

View File

@ -492,7 +492,7 @@ fn symbolReferencesInternal(arena: *std.heap.ArenaAllocator, store: *DocumentSto
} }
} }
pub fn symbolReferences(arena: *std.heap.ArenaAllocator, store: *DocumentStore, decl_handle: analysis.DeclWithHandle, encoding: offsets.Encoding, include_decl: bool, context: anytype, comptime handler: anytype, skip_std_references: bool) !void { pub fn symbolReferences(arena: *std.heap.ArenaAllocator, store: *DocumentStore, decl_handle: analysis.DeclWithHandle, encoding: offsets.Encoding, include_decl: bool, context: anytype, comptime handler: anytype, skip_std_references: bool, workspace: bool) !void {
std.debug.assert(decl_handle.decl.* != .label_decl); std.debug.assert(decl_handle.decl.* != .label_decl);
const curr_handle = decl_handle.handle; const curr_handle = decl_handle.handle;
if (include_decl) { if (include_decl) {
@ -503,41 +503,43 @@ pub fn symbolReferences(arena: *std.heap.ArenaAllocator, store: *DocumentStore,
.ast_node => { .ast_node => {
try symbolReferencesInternal(arena, store, .{ .node = 0, .handle = curr_handle }, decl_handle, encoding, context, handler); try symbolReferencesInternal(arena, store, .{ .node = 0, .handle = curr_handle }, decl_handle, encoding, context, handler);
var imports = std.ArrayList(*DocumentStore.Handle).init(arena.allocator()); if (workspace) {
var imports = std.ArrayList(*DocumentStore.Handle).init(arena.allocator());
var handle_it = store.handles.iterator(); var handle_it = store.handles.iterator();
while (handle_it.next()) |entry| { while (handle_it.next()) |entry| {
if (skip_std_references and std.mem.indexOf(u8, entry.key_ptr.*, "std") != null) { if (skip_std_references and std.mem.indexOf(u8, entry.key_ptr.*, "std") != null) {
if (!include_decl or entry.value_ptr.* != curr_handle) if (!include_decl or entry.value_ptr.* != curr_handle)
continue; continue;
} }
// Check entry's transitive imports // Check entry's transitive imports
try imports.append(entry.value_ptr.*); try imports.append(entry.value_ptr.*);
var i: usize = 0; var i: usize = 0;
blk: while (i < imports.items.len) : (i += 1) { blk: while (i < imports.items.len) : (i += 1) {
const import = imports.items[i]; const import = imports.items[i];
for (import.imports_used.items) |uri| { for (import.imports_used.items) |uri| {
const h = store.getHandle(uri) orelse break; const h = store.getHandle(uri) orelse break;
if (h == curr_handle) { if (h == curr_handle) {
// entry does import curr_handle // entry does import curr_handle
try symbolReferencesInternal(arena, store, .{ .node = 0, .handle = entry.value_ptr.* }, decl_handle, encoding, context, handler); try symbolReferencesInternal(arena, store, .{ .node = 0, .handle = entry.value_ptr.* }, decl_handle, encoding, context, handler);
break :blk; break :blk;
} }
select: { select: {
for (imports.items) |item| { for (imports.items) |item| {
if (item == h) { if (item == h) {
// already checked this import // already checked this import
break :select; break :select;
} }
}
try imports.append(h);
} }
try imports.append(h);
} }
} }
try imports.resize(0);
} }
try imports.resize(0);
} }
}, },
.param_decl => |param| { .param_decl => |param| {

View File

@ -31,7 +31,7 @@ pub fn renameSymbol(arena: *std.heap.ArenaAllocator, store: *DocumentStore, decl
.edits = edits, .edits = edits,
.allocator = arena.allocator(), .allocator = arena.allocator(),
.new_name = new_name, .new_name = new_name,
}, refHandler, true); }, refHandler, true, true);
} }
pub fn renameLabel(arena: *std.heap.ArenaAllocator, decl_handle: analysis.DeclWithHandle, new_name: []const u8, edits: *std.StringHashMap([]types.TextEdit), encoding: offsets.Encoding) !void { pub fn renameLabel(arena: *std.heap.ArenaAllocator, decl_handle: analysis.DeclWithHandle, new_name: []const u8, edits: *std.StringHashMap([]types.TextEdit), encoding: offsets.Encoding) !void {