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
+4 -4
View File
@@ -2210,7 +2210,7 @@ pub mod tests {
})
});
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
cx.condition(&buffer, |buf, _| !buf.is_parsing()).await;
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
@@ -2312,7 +2312,7 @@ pub mod tests {
cx.update(|cx| init_test(cx, |_| {}));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
cx.condition(&buffer, |buf, _| !buf.is_parsing()).await;
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let buffer_snapshot = buffer.read_with(cx, |buffer, cx| buffer.snapshot(cx));
@@ -2647,7 +2647,7 @@ pub mod tests {
cx.update(|cx| init_test(cx, |_| {}));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
cx.condition(&buffer, |buf, _| !buf.is_parsing()).await;
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
@@ -2734,7 +2734,7 @@ pub mod tests {
let (text, highlighted_ranges) = marked_text_ranges(r#"constˇ «a»«:» B = "c «d»""#, false);
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
cx.condition(&buffer, |buf, _| !buf.is_parsing()).await;
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
+70 -67
View File
@@ -2878,7 +2878,7 @@ async fn test_delete_to_bracket(cx: &mut TestAppContext) {
);
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(r#"macro!("// ˇCOMMENT");"#);
cx.update_editor(|editor, window, cx| {
@@ -3109,7 +3109,7 @@ async fn test_newline_yaml(cx: &mut TestAppContext) {
let mut cx = EditorTestContext::new(cx).await;
let yaml_language = languages::language("yaml", tree_sitter_yaml::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(yaml_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(yaml_language), cx));
// Object (between 2 fields)
cx.set_state(indoc! {"
@@ -3272,7 +3272,7 @@ async fn test_newline_above(cx: &mut TestAppContext) {
);
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(indoc! {"
const a: ˇA = (
(ˇ
@@ -3320,7 +3320,7 @@ async fn test_newline_below(cx: &mut TestAppContext) {
);
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(indoc! {"
const a: ˇA = (
(ˇ
@@ -3367,7 +3367,7 @@ async fn test_newline_comments(cx: &mut TestAppContext) {
));
{
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(indoc! {"
// Fooˇ
"});
@@ -3439,7 +3439,7 @@ async fn test_newline_comments_with_multiple_delimiters(cx: &mut TestAppContext)
));
{
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(indoc! {"
//ˇ
"});
@@ -3486,7 +3486,7 @@ async fn test_newline_documentation_comments(cx: &mut TestAppContext) {
{
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(indoc! {"
/**ˇ
"});
@@ -3695,7 +3695,7 @@ async fn test_newline_comments_with_block_comment(cx: &mut TestAppContext) {
));
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(lua_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(lua_language), cx));
// Line with line comment should extend
cx.set_state(indoc! {"
@@ -3816,7 +3816,7 @@ async fn test_tab_in_leading_whitespace_auto_indents_lines(cx: &mut TestAppConte
.with_indents_query(r#"(_ "(" ")" @end) @indent"#)
.unwrap(),
);
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// test when all cursors are not at suggested indent
// then simply move to their suggested indent location
@@ -4040,7 +4040,7 @@ async fn test_tab_with_mixed_whitespace_rust(cx: &mut TestAppContext) {
);
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(indoc! {"
fn a() {
if b {
@@ -4139,7 +4139,7 @@ async fn test_indent_yaml_comments_with_multiple_cursors(cx: &mut TestAppContext
let mut cx = EditorTestContext::new(cx).await;
let yaml_language = languages::language("yaml", tree_sitter_yaml::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(yaml_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(yaml_language), cx));
cx.set_state(
r#"ˇ# ingress:
@@ -4174,7 +4174,7 @@ async fn test_indent_yaml_non_comments_with_multiple_cursors(cx: &mut TestAppCon
let mut cx = EditorTestContext::new(cx).await;
let yaml_language = languages::language("yaml", tree_sitter_yaml::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(yaml_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(yaml_language), cx));
cx.set_state(
r#"ˇingress:
@@ -4329,9 +4329,10 @@ fn test_indent_outdent_with_excerpts(cx: &mut TestAppContext) {
));
let toml_buffer =
cx.new(|cx| Buffer::local("a = 1\nb = 2\n", cx).with_language(toml_language, cx));
let rust_buffer =
cx.new(|cx| Buffer::local("const c: usize = 3;\n", cx).with_language(rust_language, cx));
cx.new(|cx| Buffer::local("a = 1\nb = 2\n", cx).with_language_immediate(toml_language, cx));
let rust_buffer = cx.new(|cx| {
Buffer::local("const c: usize = 3;\n", cx).with_language_immediate(rust_language, cx)
});
let multibuffer = cx.new(|cx| {
let mut multibuffer = MultiBuffer::new(ReadWrite);
multibuffer.push_excerpts(
@@ -5030,7 +5031,7 @@ async fn test_wrap_in_tag_single_selection(cx: &mut TestAppContext) {
None,
));
cx.update_buffer(|buffer, cx| buffer.set_language(Some(js_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(js_language), cx));
cx.set_state(indoc! {"
«testˇ»
@@ -5079,7 +5080,7 @@ async fn test_wrap_in_tag_multi_selection(cx: &mut TestAppContext) {
None,
));
cx.update_buffer(|buffer, cx| buffer.set_language(Some(js_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(js_language), cx));
cx.set_state(indoc! {"
«testˇ»
@@ -5122,7 +5123,7 @@ async fn test_wrap_in_tag_does_nothing_in_unsupported_languages(cx: &mut TestApp
None,
));
cx.update_buffer(|buffer, cx| buffer.set_language(Some(plaintext_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(plaintext_language), cx));
cx.set_state(indoc! {"
«testˇ»
@@ -6568,7 +6569,7 @@ async fn test_rewrap(cx: &mut TestAppContext) {
language: Arc<Language>,
cx: &mut EditorTestContext,
) {
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(unwrapped_text);
cx.update_editor(|e, window, cx| e.rewrap(&Rewrap, window, cx));
cx.assert_editor_state(wrapped_text);
@@ -6973,7 +6974,7 @@ async fn test_rewrap_block_comments(cx: &mut TestAppContext) {
language: Arc<Language>,
cx: &mut EditorTestContext,
) {
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(unwrapped_text);
cx.update_editor(|e, window, cx| e.rewrap(&Rewrap, window, cx));
cx.assert_editor_state(wrapped_text);
@@ -6985,7 +6986,7 @@ async fn test_hard_wrap(cx: &mut TestAppContext) {
init_test(cx, |_| {});
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(git_commit_lang()), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(git_commit_lang()), cx));
cx.update_editor(|editor, _, cx| {
editor.set_hard_wrap(Some(14), cx);
});
@@ -7424,7 +7425,7 @@ async fn test_paste_multiline(cx: &mut TestAppContext) {
init_test(cx, |_| {});
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(rust_lang()), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(rust_lang()), cx));
// Cut an indented block, without the leading whitespace.
cx.set_state(indoc! {"
@@ -7566,7 +7567,7 @@ async fn test_paste_content_from_other_app(cx: &mut TestAppContext) {
));
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(rust_lang()), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(rust_lang()), cx));
cx.set_state(indoc! {"
fn a() {
@@ -8970,7 +8971,7 @@ async fn test_select_larger_smaller_syntax_node(cx: &mut TestAppContext) {
"#
.unindent();
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
@@ -9155,7 +9156,7 @@ async fn test_select_larger_syntax_node_for_cursor_at_end(cx: &mut TestAppContex
let text = "let a = 2;";
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
@@ -9225,7 +9226,7 @@ async fn test_select_larger_syntax_node_for_cursor_at_symbol(cx: &mut TestAppCon
"#
.unindent();
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
@@ -9402,7 +9403,7 @@ async fn test_select_larger_smaller_syntax_node_for_string(cx: &mut TestAppConte
"#
.unindent();
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
@@ -9576,7 +9577,7 @@ async fn test_unwrap_syntax_nodes(cx: &mut gpui::TestAppContext) {
));
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
});
cx.set_state(indoc! { r#"use mod1::{mod2::{«mod3ˇ», mod4}, mod5::{mod6, «mod7ˇ»}};"# });
@@ -9789,7 +9790,7 @@ async fn test_autoindent(cx: &mut TestAppContext) {
let text = "fn a() {}";
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
editor
@@ -9858,7 +9859,7 @@ async fn test_autoindent_disabled(cx: &mut TestAppContext) {
let text = "fn a() {}";
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
editor
@@ -9997,7 +9998,7 @@ async fn test_autoindent_disabled_with_nested_language(cx: &mut TestAppContext)
cx.language_registry().add(language.clone());
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
});
cx.set_state(r#"struct A {ˇ}"#);
@@ -10084,7 +10085,9 @@ async fn test_autoindent_selections(cx: &mut TestAppContext) {
let buffer = editor.buffer().update(cx, |buffer, _| {
buffer.all_buffers().iter().next().unwrap().clone()
});
buffer.update(cx, |buffer, cx| buffer.set_language(Some(rust_lang()), cx));
buffer.update(cx, |buffer, cx| {
buffer.set_language_immediate(Some(rust_lang()), cx)
});
buffer
});
@@ -10177,7 +10180,7 @@ async fn test_autoclose_and_auto_surround_pairs(cx: &mut TestAppContext) {
cx.language_registry().add(language.clone());
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
});
cx.set_state(
@@ -10366,7 +10369,7 @@ async fn test_always_treat_brackets_as_autoclosed_skip_over(cx: &mut TestAppCont
cx.language_registry().add(language.clone());
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
});
cx.set_state(
@@ -10509,7 +10512,7 @@ async fn test_autoclose_with_embedded_language(cx: &mut TestAppContext) {
cx.executor().run_until_parked();
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(html_language), cx);
buffer.set_language_immediate(Some(html_language), cx);
});
cx.set_state(
@@ -10687,7 +10690,7 @@ async fn test_autoclose_with_overrides(cx: &mut TestAppContext) {
cx.language_registry().add(rust_language.clone());
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(rust_language), cx);
buffer.set_language_immediate(Some(rust_language), cx);
});
cx.set_state(
@@ -10794,7 +10797,7 @@ async fn test_surround_with_pair(cx: &mut TestAppContext) {
"#
.unindent();
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
editor
@@ -10944,7 +10947,7 @@ async fn test_delete_autoclose_pair(cx: &mut TestAppContext) {
"#
.unindent();
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
editor
@@ -11072,7 +11075,7 @@ async fn test_always_treat_brackets_as_autoclosed_delete(cx: &mut TestAppContext
cx.language_registry().add(language.clone());
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
});
cx.set_state(
@@ -11140,7 +11143,7 @@ async fn test_auto_replace_emoji_shortcode(cx: &mut TestAppContext) {
Some(tree_sitter_rust::LANGUAGE.into()),
));
let buffer = cx.new(|cx| Buffer::local("", cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local("", cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
editor
@@ -13177,7 +13180,7 @@ async fn test_handle_input_for_show_signature_help_auto_signature_help_true(
cx.language_registry().add(language.clone());
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
});
cx.set_state(
@@ -13318,7 +13321,7 @@ async fn test_handle_input_with_different_show_signature_settings(cx: &mut TestA
cx.language_registry().add(language.clone());
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
});
// Ensure that signature_help is not called when no signature help is enabled.
@@ -15900,7 +15903,7 @@ async fn test_toggle_comment(cx: &mut TestAppContext) {
},
Some(tree_sitter_rust::LANGUAGE.into()),
));
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// If multiple selections intersect a line, the line is only toggled once.
cx.set_state(indoc! {"
@@ -16021,7 +16024,7 @@ async fn test_toggle_comment_ignore_indent(cx: &mut TestAppContext) {
},
Some(tree_sitter_rust::LANGUAGE.into()),
));
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
let toggle_comments = &ToggleComments {
advance_downwards: false,
@@ -16151,7 +16154,7 @@ async fn test_advance_downward_on_toggle_comment(cx: &mut TestAppContext) {
cx.language_registry().add(language.clone());
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
});
let toggle_comments = &ToggleComments {
@@ -16309,7 +16312,7 @@ async fn test_toggle_block_comment(cx: &mut TestAppContext) {
cx.language_registry().add(html_language.clone());
cx.language_registry().add(javascript_language);
cx.update_buffer(|buffer, cx| {
buffer.set_language(Some(html_language), cx);
buffer.set_language_immediate(Some(html_language), cx);
});
// Toggle comments for empty selections
@@ -16744,7 +16747,7 @@ async fn test_extra_newline_insertion(cx: &mut TestAppContext) {
"{{} }\n", //
);
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
editor
@@ -17639,7 +17642,7 @@ async fn test_move_to_enclosing_bracket_in_markdown_code_block(cx: &mut TestAppC
cx,
);
buffer.set_language_registry(language_registry.clone());
buffer.set_language(Some(markdown_lang()), cx);
buffer.set_language_immediate(Some(markdown_lang()), cx);
buffer
});
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
@@ -22451,7 +22454,7 @@ async fn test_find_enclosing_node_with_task(cx: &mut TestAppContext) {
let project = Project::test(fs, ["/a".as_ref()], cx).await;
let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx));
let cx = &mut VisualTestContext::from_window(*workspace.deref(), cx);
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let multi_buffer = cx.new(|cx| MultiBuffer::singleton(buffer.clone(), cx));
let editor = cx.new_window_entity(|window, cx| {
@@ -23940,7 +23943,7 @@ async fn test_tree_sitter_brackets_newline_insertion(cx: &mut TestAppContext) {
)
.unwrap(),
);
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
cx.set_state(indoc! {"
<span>ˇ</span>
@@ -24825,7 +24828,7 @@ async fn test_linked_edits_on_typing_punctuation(cx: &mut TestAppContext) {
},
Some(tree_sitter_typescript::LANGUAGE_TSX.into()),
));
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// Test typing > does not extend linked pair
cx.set_state("<divˇ<div></div>");
@@ -25025,7 +25028,7 @@ async fn test_tab_in_leading_whitespace_auto_indents_for_python(cx: &mut TestApp
let mut cx = EditorTestContext::new(cx).await;
let language = languages::language("python", tree_sitter_python::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// test cursor move to start of each line on tab
// for `if`, `elif`, `else`, `while`, `with` and `for`
@@ -25135,7 +25138,7 @@ async fn test_outdent_after_input_for_python(cx: &mut TestAppContext) {
let mut cx = EditorTestContext::new(cx).await;
let language = languages::language("python", tree_sitter_python::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// test `else` auto outdents when typed inside `if` block
cx.set_state(indoc! {"
@@ -25367,7 +25370,7 @@ async fn test_indent_on_newline_for_python(cx: &mut TestAppContext) {
});
let mut cx = EditorTestContext::new(cx).await;
let language = languages::language("python", tree_sitter_python::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// test correct indent after newline on comment
cx.set_state(indoc! {"
@@ -25428,7 +25431,7 @@ async fn test_tab_in_leading_whitespace_auto_indents_for_bash(cx: &mut TestAppCo
let mut cx = EditorTestContext::new(cx).await;
let language = languages::language("bash", tree_sitter_bash::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// test cursor move to start of each line on tab
// for `if`, `elif`, `else`, `while`, `for`, `case` and `function`
@@ -25522,7 +25525,7 @@ async fn test_indent_after_input_for_bash(cx: &mut TestAppContext) {
let mut cx = EditorTestContext::new(cx).await;
let language = languages::language("bash", tree_sitter_bash::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// test indents on comment insert
cx.set_state(indoc! {"
@@ -25564,7 +25567,7 @@ async fn test_outdent_after_input_for_bash(cx: &mut TestAppContext) {
let mut cx = EditorTestContext::new(cx).await;
let language = languages::language("bash", tree_sitter_bash::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// test `else` auto outdents when typed inside `if` block
cx.set_state(indoc! {"
@@ -25717,7 +25720,7 @@ async fn test_indent_on_newline_for_bash(cx: &mut TestAppContext) {
});
let mut cx = EditorTestContext::new(cx).await;
let language = languages::language("bash", tree_sitter_bash::LANGUAGE.into());
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(language), cx));
// test correct indent after newline on comment
cx.set_state(indoc! {"
@@ -27016,7 +27019,7 @@ async fn test_select_next_prev_syntax_node(cx: &mut TestAppContext) {
}
"#;
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(language, cx));
let buffer = cx.new(|cx| Buffer::local(text, cx).with_language_immediate(language, cx));
let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx));
let (editor, cx) = cx.add_window_view(|window, cx| build_editor(buffer, window, cx));
@@ -27208,7 +27211,7 @@ async fn test_paste_url_from_other_app_creates_markdown_link_over_selected_text(
));
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(markdown_language), cx));
cx.set_state("Hello, «editorˇ».\nZed is «ˇgreat» (see this link: ˇ)");
cx.update_editor(|editor, window, cx| {
@@ -27238,7 +27241,7 @@ async fn test_paste_url_from_zed_copy_creates_markdown_link_over_selected_text(
));
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(markdown_language), cx));
cx.set_state(&format!(
"Hello, editor.\nZed is great (see this link: )\n«{url}ˇ»"
));
@@ -27277,7 +27280,7 @@ async fn test_paste_url_from_other_app_replaces_existing_url_without_creating_ma
));
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(markdown_language), cx));
cx.set_state("Please visit zed's homepage: «https://www.apple.comˇ»");
cx.update_editor(|editor, window, cx| {
@@ -27305,7 +27308,7 @@ async fn test_paste_plain_text_from_other_app_replaces_selection_without_creatin
));
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(markdown_language), cx));
cx.set_state("Hello, «editorˇ».\nZed is «ˇgreat»");
cx.update_editor(|editor, window, cx| {
@@ -27333,7 +27336,7 @@ async fn test_paste_url_from_other_app_without_creating_markdown_link_in_non_mar
));
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx));
cx.update_buffer(|buffer, cx| buffer.set_language_immediate(Some(markdown_language), cx));
cx.set_state("// Hello, «editorˇ».\n// Zed is «ˇgreat» (see this link: ˇ)");
cx.update_editor(|editor, window, cx| {
@@ -27385,7 +27388,7 @@ async fn test_paste_url_from_other_app_creates_markdown_link_selectively_in_mult
.unwrap();
let first_buffer = multi_buffer.read(cx).buffer(first_buffer_id).unwrap();
first_buffer.update(cx, |buffer, cx| {
buffer.set_language(Some(markdown_language.clone()), cx);
buffer.set_language_immediate(Some(markdown_language.clone()), cx);
});
editor
@@ -27688,7 +27691,7 @@ async fn test_sticky_scroll(cx: &mut TestAppContext) {
.as_singleton()
.unwrap()
.update(cx, |buffer, cx| {
buffer.set_language(Some(rust_lang()), cx);
buffer.set_language_immediate(Some(rust_lang()), cx);
})
});
@@ -27778,7 +27781,7 @@ async fn test_scroll_by_clicking_sticky_header(cx: &mut TestAppContext) {
.as_singleton()
.unwrap()
.update(cx, |buffer, cx| {
buffer.set_language(Some(rust_lang()), cx);
buffer.set_language_immediate(Some(rust_lang()), cx);
})
});
+1 -1
View File
@@ -1139,7 +1139,7 @@ impl SerializableItem for Editor {
buffer.update(cx, |buffer, cx| {
buffer.set_language_registry(language_registry);
if let Some(language) = language {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
}
buffer.set_text(contents, cx);
if let Some(entry) = buffer.peek_undo_stack() {
+3 -3
View File
@@ -638,7 +638,7 @@ mod jsx_tag_autoclose_tests {
cx.update_buffer(|buffer, cx| {
let language = language("tsx", tree_sitter_typescript::LANGUAGE_TSX.into());
buffer.set_language(Some(language), cx)
buffer.set_language_immediate(Some(language), cx)
});
cx
@@ -802,7 +802,7 @@ mod jsx_tag_autoclose_tests {
let buffer_a = cx.new(|cx| {
let mut buf = language::Buffer::local("<div", cx);
buf.set_language(
buf.set_language_immediate(
Some(language("tsx", tree_sitter_typescript::LANGUAGE_TSX.into())),
cx,
);
@@ -810,7 +810,7 @@ mod jsx_tag_autoclose_tests {
});
let buffer_b = cx.new(|cx| {
let mut buf = language::Buffer::local("<pre", cx);
buf.set_language(
buf.set_language_immediate(
Some(language("tsx", tree_sitter_typescript::LANGUAGE_TSX.into())),
cx,
);
+1 -1
View File
@@ -205,7 +205,7 @@ pub fn expand_macro_recursively(
workspace.update_in(cx, |workspace, window, cx| {
buffer.update(cx, |buffer, cx| {
buffer.set_text(macro_expansion.expansion, cx);
buffer.set_language(Some(rust_language), cx);
buffer.set_language_immediate(Some(rust_language), cx);
buffer.set_capability(Capability::ReadOnly, cx);
});
let multibuffer =
@@ -67,7 +67,7 @@ impl EditorTestContext {
.await
.unwrap();
buffer.update(cx, |buffer, cx| {
buffer.set_language(Some(language), cx);
buffer.set_language_immediate(Some(language), cx);
});
let editor = cx.add_window(|window, cx| {