rubocop 0.80.1 → 0.81.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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +62 -15
  4. data/lib/rubocop.rb +4 -1
  5. data/lib/rubocop/ast/builder.rb +2 -0
  6. data/lib/rubocop/ast/node.rb +11 -6
  7. data/lib/rubocop/ast/node/block_node.rb +5 -1
  8. data/lib/rubocop/ast/node/case_match_node.rb +56 -0
  9. data/lib/rubocop/ast/traversal.rb +11 -9
  10. data/lib/rubocop/config_obsoletion.rb +1 -0
  11. data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
  12. data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
  13. data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
  14. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  15. data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
  16. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
  17. data/lib/rubocop/cop/lint/loop.rb +6 -4
  18. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  19. data/lib/rubocop/cop/lint/raise_exception.rb +39 -0
  20. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  21. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  22. data/lib/rubocop/cop/lint/suppressed_exception.rb +12 -22
  23. data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
  24. data/lib/rubocop/cop/migration/department_name.rb +22 -9
  25. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
  26. data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
  27. data/lib/rubocop/cop/naming/method_name.rb +30 -0
  28. data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
  29. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  30. data/lib/rubocop/cop/style/documentation.rb +43 -5
  31. data/lib/rubocop/cop/style/end_block.rb +6 -0
  32. data/lib/rubocop/cop/style/hash_each_methods.rb +2 -0
  33. data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -2
  34. data/lib/rubocop/cop/style/hash_transform_values.rb +6 -2
  35. data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
  36. data/lib/rubocop/cop/style/lambda.rb +1 -0
  37. data/lib/rubocop/cop/style/module_function.rb +56 -10
  38. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
  39. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -2
  40. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  41. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +34 -0
  42. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
  43. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +85 -0
  44. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
  45. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  46. data/lib/rubocop/formatter/junit_formatter.rb +17 -6
  47. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  48. data/lib/rubocop/processed_source.rb +1 -1
  49. data/lib/rubocop/version.rb +1 -1
  50. metadata +8 -5
  51. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4837832a6eb4686ba49145b2668aea7b94d85f3b23d24eb49c05ff9b456393b4
4
- data.tar.gz: 1d72140d3461ddf8f64eb1218a78f76603b400e09cb902f1bed6e036650c0d86
3
+ metadata.gz: af0dab74354064816d5756cb5a49ab7160c444292ef32e9ee7980dff8a18110f
4
+ data.tar.gz: 96288aa5f77f19813ef7cac495f7c86d912f3be28da021b01d30136a2ef28f99
5
5
  SHA512:
6
- metadata.gz: 4637362ae937c8e659c62d5d4e305342f9580652551356a5178ae3861fa680ac3a7ba27a8eaf0869c73de5c66c16a3ed53d1377aba4d1ad9616dd3e69ce2f761
7
- data.tar.gz: aada4e63308932e7847e94de67565942cbc4b12ae41663a1cb1984228988580e7322612c8c3a73337ae54baa0af9dc0b133f627c44c54a39994f86c0c588b976
6
+ metadata.gz: 015244a9c6aff6e2d5640e68b286127944418221bb8c76db04273c5c35b5bc41e03bf7d85c44a3b630a0dd8a24f5a4531ddaf61adb0b75a0b39e2e6c2e08d8cf
7
+ data.tar.gz: 8e209ee81ebf1d5a3215292c7d7eddabaacb64e0fa1da7935372495ad13e5bdd896b7fd27fde25fc0e8ffaa7d1b0873f47c40f505d4828e23a52f0ca2ee847e6
data/README.md CHANGED
@@ -53,7 +53,7 @@ haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
53
53
  might want to use a conservative version lock in your `Gemfile`:
54
54
 
55
55
  ```rb
56
- gem 'rubocop', '~> 0.80.1', require: false
56
+ gem 'rubocop', '~> 0.81.0', require: false
57
57
  ```
58
58
 
59
59
  ## Quickstart
@@ -255,10 +255,30 @@ Layout/ArrayAlignment:
255
255
  Description: >-
256
256
  Align the elements of an array literal if they span more than
257
257
  one line.
258
- StyleGuide: '#align-multiline-arrays'
258
+ StyleGuide: '#no-double-indent'
259
259
  Enabled: true
260
260
  VersionAdded: '0.49'
261
261
  VersionChanged: '0.77'
262
+ # Alignment of elements of a multi-line array.
263
+ #
264
+ # The `with_first_parameter` style aligns the following lines along the same
265
+ # column as the first element.
266
+ #
267
+ # array = [1, 2, 3,
268
+ # 4, 5, 6]
269
+ #
270
+ # The `with_fixed_indentation` style aligns the following lines with one
271
+ # level of indentation relative to the start of the line with start of array.
272
+ #
273
+ # array = [1, 2, 3,
274
+ # 4, 5, 6]
275
+ EnforcedStyle: with_first_element
276
+ SupportedStyles:
277
+ - with_first_element
278
+ - with_fixed_indentation
279
+ # By default, the indentation width from Layout/IndentationWidth is used
280
+ # But it can be overridden by setting this parameter
281
+ IndentationWidth: ~
262
282
 
263
283
  Layout/AssignmentIndentation:
264
284
  Description: >-
@@ -1303,6 +1323,7 @@ Lint/BooleanSymbol:
1303
1323
  Description: 'Check for `:true` and `:false` symbols.'
1304
1324
  Enabled: true
1305
1325
  VersionAdded: '0.50'
1326
+ VersionChanged: '0.81'
1306
1327
 
1307
1328
  Lint/CircularArgumentReference:
1308
1329
  Description: "Default values in optional keyword arguments and optional ordinal arguments should not refer back to the name of the argument."
@@ -1375,11 +1396,6 @@ Lint/EmptyWhen:
1375
1396
  Enabled: true
1376
1397
  VersionAdded: '0.45'
1377
1398
 
1378
- Lint/EndInMethod:
1379
- Description: 'END blocks should not be placed inside method definitions.'
1380
- Enabled: true
1381
- VersionAdded: '0.9'
1382
-
1383
1399
  Lint/EnsureReturn:
1384
1400
  Description: 'Do not use return in an ensure block.'
1385
1401
  StyleGuide: '#no-return-ensure'
@@ -1546,6 +1562,12 @@ Lint/PercentSymbolArray:
1546
1562
  Enabled: true
1547
1563
  VersionAdded: '0.41'
1548
1564
 
1565
+ Lint/RaiseException:
1566
+ Description: Checks for `raise` or `fail` statements which are raising `Exception` class.
1567
+ StyleGuide: '#raise-exception'
1568
+ Enabled: pending
1569
+ VersionAdded: '0.81'
1570
+
1549
1571
  Lint/RandOne:
1550
1572
  Description: >-
1551
1573
  Checks for `rand(1)` calls. Such calls always return `0`
@@ -1574,7 +1596,7 @@ Lint/RedundantRequireStatement:
1574
1596
  Lint/RedundantSplatExpansion:
1575
1597
  Description: 'Checks for splat unnecessarily being called on literals.'
1576
1598
  Enabled: true
1577
- VersionChanged: '0.76'
1599
+ VersionAdded: '0.76'
1578
1600
 
1579
1601
  Lint/RedundantStringCoercion:
1580
1602
  Description: 'Checks for Object#to_s usage in string interpolation.'
@@ -1688,13 +1710,18 @@ Lint/ShadowingOuterLocalVariable:
1688
1710
  Enabled: true
1689
1711
  VersionAdded: '0.9'
1690
1712
 
1713
+ Lint/StructNewOverride:
1714
+ Description: 'Disallow overriding the `Struct` built-in methods via `Struct.new`.'
1715
+ Enabled: pending
1716
+ VersionAdded: '0.81'
1717
+
1691
1718
  Lint/SuppressedException:
1692
1719
  Description: "Don't suppress exceptions."
1693
1720
  StyleGuide: '#dont-hide-exceptions'
1694
1721
  Enabled: true
1695
- AllowComments: false
1722
+ AllowComments: true
1696
1723
  VersionAdded: '0.9'
1697
- VersionChanged: '0.77'
1724
+ VersionChanged: '0.81'
1698
1725
 
1699
1726
  Lint/Syntax:
1700
1727
  Description: 'Checks syntax error.'
@@ -1705,6 +1732,7 @@ Lint/Syntax:
1705
1732
  Lint/ToJSON:
1706
1733
  Description: 'Ensure #to_json includes an optional argument.'
1707
1734
  Enabled: true
1735
+ VersionAdded: '0.66'
1708
1736
 
1709
1737
  Lint/UnderscorePrefixedVariableName:
1710
1738
  Description: 'Do not use prefix `_` for a variable that is used.'
@@ -1736,9 +1764,10 @@ Lint/UnusedMethodArgument:
1736
1764
  StyleGuide: '#underscore-unused-vars'
1737
1765
  Enabled: true
1738
1766
  VersionAdded: '0.21'
1739
- VersionChanged: '0.35'
1767
+ VersionChanged: '0.81'
1740
1768
  AllowUnusedKeywordArguments: false
1741
1769
  IgnoreEmptyMethods: true
1770
+ IgnoreNotImplementedMethods: true
1742
1771
 
1743
1772
  Lint/UriEscapeUnescape:
1744
1773
  Description: >-
@@ -1804,9 +1833,10 @@ Metrics/AbcSize:
1804
1833
  - https://en.wikipedia.org/wiki/ABC_Software_Metric
1805
1834
  Enabled: true
1806
1835
  VersionAdded: '0.27'
1807
- VersionChanged: '0.66'
1836
+ VersionChanged: '0.81'
1808
1837
  # The ABC size is a calculated magnitude, so this number can be an Integer or
1809
1838
  # a Float.
1839
+ IgnoredMethods: []
1810
1840
  Max: 15
1811
1841
 
1812
1842
  Metrics/BlockLength:
@@ -1846,6 +1876,8 @@ Metrics/CyclomaticComplexity:
1846
1876
  of test cases needed to validate a method.
1847
1877
  Enabled: true
1848
1878
  VersionAdded: '0.25'
1879
+ VersionChanged: '0.81'
1880
+ IgnoredMethods: []
1849
1881
  Max: 6
1850
1882
 
1851
1883
  Metrics/MethodLength:
@@ -1879,6 +1911,8 @@ Metrics/PerceivedComplexity:
1879
1911
  human reader.
1880
1912
  Enabled: true
1881
1913
  VersionAdded: '0.25'
1914
+ VersionChanged: '0.81'
1915
+ IgnoredMethods: []
1882
1916
  Max: 7
1883
1917
 
1884
1918
  ################## Migration #############################
@@ -1888,6 +1922,7 @@ Migration/DepartmentName:
1888
1922
  Check that cop names in rubocop:disable (etc) comments are
1889
1923
  given with department name.
1890
1924
  Enabled: true
1925
+ VersionAdded: '0.75'
1891
1926
 
1892
1927
  #################### Naming ##############################
1893
1928
 
@@ -2178,10 +2213,12 @@ Style/AccessModifierDeclarations:
2178
2213
  Description: 'Checks style of how access modifiers are used.'
2179
2214
  Enabled: true
2180
2215
  VersionAdded: '0.57'
2216
+ VersionChanged: '0.81'
2181
2217
  EnforcedStyle: group
2182
2218
  SupportedStyles:
2183
2219
  - inline
2184
2220
  - group
2221
+ AllowModifiersOnSymbols: true
2185
2222
 
2186
2223
  Style/Alias:
2187
2224
  Description: 'Use alias instead of alias_method.'
@@ -2435,7 +2472,7 @@ Style/ClassVars:
2435
2472
  # Align with the style guide.
2436
2473
  Style/CollectionMethods:
2437
2474
  Description: 'Preferred collection methods.'
2438
- StyleGuide: '#map-find-select-reduce-size'
2475
+ StyleGuide: '#map-find-select-reduce-include-size'
2439
2476
  Enabled: false
2440
2477
  VersionAdded: '0.9'
2441
2478
  VersionChanged: '0.27'
@@ -2452,6 +2489,7 @@ Style/CollectionMethods:
2452
2489
  inject: 'reduce'
2453
2490
  detect: 'find'
2454
2491
  find_all: 'select'
2492
+ member?: 'include?'
2455
2493
 
2456
2494
  Style/ColonMethodCall:
2457
2495
  Description: 'Do not use :: for method call.'
@@ -2677,6 +2715,7 @@ Style/EndBlock:
2677
2715
  StyleGuide: '#no-END-blocks'
2678
2716
  Enabled: true
2679
2717
  VersionAdded: '0.9'
2718
+ VersionChanged: '0.81'
2680
2719
 
2681
2720
  Style/EvalWithLocation:
2682
2721
  Description: 'Pass `__FILE__` and `__LINE__` to `eval` method, as they are used by backtraces.'
@@ -2937,7 +2976,7 @@ Style/LambdaCall:
2937
2976
  Description: 'Use lambda.call(...) instead of lambda.(...).'
2938
2977
  StyleGuide: '#proc-call'
2939
2978
  Enabled: true
2940
- VersionAdded: '0.13.1'
2979
+ VersionAdded: '0.13'
2941
2980
  VersionChanged: '0.14'
2942
2981
  EnforcedStyle: call
2943
2982
  SupportedStyles:
@@ -3067,6 +3106,7 @@ Style/ModuleFunction:
3067
3106
  SupportedStyles:
3068
3107
  - module_function
3069
3108
  - extend_self
3109
+ - forbidden
3070
3110
  Autocorrect: false
3071
3111
  SafeAutoCorrect: false
3072
3112
 
@@ -3806,22 +3846,29 @@ Style/TrailingCommaInArrayLiteral:
3806
3846
  StyleGuide: '#no-trailing-array-commas'
3807
3847
  Enabled: true
3808
3848
  VersionAdded: '0.53'
3849
+ # If `comma`, the cop requires a comma after the last item in an array,
3809
3850
  # but only when each item is on its own line.
3810
3851
  # If `consistent_comma`, the cop requires a comma after the last item of all
3811
- # non-empty array literals.
3852
+ # non-empty, multiline array literals.
3812
3853
  EnforcedStyleForMultiline: no_comma
3813
3854
  SupportedStylesForMultiline:
3814
3855
  - comma
3815
3856
  - consistent_comma
3816
3857
  - no_comma
3817
3858
 
3859
+ Style/TrailingCommaInBlockArgs:
3860
+ Description: 'Checks for useless trailing commas in block arguments.'
3861
+ Enabled: false
3862
+ Safe: false
3863
+ VersionAdded: '0.81'
3864
+
3818
3865
  Style/TrailingCommaInHashLiteral:
3819
3866
  Description: 'Checks for trailing comma in hash literals.'
3820
3867
  Enabled: true
3821
3868
  # If `comma`, the cop requires a comma after the last item in a hash,
3822
3869
  # but only when each item is on its own line.
3823
3870
  # If `consistent_comma`, the cop requires a comma after the last item of all
3824
- # non-empty hash literals.
3871
+ # non-empty, multiline hash literals.
3825
3872
  EnforcedStyleForMultiline: no_comma
3826
3873
  SupportedStylesForMultiline:
3827
3874
  - comma
@@ -37,6 +37,7 @@ require_relative 'rubocop/ast/node/args_node'
37
37
  require_relative 'rubocop/ast/node/array_node'
38
38
  require_relative 'rubocop/ast/node/block_node'
39
39
  require_relative 'rubocop/ast/node/break_node'
40
+ require_relative 'rubocop/ast/node/case_match_node'
40
41
  require_relative 'rubocop/ast/node/case_node'
41
42
  require_relative 'rubocop/ast/node/class_node'
42
43
  require_relative 'rubocop/ast/node/def_node'
@@ -299,7 +300,6 @@ require_relative 'rubocop/cop/lint/empty_ensure'
299
300
  require_relative 'rubocop/cop/lint/empty_expression'
300
301
  require_relative 'rubocop/cop/lint/empty_interpolation'
301
302
  require_relative 'rubocop/cop/lint/empty_when'
302
- require_relative 'rubocop/cop/lint/end_in_method'
303
303
  require_relative 'rubocop/cop/lint/ensure_return'
304
304
  require_relative 'rubocop/cop/lint/erb_new_arguments'
305
305
  require_relative 'rubocop/cop/lint/flip_flop'
@@ -325,6 +325,7 @@ require_relative 'rubocop/cop/lint/ordered_magic_comments'
325
325
  require_relative 'rubocop/cop/lint/parentheses_as_grouped_expression'
326
326
  require_relative 'rubocop/cop/lint/percent_string_array'
327
327
  require_relative 'rubocop/cop/lint/percent_symbol_array'
328
+ require_relative 'rubocop/cop/lint/raise_exception'
328
329
  require_relative 'rubocop/cop/lint/rand_one'
329
330
  require_relative 'rubocop/cop/lint/redundant_cop_disable_directive'
330
331
  require_relative 'rubocop/cop/lint/redundant_cop_enable_directive'
@@ -346,6 +347,7 @@ require_relative 'rubocop/cop/lint/send_with_mixin_argument'
346
347
  require_relative 'rubocop/cop/lint/shadowed_argument'
347
348
  require_relative 'rubocop/cop/lint/shadowed_exception'
348
349
  require_relative 'rubocop/cop/lint/shadowing_outer_local_variable'
350
+ require_relative 'rubocop/cop/lint/struct_new_override'
349
351
  require_relative 'rubocop/cop/lint/suppressed_exception'
350
352
  require_relative 'rubocop/cop/lint/syntax'
351
353
  require_relative 'rubocop/cop/lint/to_json'
@@ -555,6 +557,7 @@ require_relative 'rubocop/cop/style/trailing_body_on_method_definition'
555
557
  require_relative 'rubocop/cop/style/trailing_body_on_module'
556
558
  require_relative 'rubocop/cop/style/trailing_comma_in_arguments'
557
559
  require_relative 'rubocop/cop/style/trailing_comma_in_array_literal'
560
+ require_relative 'rubocop/cop/style/trailing_comma_in_block_args'
558
561
  require_relative 'rubocop/cop/style/trailing_comma_in_hash_literal'
559
562
  require_relative 'rubocop/cop/style/trailing_method_end_statement'
560
563
  require_relative 'rubocop/cop/style/trailing_underscore_variable'
@@ -20,7 +20,9 @@ module RuboCop
20
20
  args: ArgsNode,
21
21
  array: ArrayNode,
22
22
  block: BlockNode,
23
+ numblock: BlockNode,
23
24
  break: BreakNode,
25
+ case_match: CaseMatchNode,
24
26
  case: CaseNode,
25
27
  class: ClassNode,
26
28
  def: DefNode,
@@ -98,7 +98,7 @@ module RuboCop
98
98
  @mutable_attributes.frozen?
99
99
  end
100
100
 
101
- protected :parent= # rubocop:disable Style/AccessModifierDeclarations
101
+ protected :parent=
102
102
 
103
103
  # Override `AST::Node#updated` so that `AST::Processor` does not try to
104
104
  # mutate our ASTs. Since we keep references from children to parents and
@@ -291,7 +291,7 @@ module RuboCop
291
291
  ## Destructuring
292
292
 
293
293
  def_node_matcher :receiver, <<~PATTERN
294
- {(send $_ ...) (block (send $_ ...) ...)}
294
+ {(send $_ ...) ({block numblock} (send $_ ...) ...)}
295
295
  PATTERN
296
296
 
297
297
  def_node_matcher :str_content, '(str $_)'
@@ -313,9 +313,8 @@ module RuboCop
313
313
  (casgn $_ $_ (send (const nil? {:Class :Module}) :new ...))
314
314
  (casgn $_ $_ (block (send (const nil? {:Class :Module}) :new ...) ...))}
315
315
  PATTERN
316
- # rubocop:disable Style/AccessModifierDeclarations
316
+
317
317
  private :defined_module0
318
- # rubocop:enable Style/AccessModifierDeclarations
319
318
 
320
319
  def defined_module
321
320
  namespace, name = *defined_module0
@@ -469,7 +468,13 @@ module RuboCop
469
468
  irange_type? || erange_type?
470
469
  end
471
470
 
472
- def_node_matcher :guard_clause?, <<~PATTERN
471
+ def guard_clause?
472
+ node = and_type? || or_type? ? rhs : self
473
+
474
+ node.match_guard_clause?
475
+ end
476
+
477
+ def_node_matcher :match_guard_clause?, <<~PATTERN
473
478
  [${(send nil? {:raise :fail} ...) return break next} single_line?]
474
479
  PATTERN
475
480
 
@@ -479,7 +484,7 @@ module RuboCop
479
484
  (send (const nil? :Proc) :new)}
480
485
  PATTERN
481
486
 
