rufo 0.0.17 → 0.0.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 50d15a24f09ec9bd78016c6e572736daae323c7c
4
- data.tar.gz: 3043fa80ffc0e2d5693f64ae66f0d9778fa60216
3
+ metadata.gz: 82f3fd868e4d701c1e505e16a057d8d8e494a925
4
+ data.tar.gz: de7c89b69cac54b2640d899310623539d9ec7e25
5
5
  SHA512:
6
- metadata.gz: 43d21b3b6966469feaf5eea5179de28248b973669b994a57d3a0fb84204c09cfee06edc88aab5d84a16f6dc7e1a953aa12603ede252cf07e7aacf1fec20bc3f1
7
- data.tar.gz: 0a08b865224b3ae14c74aca6898790b9aa5bc8d094fe3423d90bce186b84eb26400041a53f610b74c5b28b7d30dc432b2b47b9a0476818c25350d0fb51be295e
6
+ metadata.gz: 28620000e4f9723f908da738c364c35390ae9308aa79590b3485eed9bc30aa0bba7e709927b2357dcd691bfc14552a209d478d38cce03677d0788b23aafdd18e
7
+ data.tar.gz: cece98ad578f1a43dadb98791773c062208b40953394b484315b15268293ae50a0766898c644aeb9dfee36bae2a3dfc9b53ad672ea46cc32bf6f1992ef44a3dd
data/README.md CHANGED
@@ -76,8 +76,8 @@ issue if you need something else to be configurable.
76
76
 
77
77
  ## Status
78
78
 
79
- The formatter was tested on some big files with many Ruby
80
- syntax and idioms, but since it's so new there might be some missing stuff. Don't hesitate
79
+ The formatter is able to format `rails` and other projects, so at this point
80
+ it's pretty mature. There might still be some bugs. Don't hesitate
81
81
  to open an issue if you find something is not working well. In any case, if the formatter
82
82
  chokes on some valid input you will get an error prompting you to submit a bug report here :-)
83
83
 
data/lib/rufo/command.rb CHANGED
@@ -54,7 +54,7 @@ module Rufo::Command
54
54
  end
55
55
 
56
56
  def self.format_file(filename, want_check)
57
- code = File.read(filename)
57
+ code = File.read(filename)
58
58
 
59
59
  begin
60
60
  result = format(code, File.dirname(filename))
@@ -53,10 +53,10 @@ class Rufo::Formatter
53
53
  @hash_keys_positions = []
54
54
 
55
55
  # Settings
56
- @indent_size = options.fetch(:indent_size, 2)
57
- @align_comments = options.fetch(:align_comments, true)
58
- @align_assignments = options.fetch(:align_assignments, true)
59
- @align_hash_keys = options.fetch(:align_hash_keys, true)
56
+ @indent_size = options.fetch(:indent_size, 2)
57
+ @align_comments = options.fetch(:align_comments, true)
58
+ @align_assignments = options.fetch(:align_assignments, true)
59
+ @align_hash_keys = options.fetch(:align_hash_keys, true)
60
60
  end
61
61
 
62
62
  # The indent size (default: 2)
@@ -394,18 +394,17 @@ class Rufo::Formatter
394
394
  end
395
395
 
396
396
  skip_space
397
- if newline? || comment?
398
- check_pending_heredocs
399
- end
400
397
 
401
398
  line_before_endline = @line
402
399
 
403
400
  is_last = last?(i, exps)
404
401
  if with_lines
405
- consume_end_of_line(false, !is_last, !is_last)
402
+ exp_needs_two_lines = needs_two_lines?(exp)
403
+
404
+ consume_end_of_line(false, !is_last, !is_last, exp_needs_two_lines)
406
405
 
407
406
  # Make sure to put two lines before defs, class and others
408
- if !is_last && (needs_two_lines?(exp_kind) || needs_two_lines?(exps[i + 1][0])) && @line <= line_before_endline + 1
407
+ if !is_last && (exp_needs_two_lines || needs_two_lines?(exps[i + 1])) && @line <= line_before_endline + 1
409
408
  write_line
410
409
  end
411
410
  else
@@ -414,13 +413,23 @@ class Rufo::Formatter
414
413
  end
415
414
  end
416
415
 
417
- def needs_two_lines?(exp_kind)
418
- case exp_kind
416
+ def needs_two_lines?(exp)
417
+ kind = exp[0]
418
+ case kind
419
419
  when :def, :class, :module
