rufo 0.0.28 → 0.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a6b866b774dad605890050d32a2b852c749cb59
4
- data.tar.gz: 9e1cc07e01934c9a01160fa16430c739600d3333
3
+ metadata.gz: a5d988295293486aedb59809e856de442d3e7643
4
+ data.tar.gz: 8429b9a9e9c0261736946f31564aed9f85618c91
5
5
  SHA512:
6
- metadata.gz: b931264262ffb38ba7eb7060c891342b2b6f7ed89625acb88842a6e5b51a99eeaaf9ead94b8e4ab0f8955c090847845b3b7ec62bdfca6615f35f378351027505
7
- data.tar.gz: 5bdd8f74723a4af2fa7a5eab106f55899fa510a7987bc2afb7d93296245867fb57a3f95592b23cbe633b6b017594f67003ba17808ac3c5fa0064cbb523ca80d6
6
+ metadata.gz: 4fe7de7ca53140f7b02fda1d5bdc9ad8cf448f448f60c969479f9e8427b96585a7dc7094f816fe3450f21f591bdea88f2c162670a906f0a13eda2b38f9388327
7
+ data.tar.gz: 1dc130a6f8708862eb9a4ded52459607579a1f431e77758f2e1d2266a50d6563e8e3fe52b0b8110c4e8508014107b7624ab49cb24a1fa8861d937abc03ff461f
@@ -532,8 +532,18 @@ class Rufo::Formatter
532
532
  if !is_last && (exp_needs_two_lines || needs_two_lines?(exps[i + 1])) && @line <= line_before_endline + 1
533
533
  write_line
534
534
  end
535
- else
536
- skip_space_or_newline unless is_last
535
+ elsif !is_last
536
+ skip_space
537
+
538
+ has_semicolon = semicolon?
539
+ skip_semicolons
540
+ if newline?
541
+ write_line
542
+ write_indent(next_indent)
543
+ elsif has_semicolon
544
+ write "; "
545
+ end
546
+ skip_space_or_newline
537
547
  end
538
548
  end
539
549
  end
@@ -1170,7 +1180,11 @@ class Rufo::Formatter
1170
1180
  if void_exps?(body)
1171
1181
  consume_token :on_lbrace
1172
1182
  consume_block_args args
1173
- consume_space
1183
+ if space?
1184
+ consume_space
1185
+ else
1186
+ skip_space_or_newline
1187
+ end
1174
1188
  consume_token :on_rbrace
1175
1189
  return
1176
1190
  end
@@ -1199,7 +1213,7 @@ class Rufo::Formatter
1199
1213
  call_info << true
1200
1214
  end
1201
1215
 
1202
- indent_body body
1216
+ indent_body body, force_multiline: true
1203
1217
  write_indent
1204
1218
 
1205
1219
  call_info << @line if call_info
@@ -1211,13 +1225,15 @@ class Rufo::Formatter
1211
1225
  # [:brace_block, args, body]
1212
1226
  _, args, body = node
1213
1227
 
1228
+ line = @line
1229
+
1214
1230
  consume_keyword "do"
1215
1231
 
1216
1232
  consume_block_args args
1217
1233
 
1218
1234
  indent_body body
1219
1235
 
1220
- write_indent
1236
+ write_indent if @line != line
1221
1237
  consume_keyword "end"
1222
1238
  end
1223
1239
 
@@ -1343,6 +1359,9 @@ class Rufo::Formatter
1343
1359
  def visit_bodystmt(node)
1344
1360
  # [:bodystmt, body, rescue_body, else_body, ensure_body]
1345
1361
  _, body, rescue_body, else_body, ensure_body = node
1362
+
1363
+ line = @line
1364
+
1346
1365
  indent_body body
1347
1366
 
1348
1367
  while rescue_body
@@ -1385,7 +1404,7 @@ class Rufo::Formatter
1385
1404
  indent_body ensure_body[1]
1386
1405
  end
1387
1406
 
1388
- write_indent
1407
+ write_indent if @line != line
1389
1408
  consume_keyword "end"
1390
1409
  end
1391
1410
 
@@ -1463,6 +1482,8 @@ class Rufo::Formatter
1463
1482
  #[:for, var, collection, body]
1464
1483
  _, var, collection, body = node
1465
1484
 
1485
+ line = @line
1486
+
1466
1487
  consume_keyword "for"
1467
1488
  consume_space
1468
1489
 
@@ -1478,10 +1499,9 @@ class Rufo::Formatter
1478
1499
  visit collection
1479
1500
  skip_space
1480
1501
 
1481
- next_token if keyword?("do")
1482
-
1483
1502
  indent_body body
1484
- write_indent
1503
+
1504
+ write_indent if @line != line
1485
1505
  consume_keyword "end"
1486
1506
  end
1487
1507
 
@@ -1664,7 +1684,7 @@ class Rufo::Formatter
1664
1684
  visit superclass
1665
1685
  end
1666
1686
 
1667
- maybe_inline_body body
1687
+ visit body
1668
1688
  end
1669
1689
 
1670
1690
  def visit_module(node)
@@ -1677,25 +1697,7 @@ class Rufo::Formatter
1677
1697
  skip_space_or_newline
1678
1698
  write_space
1679
1699
  visit name
1680
- maybe_inline_body body
1681
- end
1682
-
1683
- def maybe_inline_body(body)
1684
- skip_space
1685
- if semicolon? && empty_body?(body)
1686
- next_token
1687
- skip_space
1688
- if newline?
1689
- skip_space_or_newline
1690
- visit body
1691
- else
1692
- write "; "
1693
- skip_space_or_newline
1694
- consume_keyword "end"
1695
- end
1696
- else
1697
- visit body
1698
- end
1700
+ visit body
1699
1701
  end
1700
1702
 
1701
1703
  def visit_def(node)
@@ -1754,7 +1756,7 @@ class Rufo::Formatter
1754
1756
  skip_space_or_newline
1755
1757
  check :on_rparen
1756
1758
  next_token
1757
- skip_space_or_newline
1759
+ skip_space
1758
1760
  else
1759
1761
  write "("
1760
1762
 
@@ -1780,7 +1782,7 @@ class Rufo::Formatter
1780
1782
  write "("
1781
1783
  visit params
1782
1784
  write ")"
1783
- skip_space_or_newline
1785
+ skip_space
1784
1786
  end
1785
1787
 
1786
1788
  visit body
@@ -2058,16 +2060,17 @@ class Rufo::Formatter
2058
2060
  # `:foo => 1` or `:"foo" => 1` and a `=>`
2059
2061
  # always follows
2060
2062
  symbol = current_token_kind == :on_symbeg
2063
+ arrow = symbol || !(key[0] == :@label || key[0] == :dyna_symbol)
2061
2064
 
2062
2065
  visit key
2063
2066
 
2064
- consume_space(want_preserve_whitespace: !@align_hash_keys)
2067
+ consume_space(want_preserve_whitespace: @preserve_whitespace)
2065
2068
 
2066
2069
  track_hash_key
2067
2070
 
2068
2071
  # Don't output `=>` for keys that are `label: value`
2069
2072
  # or `"label": value`
2070
- if symbol || !(key[0] == :@label || key[0] == :dyna_symbol)
2073
+ if arrow
2071
2074
  consume_op "=>"
2072
2075
  consume_space(want_preserve_whitespace: !@align_hash_keys)
2073
2076
  end
@@ -2310,7 +2313,7 @@ class Rufo::Formatter
2310
2313
  consume_keyword "do"
2311
2314
  end
2312
2315
 
2313
- indent_body body
2316
+ indent_body body, force_multiline: true
2314
2317
 
2315
2318
  write_indent
2316
2319
 
@@ -2465,6 +2468,9 @@ class Rufo::Formatter
2465
2468
  # We have to be careful not to aumatically write a heredoc on next_token,
2466
2469
  # because we miss the chance to write a comma to separate elements
2467
2470
  next_token_no_heredoc_check
2471
+
2472
+ first_space = current_token if space?
2473
+
2468
2474
  skip_space_no_heredoc_check
2469
2475
  wrote_comma = check_heredocs_in_literal_elements(is_last, needs_trailing_comma, wrote_comma)
2470
2476
 
@@ -2475,6 +2481,8 @@ class Rufo::Formatter
2475
2481
  consume_end_of_line
2476
2482
  write_indent(needed_indent)
2477
2483
  end
2484
+ elsif !is_last && first_space && @preserve_whitespace
2485
+ write_space first_space[2]
2478
2486
  else
2479
2487
  write_space unless is_last
2480
2488
  end
@@ -2533,17 +2541,13 @@ class Rufo::Formatter
2533
2541
  # end
