Merge e246758be4
into 0e575b2809
This commit is contained in:
commit
90467f0150
2 changed files with 583 additions and 60 deletions
|
@ -11737,6 +11737,18 @@ impl Editor {
|
||||||
let buffer = self.buffer.read(cx).snapshot(cx);
|
let buffer = self.buffer.read(cx).snapshot(cx);
|
||||||
let selections = self.selections.all::<Point>(cx);
|
let selections = self.selections.all::<Point>(cx);
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
|
enum CommentFormat {
|
||||||
|
/// single line comment, with prefix for line
|
||||||
|
Line(String),
|
||||||
|
/// single line within a block comment, with prefix for line
|
||||||
|
BlockLine(String),
|
||||||
|
/// a single line of a block comment that includes the initial delimiter
|
||||||
|
BlockCommentWithStart(BlockCommentConfig),
|
||||||
|
/// a single line of a block comment that includes the ending delimiter
|
||||||
|
BlockCommentWithEnd(BlockCommentConfig),
|
||||||
|
}
|
||||||
|
|
||||||
// Split selections to respect paragraph, indent, and comment prefix boundaries.
|
// Split selections to respect paragraph, indent, and comment prefix boundaries.
|
||||||
let wrap_ranges = selections.into_iter().flat_map(|selection| {
|
let wrap_ranges = selections.into_iter().flat_map(|selection| {
|
||||||
let mut non_blank_rows_iter = (selection.start.row..=selection.end.row)
|
let mut non_blank_rows_iter = (selection.start.row..=selection.end.row)
|
||||||
|
@ -11753,37 +11765,75 @@ impl Editor {
|
||||||
let language_scope = buffer.language_scope_at(selection.head());
|
let language_scope = buffer.language_scope_at(selection.head());
|
||||||
|
|
||||||
let indent_and_prefix_for_row =
|
let indent_and_prefix_for_row =
|
||||||
|row: u32| -> (IndentSize, Option<String>, Option<String>) {
|
|row: u32| -> (IndentSize, Option<CommentFormat>, Option<String>) {
|
||||||
let indent = buffer.indent_size_for_line(MultiBufferRow(row));
|
let indent = buffer.indent_size_for_line(MultiBufferRow(row));
|
||||||
let (comment_prefix, rewrap_prefix) =
|
let (comment_prefix, rewrap_prefix) = if let Some(language_scope) =
|
||||||
if let Some(language_scope) = &language_scope {
|
&language_scope
|
||||||
let indent_end = Point::new(row, indent.len);
|
{
|
||||||
let comment_prefix = language_scope
|
let indent_end = Point::new(row, indent.len);
|
||||||
|
let line_end = Point::new(row, buffer.line_len(MultiBufferRow(row)));
|
||||||
|
let line_text_after_indent = buffer
|
||||||
|
.text_for_range(indent_end..line_end)
|
||||||
|
.collect::<String>();
|
||||||
|
|
||||||
|
let is_within_comment_override = buffer
|
||||||
|
.language_scope_at(indent_end)
|
||||||
|
.is_some_and(|scope| scope.override_name() == Some("comment"));
|
||||||
|
let comment_delimiters = if is_within_comment_override {
|
||||||
|
// we are within a comment syntax node, but we don't
|
||||||
|
// yet know what kind of comment: block, doc or line
|
||||||
|
match (
|
||||||
|
language_scope.documentation_comment(),
|
||||||
|
language_scope.block_comment(),
|
||||||
|
) {
|
||||||
|
(Some(config), _) | (_, Some(config))
|
||||||
|
if buffer.contains_str_at(indent_end, &config.start) =>
|
||||||
|
{
|
||||||
|
Some(CommentFormat::BlockCommentWithStart(config.clone()))
|
||||||
|
}
|
||||||
|
(Some(config), _) | (_, Some(config))
|
||||||
|
if line_text_after_indent.ends_with(config.end.as_ref()) =>
|
||||||
|
{
|
||||||
|
Some(CommentFormat::BlockCommentWithEnd(config.clone()))
|
||||||
|
}
|
||||||
|
(Some(config), _) | (_, Some(config))
|
||||||
|
if buffer.contains_str_at(indent_end, &config.prefix) =>
|
||||||
|
{
|
||||||
|
Some(CommentFormat::BlockLine(config.prefix.to_string()))
|
||||||
|
}
|
||||||
|
(_, _) => language_scope
|
||||||
|
.line_comment_prefixes()
|
||||||
|
.iter()
|
||||||
|
.find(|prefix| buffer.contains_str_at(indent_end, prefix))
|
||||||
|
.map(|prefix| CommentFormat::Line(prefix.to_string())),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// we not in an overridden comment node, but we may
|
||||||
|
// be within a non-overridden line comment node
|
||||||
|
language_scope
|
||||||
.line_comment_prefixes()
|
.line_comment_prefixes()
|
||||||
.iter()
|
.iter()
|
||||||
.find(|prefix| buffer.contains_str_at(indent_end, prefix))
|
.find(|prefix| buffer.contains_str_at(indent_end, prefix))
|
||||||
.map(|prefix| prefix.to_string());
|
.map(|prefix| CommentFormat::Line(prefix.to_string()))
|
||||||
let line_end = Point::new(row, buffer.line_len(MultiBufferRow(row)));
|
|
||||||
let line_text_after_indent = buffer
|
|
||||||
.text_for_range(indent_end..line_end)
|
|
||||||
.collect::<String>();
|
|
||||||
let rewrap_prefix = language_scope
|
|
||||||
.rewrap_prefixes()
|
|
||||||
.iter()
|
|
||||||
.find_map(|prefix_regex| {
|
|
||||||
prefix_regex.find(&line_text_after_indent).map(|mat| {
|
|
||||||
if mat.start() == 0 {
|
|
||||||
Some(mat.as_str().to_string())
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.flatten();
|
|
||||||
(comment_prefix, rewrap_prefix)
|
|
||||||
} else {
|
|
||||||
(None, None)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let rewrap_prefix = language_scope
|
||||||
|
.rewrap_prefixes()
|
||||||
|
.iter()
|
||||||
|
.find_map(|prefix_regex| {
|
||||||
|
prefix_regex.find(&line_text_after_indent).map(|mat| {
|
||||||
|
if mat.start() == 0 {
|
||||||
|
Some(mat.as_str().to_string())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.flatten();
|
||||||
|
(comment_delimiters, rewrap_prefix)
|
||||||
|
} else {
|
||||||
|
(None, None)
|
||||||
|
};
|
||||||
(indent, comment_prefix, rewrap_prefix)
|
(indent, comment_prefix, rewrap_prefix)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -11794,22 +11844,22 @@ impl Editor {
|
||||||
let mut prev_row = first_row;
|
let mut prev_row = first_row;
|
||||||
let (
|
let (
|
||||||
mut current_range_indent,
|
mut current_range_indent,
|
||||||
mut current_range_comment_prefix,
|
mut current_range_comment_delimiters,
|
||||||
mut current_range_rewrap_prefix,
|
mut current_range_rewrap_prefix,
|
||||||
) = indent_and_prefix_for_row(first_row);
|
) = indent_and_prefix_for_row(first_row);
|
||||||
|
|
||||||
for row in non_blank_rows_iter.skip(1) {
|
for row in non_blank_rows_iter.skip(1) {
|
||||||
let has_paragraph_break = row > prev_row + 1;
|
let has_paragraph_break = row > prev_row + 1;
|
||||||
|
|
||||||
let (row_indent, row_comment_prefix, row_rewrap_prefix) =
|
let (row_indent, row_comment_delimiters, row_rewrap_prefix) =
|
||||||
indent_and_prefix_for_row(row);
|
indent_and_prefix_for_row(row);
|
||||||
|
|
||||||
let has_indent_change = row_indent != current_range_indent;
|
let has_indent_change = row_indent != current_range_indent;
|
||||||
let has_comment_change = row_comment_prefix != current_range_comment_prefix;
|
let has_comment_change = row_comment_delimiters != current_range_comment_delimiters;
|
||||||
|
|
||||||
let has_boundary_change = has_comment_change
|
let has_boundary_change = has_comment_change
|
||||||
|| row_rewrap_prefix.is_some()
|
|| row_rewrap_prefix.is_some()
|
||||||
|| (has_indent_change && current_range_comment_prefix.is_some());
|
|| (has_indent_change && current_range_comment_delimiters.is_some());
|
||||||
|
|
||||||
if has_paragraph_break || has_boundary_change {
|
if has_paragraph_break || has_boundary_change {
|
||||||
ranges.push((
|
ranges.push((
|
||||||
|
@ -11817,13 +11867,13 @@ impl Editor {
|
||||||
Point::new(current_range_start, 0)
|
Point::new(current_range_start, 0)
|
||||||
..Point::new(prev_row, buffer.line_len(MultiBufferRow(prev_row))),
|
..Point::new(prev_row, buffer.line_len(MultiBufferRow(prev_row))),
|
||||||
current_range_indent,
|
current_range_indent,
|
||||||
current_range_comment_prefix.clone(),
|
current_range_comment_delimiters.clone(),
|
||||||
current_range_rewrap_prefix.clone(),
|
current_range_rewrap_prefix.clone(),
|
||||||
from_empty_selection,
|
from_empty_selection,
|
||||||
));
|
));
|
||||||
current_range_start = row;
|
current_range_start = row;
|
||||||
current_range_indent = row_indent;
|
current_range_indent = row_indent;
|
||||||
current_range_comment_prefix = row_comment_prefix;
|
current_range_comment_delimiters = row_comment_delimiters;
|
||||||
current_range_rewrap_prefix = row_rewrap_prefix;
|
current_range_rewrap_prefix = row_rewrap_prefix;
|
||||||
}
|
}
|
||||||
prev_row = row;
|
prev_row = row;
|
||||||
|
@ -11834,7 +11884,7 @@ impl Editor {
|
||||||
Point::new(current_range_start, 0)
|
Point::new(current_range_start, 0)
|
||||||
..Point::new(prev_row, buffer.line_len(MultiBufferRow(prev_row))),
|
..Point::new(prev_row, buffer.line_len(MultiBufferRow(prev_row))),
|
||||||
current_range_indent,
|
current_range_indent,
|
||||||
current_range_comment_prefix,
|
current_range_comment_delimiters,
|
||||||
current_range_rewrap_prefix,
|
current_range_rewrap_prefix,
|
||||||
from_empty_selection,
|
from_empty_selection,
|
||||||
));
|
));
|
||||||
|
@ -11848,7 +11898,7 @@ impl Editor {
|
||||||
for (
|
for (
|
||||||
language_settings,
|
language_settings,
|
||||||
wrap_range,
|
wrap_range,
|
||||||
indent_size,
|
mut indent_size,
|
||||||
comment_prefix,
|
comment_prefix,
|
||||||
rewrap_prefix,
|
rewrap_prefix,
|
||||||
from_empty_selection,
|
from_empty_selection,
|
||||||
|
@ -11868,16 +11918,26 @@ impl Editor {
|
||||||
|
|
||||||
let tab_size = language_settings.tab_size;
|
let tab_size = language_settings.tab_size;
|
||||||
|
|
||||||
|
let (line_prefix, inside_comment) = match &comment_prefix {
|
||||||
|
Some(CommentFormat::Line(prefix) | CommentFormat::BlockLine(prefix)) => {
|
||||||
|
(Some(prefix.as_str()), true)
|
||||||
|
}
|
||||||
|
Some(CommentFormat::BlockCommentWithEnd(BlockCommentConfig { prefix, .. })) => {
|
||||||
|
(Some(prefix.as_ref()), true)
|
||||||
|
}
|
||||||
|
Some(CommentFormat::BlockCommentWithStart(BlockCommentConfig {
|
||||||
|
start: _,
|
||||||
|
end: _,
|
||||||
|
prefix,
|
||||||
|
tab_size,
|
||||||
|
})) => {
|
||||||
|
indent_size.len += tab_size;
|
||||||
|
(Some(prefix.as_ref()), true)
|
||||||
|
}
|
||||||
|
None => (None, false),
|
||||||
|
};
|
||||||
let indent_prefix = indent_size.chars().collect::<String>();
|
let indent_prefix = indent_size.chars().collect::<String>();
|
||||||
let mut line_prefix = indent_prefix.clone();
|
let line_prefix = format!("{indent_prefix}{}", line_prefix.unwrap_or(""));
|
||||||
let mut inside_comment = false;
|
|
||||||
if let Some(prefix) = &comment_prefix {
|
|
||||||
line_prefix.push_str(prefix);
|
|
||||||
inside_comment = true;
|
|
||||||
}
|
|
||||||
if let Some(prefix) = &rewrap_prefix {
|
|
||||||
line_prefix.push_str(prefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
let allow_rewrap_based_on_language = match language_settings.allow_rewrap {
|
let allow_rewrap_based_on_language = match language_settings.allow_rewrap {
|
||||||
RewrapBehavior::InComments => inside_comment,
|
RewrapBehavior::InComments => inside_comment,
|
||||||
|
@ -11922,13 +11982,55 @@ impl Editor {
|
||||||
let start_offset = start.to_offset(&buffer);
|
let start_offset = start.to_offset(&buffer);
|
||||||
let end = Point::new(end_row, buffer.line_len(MultiBufferRow(end_row)));
|
let end = Point::new(end_row, buffer.line_len(MultiBufferRow(end_row)));
|
||||||
let selection_text = buffer.text_for_range(start..end).collect::<String>();
|
let selection_text = buffer.text_for_range(start..end).collect::<String>();
|
||||||
|
let mut first_line_delimiter = None;
|
||||||
|
let mut last_line_delimiter = None;
|
||||||
let Some(lines_without_prefixes) = selection_text
|
let Some(lines_without_prefixes) = selection_text
|
||||||
.lines()
|
.lines()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(ix, line)| {
|
.map(|(ix, line)| {
|
||||||
let line_trimmed = line.trim_start();
|
let line_trimmed = line.trim();
|
||||||
if rewrap_prefix.is_some() && ix > 0 {
|
if rewrap_prefix.is_some() && ix > 0 {
|
||||||
Ok(line_trimmed)
|
Ok(line_trimmed)
|
||||||
|
} else if let Some(
|
||||||
|
CommentFormat::BlockCommentWithStart(BlockCommentConfig {
|
||||||
|
start,
|
||||||
|
prefix,
|
||||||
|
end,
|
||||||
|
tab_size,
|
||||||
|
})
|
||||||
|
| CommentFormat::BlockCommentWithEnd(BlockCommentConfig {
|
||||||
|
start,
|
||||||
|
prefix,
|
||||||
|
end,
|
||||||
|
tab_size,
|
||||||
|
}),
|
||||||
|
) = &comment_prefix
|
||||||
|
{
|
||||||
|
let line_trimmed = line_trimmed
|
||||||
|
.strip_prefix(start.as_ref())
|
||||||
|
.map(|s| {
|
||||||
|
let mut indent_size = indent_size;
|
||||||
|
indent_size.len -= tab_size;
|
||||||
|
let indent_prefix: String = indent_size.chars().collect();
|
||||||
|
first_line_delimiter = Some((indent_prefix, start));
|
||||||
|
s.trim_start()
|
||||||
|
})
|
||||||
|
.unwrap_or(line_trimmed);
|
||||||
|
let line_trimmed = line_trimmed
|
||||||
|
.strip_suffix(end.as_ref())
|
||||||
|
.map(|s| {
|
||||||
|
last_line_delimiter = Some(end);
|
||||||
|
s.trim_end()
|
||||||
|
})
|
||||||
|
.unwrap_or(line_trimmed);
|
||||||
|
let line_trimmed = line_trimmed
|
||||||
|
.strip_prefix(prefix.as_ref())
|
||||||
|
.unwrap_or(line_trimmed);
|
||||||
|
Ok(line_trimmed)
|
||||||
|
} else if let Some(CommentFormat::BlockLine(prefix)) = &comment_prefix {
|
||||||
|
line_trimmed.strip_prefix(prefix).with_context(|| {
|
||||||
|
format!("line did not start with prefix {prefix:?}: {line:?}")
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
line_trimmed
|
line_trimmed
|
||||||
.strip_prefix(&line_prefix.trim_start())
|
.strip_prefix(&line_prefix.trim_start())
|
||||||
|
@ -11955,14 +12057,25 @@ impl Editor {
|
||||||
line_prefix.clone()
|
line_prefix.clone()
|
||||||
};
|
};
|
||||||
|
|
||||||
let wrapped_text = wrap_with_prefix(
|
let wrapped_text = {
|
||||||
line_prefix,
|
let mut wrapped_text = wrap_with_prefix(
|
||||||
subsequent_lines_prefix,
|
line_prefix,
|
||||||
lines_without_prefixes.join("\n"),
|
subsequent_lines_prefix,
|
||||||
wrap_column,
|
lines_without_prefixes.join("\n"),
|
||||||
tab_size,
|
wrap_column,
|
||||||
options.preserve_existing_whitespace,
|
tab_size,
|
||||||
);
|
options.preserve_existing_whitespace,
|
||||||
|
);
|
||||||
|
|
||||||
|
if let Some((indent, delimiter)) = first_line_delimiter {
|
||||||
|
wrapped_text = format!("{indent}{delimiter}\n{wrapped_text}");
|
||||||
|
}
|
||||||
|
if let Some(last_line) = last_line_delimiter {
|
||||||
|
wrapped_text = format!("{wrapped_text}\n{indent_prefix}{last_line}");
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapped_text
|
||||||
|
};
|
||||||
|
|
||||||
// TODO: should always use char-based diff while still supporting cursor behavior that
|
// TODO: should always use char-based diff while still supporting cursor behavior that
|
||||||
// matches vim.
|
// matches vim.
|
||||||
|
|
|
@ -5438,14 +5438,18 @@ async fn test_rewrap(cx: &mut TestAppContext) {
|
||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
));
|
));
|
||||||
let rust_language = Arc::new(Language::new(
|
let rust_language = Arc::new(
|
||||||
LanguageConfig {
|
Language::new(
|
||||||
name: "Rust".into(),
|
LanguageConfig {
|
||||||
line_comments: vec!["// ".into(), "/// ".into()],
|
name: "Rust".into(),
|
||||||
..LanguageConfig::default()
|
line_comments: vec!["// ".into(), "/// ".into()],
|
||||||
},
|
..LanguageConfig::default()
|
||||||
Some(tree_sitter_rust::LANGUAGE.into()),
|
},
|
||||||
));
|
Some(tree_sitter_rust::LANGUAGE.into()),
|
||||||
|
)
|
||||||
|
.with_override_query("[(line_comment)(block_comment)] @comment.inclusive")
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
|
||||||
let plaintext_language = Arc::new(Language::new(
|
let plaintext_language = Arc::new(Language::new(
|
||||||
LanguageConfig {
|
LanguageConfig {
|
||||||
|
@ -5761,6 +5765,412 @@ async fn test_rewrap(cx: &mut TestAppContext) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_rewrap_block_comments(cx: &mut TestAppContext) {
|
||||||
|
init_test(cx, |settings| {
|
||||||
|
settings.languages.0.extend([(
|
||||||
|
"Rust".into(),
|
||||||
|
LanguageSettingsContent {
|
||||||
|
allow_rewrap: Some(language_settings::RewrapBehavior::InComments),
|
||||||
|
preferred_line_length: Some(40),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
)])
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut cx = EditorTestContext::new(cx).await;
|
||||||
|
|
||||||
|
let rust_lang = Arc::new(
|
||||||
|
Language::new(
|
||||||
|
LanguageConfig {
|
||||||
|
name: "Rust".into(),
|
||||||
|
line_comments: vec!["// ".into()],
|
||||||
|
block_comment: Some(BlockCommentConfig {
|
||||||
|
start: "/*".into(),
|
||||||
|
end: "*/".into(),
|
||||||
|
prefix: "* ".into(),
|
||||||
|
tab_size: 1,
|
||||||
|
}),
|
||||||
|
documentation_comment: Some(BlockCommentConfig {
|
||||||
|
start: "/**".into(),
|
||||||
|
end: "*/".into(),
|
||||||
|
prefix: "* ".into(),
|
||||||
|
tab_size: 1,
|
||||||
|
}),
|
||||||
|
|
||||||
|
..LanguageConfig::default()
|
||||||
|
},
|
||||||
|
Some(tree_sitter_rust::LANGUAGE.into()),
|
||||||
|
)
|
||||||
|
.with_override_query("[(line_comment) (block_comment)] @comment.inclusive")
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
|
||||||
|
// regular block comment
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// indent is respected
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
{}
|
||||||
|
/*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
{}
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// short block comments with inline delimiters
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
/*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
/*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// multiline block comment with inline start/end delimiters
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
/*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit. */
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// block comment rewrap still respects paragraph bounds
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
*
|
||||||
|
* Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*
|
||||||
|
* Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// documentation comments
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
/**ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
/**
|
||||||
|
*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
/**
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// different, adjacent comments
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
/**
|
||||||
|
*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
//ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
/**
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
//ˇ Lorem ipsum dolor sit amet,
|
||||||
|
// consectetur adipiscing elit.
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// selection w/ single short block comment
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
«/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */ˇ»
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
«/*
|
||||||
|
* Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/ˇ»
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// rewrapping a single comment w/ abutting comments
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
/* ˇLorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
/*
|
||||||
|
* ˇLorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// selection w/ non-abutting short block comments
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
«/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
|
||||||
|
/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */ˇ»
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
«/*
|
||||||
|
* Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/ˇ»
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// selection of multiline block comments
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
«/* Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit. */ˇ»
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
«/*
|
||||||
|
* Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/ˇ»
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// partial selection of multiline block comments
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
«/* Lorem ipsum dolor sit amet,ˇ»
|
||||||
|
* consectetur adipiscing elit. */
|
||||||
|
/* Lorem ipsum dolor sit amet,
|
||||||
|
«* consectetur adipiscing elit. */ˇ»
|
||||||
|
"},
|
||||||
|
indoc! {"
|
||||||
|
«/*
|
||||||
|
* Lorem ipsum dolor sit amet,ˇ»
|
||||||
|
* consectetur adipiscing elit. */
|
||||||
|
/* Lorem ipsum dolor sit amet,
|
||||||
|
«* consectetur adipiscing elit.
|
||||||
|
*/ˇ»
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// selection w/ abutting short block comments
|
||||||
|
// FIXME unhandled edge case; not correct, just documenting known issues
|
||||||
|
// should not be combined; should rewrap as 2 comments
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
«/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */ˇ»
|
||||||
|
"},
|
||||||
|
// desired behavior:
|
||||||
|
// indoc! {"
|
||||||
|
// «/*
|
||||||
|
// * Lorem ipsum dolor sit amet,
|
||||||
|
// * consectetur adipiscing elit.
|
||||||
|
// */
|
||||||
|
// /*
|
||||||
|
// * Lorem ipsum dolor sit amet,
|
||||||
|
// * consectetur adipiscing elit.
|
||||||
|
// */ˇ»
|
||||||
|
// "},
|
||||||
|
// actual behaviour:
|
||||||
|
indoc! {"
|
||||||
|
«/*
|
||||||
|
* Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit. Lorem
|
||||||
|
* ipsum dolor sit amet, consectetur
|
||||||
|
* adipiscing elit.
|
||||||
|
*/ˇ»
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
// FIXME same as above, but with delimiters on separate line
|
||||||
|
// assert_rewrap(
|
||||||
|
// indoc! {"
|
||||||
|
// «/* Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
// */
|
||||||
|
// /*
|
||||||
|
// * Lorem ipsum dolor sit amet, consectetur adipiscing elit. */ˇ»
|
||||||
|
// "},
|
||||||
|
// // desired:
|
||||||
|
// // indoc! {"
|
||||||
|
// // «/*
|
||||||
|
// // * Lorem ipsum dolor sit amet,
|
||||||
|
// // * consectetur adipiscing elit.
|
||||||
|
// // */
|
||||||
|
// // /*
|
||||||
|
// // * Lorem ipsum dolor sit amet,
|
||||||
|
// // * consectetur adipiscing elit.
|
||||||
|
// // */ˇ»
|
||||||
|
// // "},
|
||||||
|
// // actual: (but with trailing w/s on the empty lines)
|
||||||
|
// indoc! {"
|
||||||
|
// «/*
|
||||||
|
// * Lorem ipsum dolor sit amet,
|
||||||
|
// * consectetur adipiscing elit.
|
||||||
|
// *
|
||||||
|
// */
|
||||||
|
// /*
|
||||||
|
// *
|
||||||
|
// * Lorem ipsum dolor sit amet,
|
||||||
|
// * consectetur adipiscing elit.
|
||||||
|
// */ˇ»
|
||||||
|
// "},
|
||||||
|
// rust_lang.clone(),
|
||||||
|
// &mut cx,
|
||||||
|
// );
|
||||||
|
|
||||||
|
// TODO these are unhandled edge cases; not correct, just documenting known issues
|
||||||
|
assert_rewrap(
|
||||||
|
indoc! {"
|
||||||
|
/*
|
||||||
|
//ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
//ˇ Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
|
||||||
|
/*ˇ Lorem ipsum dolor sit amet */ /* consectetur adipiscing elit. */
|
||||||
|
"},
|
||||||
|
// desired:
|
||||||
|
// indoc! {"
|
||||||
|
// /*
|
||||||
|
// *ˇ Lorem ipsum dolor sit amet,
|
||||||
|
// * consectetur adipiscing elit.
|
||||||
|
// */
|
||||||
|
// /*
|
||||||
|
// *ˇ Lorem ipsum dolor sit amet,
|
||||||
|
// * consectetur adipiscing elit.
|
||||||
|
// */
|
||||||
|
// /*
|
||||||
|
// *ˇ Lorem ipsum dolor sit amet
|
||||||
|
// */ /* consectetur adipiscing elit. */
|
||||||
|
// "},
|
||||||
|
// actual:
|
||||||
|
indoc! {"
|
||||||
|
/*
|
||||||
|
//ˇ Lorem ipsum dolor sit amet,
|
||||||
|
// consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* //ˇ Lorem ipsum dolor sit amet,
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
*ˇ Lorem ipsum dolor sit amet */ /*
|
||||||
|
* consectetur adipiscing elit.
|
||||||
|
*/
|
||||||
|
"},
|
||||||
|
rust_lang.clone(),
|
||||||
|
&mut cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
|
fn assert_rewrap(
|
||||||
|
unwrapped_text: &str,
|
||||||
|
wrapped_text: &str,
|
||||||
|
language: Arc<Language>,
|
||||||
|
cx: &mut EditorTestContext,
|
||||||
|
) {
|
||||||
|
cx.update_buffer(|buffer, cx| buffer.set_language(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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
async fn test_hard_wrap(cx: &mut TestAppContext) {
|
async fn test_hard_wrap(cx: &mut TestAppContext) {
|
||||||
init_test(cx, |_| {});
|
init_test(cx, |_| {});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue