Fix bracket colorization not working in file-less files with a proper language (#43947)

Follow-up of https://github.com/zed-industries/zed/pull/43172

Release Notes:

- Fixed bracket colorization in file-less files with a proper language
This commit is contained in:
Kirill Bulatov
2025-12-01 21:53:54 +00:00
committed by GitHub
parent 33513292af
commit de392cda39
4 changed files with 54 additions and 10 deletions
+36 -2
View File
@@ -43,7 +43,7 @@ impl Editor {
.collect_array()
};
let bracket_matches_by_accent = self.visible_excerpts(cx).into_iter().fold(
let bracket_matches_by_accent = self.visible_excerpts(false, cx).into_iter().fold(
HashMap::default(),
|mut acc, (excerpt_id, (buffer, buffer_version, buffer_range))| {
let buffer_snapshot = buffer.read(cx).snapshot();
@@ -164,7 +164,7 @@ mod tests {
use super::*;
use crate::{
DisplayPoint, EditorSnapshot, MoveToBeginning, MoveToEnd, MoveUp,
DisplayPoint, EditorMode, EditorSnapshot, MoveToBeginning, MoveToEnd, MoveUp,
display_map::{DisplayRow, ToDisplayPoint},
editor_tests::init_test,
test::{
@@ -276,6 +276,40 @@ where
);
}
#[gpui::test]
async fn test_file_less_file_colorization(cx: &mut gpui::TestAppContext) {
init_test(cx, |language_settings| {
language_settings.defaults.colorize_brackets = Some(true);
});
let editor = cx.add_window(|window, cx| {
let multi_buffer = MultiBuffer::build_simple("fn main() {}", cx);
multi_buffer.update(cx, |multi_buffer, cx| {
multi_buffer
.as_singleton()
.unwrap()
.update(cx, |buffer, cx| {
buffer.set_language(Some(rust_lang()), cx);
});
});
Editor::new(EditorMode::full(), multi_buffer, None, window, cx)
});
cx.executor().advance_clock(Duration::from_millis(100));
cx.executor().run_until_parked();
assert_eq!(
"fn main«1()1» «1{}1»
1 hsla(207.80, 16.20%, 69.19%, 1.00)
",
editor
.update(cx, |editor, window, cx| {
editor_bracket_colors_markup(&editor.snapshot(window, cx))
})
.unwrap(),
"File-less buffer should still have its brackets colorized"
);
}
#[gpui::test]
async fn test_markdown_bracket_colorization(cx: &mut gpui::TestAppContext) {
init_test(cx, |language_settings| {
+15 -5
View File
@@ -5308,12 +5308,10 @@ impl Editor {
pub fn visible_excerpts(
&self,
lsp_related_only: bool,
cx: &mut Context<Editor>,
) -> HashMap<ExcerptId, (Entity<Buffer>, clock::Global, Range<usize>)> {
let Some(project) = self.project() else {
return HashMap::default();
};
let project = project.read(cx);
let project = self.project().cloned();
let multi_buffer = self.buffer().read(cx);
let multi_buffer_snapshot = multi_buffer.snapshot(cx);
let multi_buffer_visible_start = self
@@ -5331,6 +5329,18 @@ impl Editor {
.into_iter()
.filter(|(_, excerpt_visible_range, _)| !excerpt_visible_range.is_empty())
.filter_map(|(buffer, excerpt_visible_range, excerpt_id)| {
if !lsp_related_only {
return Some((
excerpt_id,
(
multi_buffer.buffer(buffer.remote_id()).unwrap(),
buffer.version().clone(),
excerpt_visible_range.start.0..excerpt_visible_range.end.0,
),
));
}
let project = project.as_ref()?.read(cx);
let buffer_file = project::File::from_dyn(buffer.file())?;
let buffer_worktree = project.worktree_for_id(buffer_file.worktree_id(cx), cx)?;
let worktree_entry = buffer_worktree
@@ -22592,7 +22602,7 @@ impl Editor {
if self.ignore_lsp_data() {
return;
}
for (_, (visible_buffer, _, _)) in self.visible_excerpts(cx) {
for (_, (visible_buffer, _, _)) in self.visible_excerpts(true, cx) {
self.register_buffer(visible_buffer.read(cx).remote_id(), cx);
}
}
+2 -2
View File
@@ -291,7 +291,7 @@ impl Editor {
}),
};
let mut visible_excerpts = self.visible_excerpts(cx);
let mut visible_excerpts = self.visible_excerpts(true, cx);
let mut invalidate_hints_for_buffers = HashSet::default();
let ignore_previous_fetches = match reason {
InlayHintRefreshReason::ModifiersChanged(_)
@@ -2211,7 +2211,7 @@ pub mod tests {
cx: &mut gpui::TestAppContext,
) -> Range<Point> {
let ranges = editor
.update(cx, |editor, _window, cx| editor.visible_excerpts(cx))
.update(cx, |editor, _window, cx| editor.visible_excerpts(true, cx))
.unwrap();
assert_eq!(
ranges.len(),
+1 -1
View File
@@ -164,7 +164,7 @@ impl Editor {
}
let visible_buffers = self
.visible_excerpts(cx)
.visible_excerpts(true, cx)
.into_values()
.map(|(buffer, ..)| buffer)
.filter(|editor_buffer| {