2534
2542
  #
2535
2543
  # [:if, cond, then, else]
2544
+ line = @line
2545
+
2536
2546
  consume_keyword(keyword)
2537
2547
  consume_space
2538
2548
  visit node[1]
2539
2549
  skip_space
2540
2550
 
2541
- # Remove "then"
2542
- if keyword?("then")
2543
- next_token
2544
- skip_space
2545
- end
2546
-
2547
2551
  indent_body node[2]
2548
2552
  if else_body = node[3]
2549
2553
  # [:else, else_contents]
@@ -2562,7 +2566,7 @@ class Rufo::Formatter
2562
2566
  end
2563
2567
 
2564
2568
  if check_end
2565
- write_indent
2569
+ write_indent if @line != line
2566
2570
  consume_keyword "end"
2567
2571
  end
2568
2572
  end
@@ -2580,6 +2584,8 @@ class Rufo::Formatter
2580
2584
  def visit_while_or_until(node, keyword)
2581
2585
  _, cond, body = node
2582
2586
 
2587
+ line = @line
2588
+
2583
2589
  consume_keyword keyword
2584
2590
  consume_space
2585
2591
 
@@ -2587,49 +2593,9 @@ class Rufo::Formatter
2587
2593
 
2588
2594
  skip_space
2589
2595
 
2590
- # Keep `while cond; end` as is
2591
- semicolon = semicolon?
2592
- is_do = keyword?("do")
2593
-
2594
- if (semicolon || is_do) && void_exps?(body)
2595
- next_token
2596
- skip_space
2597
-
2598
- if keyword?("end")
2599
- if is_do
2600
- write " do end"
2601
- else
2602
- write "; end"
2603
- end
2604
- next_token
2605
- return
2606
- end
2607
- end
2608
-
2609
- if semicolon || is_do
2610
- next_token
2611
- skip_space
2612
- skip_semicolons
2613
-
2614
- if newline? || comment?
2615
- indent_body body
2616
- write_indent
2617
- else
2618
- skip_space_or_newline
2619
- if semicolon
2620
- write "; "
2621
- else
2622
- write " do "
2623
- end
2624
- visit_exps body, with_lines: false
2625
- skip_space_or_newline
2626
- write_space if is_do
2627
- end
2628
- else
2629
- indent_body body
2630
- write_indent
2631
- end
2596
+ indent_body body
2632
2597
 
2598
+ write_indent if @line != line
2633
2599
  consume_keyword "end"
2634
2600
  end
2635
2601
 
@@ -2857,6 +2823,8 @@ class Rufo::Formatter
2857
2823
  multilple_lines = false # Did we pass through more than one newline?
2858
2824
  last_comment_has_newline = false # Does the last comment has a newline?
2859
2825
  newline_count = 0 # Number of newlines we passed
2826
+ last_comment = nil # Token for the last comment found
2827
+ last_comment_column = nil # Actual column of the last comment written
2860
2828
 
2861
2829
  loop do
2862
2830
  case current_token_kind
@@ -2909,7 +2877,30 @@ class Rufo::Formatter
2909
2877
  # Since we remove newlines from comments, we must add the last
2910
2878
  # one if it was a comment
2911
2879
  write_line
2912
- write_indent
2880
+
2881
+ # If the last comment is in the previous line and it was already
2882
+ # aligned to this comment, keep it aligned. This is useful for
2883
+ # this:
2884
+ #
2885
+ # ```
2886
+ # a = 1 # some comment
2887
+ # # that continues here
2888
+ # ```
2889
+ #
2890
+ # We want to preserve it like that and not change it to:
2891
+ #
2892
+ # ```
2893
+ # a = 1 # some comment
2894
+ # # that continues here
2895
+ # ```
2896
+ if last_comment &&
2897
+ last_comment[0][0] + 1 == current_token[0][0] &&
2898
+ last_comment[0][1] == current_token[0][1]
2899
+ write_indent(last_comment_column)
2900
+ track_comment
2901
+ else
2902
+ write_indent
2903
+ end
2913
2904
  else
2914
2905
  if found_newline
2915
2906
  if newline_count == 1 && needs_two_lines_on_comment
@@ -2932,11 +2923,14 @@ class Rufo::Formatter
2932
2923
  track_comment
2933
2924
  end
2934
2925
  end
2926
+ last_comment = current_token
2927
+ last_comment_column = @column
2935
2928
  last_comment_has_newline = current_token_value.end_with?("\n")
2936
- write current_token_value.rstrip
2937
- next_token
2938
2929
  last = :comment
2939
2930
  multilple_lines = false
2931
+
2932
+ write current_token_value.rstrip
2933
+ next_token
2940
2934
  when :on_embdoc_beg
2941
2935
  write_line if multilple_lines
2942
2936
 
@@ -3000,14 +2994,61 @@ class Rufo::Formatter
3000
2994
  end
3001
2995
  end
3002
2996
 
3003
- def indent_body(exps)
3004
- indent do
3005
- consume_end_of_line(want_multiline: false)
2997
+ def indent_body(exps, force_multiline: false)
2998
+ skip_space
2999
+
3000
+ has_semicolon = semicolon?
3001
+
3002
+ if has_semicolon
3003
+ next_token
3004
+ skip_semicolons
3005
+ end
3006
+
3007
+ # If an end follows there's nothing to do
3008
+ if keyword?("end")
3009
+ if has_semicolon
3010
+ write "; "
3011
+ else
3012
+ write " "
3013
+ end
3014
+ return
3006
3015
  end
3007
3016
 
3008
3017
  # A then keyword can appear after a newline after an `if`, `unless`, etc.
3009
3018
  # Since that's a super weird formatting for if, probably way too obsolete
3010
3019
  # by now, we just remove it.
3020
+ has_then = keyword?("then")
3021
+ if has_then
3022
+ next_token
3023
+ skip_space
3024
+ end
3025
+
3026
+ has_do = keyword?("do")
3027
+ if has_do
3028
+ next_token
3029
+ skip_space
3030
+ end
3031
+
3032
+ # If no newline or comment follows, we format it inline.
3033
+ if !force_multiline && !(newline? || comment?)
3034
+ if has_then
3035
+ write " then "
3036
+ elsif has_do
3037
+ write " do "
3038
+ elsif has_semicolon
3039
+ write "; "
3040
+ else
3041
+ write " "
3042
+ end
3043
+ visit_exps exps, with_indent: false, with_lines: false
3044
+ consume_space
3045
+ return
3046
+ end
3047
+
3048
+ indent do
3049
+ consume_end_of_line(want_multiline: false)
3050
+ end
3051
+
3011
3052
  if keyword?("then")
3012
3053
  next_token
3013
3054
  skip_space_or_newline
@@ -3273,27 +3314,27 @@ class Rufo::Formatter
3273
3314
  def do_align(elements, scope)
3274
3315
  lines = @output.lines
3275
3316
 
3276
- # Chunk comments that are in consecutive lines
3317
+ # Chunk elements that are in consecutive lines
3277
3318
  chunks = chunk_while(elements) do |(l1, c1, i1, id1), (l2, c2, i2, id2)|
3278
3319
  l1 + 1 == l2 && i1 == i2 && id1 == id2
3279
3320
  end
3280
3321
 
3281
- chunks.each do |comments|
3282
- next if comments.size == 1
3322
+ chunks.each do |elements|
3323
+ next if elements.size == 1
3283
3324
 
3284
3325
  if scope == :hash_key
3285
3326
  # Don't indent successive hash keys if any of them is in turn a hash
3286
3327
  # or array literal that is formatted in separate lines.
3287
- has_brace_newline = comments.any? do |(l, c)|
3328
+ has_brace_newline = elements.any? do |(l, c)|
3288
3329
  line_end = lines[l][c..-1]
3289
3330
  line_end.start_with?("=> {\n", "=> [\n", "=> [ #", "=> { #", "[\n", "{\n", "[ #", "{ #")
3290
3331
  end
3291
3332
  next if has_brace_newline
3292
3333
  end
3293
3334
 
3294
- max_column = comments.map { |l, c| c }.max
3335
+ max_column = elements.map { |l, c| c }.max
3295
3336
 
3296
- comments.each do |(line, column, _, _, offset)|
3337
+ elements.each do |(line, column, _, _, offset)|
3297
3338
  next if column == max_column
3298
3339
 
3299
3340
  split_index = column
@@ -1,3 +1,3 @@
1
1
  module Rufo
2
- VERSION = "0.0.28"
2
+ VERSION = "0.0.29"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rufo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.28
4
+ version: 0.0.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ary Borenszweig