language: Improve auto-indentation when using round brackets in Python (#31260)
Follow-up to #29625 and #30902 This PR reintroduces auto-intents for brackets in Python and fixes some cases where an indentation would be triggered if it should not. For example, upon typing ```python a = [] ``` and inserting a newline after, the next line would be indented although it shoud not be. Bracket auto-indentation was tested prior to #29625 but removed there and the test updated accordingly. #30902 reintroduced this for all brackets but `()`. I reintroduced this here, reverted the changes to the test so that indents also happen after typing `()`. This is frequently used for tuples and multiline statements in Python. Release Notes: - Improved auto-indentation when using round brackets in Python.
This commit is contained in:
parent
a204510cfc
commit
4c28d2c2e2
4 changed files with 31 additions and 4 deletions
|
@ -20860,7 +20860,7 @@ async fn test_indent_on_newline_for_python(cx: &mut TestAppContext) {
|
||||||
ˇ
|
ˇ
|
||||||
"});
|
"});
|
||||||
|
|
||||||
// test correct indent after newline in curly brackets
|
// test correct indent after newline in brackets
|
||||||
cx.set_state(indoc! {"
|
cx.set_state(indoc! {"
|
||||||
{ˇ}
|
{ˇ}
|
||||||
"});
|
"});
|
||||||
|
@ -20873,6 +20873,32 @@ async fn test_indent_on_newline_for_python(cx: &mut TestAppContext) {
|
||||||
ˇ
|
ˇ
|
||||||
}
|
}
|
||||||
"});
|
"});
|
||||||
|
|
||||||
|
cx.set_state(indoc! {"
|
||||||
|
(ˇ)
|
||||||
|
"});
|
||||||
|
cx.update_editor(|editor, window, cx| {
|
||||||
|
editor.newline(&Newline, window, cx);
|
||||||
|
});
|
||||||
|
cx.run_until_parked();
|
||||||
|
cx.assert_editor_state(indoc! {"
|
||||||
|
(
|
||||||
|
ˇ
|
||||||
|
)
|
||||||
|
"});
|
||||||
|
|
||||||
|
// do not indent after empty lists or dictionaries
|
||||||
|
cx.set_state(indoc! {"
|
||||||
|
a = []ˇ
|
||||||
|
"});
|
||||||
|
cx.update_editor(|editor, window, cx| {
|
||||||
|
editor.newline(&Newline, window, cx);
|
||||||
|
});
|
||||||
|
cx.run_until_parked();
|
||||||
|
cx.assert_editor_state(indoc! {"
|
||||||
|
a = []
|
||||||
|
ˇ
|
||||||
|
"});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn empty_range(row: usize, column: usize) -> Range<DisplayPoint> {
|
fn empty_range(row: usize, column: usize) -> Range<DisplayPoint> {
|
||||||
|
|
|
@ -2901,7 +2901,7 @@ impl BufferSnapshot {
|
||||||
end
|
end
|
||||||
};
|
};
|
||||||
if let Some((start, end)) = start.zip(end) {
|
if let Some((start, end)) = start.zip(end) {
|
||||||
if start.row == end.row && !significant_indentation {
|
if start.row == end.row && (!significant_indentation || start.column < end.column) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let range = start..end;
|
let range = start..end;
|
||||||
|
|
|
@ -1236,12 +1236,12 @@ mod tests {
|
||||||
"def a():\n \n if a:\n b()\n else:\n "
|
"def a():\n \n if a:\n b()\n else:\n "
|
||||||
);
|
);
|
||||||
|
|
||||||
// indent after an open paren. the closing paren is not indented
|
// indent after an open paren. the closing paren is not indented
|
||||||
// because there is another token before it on the same line.
|
// because there is another token before it on the same line.
|
||||||
append(&mut buffer, "foo(\n1)", cx);
|
append(&mut buffer, "foo(\n1)", cx);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
buffer.text(),
|
buffer.text(),
|
||||||
"def a():\n \n if a:\n b()\n else:\n foo(\n 1)"
|
"def a():\n \n if a:\n b()\n else:\n foo(\n 1)"
|
||||||
);
|
);
|
||||||
|
|
||||||
// dedent the closing paren if it is shifted to the beginning of the line
|
// dedent the closing paren if it is shifted to the beginning of the line
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
(_ "(" ")" @end) @indent
|
||||||
(_ "[" "]" @end) @indent
|
(_ "[" "]" @end) @indent
|
||||||
(_ "{" "}" @end) @indent
|
(_ "{" "}" @end) @indent
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue