editor: Fix regression causing incorrect delimiter on newline in case of multiple comment prefixes (#31129)

Closes #31115

This fixes regression caused by
https://github.com/zed-industries/zed/pull/30824 while keeping that fix.

- [x] Test

Release Notes:

- Fixed the issue where adding a newline after the `///` comment would
extend it with `//` instead of `///` in Rust and other similar
languages.
This commit is contained in:
smit 2025-05-22 03:56:20 +05:30 committed by GitHub
parent b829f72c17
commit 8742d4ab90
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 45 additions and 6 deletions

View file

@ -3964,15 +3964,18 @@ impl Editor {
.skip(num_of_whitespaces) .skip(num_of_whitespaces)
.take(max_len_of_delimiter) .take(max_len_of_delimiter)
.collect::<String>(); .collect::<String>();
let (delimiter, trimmed_len) = let (delimiter, trimmed_len) = delimiters
delimiters.iter().find_map(|delimiter| { .iter()
let trimmed = delimiter.trim_end(); .filter_map(|delimiter| {
if comment_candidate.starts_with(trimmed) { let prefix = delimiter.trim_end();
Some((delimiter, trimmed.len())) if comment_candidate.starts_with(prefix) {
Some((delimiter, prefix.len()))
} else { } else {
None None
} }
})?; })
.max_by_key(|(_, len)| *len)?;
let cursor_is_placed_after_comment_marker = let cursor_is_placed_after_comment_marker =
num_of_whitespaces + trimmed_len <= start_point.column as usize; num_of_whitespaces + trimmed_len <= start_point.column as usize;
if cursor_is_placed_after_comment_marker { if cursor_is_placed_after_comment_marker {

View file

@ -2820,6 +2820,42 @@ async fn test_newline_comments(cx: &mut TestAppContext) {
"}); "});
} }
#[gpui::test]
async fn test_newline_comments_with_multiple_delimiters(cx: &mut TestAppContext) {
init_test(cx, |settings| {
settings.defaults.tab_size = NonZeroU32::new(4)
});
let language = Arc::new(Language::new(
LanguageConfig {
line_comments: vec!["// ".into(), "/// ".into()],
..LanguageConfig::default()
},
None,
));
{
let mut cx = EditorTestContext::new(cx).await;
cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
cx.set_state(indoc! {"
//ˇ
"});
cx.update_editor(|e, window, cx| e.newline(&Newline, window, cx));
cx.assert_editor_state(indoc! {"
//
// ˇ
"});
cx.set_state(indoc! {"
///ˇ
"});
cx.update_editor(|e, window, cx| e.newline(&Newline, window, cx));
cx.assert_editor_state(indoc! {"
///
/// ˇ
"});
}
}
#[gpui::test] #[gpui::test]
async fn test_newline_documentation_comments(cx: &mut TestAppContext) { async fn test_newline_documentation_comments(cx: &mut TestAppContext) {
init_test(cx, |settings| { init_test(cx, |settings| {