rufo 0.15.1 → 0.16.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +41 -19
- data/lib/rufo/erb_formatter.rb +1 -1
- data/lib/rufo/formatter.rb +351 -33
- data/lib/rufo/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6b55f94b8276a2ca0dc8518aa98949e83f83a95adc25a039385cb6855bcbb1c
|
4
|
+
data.tar.gz: 03b7595cccdade48c215c3609726bd8a40a5ac72c66e6f64246e842a63f7729e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c15b016ff6914844a2da86cf3af9ae257abdd9c421dfc4186d2eea39cfba919a2ac3ec489a1f539c59abd49452a5af511e2bca538adb7c62b346859bab3912b
|
7
|
+
data.tar.gz: aadada98b7acf84c40c147210655c54681d49b2d2079c76f6d44c19775676556cbf6545bc0754b4c037ba94478b31259f1236a464f60b15704f1e6ecbb98def7
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -12,6 +12,28 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
12
12
|
|
13
13
|
### Added
|
14
14
|
|
15
|
+
## [0.16.1] - 2023-05-04
|
16
|
+
|
17
|
+
### Fixed
|
18
|
+
- Fix Bug: raises error while formatting pattern matching syntax ([#304](https://github.com/ruby-formatter/rufo/issues/304))
|
19
|
+
- Fix Bug: avoid inserting a unnecessary comma to end of heredoc which in array with method call ([#303](https://github.com/ruby-formatter/rufo/pull/303))
|
20
|
+
|
21
|
+
### Changed
|
22
|
+
|
23
|
+
### Added
|
24
|
+
|
25
|
+
## [0.16.0] - 2023-04-02
|
26
|
+
|
27
|
+
### Fixed
|
28
|
+
|
29
|
+
- Formats ERB files with configuration ([#275](https://github.com/ruby-formatter/rufo/issues/275))
|
30
|
+
|
31
|
+
### Changed
|
32
|
+
|
33
|
+
### Added
|
34
|
+
|
35
|
+
- Support for pattern matching syntax
|
36
|
+
|
15
37
|
## [0.15.1] - 2023-02-08
|
16
38
|
|
17
39
|
### Fixed
|
@@ -46,8 +68,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
46
68
|
|
47
69
|
### Added
|
48
70
|
|
49
|
-
- Support for partial argument forwarding. (
|
50
|
-
- Support for endless method. (
|
71
|
+
- Support for partial argument forwarding. ([#268](https://github.com/ruby-formatter/rufo/issues/268))
|
72
|
+
- Support for endless method. ([#271](https://github.com/ruby-formatter/rufo/issues/271))
|
51
73
|
- Add Ruby 3.2.0 to test runs on CI.
|
52
74
|
|
53
75
|
## [0.13.0] - 2021-05-07
|
@@ -72,7 +94,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
72
94
|
- File.read default encode UTF-8
|
73
95
|
- Handle case where the code is invalid but ripper does not raise an error.
|
74
96
|
- Removed implicit dependency on `rake`.
|
75
|
-
- Error when semicolon and then used in a case statement #230.
|
97
|
+
- Error when semicolon and then used in a case statement [#230](https://github.com/ruby-formatter/rufo/issues/230).
|
76
98
|
|
77
99
|
### Changed
|
78
100
|
|
@@ -163,22 +185,22 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
163
185
|
## [0.7.0] - 2019-04-28
|
164
186
|
|
165
187
|
### Fixed
|
166
|
-
- Argument align with splat (
|
188
|
+
- Argument align with splat ([#123](https://github.com/ruby-formatter/rufo/issues/123))
|
167
189
|
|
168
190
|
### Changed
|
169
191
|
|
170
192
|
### Added
|
171
|
-
- Support jbuilder files (
|
193
|
+
- Support jbuilder files ([#173](https://github.com/ruby-formatter/rufo/issues/173))
|
172
194
|
|
173
195
|
## [0.6.1] - 2019-04-27
|
174
196
|
|
175
197
|
### Fixed
|
176
|
-
- Fix bug: symbol literal like `:"foo"` in ruby 2.6.3 (
|
198
|
+
- Fix bug: symbol literal like `:"foo"` in ruby 2.6.3 ([#168](https://github.com/ruby-formatter/rufo/issues/168))
|
177
199
|
|
178
200
|
## [0.6.0] - 2019-03-04
|
179
201
|
|
180
202
|
### Fixed
|
181
|
-
- Fix odd indentation of nested one liner "if" statements (
|
203
|
+
- Fix odd indentation of nested one liner "if" statements ([#128](https://github.com/ruby-formatter/rufo/issues/128))
|
182
204
|
|
183
205
|
### Added
|
184
206
|
- Ignore `vendor` directories from files to be checked. This allows rufo to be run without any arguments against a directory both locally and on common CI tools without needing any configuration.
|
@@ -192,7 +214,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
192
214
|
|
193
215
|
### Fixed
|
194
216
|
|
195
|
-
- Fix bug: Rufo crashes on nested empty hash literal (
|
217
|
+
- Fix bug: Rufo crashes on nested empty hash literal ([#152](https://github.com/ruby-formatter/rufo/issues/152))
|
196
218
|
- Handle case where rufo would change formatting if run multiple times for hashes in some cases.
|
197
219
|
|
198
220
|
## [0.5.0] - 2019-02-09
|
@@ -210,7 +232,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
210
232
|
## [0.4.2] - 2019-01-22
|
211
233
|
|
212
234
|
### Fixed
|
213
|
-
- Fix bug: Rufo indents squiggly HEREDOC incorrectly causing bad formating (
|
235
|
+
- Fix bug: Rufo indents squiggly HEREDOC incorrectly causing bad formating ([#136](https://github.com/ruby-formatter/rufo/issues/136))
|
214
236
|
|
215
237
|
### Added
|
216
238
|
|
@@ -219,14 +241,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
219
241
|
## [0.4.1] - 2018-10-27
|
220
242
|
|
221
243
|
### Fixed
|
222
|
-
- Fix bug for double colon operator in method definition (
|
244
|
+
- Fix bug for double colon operator in method definition ([#120](https://github.com/ruby-formatter/rufo/issues/120))
|
223
245
|
|
224
246
|
## [0.4.0] - 2018-08-09
|
225
247
|
|
226
248
|
### Fixed
|
227
|
-
- Fix Bug: Rufo breaks HEREDOC syntax. (
|
228
|
-
- Fix Bug: formatter.rb:3700:in `block in adjust_other_alignments': undefined method `[]' for nil:NilClass (NoMethodError) (
|
229
|
-
- Fix Bug: Rufo keeps switching formatting on same file every time it runs (
|
249
|
+
- Fix Bug: Rufo breaks HEREDOC syntax. ([#88](https://github.com/ruby-formatter/rufo/issues/88)). This fixes heredoc within parens formatting causing bad formatting and subsequent syntax error.
|
250
|
+
- Fix Bug: formatter.rb:3700:in `block in adjust_other_alignments': undefined method `[]' for nil:NilClass (NoMethodError) ([#87](https://github.com/ruby-formatter/rufo/issues/87)). Check alignment target exists.
|
251
|
+
- Fix Bug: Rufo keeps switching formatting on same file every time it runs ([#86](https://github.com/ruby-formatter/rufo/issues/86)). Avoids re-indenting nested literal indents.
|
230
252
|
|
231
253
|
### Added
|
232
254
|
- Allow for simpler else_body node to suit new Ripper style in 2.6.0
|
@@ -238,7 +260,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
238
260
|
## [0.3.1] - 2018-04-12
|
239
261
|
|
240
262
|
### Fixed
|
241
|
-
- Fix `quote_style` config not being respected (
|
263
|
+
- Fix `quote_style` config not being respected ([#95](https://github.com/ruby-formatter/rufo/issues/95)).
|
242
264
|
|
243
265
|
## [0.3.0] - 2018-03-24
|
244
266
|
|
@@ -247,9 +269,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
247
269
|
- Normalize string quotes according to quote_style, which defaults to :double.
|
248
270
|
|
249
271
|
### Fixed
|
250
|
-
- Fix printing of extraneous trailing semicolons from inline classes, modules, methods (
|
251
|
-
- Fix unhandled white space between array getter/setters `x[0] [0]` (
|
252
|
-
- Fix comma printing for heredocs when inside a hash (
|
272
|
+
- Fix printing of extraneous trailing semicolons from inline classes, modules, methods ([#59](https://github.com/ruby-formatter/rufo/issues/59))
|
273
|
+
- Fix unhandled white space between array getter/setters `x[0] [0]` ([#62](https://github.com/ruby-formatter/rufo/issues/62))
|
274
|
+
- Fix comma printing for heredocs when inside a hash ([#61](https://github.com/ruby-formatter/rufo/issues/61))
|
253
275
|
- Fix array literals against changes to Ruby 2.5.0
|
254
276
|
|
255
277
|
## [0.2.0] - 2017-11-13
|
@@ -290,8 +312,8 @@ The following configuration options have been **removed**, and replaced with non
|
|
290
312
|
|
291
313
|
### Fixed
|
292
314
|
- Fix crash in Ruby <= 2.3.4, <= 2.4.1 in the presence of certain squiggly doc (`<<~`) with multiple embedded expressions. The real fix here is to upgrade Ruby to >= 2.3.5 / >= 2.4.2
|
293
|
-
- Fix dedent bug and bad formatting caused by comments within chained calls (
|
294
|
-
- Fix formatting bug for `for i, in [[1, 2]] ; x ; end` (
|
315
|
+
- Fix dedent bug and bad formatting caused by comments within chained calls ([#49](https://github.com/ruby-formatter/rufo/issues/49))
|
316
|
+
- Fix formatting bug for `for i, in [[1, 2]] ; x ; end` ([#45](https://github.com/ruby-formatter/rufo/issues/45))
|
295
317
|
|
296
318
|
## [0.1.0] - 2017-10-08
|
297
319
|
Beginning of logging changes!
|
data/lib/rufo/erb_formatter.rb
CHANGED
data/lib/rufo/formatter.rb
CHANGED
@@ -227,7 +227,7 @@ class Rufo::Formatter
|
|
227
227
|
when :@CHAR
|
228
228
|
# [:@CHAR, "?a", [1, 0]]
|
229
229
|
consume_token :on_CHAR
|
230
|
-
when :@
|
230
|
+
when :@backref, :@label, :@op
|
231
231
|
# [:@gvar, "$abc", [1, 0]]
|
232
232
|
# [:@backref, "$1", [1, 0]]
|
233
233
|
# [:@label, "foo:", [1, 3]]
|
@@ -287,6 +287,7 @@ class Rufo::Formatter
|
|
287
287
|
when :dyna_symbol
|
288
288
|
visit_quoted_symbol_literal(node)
|
289
289
|
when :@ident
|
290
|
+
consume_pin_op
|
290
291
|
consume_token :on_ident
|
291
292
|
when :var_ref, :var_field, :const_ref, :vcall, :fcall
|
292
293
|
# [:var_ref, exp]
|
@@ -300,10 +301,16 @@ class Rufo::Formatter
|
|
300
301
|
consume_token :on_kw
|
301
302
|
when :@ivar
|
302
303
|
# [:@ivar, "@foo", [1, 0]]
|
304
|
+
consume_pin_op
|
303
305
|
consume_token :on_ivar
|
304
306
|
when :@cvar
|
305
307
|
# [:@cvar, "@@foo", [1, 0]]
|
308
|
+
consume_pin_op
|
306
309
|
consume_token :on_cvar
|
310
|
+
when :@gvar
|
311
|
+
# [:@gvar, "$foo", [1, 0]]
|
312
|
+
consume_pin_op
|
313
|
+
consume_token :on_gvar
|
307
314
|
when :@const
|
308
315
|
# [:@const, "FOO", [1, 0]]
|
309
316
|
consume_token :on_const
|
@@ -377,7 +384,7 @@ class Rufo::Formatter
|
|
377
384
|
visit_until(node)
|
378
385
|
when :case
|
379
386
|
visit_case(node)
|
380
|
-
when :when
|
387
|
+
when :when, :in
|
381
388
|
visit_when(node)
|
382
389
|
when :unary
|
383
390
|
visit_unary(node)
|
@@ -470,6 +477,12 @@ class Rufo::Formatter
|
|
470
477
|
visit_end_node(node)
|
471
478
|
when :args_forward
|
472
479
|
consume_op("...")
|
480
|
+
when :aryptn
|
481
|
+
visit_array_pattern(node)
|
482
|
+
when :fndptn
|
483
|
+
visit_find_pattern(node)
|
484
|
+
when :hshptn
|
485
|
+
visit_hash_pattern(node)
|
473
486
|
else
|
474
487
|
bug "Unhandled node: #{node.first}"
|
475
488
|
end
|
@@ -587,8 +600,8 @@ class Rufo::Formatter
|
|
587
600
|
needs_comma = !comma? && trailing_commas
|
588
601
|
|
589
602
|
if inside_literal_elements_list && needs_comma
|
590
|
-
write ","
|
591
603
|
@last_was_heredoc = true
|
604
|
+
@end_of_heredoc_position = @output.length
|
592
605
|
end
|
593
606
|
|
594
607
|
@output << captured_output
|
@@ -1543,13 +1556,26 @@ class Rufo::Formatter
|
|
1543
1556
|
end
|
1544
1557
|
|
1545
1558
|
def visit_begin(node)
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1551
|
-
|
1552
|
-
|
1559
|
+
if op?("^")
|
1560
|
+
# ^(expression)
|
1561
|
+
#
|
1562
|
+
# [:begin, expression_node]
|
1563
|
+
consume_op "^"
|
1564
|
+
skip_space
|
1565
|
+
consume_token :on_lparen
|
1566
|
+
skip_space
|
1567
|
+
visit node[1]
|
1568
|
+
skip_space
|
1569
|
+
consume_token :on_rparen
|
1570
|
+
else
|
1571
|
+
# begin
|
1572
|
+
# body
|
1573
|
+
# end
|
1574
|
+
#
|
1575
|
+
# [:begin, [:bodystmt, body, rescue_body, else_body, ensure_body]]
|
1576
|
+
consume_keyword "begin"
|
1577
|
+
visit node[1]
|
1578
|
+
end
|
1553
1579
|
end
|
1554
1580
|
|
1555
1581
|
def visit_bodystmt(node)
|
@@ -1800,7 +1826,7 @@ class Rufo::Formatter
|
|
1800
1826
|
# Maybe a Ripper bug, but if there's something before a star
|
1801
1827
|
# then a star shouldn't be here... but if it is... handle it
|
1802
1828
|
# somehow...
|
1803
|
-
if
|
1829
|
+
if op?("*")
|
1804
1830
|
star = before
|
1805
1831
|
else
|
1806
1832
|
visit_comma_separated_list to_ary(before)
|
@@ -2353,7 +2379,7 @@ class Rufo::Formatter
|
|
2353
2379
|
token_column = current_token_column
|
2354
2380
|
|
2355
2381
|
closing_brace_token, _ = find_closing_brace_token
|
2356
|
-
need_space = need_space_for_hash?(node, closing_brace_token)
|
2382
|
+
need_space = need_space_for_hash?(node, node[1], closing_brace_token)
|
2357
2383
|
|
2358
2384
|
check :on_lbrace
|
2359
2385
|
write "{"
|
@@ -2733,7 +2759,7 @@ class Rufo::Formatter
|
|
2733
2759
|
visit_comma_separated_list exps
|
2734
2760
|
end
|
2735
2761
|
|
2736
|
-
def visit_literal_elements(elements, inside_hash: false, inside_array: false, token_column:)
|
2762
|
+
def visit_literal_elements(elements, inside_hash: false, inside_array: false, token_column:, keep_final_newline: false, &block)
|
2737
2763
|
base_column = @column
|
2738
2764
|
base_line = @line
|
2739
2765
|
needs_final_space = (inside_hash || inside_array) && space?
|
@@ -2770,6 +2796,7 @@ class Rufo::Formatter
|
|
2770
2796
|
wrote_comma = false
|
2771
2797
|
first_space = nil
|
2772
2798
|
|
2799
|
+
visitor = block_given? ? block : ->(elem) { visit elem }
|
2773
2800
|
elements.each_with_index do |elem, i|
|
2774
2801
|
@literal_elements_level = @node_level
|
2775
2802
|
|
@@ -2777,9 +2804,9 @@ class Rufo::Formatter
|
|
2777
2804
|
wrote_comma = false
|
2778
2805
|
|
2779
2806
|
if needs_trailing_comma
|
2780
|
-
indent(needed_indent) {
|
2807
|
+
indent(needed_indent) { visitor.call(elem) }
|
2781
2808
|
else
|
2782
|
-
|
2809
|
+
visitor.call(elem)
|
2783
2810
|
end
|
2784
2811
|
|
2785
2812
|
# We have to be careful not to aumatically write a heredoc on next_token,
|
@@ -2820,7 +2847,13 @@ class Rufo::Formatter
|
|
2820
2847
|
@literal_elements_level = nil
|
2821
2848
|
|
2822
2849
|
if needs_trailing_comma
|
2823
|
-
|
2850
|
+
if !wrote_comma && trailing_commas
|
2851
|
+
if @last_was_heredoc
|
2852
|
+
@output.insert(@end_of_heredoc_position, ",")
|
2853
|
+
else
|
2854
|
+
write ","
|
2855
|
+
end
|
2856
|
+
end
|
2824
2857
|
|
2825
2858
|
consume_end_of_line(first_space: first_space)
|
2826
2859
|
write_indent
|
@@ -2829,6 +2862,8 @@ class Rufo::Formatter
|
|
2829
2862
|
else
|
2830
2863
|
if needs_final_space
|
2831
2864
|
consume_space
|
2865
|
+
elsif keep_final_newline
|
2866
|
+
skip_space
|
2832
2867
|
else
|
2833
2868
|
skip_space_or_newline
|
2834
2869
|
end
|
@@ -2938,31 +2973,66 @@ class Rufo::Formatter
|
|
2938
2973
|
# [:case, cond, case_when]
|
2939
2974
|
_, cond, case_when = node
|
2940
2975
|
|
2941
|
-
|
2976
|
+
# If node is inline pattern matching, case_expression will be false
|
2977
|
+
case_expression = keyword?("case")
|
2978
|
+
if case_expression
|
2979
|
+
consume_keyword "case"
|
2980
|
+
end
|
2942
2981
|
|
2943
2982
|
if cond
|
2944
2983
|
consume_space
|
2945
2984
|
visit cond
|
2946
2985
|
end
|
2947
2986
|
|
2948
|
-
|
2949
|
-
|
2950
|
-
|
2987
|
+
if case_expression
|
2988
|
+
consume_end_of_line
|
2989
|
+
write_indent
|
2990
|
+
else
|
2991
|
+
consume_space
|
2992
|
+
end
|
2951
2993
|
visit case_when
|
2952
2994
|
|
2953
|
-
|
2954
|
-
|
2995
|
+
if case_expression
|
2996
|
+
write_indent
|
2997
|
+
consume_keyword "end"
|
2998
|
+
end
|
2955
2999
|
end
|
2956
3000
|
|
2957
3001
|
def visit_when(node)
|
2958
3002
|
# [:when, conds, body, next_exp]
|
2959
|
-
|
3003
|
+
# [:in, pattern, body, next_exp]
|
3004
|
+
kw, conds_or_pattern, body, next_exp = node
|
2960
3005
|
|
2961
|
-
|
3006
|
+
case kw
|
3007
|
+
when :when
|
3008
|
+
consume_keyword "when"
|
3009
|
+
when :in
|
3010
|
+
if current_token_kind == :on_op
|
3011
|
+
consume_op "=>"
|
3012
|
+
else
|
3013
|
+
consume_keyword "in"
|
3014
|
+
end
|
3015
|
+
end
|
2962
3016
|
consume_space
|
2963
3017
|
|
2964
3018
|
indent(@column) do
|
2965
|
-
|
3019
|
+
case kw
|
3020
|
+
when :when
|
3021
|
+
visit_comma_separated_list conds_or_pattern
|
3022
|
+
when :in
|
3023
|
+
parens = current_token_kind == :on_lparen
|
3024
|
+
if parens
|
3025
|
+
consume_token :on_lparen
|
3026
|
+
skip_space_or_newline
|
3027
|
+
end
|
3028
|
+
|
3029
|
+
visit conds_or_pattern
|
3030
|
+
|
3031
|
+
if parens
|
3032
|
+
skip_space_or_newline
|
3033
|
+
consume_token :on_rparen
|
3034
|
+
end
|
3035
|
+
end
|
2966
3036
|
skip_space
|
2967
3037
|
end
|
2968
3038
|
written_space = false
|
@@ -3020,12 +3090,15 @@ class Rufo::Formatter
|
|
3020
3090
|
end
|
3021
3091
|
end
|
3022
3092
|
|
3023
|
-
|
3024
|
-
|
3025
|
-
|
3093
|
+
# If node is inline pattern matching, body will be nil
|
3094
|
+
if body
|
3095
|
+
if inline
|
3096
|
+
indent do
|
3097
|
+
visit_exps body
|
3098
|
+
end
|
3099
|
+
else
|
3100
|
+
indent_body body
|
3026
3101
|
end
|
3027
|
-
else
|
3028
|
-
indent_body body
|
3029
3102
|
end
|
3030
3103
|
|
3031
3104
|
if next_exp
|
@@ -3056,6 +3129,232 @@ class Rufo::Formatter
|
|
3056
3129
|
end
|
3057
3130
|
end
|
3058
3131
|
|
3132
|
+
def visit_array_pattern(node)
|
3133
|
+
# [:aryptn, const_ref, pre_rest, rest, post_rest]
|
3134
|
+
_, const_ref, pre_rest, rest, post_rest = node
|
3135
|
+
|
3136
|
+
if const_ref
|
3137
|
+
return visit_constant_pattern(node)
|
3138
|
+
end
|
3139
|
+
|
3140
|
+
# pattern is [*]
|
3141
|
+
if !pre_rest && !post_rest && rest == [:var_field, nil]
|
3142
|
+
consume_token :on_lbracket
|
3143
|
+
skip_space_or_newline
|
3144
|
+
consume_op "*"
|
3145
|
+
skip_space_or_newline
|
3146
|
+
consume_token :on_rbracket
|
3147
|
+
return
|
3148
|
+
end
|
3149
|
+
|
3150
|
+
token_column = current_token_column
|
3151
|
+
|
3152
|
+
has_bracket = current_token_kind == :on_lbracket
|
3153
|
+
if has_bracket
|
3154
|
+
consume_token :on_lbracket
|
3155
|
+
skip_space
|
3156
|
+
end
|
3157
|
+
|
3158
|
+
write_comma = false
|
3159
|
+
if pre_rest
|
3160
|
+
visit_literal_elements pre_rest, inside_array: true, token_column: token_column, keep_final_newline: !has_bracket
|
3161
|
+
write_comma = true
|
3162
|
+
end
|
3163
|
+
|
3164
|
+
# pattern like `[a,]` will make `rest` as `[:var_field, nil]`
|
3165
|
+
if rest && ((var_name_node = rest[1]) || current_token_value == "*")
|
3166
|
+
if write_comma
|
3167
|
+
write ","
|
3168
|
+
consume_space
|
3169
|
+
else
|
3170
|
+
skip_space_or_newline
|
3171
|
+
end
|
3172
|
+
|
3173
|
+
consume_op "*"
|
3174
|
+
if var_name_node
|
3175
|
+
visit rest
|
3176
|
+
end
|
3177
|
+
end
|
3178
|
+
|
3179
|
+
if post_rest
|
3180
|
+
skip_space
|
3181
|
+
check :on_comma
|
3182
|
+
write ","
|
3183
|
+
consume_space
|
3184
|
+
next_token
|
3185
|
+
|
3186
|
+
visit_literal_elements post_rest, inside_array: true, token_column: token_column, keep_final_newline: !has_bracket
|
3187
|
+
end
|
3188
|
+
|
3189
|
+
skip_space
|
3190
|
+
if has_bracket
|
3191
|
+
consume_token :on_rbracket
|
3192
|
+
end
|
3193
|
+
end
|
3194
|
+
|
3195
|
+
def visit_constant_pattern(node)
|
3196
|
+
# [:aryptn, const_ref, args]
|
3197
|
+
_, const_ref, args = node
|
3198
|
+
|
3199
|
+
visit const_ref
|
3200
|
+
|
3201
|
+
parens = current_token_kind == :on_lparen
|
3202
|
+
if parens
|
3203
|
+
consume_token :on_lparen
|
3204
|
+
else
|
3205
|
+
consume_token :on_lbracket
|
3206
|
+
end
|
3207
|
+
|
3208
|
+
skip_space
|
3209
|
+
visit_comma_separated_list args
|
3210
|
+
|
3211
|
+
skip_space
|
3212
|
+
if parens
|
3213
|
+
consume_token :on_rparen
|
3214
|
+
else
|
3215
|
+
consume_token :on_rbracket
|
3216
|
+
end
|
3217
|
+
end
|
3218
|
+
|
3219
|
+
def visit_find_pattern(node)
|
3220
|
+
# [:fndptn, const_ref, pre, patterns, post]
|
3221
|
+
_, const_ref, pre, patterns, post = node
|
3222
|
+
|
3223
|
+
parens = if const_ref
|
3224
|
+
visit const_ref
|
3225
|
+
current_token_kind == :on_lparen
|
3226
|
+
else
|
3227
|
+
false
|
3228
|
+
end
|
3229
|
+
|
3230
|
+
if parens
|
3231
|
+
consume_token :on_lparen
|
3232
|
+
else
|
3233
|
+
consume_token :on_lbracket
|
3234
|
+
end
|
3235
|
+
|
3236
|
+
skip_space
|
3237
|
+
consume_op "*"
|
3238
|
+
if pre[1] # check pre has name or not
|
3239
|
+
visit pre
|
3240
|
+
end
|
3241
|
+
|
3242
|
+
patterns.each do |pattern|
|
3243
|
+
skip_space
|
3244
|
+
consume_token :on_comma
|
3245
|
+
consume_space
|
3246
|
+
visit pattern
|
3247
|
+
end
|
3248
|
+
|
3249
|
+
skip_space
|
3250
|
+
consume_token :on_comma
|
3251
|
+
consume_space
|
3252
|
+
consume_op "*"
|
3253
|
+
if post[1] # check post has name or not
|
3254
|
+
visit post
|
3255
|
+
end
|
3256
|
+
|
3257
|
+
skip_space
|
3258
|
+
if parens
|
3259
|
+
consume_token :on_rparen
|
3260
|
+
else
|
3261
|
+
consume_token :on_rbracket
|
3262
|
+
end
|
3263
|
+
end
|
3264
|
+
|
3265
|
+
def visit_hash_pattern(node)
|
3266
|
+
_, const_ref, elements, rest = node
|
3267
|
+
|
3268
|
+
if const_ref
|
3269
|
+
visit const_ref
|
3270
|
+
end
|
3271
|
+
|
3272
|
+
token_column = current_token_column
|
3273
|
+
|
3274
|
+
need_space = false
|
3275
|
+
expected_right_token = nil
|
3276
|
+
if const_ref
|
3277
|
+
if current_token_kind == :on_lparen
|
3278
|
+
consume_token :on_lparen
|
3279
|
+
expected_right_token = :on_rparen
|
3280
|
+
else
|
3281
|
+
consume_token :on_lbracket
|
3282
|
+
expected_right_token = :on_rbracket
|
3283
|
+
end
|
3284
|
+
elsif current_token_kind == :on_lbrace
|
3285
|
+
expected_right_token = :on_rbrace
|
3286
|
+
closing_brace_token, _ = find_closing_brace_token
|
3287
|
+
need_space = need_space_for_hash?(node, [*elements, rest].compact, closing_brace_token)
|
3288
|
+
|
3289
|
+
consume_token :on_lbrace
|
3290
|
+
brace_position = @output.length - 1
|
3291
|
+
consume_space if need_space
|
3292
|
+
end
|
3293
|
+
|
3294
|
+
# pattern is {}
|
3295
|
+
empty = !const_ref && !elements && !rest
|
3296
|
+
if empty
|
3297
|
+
consume_token :on_rbrace
|
3298
|
+
return
|
3299
|
+
end
|
3300
|
+
|
3301
|
+
# pattern is {**}
|
3302
|
+
empty = !const_ref && elements.empty? && !rest
|
3303
|
+
if empty
|
3304
|
+
consume_space
|
3305
|
+
consume_op "**"
|
3306
|
+
consume_space
|
3307
|
+
consume_token :on_rbrace
|
3308
|
+
return
|
3309
|
+
end
|
3310
|
+
|
3311
|
+
visit_literal_elements elements, inside_hash: true, token_column: token_column, keep_final_newline: expected_right_token.nil? do |element|
|
3312
|
+
key, value = element
|
3313
|
+
visit key
|
3314
|
+
if value
|
3315
|
+
consume_space
|
3316
|
+
visit value
|
3317
|
+
end
|
3318
|
+
end
|
3319
|
+
|
3320
|
+
if rest || op?("**") || comma?
|
3321
|
+
unless elements.empty?
|
3322
|
+
write ","
|
3323
|
+
end
|
3324
|
+
|
3325
|
+
skip_space_or_newline
|
3326
|
+
if rest || op?("**")
|
3327
|
+
consume_space
|
3328
|
+
consume_op "**"
|
3329
|
+
if rest
|
3330
|
+
visit rest
|
3331
|
+
end
|
3332
|
+
end
|
3333
|
+
end
|
3334
|
+
|
3335
|
+
unless expected_right_token.nil?
|
3336
|
+
skip_space
|
3337
|
+
|
3338
|
+
if expected_right_token == :on_rbrace
|
3339
|
+
# in some case, need_space_for_hash? might be unexpected behaviour for some patterns, example:
|
3340
|
+
# { a: 1,
|
3341
|
+
# ** }
|
3342
|
+
# so re-check need_space? at here, and insert a space in the missing position if needed.
|
3343
|
+
char_after_brace = @output[brace_position + 1]
|
3344
|
+
if !need_space && !["\n", " "].include?(char_after_brace)
|
3345
|
+
need_space = true
|
3346
|
+
@output.insert(brace_position + 1, " ")
|
3347
|
+
end
|
3348
|
+
end
|
3349
|
+
|
3350
|
+
check expected_right_token
|
3351
|
+
right = current_token_value
|
3352
|
+
write " " if need_space
|
3353
|
+
write right
|
3354
|
+
next_token
|
3355
|
+
end
|
3356
|
+
end
|
3357
|
+
|
3059
3358
|
def consume_space(want_preserve_whitespace: false)
|
3060
3359
|
first_space = skip_space
|
3061
3360
|
if want_preserve_whitespace && !newline? && !comment? && first_space
|
@@ -3407,6 +3706,13 @@ class Rufo::Formatter
|
|
3407
3706
|
end
|
3408
3707
|
end
|
3409
3708
|
|
3709
|
+
def consume_pin_op
|
3710
|
+
return unless op?("^")
|
3711
|
+
|
3712
|
+
consume_op "^"
|
3713
|
+
skip_space
|
3714
|
+
end
|
3715
|
+
|
3410
3716
|
def indent(value = nil)
|
3411
3717
|
if value
|
3412
3718
|
old_indent = @indent
|
@@ -3656,6 +3962,10 @@ class Rufo::Formatter
|
|
3656
3962
|
current_token_kind == :on_sp
|
3657
3963
|
end
|
3658
3964
|
|
3965
|
+
def op?(value)
|
3966
|
+
current_token_kind == :on_op && current_token_value == value
|
3967
|
+
end
|
3968
|
+
|
3659
3969
|
def void_exps?(node)
|
3660
3970
|
node.size == 1 && node[0].size == 1 && node[0][0] == :void_stmt
|
3661
3971
|
end
|
@@ -3887,8 +4197,8 @@ class Rufo::Formatter
|
|
3887
4197
|
end
|
3888
4198
|
|
3889
4199
|
# Check to see if need to add space inside hash literal braces.
|
3890
|
-
def need_space_for_hash?(node, closing_brace_token)
|
3891
|
-
return false
|
4200
|
+
def need_space_for_hash?(node, elements, closing_brace_token)
|
4201
|
+
return false if elements.nil? || elements.empty?
|
3892
4202
|
|
3893
4203
|
left_need_space = current_token_line == node_line(node, beginning: true)
|
3894
4204
|
right_need_space = closing_brace_token[0][0] == node_line(node, beginning: false)
|
@@ -3901,8 +4211,16 @@ class Rufo::Formatter
|
|
3901
4211
|
# get line of node, it is only used in visit_hash right now,
|
3902
4212
|
# so handling the following node types is enough.
|
3903
4213
|
case node.first
|
3904
|
-
when :hash, :string_literal, :symbol_literal, :symbol, :vcall, :string_content, :assoc_splat, :var_ref, :dyna_symbol
|
4214
|
+
when :hash, :string_literal, :symbol_literal, :symbol, :vcall, :string_content, :assoc_splat, :var_ref, :dyna_symbol, :var_field
|
3905
4215
|
node_line(node[1], beginning: beginning)
|
4216
|
+
when :hshptn
|
4217
|
+
_, _, elements, rest = node
|
4218
|
+
elem = if beginning
|
4219
|
+
(elements[0] && elements[0][0]) || rest
|
4220
|
+
else
|
4221
|
+
rest || elements.last[0]
|
4222
|
+
end
|
4223
|
+
node_line(elem, beginning: beginning)
|
3906
4224
|
when :assoc_new
|
3907
4225
|
# There's no line number info for empty strings or hashes.
|
3908
4226
|
if node[1] != EMPTY_STRING && node[1] != EMPTY_HASH
|
data/lib/rufo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rufo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ary Borenszweig
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -210,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
210
|
- !ruby/object:Gem::Version
|
211
211
|
version: '0'
|
212
212
|
requirements: []
|
213
|
-
rubygems_version: 3.
|
213
|
+
rubygems_version: 3.4.10
|
214
214
|
signing_key:
|
215
215
|
specification_version: 4
|
216
216
|
summary: Ruby code formatter
|