482
- def_node_matcher :lambda?, '(block (send nil? :lambda) ...)'
487
+ def_node_matcher :lambda?, '({block numblock} (send nil? :lambda) ...)'
483
488
  def_node_matcher :lambda_or_proc?, '{lambda? proc?}'
484
489
 
485
490
  def_node_matcher :class_constructor?, <<~PATTERN
@@ -24,7 +24,11 @@ module RuboCop
24
24
  #
25
25
  # @return [Array<Node>]
26
26
  def arguments
27
- node_parts[1]
27
+ if numblock_type?
28
+ [] # Numbered parameters have no block arguments.
29
+ else
30
+ node_parts[1]
31
+ end
28
32
  end
29
33
 
30
34
  # The body of this block.
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `case_match` nodes. This will be used in place of
6
+ # a plain node when the builder constructs the AST, making its methods
7
+ # available to all `case_match` nodes within RuboCop.
8
+ class CaseMatchNode < Node
9
+ include ConditionalNode
10
+
11
+ # Returns the keyword of the `case` statement as a string.
12
+ #
13
+ # @return [String] the keyword of the `case` statement
14
+ def keyword
15
+ 'case'
16
+ end
17
+
18
+ # Calls the given block for each `in_pattern` node in the `in` statement.
19
+ # If no block is given, an `Enumerator` is returned.
20
+ #
21
+ # @return [self] if a block is given
22
+ # @return [Enumerator] if no block is given
23
+ def each_in_pattern
24
+ return in_pattern_branches.to_enum(__method__) unless block_given?
25
+
26
+ in_pattern_branches.each do |condition|
27
+ yield condition
28
+ end
29
+
30
+ self
31
+ end
32
+
33
+ # Returns an array of all the when branches in the `case` statement.
34
+ #
35
+ # @return [Array<Node>] an array of `in_pattern` nodes
36
+ def in_pattern_branches
37
+ node_parts[1...-1]
38
+ end
39
+
40
+ # Returns the else branch of the `case` statement, if any.
41
+ #
42
+ # @return [Node] the else branch node of the `case` statement
43
+ # @return [nil] if the case statement does not have an else branch.
44
+ def else_branch
45
+ node_parts[-1]
46
+ end
47
+
48
+ # Checks whether this case statement has an `else` branch.
49
+ #
50
+ # @return [Boolean] whether the `case` statement has an `else` branch
51
+ def else?
52
+ !loc.else.nil?
53
+ end
54
+ end
55
+ end
56
+ end
@@ -21,7 +21,7 @@ module RuboCop
21
21
  arg restarg blockarg shadowarg
22
22
  kwrestarg zsuper lambda redo retry
23
23
  forward_args forwarded_args
24
- match_var match_nil_pattern].freeze
24
+ match_var match_nil_pattern empty_else].freeze
25
25
  ONE_CHILD_NODE = %i[splat kwsplat block_pass not break next
26
26
  preexe postexe match_current_line defined?
27
27
  arg_expr pin match_rest if_guard unless_guard
@@ -31,7 +31,7 @@ module RuboCop
31
31
  undef alias args super yield or and
32
32
  while_post until_post iflipflop eflipflop
33
33
  match_with_lvasgn begin kwbegin return
34
- in_match case_match in_pattern match_alt
34
+ in_match match_alt
35
35
  match_as array_pattern array_pattern_with_tail
36
36
  hash_pattern const_pattern].freeze
37
37
  SECOND_CHILD_ONLY = %i[lvasgn ivasgn cvasgn gvasgn optarg kwarg
@@ -178,13 +178,15 @@ module RuboCop
178
178
  nil
179
179
  end
180
180
 
181
- alias on_rescue on_case
182
- alias on_resbody on_case
183
- alias on_ensure on_case
184
- alias on_for on_case
185
- alias on_when on_case
186
- alias on_irange on_case
187
- alias on_erange on_case
181
+ alias on_rescue on_case
182
+ alias on_resbody on_case
183
+ alias on_ensure on_case
184
+ alias on_for on_case
185
+ alias on_when on_case
186
+ alias on_case_match on_case
187
+ alias on_in_pattern on_case
188
+ alias on_irange on_case
189
+ alias on_erange on_case
188
190
 
189
191
  def on_numblock(node)
190
192
  children = node.children