rufo 0.0.30 → 0.0.31
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rufo/formatter.rb +128 -46
- data/lib/rufo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 208020c1cfc4ae639637febda545a3c3752980fe
|
4
|
+
data.tar.gz: 17da5ed34f7765ff9e08daa305965e41c568a6ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 696a53c1d4d30504a01c677fe87f54db384c68c8e8e38f510184c7bd2fd1bb4e9b18a04171b75318f722356bdcca93eef28e96feafb21d403336b0432d2821cc
|
7
|
+
data.tar.gz: a5783f444cb5b20a2ef8d0b8eadd4a7e62502f4782e98bf5938ac484d6abbeda167384749a47b81ca10949c548e737a967706b420f64424225f94180bc753fb6
|
data/lib/rufo/formatter.rb
CHANGED
@@ -19,7 +19,7 @@ class Rufo::Formatter
|
|
19
19
|
@indent = 0
|
20
20
|
@line = 0
|
21
21
|
@column = 0
|
22
|
-
@last_was_newline =
|
22
|
+
@last_was_newline = true
|
23
23
|
@output = ""
|
24
24
|
|
25
25
|
# The column of a `obj.method` call, so we can align
|
@@ -74,6 +74,12 @@ class Rufo::Formatter
|
|
74
74
|
# Position of comments that occur at the end of a line
|
75
75
|
@comments_positions = []
|
76
76
|
|
77
|
+
# Token for the last comment found
|
78
|
+
@last_comment = nil
|
79
|
+
|
80
|
+
# Actual column of the last comment written
|
81
|
+
@last_comment_column = nil
|
82
|
+
|
77
83
|
# Associate lines to alignments
|
78
84
|
# Associate a line to an index inside @comments_position
|
79
85
|
# becuase when aligning something to the left of a comment
|
@@ -205,7 +211,8 @@ class Rufo::Formatter
|
|
205
211
|
def format
|
206
212
|
visit @sexp
|
207
213
|
consume_end
|
208
|
-
write_line
|
214
|
+
write_line if !@last_was_newline || @output == ""
|
215
|
+
@output.chomp! if @output.end_with?("\n\n")
|
209
216
|
|
210
217
|
dedent_calls
|
211
218
|
do_align_assignments if @align_assignments
|
@@ -275,7 +282,7 @@ class Rufo::Formatter
|
|
275
282
|
|
276
283
|
# For heredocs with tilde we sometimes need to align the contents
|
277
284
|
if heredoc && tilde && @last_was_newline
|
278
|
-
write_indent(next_indent)
|
285
|
+
write_indent(next_indent) unless current_token_value == "\n"
|
279
286
|
check :on_tstring_content
|
280
287
|
consume_token_value(current_token_value)
|
281
288
|
next_token
|
@@ -797,9 +804,19 @@ class Rufo::Formatter
|
|
797
804
|
end
|
798
805
|
end
|
799
806
|
|
800
|
-
def
|
807
|
+
def current_comment_aligned_to_previous_one?
|
808
|
+
@last_comment &&
|
809
|
+
@last_comment[0][0] + 1 == current_token[0][0] &&
|
810
|
+
@last_comment[0][1] == current_token[0][1]
|
811
|
+
end
|
812
|
+
|
813
|
+
def track_comment(id: nil, match_previous_id: false)
|
814
|
+
if match_previous_id && !@comments_positions.empty?
|
815
|
+
id = @comments_positions.last[3]
|
816
|
+
end
|
817
|
+
|
801
818
|
@line_to_alignments_positions[@line] << [:comment, @column, @comments_positions, @comments_positions.size]
|
802
|
-
@comments_positions << [@line, @column, 0,
|
819
|
+
@comments_positions << [@line, @column, 0, id, 0]
|
803
820
|
end
|
804
821
|
|
805
822
|
def track_assignment(offset = 0)
|
@@ -1056,18 +1073,7 @@ class Rufo::Formatter
|
|
1056
1073
|
|
1057
1074
|
push_call(node) do
|
1058
1075
|
visit name
|
1059
|
-
|
1060
|
-
has_backslash, first_space = skip_space_backslash
|
1061
|
-
if has_backslash
|
1062
|
-
write " \\"
|
1063
|
-
write_line
|
1064
|
-
write_indent(next_indent)
|
1065
|
-
elsif first_space && @preserve_whitespace
|
1066
|
-
write_space first_space[2]
|
1067
|
-
skip_space_or_newline
|
1068
|
-
else
|
1069
|
-
consume_space
|
1070
|
-
end
|
1076
|
+
consume_space_after_command_name
|
1071
1077
|
end
|
1072
1078
|
|
1073
1079
|
visit_command_end(node, args)
|
@@ -1128,8 +1134,7 @@ class Rufo::Formatter
|
|
1128
1134
|
end
|
1129
1135
|
|
1130
1136
|
visit name
|
1131
|
-
|
1132
|
-
|
1137
|
+
consume_space_after_command_name
|
1133
1138
|
visit_command_args(args)
|
1134
1139
|
|
1135
1140
|
# Only set it after we visit the call after the dot,
|
@@ -1137,6 +1142,20 @@ class Rufo::Formatter
|
|
1137
1142
|
@dot_column = dot_column
|
1138
1143
|
end
|
1139
1144
|
|
1145
|
+
def consume_space_after_command_name
|
1146
|
+
has_backslash, first_space = skip_space_backslash
|
1147
|
+
if has_backslash
|
1148
|
+
write " \\"
|
1149
|
+
write_line
|
1150
|
+
write_indent(next_indent)
|
1151
|
+
elsif first_space && @preserve_whitespace
|
1152
|
+
write_space first_space[2]
|
1153
|
+
skip_space_or_newline
|
1154
|
+
else
|
1155
|
+
consume_space
|
1156
|
+
end
|
1157
|
+
end
|
1158
|
+
|
1140
1159
|
def visit_command_args(args)
|
1141
1160
|
needed_indent = @column
|
1142
1161
|
|
@@ -1481,7 +1500,16 @@ class Rufo::Formatter
|
|
1481
1500
|
visit args
|
1482
1501
|
end
|
1483
1502
|
|
1484
|
-
|
1503
|
+
if has_paren
|
1504
|
+
# Ripper has a bug where parsing `|(w, *x, y), z|`,
|
1505
|
+
# the "y" isn't returned. In this case we just consume
|
1506
|
+
# all tokens until we find a `)`.
|
1507
|
+
while current_token_kind != :on_rparen
|
1508
|
+
consume_token current_token_kind
|
1509
|
+
end
|
1510
|
+
|
1511
|
+
consume_token :on_rparen
|
1512
|
+
end
|
1485
1513
|
end
|
1486
1514
|
|
1487
1515
|
def visit_mrhs_add_star(node)
|
@@ -1639,13 +1667,34 @@ class Rufo::Formatter
|
|
1639
1667
|
|
1640
1668
|
consume_op_or_keyword op
|
1641
1669
|
|
1642
|
-
|
1643
|
-
|
1670
|
+
has_space = space?
|
1671
|
+
|
1672
|
+
if has_space
|
1673
|
+
consume_space(want_preserve_whitespace: @preserve_whitespace)
|
1644
1674
|
else
|
1645
1675
|
skip_space_or_newline
|
1646
1676
|
end
|
1647
1677
|
|
1648
|
-
|
1678
|
+
if op == :not
|
1679
|
+
has_paren = current_token_kind == :on_lparen
|
1680
|
+
|
1681
|
+
if has_paren && !has_space
|
1682
|
+
write "("
|
1683
|
+
next_token
|
1684
|
+
skip_space_or_newline
|
1685
|
+
end
|
1686
|
+
|
1687
|
+
visit exp
|
1688
|
+
|
1689
|
+
if has_paren && !has_space
|
1690
|
+
skip_space_or_newline
|
1691
|
+
check :on_rparen
|
1692
|
+
write ")"
|
1693
|
+
next_token
|
1694
|
+
end
|
1695
|
+
else
|
1696
|
+
visit exp
|
1697
|
+
end
|
1649
1698
|
end
|
1650
1699
|
|
1651
1700
|
def visit_binary(node)
|
@@ -2312,7 +2361,12 @@ class Rufo::Formatter
|
|
2312
2361
|
check :on_tlambda
|
2313
2362
|
write "->"
|
2314
2363
|
next_token
|
2315
|
-
|
2364
|
+
|
2365
|
+
if space? && @preserve_whitespace
|
2366
|
+
consume_space(want_preserve_whitespace: true)
|
2367
|
+
else
|
2368
|
+
skip_space_or_newline
|
2369
|
+
end
|
2316
2370
|
|
2317
2371
|
if empty_params?(params)
|
2318
2372
|
if current_token_kind == :on_lparen
|
@@ -2386,27 +2440,25 @@ class Rufo::Formatter
|
|
2386
2440
|
_, exp = node
|
2387
2441
|
|
2388
2442
|
consume_keyword "defined?"
|
2389
|
-
|
2443
|
+
has_space = space?
|
2444
|
+
|
2445
|
+
if has_space
|
2446
|
+
consume_space(want_preserve_whitespace: @preserve_whitespace)
|
2447
|
+
else
|
2448
|
+
skip_space_or_newline
|
2449
|
+
end
|
2390
2450
|
|
2391
2451
|
has_paren = current_token_kind == :on_lparen
|
2392
2452
|
|
2393
|
-
if has_paren
|
2453
|
+
if has_paren && !has_space
|
2394
2454
|
write "("
|
2395
2455
|
next_token
|
2396
2456
|
skip_space_or_newline
|
2397
|
-
else
|
2398
|
-
consume_space
|
2399
|
-
end
|
2400
|
-
|
2401
|
-
# exp can be [:paren, exp] if there's a parentheses,
|
2402
|
-
# though not always (only if there's a space after `defined?`)
|
2403
|
-
if exp[0] == :paren
|
2404
|
-
exp = exp[1]
|
2405
2457
|
end
|
2406
2458
|
|
2407
2459
|
visit exp
|
2408
2460
|
|
2409
|
-
if has_paren
|
2461
|
+
if has_paren && !has_space
|
2410
2462
|
skip_space_or_newline
|
2411
2463
|
check :on_rparen
|
2412
2464
|
write ")"
|
@@ -2866,8 +2918,6 @@ class Rufo::Formatter
|
|
2866
2918
|
multilple_lines = false # Did we pass through more than one newline?
|
2867
2919
|
last_comment_has_newline = false # Does the last comment has a newline?
|
2868
2920
|
newline_count = 0 # Number of newlines we passed
|
2869
|
-
last_comment = nil # Token for the last comment found
|
2870
|
-
last_comment_column = nil # Actual column of the last comment written
|
2871
2921
|
|
2872
2922
|
loop do
|
2873
2923
|
case current_token_kind
|
@@ -2936,11 +2986,9 @@ class Rufo::Formatter
|
|
2936
2986
|
# a = 1 # some comment
|
2937
2987
|
# # that continues here
|
2938
2988
|
# ```
|
2939
|
-
if
|
2940
|
-
|
2941
|
-
|
2942
|
-
write_indent(last_comment_column)
|
2943
|
-
track_comment
|
2989
|
+
if current_comment_aligned_to_previous_one?
|
2990
|
+
write_indent(@last_comment_column)
|
2991
|
+
track_comment(match_previous_id: true)
|
2944
2992
|
else
|
2945
2993
|
write_indent
|
2946
2994
|
end
|
@@ -2959,15 +3007,50 @@ class Rufo::Formatter
|
|
2959
3007
|
# Write line or second line if needed
|
2960
3008
|
write_line if last != :newline || multilple_lines
|
2961
3009
|
write_indent
|
3010
|
+
track_comment(id: @last_was_newline ? true : nil)
|
2962
3011
|
else
|
2963
3012
|
# If we didn't find any newline yet, this is the first comment,
|
2964
3013
|
# so append a space if needed (for example after an expression)
|
2965
3014
|
write_space unless at_prefix
|
2966
|
-
|
3015
|
+
|
3016
|
+
# First we check if the comment was aligned to the previous comment
|
3017
|
+
# in the previous line, in order to keep them like that.
|
3018
|
+
if current_comment_aligned_to_previous_one?
|
3019
|
+
track_comment(match_previous_id: true)
|
3020
|
+
else
|
3021
|
+
# We want to distinguish comments that appear at the beginning
|
3022
|
+
# of a line (which means the line has only a comment) and comments
|
3023
|
+
# that appear after some expression. We don't want to align these
|
3024
|
+
# and consider them separate entities. So, we use `@last_was_newline`
|
3025
|
+
# as an id to distinguish that.
|
3026
|
+
#
|
3027
|
+
# For example, this:
|
3028
|
+
#
|
3029
|
+
# # comment 1
|
3030
|
+
# # comment 2
|
3031
|
+
# call # comment 3
|
3032
|
+
#
|
3033
|
+
# Should format to:
|
3034
|
+
#
|
3035
|
+
# # comment 1
|
3036
|
+
# # comment 2
|
3037
|
+
# call # comment 3
|
3038
|
+
#
|
3039
|
+
# Instead of:
|
3040
|
+
#
|
3041
|
+
# # comment 1
|
3042
|
+
# # comment 2
|
3043
|
+
# call # comment 3
|
3044
|
+
#
|
3045
|
+
# We still want to track the first two comments to align to the
|
3046
|
+
# beginning of the line according to indentation in case they
|
3047
|
+
# are not already there.
|
3048
|
+
track_comment(id: @last_was_newline ? true : nil)
|
3049
|
+
end
|
2967
3050
|
end
|
2968
3051
|
end
|
2969
|
-
last_comment = current_token
|
2970
|
-
last_comment_column = @column
|
3052
|
+
@last_comment = current_token
|
3053
|
+
@last_comment_column = @column
|
2971
3054
|
last_comment_has_newline = current_token_value.end_with?("\n")
|
2972
3055
|
last = :comment
|
2973
3056
|
multilple_lines = false
|
@@ -3140,7 +3223,6 @@ class Rufo::Formatter
|
|
3140
3223
|
def write_indent(indent = @indent)
|
3141
3224
|
@output << " " * indent
|
3142
3225
|
@column += indent
|
3143
|
-
@last_was_newline = false
|
3144
3226
|
end
|
3145
3227
|
|
3146
3228
|
def indent_after_space(node, sticky: false, want_space: true, first_space: nil, needed_indent: next_indent)
|
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.0.
|
4
|
+
version: 0.0.31
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ary Borenszweig
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|