420
- true
421
- else
422
- false
420
+ return true
421
+ when :vcall
422
+ # Check if it's private/protected/public
423
+ nested = exp[1]
424
+ if nested[0] == :@ident
425
+ case nested[1]
426
+ when "private", "protected", "public"
427
+ return true
428
+ end
429
+ end
423
430
  end
431
+
432
+ false
424
433
  end
425
434
 
426
435
  def visit_string_literal(node)
@@ -430,30 +439,18 @@ class Rufo::Formatter
430
439
 
431
440
  if heredoc
432
441
  write current_token_value.rstrip
442
+ # Accumulate heredoc: we'll write it once
443
+ # we find a newline.
444
+ @heredocs << [node, tilde]
433
445
  next_token
434
- skip_space
435
-
436
- # If something other than a newline follows the heredoc
437
- # beginning it means some other code follows and
438
- # we have to accumulate the heredoc and print it
439
- # later, when the line ends.
440
- if !newline? || !@heredocs.empty?
441
- @heredocs << [node, tilde]
442
- return
443
- end
446
+ return
444
447
  elsif current_token_kind == :on_backtick
445
448
  consume_token :on_backtick
446
449
  else
447
450
  consume_token :on_tstring_beg
448
451
  end
449
452
 
450
- if heredoc
451
- @current_heredoc = [node, tilde]
452
- end
453
-
454
453
  visit_string_literal_end(node)
455
-
456
- @current_heredoc = nil if heredoc
457
454
  end
458
455
 
459
456
  def visit_string_literal_end(node)
@@ -473,10 +470,8 @@ class Rufo::Formatter
473
470
  next_token
474
471
  skip_space
475
472
 
476
- if newline?
477
- write_line
478
- write_indent
479
- end
473
+ # Simulate a newline after the heredoc
474
+ @tokens << [[0, 0], :on_ignored_nl, "\n"]
480
475
  when :on_backtick
481
476
  consume_token :on_backtick
482
477
  else
@@ -869,15 +864,12 @@ class Rufo::Formatter
869
864
  end
870
865
  end
871
866
 
872
- def check_pending_heredocs
867
+ def flush_heredocs
873
868
  printed = false
874
869
 
875
870
  until @heredocs.empty?
876
871
  heredoc, tilde = @heredocs.first
877
872
 
878
- # Need to print a line between consecutive heredoc ends
879
- write_line if printed
880
-
881
873
  @heredocs.shift
882
874
  @current_heredoc = [heredoc, tilde]
883
875
  visit_string_literal_end(heredoc)
@@ -921,7 +913,26 @@ class Rufo::Formatter
921
913
  end
922
914
 
923
915
  def visit_command_args(args)
924
- indent(@column) do
916
+ needed_indent = @column
917
+
918
+ # Check if there's a single argument and it's
919
+ # a def, class or module. In that case we don't
920
+ # want to align the content to the position of
921
+ # that keyword.
922
+ if args[0] == :args_add_block
923
+ nested_args = args[1]
924
+ if nested_args.is_a?(Array) && nested_args.size == 1
925
+ first = nested_args[0]
926
+ if first.is_a?(Array)
927
+ case first[0]
928
+ when :def, :class, :module
929
+ needed_indent = @indent
930
+ end
931
+ end
932
+ end
933
+ end
934
+
935
+ indent(needed_indent) do
925
936
  if args[0].is_a?(Symbol)
926
937
  visit args
927
938
  else
@@ -1003,29 +1014,56 @@ class Rufo::Formatter
1003
1014
  end
1004
1015
 
1005
1016
  def visit_block_arguments(node)
1006
- # [:block_var, params, blockarg]
1007
- _, params, blockarg = node
1017
+ # [:block_var, params, local_params]
1018
+ _, params, local_params = node
1019
+
1020
+ empty_params = empty_params?(params)
1008
1021
 
1009
1022
  check :on_op
1010
1023
 
1011
1024
  # check for ||
1012
- if blockarg.nil?
1025
+ if empty_params && !local_params
1013
1026
  # Don't write || as it's meaningless
1014
- next_token
1015
- else
1016
- next_token
1017
- skip_space_or_newline
1018
-
1019
- # This means it's an empty | |, so we remove it
1020
- if current_token_kind == :on_op && current_token_value == "|"
1027
+ if current_token_value == "|"
1021
1028
  next_token
1022
- else
1023
- write "|"
1024
- visit params
1025
1029
  skip_space_or_newline
1026
- consume_op "|"
1030
+ check :on_op
1031
+ next_token
1032
+ else
1033
+ next_token
1027
1034
  end
1035
+ return
1036
+ end
1037
+
1038
+ consume_token :on_op
1039
+ found_semicolon = skip_space_or_newline(true, true)
1040
+
1041
+ if found_semicolon
1042
+ # Nothing
1043
+ elsif empty_params && local_params
1044
+ consume_token :on_semicolon
1045
+ found_semicolon = true
1046
+ end
1047
+
1048
+ skip_space_or_newline
1049
+
1050
+ unless empty_params
1051
+ visit params
1052
+ skip_space
1028
1053
  end
1054
+
1055
+ if local_params
1056
+ if semicolon?
1057
+ consume_token :on_semicolon
1058
+ consume_space
1059
+ end
1060
+
1061
+ visit_comma_separated_list local_params
1062
+ else
1063
+ skip_space_or_newline
1064
+ end
1065
+
1066
+ consume_op "|"
1029
1067
  end
1030
1068
 
1031
1069
  def visit_call_args(node)
@@ -1036,7 +1074,7 @@ class Rufo::Formatter
1036
1074
  # arg1, ..., *star
1037
1075
  visit args
1038
1076
  else
1039
- visit_comma_separated_list args, true
1077
+ visit_comma_separated_list args
1040
1078
  end
1041
1079
 
1042
1080
  if block_arg
@@ -1258,7 +1296,7 @@ class Rufo::Formatter
1258
1296
  end
1259
1297
  end
1260
1298
 
1261
- def visit_comma_separated_list(nodes, inside_call = false)
1299
+ def visit_comma_separated_list(nodes)
1262
1300
  # When there's *x inside a left hand side assignment
1263
1301
  # or a case when, it comes as [:op, ...]
1264
1302
  if nodes[0].is_a?(Symbol)
@@ -1268,15 +1306,13 @@ class Rufo::Formatter
1268
1306
 
1269
1307
  needs_indent = false
1270
1308
 
1271
- if inside_call
1272
- if newline? || comment?
1273
- needs_indent = true
1274
- base_column = next_indent
1275
- consume_end_of_line
1276
- write_indent(base_column)
1277
- else
1278
- base_column = @column
1279
- end
1309
+ if newline? || comment?
1310
+ needs_indent = true
1311
+ base_column = next_indent
1312
+ consume_end_of_line
1313
+ write_indent(base_column)
1314
+ else
1315
+ base_column = @column
1280
1316
  end
1281
1317
 
1282
1318
  nodes.each_with_index do |exp, i|
@@ -1760,7 +1796,7 @@ class Rufo::Formatter
1760
1796
  if elements
1761
1797
  # [:assoclist_from_args, elements]
1762
1798
  push_hash(node) do
1763
- visit_literal_elements(elements[1])
1799
+ visit_literal_elements(elements[1], true)
1764
1800
  end
1765
1801
  else
1766
1802
  skip_space_or_newline
@@ -2115,11 +2151,18 @@ class Rufo::Formatter
2115
2151
  visit_comma_separated_list exps
2116
2152
  end
2117
2153
 
2118
- def visit_literal_elements(elements)
2119
- base_column = @column
2120
-
2154
+ def visit_literal_elements(elements, inside_hash = false)
2155
+ base_column = @column
2156
+ needs_final_space = inside_hash && space?
2121
2157
  skip_space
2122
2158
 
2159
+ if newline? || comment?
2160
+ needs_final_space = false
2161
+ elsif needs_final_space
2162
+ consume_space
2163
+ base_column = @column
2164
+ end
2165
+
2123
2166
  # If there's a newline right at the beginning,
2124
2167
  # write it, and we'll indent element and always
2125
2168
  # add a trailing comma to the last element
@@ -2167,7 +2210,11 @@ class Rufo::Formatter
2167
2210
  elsif comment?
2168
2211
  consume_end_of_line
2169
2212
  else
2170
- skip_space_or_newline
2213
+ if needs_final_space
2214
+ consume_space
2215
+ else
2216
+ skip_space_or_newline
2217
+ end
2171
2218
  end
2172
2219
  end
2173
2220
 
@@ -2388,10 +2435,11 @@ class Rufo::Formatter
2388
2435
  has_slash_newline
2389
2436
  end
2390
2437
 
2391
- def skip_space_or_newline(want_semicolon = false)
2392
- found_newline = false
2393
- found_comment = false
2394
- last = nil
2438
+ def skip_space_or_newline(want_semicolon = false, write_first_semicolon = false)
2439
+ found_newline = false
2440
+ found_comment = false
2441
+ found_semicolon = false
2442
+ last = nil
2395
2443
 
2396
2444
  while true
2397
2445
  case current_token_kind
@@ -2402,11 +2450,12 @@ class Rufo::Formatter
2402
2450
  last = :newline
2403
2451
  found_newline = true
2404
2452
  when :on_semicolon
2405
- if !found_newline && !found_comment
2453
+ if (!found_newline && !found_comment) || (!found_semicolon && write_first_semicolon)
2406
2454
  write "; "
2407
2455
  end
2408
2456
  next_token
2409
- last = :semicolon
2457
+ last = :semicolon
2458
+ found_semicolon = true
2410
2459
  when :on_comment
2411
2460
  write_line if last == :newline
2412
2461
 
@@ -2424,6 +2473,8 @@ class Rufo::Formatter
2424
2473
  break
2425
2474
  end
2426
2475
  end
2476
+
2477
+ found_semicolon
2427
2478
  end
2428
2479
 
2429
2480
  def skip_semicolons
@@ -2480,11 +2531,12 @@ class Rufo::Formatter
2480
2531
  # - at_prefix: are we at a point before an expression? (if so, we don't need a space before the first comment)
2481
2532
  # - want_semicolon: do we want do print a semicolon to separate expressions?
2482
2533
  # - want_multiline: do we want multiple lines to appear, or at most one?
2483
- def consume_end_of_line(at_prefix = false, want_semicolon = false, want_multiline = true)
2534
+ def consume_end_of_line(at_prefix = false, want_semicolon = false, want_multiline = true, needs_two_lines_on_comment = false)
2484
2535
  found_newline = false # Did we find any newline during this method?
2485
2536
  last = nil # Last token kind found
2486
2537
  multilple_lines = false # Did we pass through more than one newline?
2487
2538
  last_comment_has_newline = false # Does the last comment has a newline?
2539
+ newline_count = 0 # Number of newlines we passed
2488
2540
 
2489
2541
  while true
2490
2542
  case current_token_kind
@@ -2516,7 +2568,8 @@ class Rufo::Formatter
2516
2568
  end
2517
2569
  found_newline = true
2518
2570
  next_token
2519
- last = :newline
2571
+ last = :newline
2572
+ newline_count += 1
2520
2573
  when :on_semicolon
2521
2574
  next_token
2522
2575
  # If we want to print semicolons and we didn't find a newline yet,
@@ -2539,6 +2592,16 @@ class Rufo::Formatter
2539
2592
  write_indent
2540
2593
  else
2541
2594
  if found_newline
2595
+ if newline_count == 1 && needs_two_lines_on_comment
2596
+ if multilple_lines
2597
+ write_line
2598
+ multilple_lines = false
2599
+ else
2600
+ multilple_lines = true
2601
+ end
2602
+ needs_two_lines_on_comment = false
2603
+ end
2604
+
2542
2605
  # Write line or second line if needed
2543
2606
  write_line if last != :newline || multilple_lines
2544
2607
  write_indent
@@ -2750,9 +2813,9 @@ class Rufo::Formatter
2750
2813
 
2751
2814
  def find_closing_brace_token
2752
2815
  count = 0
2753
- i = @tokens.size - 1
2816
+ i = @tokens.size - 1
2754
2817
  while i >= 0
2755
- token = @tokens[i]
2818
+ token = @tokens[i]
2756
2819
  (line, column), kind = token
2757
2820
  case kind
2758
2821
  when :on_lbrace, :on_tlambeg
@@ -2785,6 +2848,10 @@ class Rufo::Formatter
2785
2848
 
2786
2849
  def next_token
2787
2850
  @tokens.pop
2851
+
2852
+ if newline? && !@heredocs.empty?
2853
+ flush_heredocs
2854
+ end
2788
2855
  end
2789
2856
 
2790
2857
  def last?(i, array)
data/lib/rufo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rufo
2
- VERSION = "0.0.17"
2
+ VERSION = "0.0.18"
3
3
  end
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.17
4
+ version: 0.0.18
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-24 00:00:00.000000000 Z
11
+ date: 2017-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler