language: Only block the foreground on buffer reparsing when necessary (#43888)

Gist is we only need to block the foreground thread for reparsing if
immediate language changes are useful to the user. That is usually only
the case when they edit the buffer

Release Notes:

- Improved performance of large project searches and project diffs

Co-authored by: David Kleingeld <david@zed.dev>
This commit is contained in:
Lukas Wirth
2025-12-01 14:57:15 +01:00
committed by GitHub
parent 3969109aa3
commit 9af6e82e65
54 changed files with 363 additions and 250 deletions
+1 -1
View File
@@ -40,7 +40,7 @@ mod tests {
});
cx.new(|cx| {
let mut buffer = Buffer::local("", cx).with_language(language, cx);
let mut buffer = Buffer::local("", cx).with_language_immediate(language, cx);
let expect_indents_to =
|buffer: &mut Buffer, cx: &mut Context<Buffer>, input: &str, expected: &str| {
+2 -2
View File
@@ -388,7 +388,7 @@ mod tests {
let language = crate::language("c", tree_sitter_c::LANGUAGE.into());
cx.new(|cx| {
let mut buffer = Buffer::local("", cx).with_language(language, cx);
let mut buffer = Buffer::local("", cx).with_language_immediate(language, cx);
buffer.edit([(0..0, "int main() {}")], None, cx);
@@ -418,7 +418,7 @@ mod tests {
let language = crate::language("c", tree_sitter_c::LANGUAGE.into());
cx.new(|cx| {
let mut buffer = Buffer::local("", cx).with_language(language, cx);
let mut buffer = Buffer::local("", cx).with_language_immediate(language, cx);
buffer.edit(
[(
+2 -2
View File
@@ -20,7 +20,7 @@ mod tests {
let language = crate::language("cpp", tree_sitter_cpp::LANGUAGE.into());
cx.new(|cx| {
let mut buffer = Buffer::local("", cx).with_language(language, cx);
let mut buffer = Buffer::local("", cx).with_language_immediate(language, cx);
buffer.edit([(0..0, "int main() {}")], None, cx);
@@ -50,7 +50,7 @@ mod tests {
let language = crate::language("cpp", tree_sitter_cpp::LANGUAGE.into());
cx.new(|cx| {
let mut buffer = Buffer::local("", cx).with_language(language, cx);
let mut buffer = Buffer::local("", cx).with_language_immediate(language, cx);
buffer.edit(
[(
+2 -1
View File
@@ -224,7 +224,8 @@ mod tests {
"#
.unindent();
let buffer = cx.new(|cx| language::Buffer::local(text, cx).with_language(language, cx));
let buffer =
cx.new(|cx| language::Buffer::local(text, cx).with_language_immediate(language, cx));
let outline = buffer.read_with(cx, |buffer, _| buffer.snapshot().outline(None));
assert_eq!(
outline
+22 -14
View File
@@ -868,8 +868,9 @@ mod tests {
}
"#;
let buffer = cx
.new(|cx| crate::Buffer::local(testify_suite, cx).with_language(language.clone(), cx));
let buffer = cx.new(|cx| {
crate::Buffer::local(testify_suite, cx).with_language_immediate(language.clone(), cx)
});
cx.executor().run_until_parked();
let runnables: Vec<_> = buffer.update(cx, |buffer, _| {
@@ -926,7 +927,8 @@ mod tests {
"#;
let buffer = cx.new(|cx| {
crate::Buffer::local(interpreted_string_subtest, cx).with_language(language.clone(), cx)
crate::Buffer::local(interpreted_string_subtest, cx)
.with_language_immediate(language.clone(), cx)
});
cx.executor().run_until_parked();
@@ -955,7 +957,8 @@ mod tests {
);
let buffer = cx.new(|cx| {
crate::Buffer::local(raw_string_subtest, cx).with_language(language.clone(), cx)
crate::Buffer::local(raw_string_subtest, cx)
.with_language_immediate(language.clone(), cx)
});
cx.executor().run_until_parked();
@@ -999,8 +1002,9 @@ mod tests {
}
"#;
let buffer =
cx.new(|cx| crate::Buffer::local(example_test, cx).with_language(language.clone(), cx));
let buffer = cx.new(|cx| {
crate::Buffer::local(example_test, cx).with_language_immediate(language.clone(), cx)
});
cx.executor().run_until_parked();
let runnables: Vec<_> = buffer.update(cx, |buffer, _| {
@@ -1070,8 +1074,9 @@ mod tests {
}
"#;
let buffer =
cx.new(|cx| crate::Buffer::local(table_test, cx).with_language(language.clone(), cx));
let buffer = cx.new(|cx| {
crate::Buffer::local(table_test, cx).with_language_immediate(language.clone(), cx)
});
cx.executor().run_until_parked();
let runnables: Vec<_> = buffer.update(cx, |buffer, _| {
@@ -1138,8 +1143,9 @@ mod tests {
}
"#;
let buffer =
cx.new(|cx| crate::Buffer::local(table_test, cx).with_language(language.clone(), cx));
let buffer = cx.new(|cx| {
crate::Buffer::local(table_test, cx).with_language_immediate(language.clone(), cx)
});
cx.executor().run_until_parked();
let runnables: Vec<_> = buffer.update(cx, |buffer, _| {
@@ -1210,8 +1216,9 @@ mod tests {
}
"#;
let buffer =
cx.new(|cx| crate::Buffer::local(table_test, cx).with_language(language.clone(), cx));
let buffer = cx.new(|cx| {
crate::Buffer::local(table_test, cx).with_language_immediate(language.clone(), cx)
});
cx.executor().run_until_parked();
let runnables: Vec<_> = buffer.update(cx, |buffer, _| {
@@ -1277,8 +1284,9 @@ mod tests {
}
"#;
let buffer =
cx.new(|cx| crate::Buffer::local(table_test, cx).with_language(language.clone(), cx));
let buffer = cx.new(|cx| {
crate::Buffer::local(table_test, cx).with_language_immediate(language.clone(), cx)
});
cx.executor().run_until_parked();
let runnables: Vec<_> = buffer.update(cx, |buffer, _| {
+1 -1
View File
@@ -2326,7 +2326,7 @@ mod tests {
});
cx.new(|cx| {
let mut buffer = Buffer::local("", cx).with_language(language, cx);
let mut buffer = Buffer::local("", cx).with_language_immediate(language, cx);
let append = |buffer: &mut Buffer, text: &str, cx: &mut Context<Buffer>| {
let ix = buffer.len();
buffer.edit([(ix..ix, text)], Some(AutoindentMode::EachLine), cx);
+1 -1
View File
@@ -1430,7 +1430,7 @@ mod tests {
let language = crate::language("rust", tree_sitter_rust::LANGUAGE.into());
cx.new(|cx| {
let mut buffer = Buffer::local("", cx).with_language(language, cx);
let mut buffer = Buffer::local("", cx).with_language_immediate(language, cx);
// indent between braces
buffer.set_text("fn a() {}", cx);
+10 -5
View File
@@ -895,7 +895,8 @@ mod tests {
"#
.unindent();
let buffer = cx.new(|cx| language::Buffer::local(text, cx).with_language(language, cx));
let buffer = cx
.new(|cx| language::Buffer::local(text, cx).with_language_immediate(language, cx));
let outline = buffer.read_with(cx, |buffer, _| buffer.snapshot().outline(None));
assert_eq!(
outline
@@ -954,7 +955,8 @@ mod tests {
"#
.unindent();
let buffer = cx.new(|cx| language::Buffer::local(text, cx).with_language(language, cx));
let buffer = cx
.new(|cx| language::Buffer::local(text, cx).with_language_immediate(language, cx));
let outline = buffer.read_with(cx, |buffer, _| buffer.snapshot().outline(None));
assert_eq!(
outline
@@ -1026,7 +1028,8 @@ mod tests {
"#
.unindent();
let buffer = cx.new(|cx| language::Buffer::local(text, cx).with_language(language, cx));
let buffer = cx
.new(|cx| language::Buffer::local(text, cx).with_language_immediate(language, cx));
let outline = buffer.read_with(cx, |buffer, _| buffer.snapshot().outline(None));
assert_eq!(
outline
@@ -1106,7 +1109,8 @@ mod tests {
"#
.unindent();
let buffer = cx.new(|cx| language::Buffer::local(text, cx).with_language(language, cx));
let buffer = cx
.new(|cx| language::Buffer::local(text, cx).with_language_immediate(language, cx));
let outline = buffer.read_with(cx, |buffer, _| buffer.snapshot().outline(None));
assert_eq!(
outline
@@ -1177,7 +1181,8 @@ mod tests {
"#
.unindent();
let buffer = cx.new(|cx| language::Buffer::local(text, cx).with_language(language, cx));
let buffer =
cx.new(|cx| language::Buffer::local(text, cx).with_language_immediate(language, cx));
let outline = buffer.read_with(cx, |buffer, _| buffer.snapshot().outline(None));
assert_eq!(
outline