rubocop 1.1.0 → 1.2.0

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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -3
  3. data/config/default.yml +31 -5
  4. data/exe/rubocop +1 -1
  5. data/lib/rubocop.rb +4 -0
  6. data/lib/rubocop/cop/layout/else_alignment.rb +15 -2
  7. data/lib/rubocop/cop/layout/end_alignment.rb +3 -3
  8. data/lib/rubocop/cop/layout/hash_alignment.rb +4 -4
  9. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +24 -18
  10. data/lib/rubocop/cop/layout/space_inside_parens.rb +35 -13
  11. data/lib/rubocop/cop/lint/else_layout.rb +29 -3
  12. data/lib/rubocop/cop/lint/empty_block.rb +15 -2
  13. data/lib/rubocop/cop/lint/loop.rb +0 -4
  14. data/lib/rubocop/cop/lint/nested_percent_literal.rb +14 -0
  15. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +58 -0
  16. data/lib/rubocop/cop/lint/useless_setter_call.rb +6 -1
  17. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  18. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +11 -1
  19. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +11 -5
  20. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +67 -18
  21. data/lib/rubocop/cop/naming/variable_number.rb +82 -8
  22. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +0 -4
  23. data/lib/rubocop/cop/style/case_like_if.rb +0 -4
  24. data/lib/rubocop/cop/style/collection_compact.rb +85 -0
  25. data/lib/rubocop/cop/style/double_negation.rb +6 -1
  26. data/lib/rubocop/cop/style/hash_syntax.rb +3 -3
  27. data/lib/rubocop/cop/style/keyword_parameters_order.rb +12 -0
  28. data/lib/rubocop/cop/style/mixin_grouping.rb +0 -4
  29. data/lib/rubocop/cop/style/negated_if_else_condition.rb +99 -0
  30. data/lib/rubocop/cop/style/raise_args.rb +21 -6
  31. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  32. data/lib/rubocop/cop/util.rb +4 -0
  33. data/lib/rubocop/ext/regexp_node.rb +10 -5
  34. data/lib/rubocop/ext/regexp_parser.rb +9 -2
  35. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  36. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +47 -0
  37. data/lib/rubocop/options.rb +2 -0
  38. data/lib/rubocop/version.rb +1 -1
  39. metadata +7 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da2c7f3fe5f1a109fce4e8e9e44efd9e438c45c0c0036f79f3d0156a4dacc452
4
- data.tar.gz: ff29fbdedc13116e5fdbcb95dc3af4a81379794f9d36596983f69a09d69ac575
3
+ metadata.gz: 9139e9c7213e73e6f44db7e88265254dc4b4e11ab0fa38b0fa88268070ff0a6a
4
+ data.tar.gz: 5590d626e845237529e7e21dbc162b2704fdbe5f37a39f0e29d3e164b550a03e
5
5
  SHA512:
6
- metadata.gz: 11f024ff53e3eb551b31b02c3a48ab250941c9fd0e642c3bb518a8d635bee89f0fc61dba12e0a66ac40c4536bf368690ade37ce3a6014531ad97ebc0fd9d82f8
7
- data.tar.gz: e567372e804699a2499b6475cdeb4e86906c5fe8eda16428d292a600648d2afe2d34bacea2443fe52229ce4539b5a09b17f387586fc3a9e2d3034d3718ce4bb3
6
+ metadata.gz: 04ce9f16ffe193e6a048a2fe2b5c0015a148becdfc25bcd67efdd5cf207727eed3ab3440bbf5f8f2473868d9f697fb88b2c2f810bfe217fb23153d010318bde8
7
+ data.tar.gz: bd33137303ca551db1a8e67ad96bb14b376207caf88ba0c82efb3202c2373b94f22bd9e19f3a8b9cfd475bc6955078c13a87b8236e6703e8ad48c2b14a2cb271
data/README.md CHANGED
@@ -50,7 +50,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
50
50
  in your `Gemfile`:
51
51
 
52
52
  ```rb
53
- gem 'rubocop', '~> 1.1', require: false
53
+ gem 'rubocop', '~> 1.2', require: false
54
54
  ```
55
55
 
