Skip to content

Commit f4a2df8

Browse files
committed
Fix multiline function definition folding
1 parent dd76366 commit f4a2df8

File tree

2 files changed

+53
-56
lines changed

2 files changed

+53
-56
lines changed

crates/parsa_python_cst/src/lib.rs

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -388,32 +388,12 @@ impl Tree {
388388
self.0.nodes().filter_map(|n| {
389389
let end = || n.last_leaf_in_subtree().previous_leaf().unwrap().end() - 1;
390390
if n.is_type(Nonterminal(match_stmt)) {
391-
return Some((n.start(), end()));
391+
return Some((n.nth_child(3).start(), end()));
392392
}
393393
if !n.is_type(Nonterminal(block)) || n.nth_child(0).is_type(Nonterminal(simple_stmts)) {
394394
return None;
395395
}
396-
let mut previous = n.parent().unwrap();
397-
if previous.is_type(Nonterminal(if_stmt)) {
398-
let cousin = n
399-
.previous_sibling()
400-
.unwrap()
401-
.previous_sibling()
402-
.unwrap()
403-
.previous_sibling()
404-
.unwrap();
405-
if cousin.as_code() == "elif" {
406-
previous = cousin
407-
}
408-
} else {
409-
let ancestor = previous.parent().unwrap();
410-
if ancestor.is_type(Nonterminal(async_stmt))
411-
|| ancestor.is_type(Nonterminal(async_function_def))
412-
{
413-
previous = ancestor;
414-
}
415-
}
416-
Some((previous.start(), end()))
396+
Some((n.start(), end()))
417397
})
418398
}
419399
}

crates/zuban_python/tests/mypylike/tests/folding_ranges.test

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ str
1212

1313
[out]
1414
__main__.py:2: Folding Ranges:
15-
- 3:0-6:22 Region
15+
- 3:9-6:22 Region
1616

1717
[case folding_ranges_basic_with_imports]
1818
#? folding-ranges
@@ -35,9 +35,9 @@ import types
3535
[out]
3636
__main__.py:2: Folding Ranges:
3737
- 1:0-5:27 Imports
38-
- 7:0-8:16 Region
39-
- 11:0-13:18 Region
40-
- 12:4-13:18 Region
38+
- 7:4-8:16 Region
39+
- 11:9-13:18 Region
40+
- 12:14-13:18 Region
4141

4242
[case folding_ranges_basic_syntax_blocks]
4343
#? folding-ranges
@@ -65,22 +65,22 @@ class X:
6565
something
6666
else:
6767
...
68-
with something:
68+
with something: # Something
6969
...
7070
[out]
7171
__main__.py:2: Folding Ranges:
72-
- 3:0-27:15 Region
73-
- 4:4-27:15 Region
74-
- 6:8-7:15 Region
75-
- 9:8-10:15 Region
76-
- 11:8-13:15 Region
77-
- 14:8-15:13 Region
78-
- 16:8-17:13 Region
79-
- 18:8-19:15 Region
80-
- 20:8-21:21 Region
81-
- 22:8-23:21 Region
82-
- 24:8-25:15 Region
83-
- 26:8-27:15 Region
72+
- 3:8-27:15 Region
73+
- 4:27-27:15 Region
74+
- 6:18-7:15 Region
75+
- 9:29-10:15 Region
76+
- 11:13-13:15 Region
77+
- 14:27-15:13 Region
78+
- 16:27-17:13 Region
79+
- 18:13-19:15 Region
80+
- 20:24-21:21 Region
81+
- 22:24-23:21 Region
82+
- 24:13-25:15 Region
83+
- 26:36-27:15 Region
8484

8585
[case folding_ranges_try_except]
8686
#? folding-ranges
@@ -103,12 +103,12 @@ def f(something, something_else) -> None:
103103

104104
[out]
105105
__main__.py:2: Folding Ranges:
106-
- 3:0-18:0 Region
107-
- 5:4-6:11 Region
108-
- 8:4-11:11 Region
109-
- 12:4-13:11 Region
110-
- 14:4-15:17 Region
111-
- 16:4-17:17 Region
106+
- 3:41-18:0 Region
107+
- 5:8-6:11 Region
108+
- 8:26-11:11 Region
109+
- 12:31-13:11 Region
110+
- 14:9-15:17 Region
111+
- 16:12-17:17 Region
112112

113113
[case folding_ranges_match]
114114
#? folding-ranges
@@ -127,11 +127,11 @@ def f(something) -> None:
127127
[out]
128128
__main__.py:2: Folding Ranges:
129129
- 1:0-2:13 Imports
130-
- 4:0-13:8 Region
131-
- 5:4-13:8 Region
132-
- 6:8-7:15 Region
133-
- 8:8-9:15 Region
134-
- 11:8-12:21 Region
130+
- 4:25-13:8 Region
131+
- 5:20-13:8 Region
132+
- 6:27-7:15 Region
133+
- 8:20-9:15 Region
134+
- 11:17-12:21 Region
135135

136136
[case folding_ranges_async]
137137
#? folding-ranges
@@ -156,9 +156,26 @@ async def bar():
156156

157157
[out]
158158
__main__.py:2: Folding Ranges:
159-
- 2:0-16:0 Region
160-
- 4:4-5:11 Region
161-
- 6:4-7:11 Region
162-
- 8:4-9:24 Region
163-
- 11:4-15:16 Region
164-
- 18:0-19:7 Region
159+
- 2:25-16:0 Region
160+
- 4:29-5:11 Region
161+
- 6:29-7:11 Region
162+
- 8:9-9:24 Region
163+
- 14:6-15:16 Region
164+
- 18:16-19:7 Region
165+
166+
[case multi_line_function_definition_folding]
167+
#? folding-ranges
168+
def f(
169+
x: str,
170+
y: str,
171+
*,
172+
z: str) -> None:
173+
...
174+
...
175+
pass
176+
...
177+
178+
x = 1
179+
[out]
180+
__main__.py:2: Folding Ranges:
181+
- 6:20-10:7 Region

0 commit comments

Comments
 (0)