refactor(indent)!: Rework indent, aligned indent

indents now use @indent.X style captures, and indent.PROP for properties to set on those captures, as documented in the help.

Captures are:

indent.auto
indent.begin
indent.end
indent.dedent
indent.branch
indent.ignore
indent.align
indent.zero

Properties are:

indent.immediate
indent.start_at_same_line
indent.open_delimiter
indent.close_delimiter
indent.increment
indent.avoid_last_matching_next

Multiple opening delims on one line and multiple closing on a line are collapsed so as not to over indent,

The final line of @indent.align blocks which must in some cases be treated specially to avoid clashing with the next line is treated the same regardless of whether the @indent.align capture actually uses aligned indentation or just normal indentation. The indent.avoid_last_matching_next property controls this.

Adjust python to use these.

List, set, dict and tuple all use @indent.align which permits both hanging and aligned styles.

Finally, try: on it’s own will indent when typing live but make no guaranteeds about whole-file formatting.

Includes lucario387:fix-align-indent
This commit is contained in:
George Harker 2023-03-19 18:09:18 -07:00 committed by Amaan Qureshi
parent 90ead4ed58
commit d1333dd7e5
14 changed files with 298 additions and 53 deletions

View file

@ -0,0 +1,12 @@
if True:
print(1, 2, 3)
if True:
print(
1,
2,
3
)
print(1,
2,
3)

View file

@ -26,5 +26,3 @@ while (a > 4 and
pass
try:
pass

View file

@ -0,0 +1,6 @@
def foo(a,
b,
c):
pass
def foobar(a,

View file

@ -0,0 +1,6 @@
d = {1:4,
2:3,
4:5}
d2 = {1:3,

View file

@ -0,0 +1,5 @@
f(1,2,3,
4,5,6)
g(1,2,3,

View file

@ -0,0 +1,5 @@
l = [1,
2,
3]
l2 = [1,

View file

@ -0,0 +1,5 @@
s = {1,
2,
3}
s2 = {1,

View file

@ -0,0 +1,7 @@
(
a,
b,
c,
)
(a,

View file

@ -0,0 +1,7 @@
(
a,
b,
c,
)
(a,

View file

@ -14,3 +14,26 @@ def a():
return (
1, 2, 3
)
def a():
return b(
1, 2, 3
)
def a():
return [1, 2, 3]
def a():
return {1, 2, 3}
def a():
return {
"a": 1,
"b": 2,
"c": 3
}
def a():
return [
a for a in range (1, 3)
]

View file

@ -17,6 +17,9 @@ describe("indent Python:", function()
describe("new line:", function()
run:new_line("aligned_indent.py", { on_line = 1, text = "arg3,", indent = 19 })
run:new_line("aligned_indent_2.py", { on_line = 2, text = "x", indent = 4 })
run:new_line("aligned_indent_2.py", { on_line = 9, text = "x", indent = 4 })
run:new_line("aligned_indent_2.py", { on_line = 12, text = "x", indent = 4 })
run:new_line("basic_blocks.py", { on_line = 1, text = "wait,", indent = 4 })
run:new_line("basic_blocks.py", { on_line = 6, text = "x += 1", indent = 4 })
run:new_line("basic_blocks.py", { on_line = 7, text = "x += 1", indent = 4 })
@ -35,11 +38,18 @@ describe("indent Python:", function()
run:new_line("control_flow.py", { on_line = 22, text = "x = 4", indent = 4 })
run:new_line("control_flow.py", { on_line = 24, text = "c < 6 and", indent = 7 })
run:new_line("control_flow.py", { on_line = 26, text = "x = 4", indent = 4 })
run:new_line("control_flow.py", { on_line = 29, text = "x = 4", indent = 4 })
run:new_line("control_flow.py", { on_line = 28, text = "x = 4", indent = 4 })
run:new_line("branches.py", { on_line = 25, text = "x > 9 and", indent = 4 })
run:new_line("branches.py", { on_line = 29, text = "and x > 9", indent = 4 })
run:new_line("hanging_indent.py", { on_line = 1, text = "arg0,", indent = 8 })
run:new_line("hanging_indent.py", { on_line = 1, text = "arg0,", indent = 4 })
run:new_line("hanging_indent.py", { on_line = 5, text = "0,", indent = 4 })
run:new_line("error_state_def.py", { on_line = 6, text = "b,", indent = 11 })
run:new_line("error_state_tuple.py", { on_line = 7, text = "b,", indent = 1 })
run:new_line("error_state_tuple_align.py", { on_line = 7, text = "b,", indent = 1 })
run:new_line("error_state_list.py", { on_line = 5, text = "3,", indent = 6 })
run:new_line("error_state_dict.py", { on_line = 6, text = "9:10,", indent = 6 })
run:new_line("error_state_set.py", { on_line = 5, text = "9,", indent = 6 })
run:new_line("error_state_funcall.py", { on_line = 5, text = "6,", indent = 2 })
run:new_line(
"join_lines.py",
{ on_line = 1, text = "+ 1 \\", indent = 4 },
@ -75,7 +85,7 @@ describe("indent Python:", function()
run:new_line("line_after_indent.py", { on_line = 55, text = "x", indent = 4 })
run:new_line("line_after_indent.py", { on_line = 63, text = "x", indent = 4 })
for _, line in ipairs { 2, 5, 8, 11, 16 } do
for _, line in ipairs { 2, 5, 8, 11, 16, 21, 24, 27, 34, 39 } do
run:new_line("return_dedent.py", { on_line = line, text = "x", indent = 0 })
end
end)