56
56
  See [versioning](https://docs.rubocop.org/rubocop/1.0/versioning.html) for further details.
@@ -70,12 +70,12 @@ You can read a lot more about RuboCop in its [official docs](https://docs.ruboco
70
70
 
71
71
  ## Compatibility
72
72
 
73
- RuboCop supports the following Ruby implementations:
73
+ RuboCop officially supports the following Ruby implementations:
74
74
 
75
75
  * MRI 2.4+
76
76
  * JRuby 9.2+
77
77
 
78
- See [compatibility](https://docs.rubocop.org/rubocop/compatibility.html) for further details.
78
+ See the [compatibility documentation](https://docs.rubocop.org/rubocop/compatibility.html) for further details.
79
79
 
80
80
  ## Readme Badge
81
81
 
@@ -85,6 +85,15 @@ If you use RuboCop in your project, you can include one of these badges in your
85
85
 
86
86
  [![Ruby Style Guide](https://img.shields.io/badge/code_style-community-brightgreen.svg)](https://rubystyle.guide)
87
87
 
88
+
89
+ Here are the Markdown snippets for the two badges:
90
+
91
+ ``` markdown
92
+ [![Ruby Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop-hq/rubocop)
93
+
94
+ [![Ruby Style Guide](https://img.shields.io/badge/code_style-community-brightgreen.svg)](https://rubystyle.guide)
95
+ ```
96
+
88
97
  ## Team
89
98
 
90
99
  Here's a list of RuboCop's core developers:
@@ -100,6 +109,8 @@ Here's a list of RuboCop's core developers:
100
109
  * [Benjamin Quorning](https://github.com/bquorning)
101
110
  * [Marc-André Lafortune](https://github.com/marcandre)
102
111
 
112
+ See the [team page](https://docs.rubocop.org/rubocop/about/team.html) for more details.
113
+
103
114
  ## Logo
104
115
 
105
116
  RuboCop's logo was created by [Dimiter Petrov](https://www.chadomoto.com/). You can find the logo in various
@@ -1478,6 +1478,7 @@ Lint/ElseLayout:
1478
1478
  Description: 'Check for odd code arrangement in an else block.'
1479
1479
  Enabled: true
1480
1480
  VersionAdded: '0.17'
1481
+ VersionChanged: '1.2'
1481
1482
 
1482
1483
  Lint/EmptyBlock:
1483
1484
  Description: 'This cop checks for blocks without a body.'
@@ -1679,6 +1680,11 @@ Lint/NextWithoutAccumulator:
1679
1680
  Enabled: true
1680
1681
  VersionAdded: '0.36'
1681
1682
 
1683
+ Lint/NoReturnInBeginEndBlocks:
1684
+ Description: 'Do not `return` inside `begin..end` blocks in assignment contexts.'
1685
+ Enabled: pending
1686
+ VersionAdded: '1.2'
1687
+
1682
1688
  Lint/NonDeterministicRequireOrder:
1683
1689
  Description: 'Always sort arrays returned by Dir.glob when requiring files.'
1684
1690
  Enabled: true
@@ -2036,8 +2042,9 @@ Lint/UselessMethodDefinition:
2036
2042
  Lint/UselessSetterCall:
2037
2043
  Description: 'Checks for useless setter call to a local variable.'
2038
2044
  Enabled: true
2045
+ SafeAutoCorrect: false
2039
2046
  VersionAdded: '0.13'
2040
- VersionChanged: '0.80'
2047
+ VersionChanged: '1.2'
2041
2048
  Safe: false
2042
2049
 
2043
2050
  Lint/UselessTimes:
@@ -2181,6 +2188,7 @@ Naming/BinaryOperatorParameterName:
2181
2188
  StyleGuide: '#other-arg'
2182
2189
  Enabled: true
2183
2190
  VersionAdded: '0.50'
2191
+ VersionChanged: '1.2'
2184
2192
 
2185
2193
  Naming/BlockParameterName:
2186
2194
  Description: >-
@@ -2287,6 +2295,7 @@ Naming/HeredocDelimiterCase:
2287
2295
  StyleGuide: '#heredoc-delimiters'
2288
2296
  Enabled: true
2289
2297
  VersionAdded: '0.50'
2298
+ VersionChanged: '1.2'
2290
2299
  EnforcedStyle: uppercase
2291
2300
  SupportedStyles:
2292
2301
  - lowercase
@@ -2305,7 +2314,7 @@ Naming/MemoizedInstanceVariableName:
2305
2314
  Memoized method name should match memo instance variable name.
2306
2315
  Enabled: true
2307
2316
  VersionAdded: '0.53'
2308
- VersionChanged: '0.58'
2317
+ VersionChanged: '1.2'
2309
2318
  EnforcedStyleForLeadingUnderscores: disallowed
2310
2319
  SupportedStylesForLeadingUnderscores:
2311
2320
  - disallowed
@@ -2403,14 +2412,18 @@ Naming/VariableName:
2403
2412
  - camelCase
2404
2413
 
2405
2414
  Naming/VariableNumber:
2406
- Description: 'Use the configured style when numbering variables.'
2415
+ Description: 'Use the configured style when numbering symbols, methods and variables.'
2416
+ StyleGuide: '#snake-case-symbols-methods-vars-with-numbers'
2407
2417
  Enabled: true
2408
2418
  VersionAdded: '0.50'
2419
+ VersionChanged: '1.2'
2409
2420
  EnforcedStyle: normalcase
2410
2421
  SupportedStyles:
2411
2422
  - snake_case
2412
2423
  - normalcase
2413
2424
  - non_integer
2425
+ CheckMethodNames: true
2426
+ CheckSymbols: true
2414
2427
 
2415
2428
  #################### Security ##############################
2416
2429
 
@@ -2789,6 +2802,11 @@ Style/ClassVars:
2789
2802
  Enabled: true
2790
2803
  VersionAdded: '0.13'
2791
2804
 
2805
+ Style/CollectionCompact:
2806
+ Description: 'Use `{Array,Hash}#{compact,compact!}` instead of custom logic to reject nils.'
2807
+ Enabled: pending
2808
+ VersionAdded: '1.2'
2809
+
2792
2810
  # Align with the style guide.
2793
2811
  Style/CollectionMethods:
2794
2812
  Description: 'Preferred collection methods.'
@@ -2986,7 +3004,7 @@ Style/DoubleNegation:
2986
3004
  StyleGuide: '#no-bang-bang'
2987
3005
  Enabled: true
2988
3006
  VersionAdded: '0.19'
2989
- VersionChanged: '0.84'
3007
+ VersionChanged: '1.2'
2990
3008
  EnforcedStyle: allowed_in_returns
2991
3009
  SafeAutoCorrect: false
2992
3010
  SupportedStyles:
@@ -3611,6 +3629,13 @@ Style/NegatedIf:
3611
3629
  - prefix
3612
3630
  - postfix
3613
3631
 
3632
+ Style/NegatedIfElseCondition:
3633
+ Description: >-
3634
+ This cop checks for uses of `if-else` and ternary operators with a negated condition
3635
+ which can be simplified by inverting condition and swapping branches.
3636
+ Enabled: pending
3637
+ VersionAdded: '1.2'
3638
+
3614
3639
  Style/NegatedUnless:
3615
3640
  Description: 'Favor if over unless for negative conditions.'
3616
3641
  StyleGuide: '#if-for-negatives'
@@ -3888,11 +3913,12 @@ Style/RaiseArgs:
3888
3913
  StyleGuide: '#exception-class-messages'
3889
3914
  Enabled: true
3890
3915
  VersionAdded: '0.14'
3891
- VersionChanged: '0.40'
3916
+ VersionChanged: '1.2'
3892
3917
  EnforcedStyle: exploded
3893
3918
  SupportedStyles:
3894
3919
  - compact # raise Exception.new(msg)
3895
3920
  - exploded # raise Exception, msg
3921
+ AllowedCompactTypes: []
3896
3922
 
3897
3923
  Style/RandomWithOffset:
3898
3924
  Description: >-
@@ -13,5 +13,5 @@ time = Benchmark.realtime do
13
13
  result = cli.run
14
14
  end
15
15
 
16
- puts "Finished in #{time} seconds" if cli.options[:debug]
16
+ puts "Finished in #{time} seconds" if cli.options[:debug] || cli.options[:display_time]
17
17
  exit result
@@ -298,6 +298,7 @@ require_relative 'rubocop/cop/lint/multiple_comparison'
298
298
  require_relative 'rubocop/cop/lint/nested_method_definition'
299
299
  require_relative 'rubocop/cop/lint/nested_percent_literal'
300
300
  require_relative 'rubocop/cop/lint/next_without_accumulator'
301
+ require_relative 'rubocop/cop/lint/no_return_in_begin_end_blocks'
301
302
  require_relative 'rubocop/cop/lint/non_deterministic_require_order'
302
303
  require_relative 'rubocop/cop/lint/non_local_exit_from_iterator'
303
304
  require_relative 'rubocop/cop/lint/number_conversion'
@@ -409,6 +410,7 @@ require_relative 'rubocop/cop/style/class_equality_comparison'
409
410
  require_relative 'rubocop/cop/style/class_methods'
410
411
  require_relative 'rubocop/cop/style/class_methods_definitions'
411
412
  require_relative 'rubocop/cop/style/class_vars'
413
+ require_relative 'rubocop/cop/style/collection_compact'
412
414
  require_relative 'rubocop/cop/style/collection_methods'
413
415
  require_relative 'rubocop/cop/style/colon_method_call'
414
416
  require_relative 'rubocop/cop/style/colon_method_definition'
@@ -496,6 +498,7 @@ require_relative 'rubocop/cop/style/multiline_when_then'
496
498
  require_relative 'rubocop/cop/style/multiple_comparison'
497
499
  require_relative 'rubocop/cop/style/mutable_constant'
498
500
  require_relative 'rubocop/cop/style/negated_if'
501
+ require_relative 'rubocop/cop/style/negated_if_else_condition'
499
502
  require_relative 'rubocop/cop/style/negated_unless'
500
503
  require_relative 'rubocop/cop/style/negated_while'
501
504
  require_relative 'rubocop/cop/style/nested_modifier'
@@ -602,6 +605,7 @@ require_relative 'rubocop/formatter/disabled_config_formatter'
602
605
  require_relative 'rubocop/formatter/emacs_style_formatter'
603
606
  require_relative 'rubocop/formatter/file_list_formatter'
604
607
  require_relative 'rubocop/formatter/fuubar_style_formatter'
608
+ require_relative 'rubocop/formatter/git_hub_actions_formatter'
605
609
  require_relative 'rubocop/formatter/html_formatter'
606
610
  require_relative 'rubocop/formatter/json_formatter'
607
611
  require_relative 'rubocop/formatter/junit_formatter'
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # This cop checks the alignment of else keywords. Normally they should
7
- # be aligned with an if/unless/while/until/begin/def keyword, but there
7
+ # be aligned with an if/unless/while/until/begin/def/rescue keyword, but there
8
8
  # are special cases when they should follow the same rules as the
9
9
  # alignment of end.
10
10
  #
@@ -93,7 +93,13 @@ module RuboCop
93
93
  case parent.type
94
94
  when :def, :defs then base_for_method_definition(parent)
95
95
  when :kwbegin then parent.loc.begin
96
- when :block then parent.send_node.source_range
96
+ when :block
97
+ assignment_node = assignment_node(parent)
98
+ if same_line?(parent, assignment_node)
99
+ assignment_node.source_range
100
+ else
101
+ parent.send_node.source_range
102
+ end
97
103
  else node.loc.keyword
98
104
  end
99
105
  end
@@ -136,6 +142,13 @@ module RuboCop
136
142
  )
137
143
  add_offense(else_range, location: else_range, message: message)
138
144
  end
145
+
146
+ def assignment_node(node)
147
+ assignment_node = node.ancestors.first
148
+ return unless assignment_node&.assignment?
149
+
150
+ assignment_node
151
+ end
139
152
  end
140
153
  end
141
154
  end
@@ -137,10 +137,10 @@ module RuboCop
137
137
  def asgn_variable_align_with(outer_node, inner_node)
138
138
  expr = outer_node.source_range
139
139
 
140
- if !line_break_before_keyword?(expr, inner_node)
141
- range_between(expr.begin_pos, inner_node.loc.keyword.end_pos)
142
- else
140
+ if line_break_before_keyword?(expr, inner_node)
143
141
  inner_node.loc.keyword
142
+ else
143
+ range_between(expr.begin_pos, inner_node.loc.keyword.end_pos)
144
144
  end
145
145
  end
146
146
 
@@ -296,13 +296,13 @@ module RuboCop
296
296
  # just give each lambda the same reference and they would all get the
297
297
  # last value of each. A local variable fixes the problem.
298
298
 
299
- if !node.value
300
- delta_value = delta[:key] || 0
301
- correct_no_value(corrector, delta_value, node.source_range)
302
- else
299
+ if node.value
303
300
  correct_key_value(corrector, delta, node.key.source_range,
304
301
  node.value.source_range,
305
302
  node.loc.operator)
303
+ else
304
+ delta_value = delta[:key] || 0
305
+ correct_no_value(corrector, delta_value, node.source_range)
306
306
  end
307
307
  end
308
308
 
@@ -54,17 +54,11 @@ module RuboCop
54
54
  end
55
55
 
56
56
  def check_inside_pipes(arguments)
57
- opening_pipe, closing_pipe = pipes(arguments)
58
-
59
57
  case style
60
58
  when :no_space
61
- check_no_space_style_inside_pipes(arguments.children,
62
- opening_pipe,
63
- closing_pipe)
59
+ check_no_space_style_inside_pipes(arguments)
64
60
  when :space
65
- check_space_style_inside_pipes(arguments.children,
66
- opening_pipe,
67
- closing_pipe)
61
+ check_space_style_inside_pipes(arguments)
68
62
  end
69
63
  end
70
64
 
@@ -76,22 +70,29 @@ module RuboCop
76
70
  closing_pipe, 'after closing `|`')
77
71
  end
78
72
 
79
- def check_no_space_style_inside_pipes(args, opening_pipe, closing_pipe)
73
+ def check_no_space_style_inside_pipes(arguments)
74
+ args = arguments.children
75
+ opening_pipe, closing_pipe = pipes(arguments)
76
+
80
77
  first = args.first.source_range
81
78
  last = args.last.source_range
82
79
 
83
80
  check_no_space(opening_pipe.end_pos, first.begin_pos,
84
81
  'Space before first')
85
- check_no_space(last_end_pos_inside_pipes(last),
82
+ check_no_space(last_end_pos_inside_pipes(arguments, last),
86
83
  closing_pipe.begin_pos, 'Space after last')
87
84
  end
88
85
 
89
- def check_space_style_inside_pipes(args, opening_pipe, closing_pipe)
90
- check_opening_pipe_space(args, opening_pipe)
91
- check_closing_pipe_space(args, closing_pipe)
86
+ def check_space_style_inside_pipes(arguments)
87
+ opening_pipe, closing_pipe = pipes(arguments)
88
+
89
+ check_opening_pipe_space(arguments, opening_pipe)
90
+ check_closing_pipe_space(arguments, closing_pipe)
92
91
  end
93
92
 
94
- def check_opening_pipe_space(args, opening_pipe)
93
+ def check_opening_pipe_space(arguments, opening_pipe)
94
+ args = arguments.children
95
+
95
96
  first_arg = args.first
96
97
  range = first_arg.source_range
97
98
 
@@ -101,9 +102,11 @@ module RuboCop
101
102
  'Extra space before first')
102
103
  end
103
104
 
104
- def check_closing_pipe_space(args, closing_pipe)
105
+ def check_closing_pipe_space(arguments, closing_pipe)
106
+ args = arguments.children
107
+
105
108
  last = args.last.source_range
106
- last_end_pos = last_end_pos_inside_pipes(last)
109
+ last_end_pos = last_end_pos_inside_pipes(arguments, last)
107
110
 
108
111
  check_space(last_end_pos, closing_pipe.begin_pos, last,
109
112
  'after last block parameter')
@@ -111,9 +114,12 @@ module RuboCop
111
114
  'Extra space after last')
112
115
  end
113
116
 
114
- def last_end_pos_inside_pipes(range)
117
+ def last_end_pos_inside_pipes(arguments, range)
115
118
  pos = range.end_pos
116
- range.source_buffer.source[pos] == ',' ? pos + 1 : pos
119
+ num = pos - arguments.source_range.begin_pos
120
+ trailing_comma_index = arguments.source[num..-1].index(',')
121
+
122
+ trailing_comma_index ? pos + trailing_comma_index + 1 : pos
117
123
  end
118
124
 
119
125
  def check_each_arg(args)
@@ -11,10 +11,12 @@ module RuboCop
11
11
  # # bad
12
12
  # f( 3)
13
13
  # g = (a + 3 )
14
+ # f( )
14
15
  #
15
16
  # # good
16
17
  # f(3)
17
18
  # g = (a + 3)
19
+ # f()
18
20
  #
19
21
  # @example EnforcedStyle: space
20
22
  # # The `space` style enforces that parentheses have a space at the
@@ -44,11 +46,7 @@ module RuboCop
44
46
  @processed_source = processed_source
45
47
 
46
48
  if style == :space
47
- each_missing_space(processed_source.tokens) do |range|
48
- add_offense(range, message: MSG_SPACE) do |corrector|
49
- corrector.insert_before(range, ' ')
50
- end
51
- end
49
+ process_with_space_style(processed_source)
52
50
  else
53
51
  each_extraneous_space(processed_source.tokens) do |range|
54
52
  add_offense(range) do |corrector|
@@ -60,6 +58,21 @@ module RuboCop
60
58
 
61
59
  private
62
60
 
61
+ def process_with_space_style(processed_source)
62
+ processed_source.tokens.each_cons(2) do |token1, token2|
63
+ each_extraneous_space_in_empty_parens(token1, token2) do |range|
64
+ add_offense(range) do |corrector|
65
+ corrector.remove(range)
66
+ end
67
+ end
68
+ each_missing_space(token1, token2) do |range|
69
+ add_offense(range, message: MSG_SPACE) do |corrector|
70
+ corrector.insert_before(range, ' ')
71
+ end
72
+ end
73
+ end
74
+ end
75
+
63
76
  def each_extraneous_space(tokens)
64
77
  tokens.each_cons(2) do |token1, token2|
65
78
  next unless parens?(token1, token2)
@@ -73,15 +86,21 @@ module RuboCop
73
86
  end
74
87
  end
75
88
 
76
- def each_missing_space(tokens)
77
- tokens.each_cons(2) do |token1, token2|
78
- next if can_be_ignored?(token1, token2)
89
+ def each_extraneous_space_in_empty_parens(token1, token2)
90
+ return unless token1.left_parens? && token2.right_parens?
79
91
 
80
- if token1.left_parens?
81
- yield range_between(token2.begin_pos, token2.begin_pos + 1)
82
- elsif token2.right_parens?
83
- yield range_between(token2.begin_pos, token2.end_pos)
84
- end
92
+ return if range_between(token1.begin_pos, token2.end_pos).source == '()'
93
+
94
+ yield range_between(token1.end_pos, token2.begin_pos)
95
+ end
96
+
97
+ def each_missing_space(token1, token2)
98
+ return if can_be_ignored?(token1, token2)
99
+
100
+ if token1.left_parens?
101
+ yield range_between(token2.begin_pos, token2.begin_pos + 1)
102
+ elsif token2.right_parens?
103
+ yield range_between(token2.begin_pos, token2.end_pos)
85
104
  end
86
105
  end
87
106
 
@@ -96,6 +115,9 @@ module RuboCop
96
115
  def can_be_ignored?(token1, token2)
97
116
  return true unless parens?(token1, token2)
98
117
 
118
+ # Ignore empty parentheses.
119
+ return true if range_between(token1.begin_pos, token2.end_pos).source == '()'
120
+
99
121
  # If the second token is a comment, that means that a line break
100
122
  # follows, and that the rules for space inside don't apply.
101
123
  return true if token2.comment?