Only return highlights for symbols in current document

This seems to only occur when highlighting "field access" symbols, e.g.
"bar" in a statement such as `foo.bar`. This is because the
`symbolReferencesInternal` function finds the reference to the field in
the container even when the container is not in the current document.
This commit is contained in:
Gregory Anders 2022-08-10 16:03:00 -06:00
parent 8847ed54f9
commit c4f3cd0efa

View File

@ -1144,12 +1144,15 @@ fn referencesDefinitionGlobal(
const result: types.ResponseParams = if (highlight) result: { const result: types.ResponseParams = if (highlight) result: {
var highlights = try std.ArrayList(types.DocumentHighlight).initCapacity(server.arena.allocator(), locs.items.len); var highlights = try std.ArrayList(types.DocumentHighlight).initCapacity(server.arena.allocator(), locs.items.len);
const uri = handle.uri();
for (locs.items) |loc| { for (locs.items) |loc| {
if (std.mem.eql(u8, loc.uri, uri)) {
highlights.appendAssumeCapacity(.{ highlights.appendAssumeCapacity(.{
.range = loc.range, .range = loc.range,
.kind = .Text, .kind = .Text,
}); });
} }
}
break :result .{ .DocumentHighlight = highlights.items }; break :result .{ .DocumentHighlight = highlights.items };
} else .{ .Locations = locs.items }; } else .{ .Locations = locs.items };
@ -1187,12 +1190,15 @@ fn referencesDefinitionFieldAccess(
); );
const result: types.ResponseParams = if (highlight) result: { const result: types.ResponseParams = if (highlight) result: {
var highlights = try std.ArrayList(types.DocumentHighlight).initCapacity(server.arena.allocator(), locs.items.len); var highlights = try std.ArrayList(types.DocumentHighlight).initCapacity(server.arena.allocator(), locs.items.len);
const uri = handle.uri();
for (locs.items) |loc| { for (locs.items) |loc| {
if (std.mem.eql(u8, loc.uri, uri)) {
highlights.appendAssumeCapacity(.{ highlights.appendAssumeCapacity(.{
.range = loc.range, .range = loc.range,
.kind = .Text, .kind = .Text,
}); });
} }
}
break :result .{ .DocumentHighlight = highlights.items }; break :result .{ .DocumentHighlight = highlights.items };
} else .{ .Locations = locs.items }; } else .{ .Locations = locs.items };
try send(writer, server.arena.allocator(), types.Response{ try send(writer, server.arena.allocator(), types.Response{
@ -1218,12 +1224,15 @@ fn referencesDefinitionLabel(
try references.labelReferences(&server.arena, decl, server.offset_encoding, include_decl, &locs, std.ArrayList(types.Location).append); try references.labelReferences(&server.arena, decl, server.offset_encoding, include_decl, &locs, std.ArrayList(types.Location).append);
const result: types.ResponseParams = if (highlight) result: { const result: types.ResponseParams = if (highlight) result: {
var highlights = try std.ArrayList(types.DocumentHighlight).initCapacity(server.arena.allocator(), locs.items.len); var highlights = try std.ArrayList(types.DocumentHighlight).initCapacity(server.arena.allocator(), locs.items.len);
const uri = handle.uri();
for (locs.items) |loc| { for (locs.items) |loc| {
if (std.mem.eql(u8, loc.uri, uri)) {
highlights.appendAssumeCapacity(.{ highlights.appendAssumeCapacity(.{
.range = loc.range, .range = loc.range,
.kind = .Text, .kind = .Text,
}); });
} }
}
break :result .{ .DocumentHighlight = highlights.items }; break :result .{ .DocumentHighlight = highlights.items };
} else .{ .Locations = locs.items }; } else .{ .Locations = locs.items };
try send(writer, server.arena.allocator(), types.Response{ try send(writer, server.arena.allocator(), types.Response{