rubocop 0.65.0 → 0.66.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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/config/default.yml +53 -4
  4. data/lib/rubocop.rb +4 -5
  5. data/lib/rubocop/cli.rb +1 -1
  6. data/lib/rubocop/config.rb +1 -1
  7. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -5
  8. data/lib/rubocop/cop/layout/class_structure.rb +59 -28
  9. data/lib/rubocop/cop/layout/extra_spacing.rb +18 -0
  10. data/lib/rubocop/cop/layout/indentation_width.rb +25 -5
  11. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +33 -17
  12. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +30 -11
  13. data/lib/rubocop/cop/lint/else_layout.rb +1 -0
  14. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
  15. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +38 -0
  16. data/lib/rubocop/cop/lint/shadowed_exception.rb +14 -1
  17. data/lib/rubocop/cop/lint/to_json.rb +38 -0
  18. data/lib/rubocop/cop/lint/void.rb +1 -1
  19. data/lib/rubocop/cop/message_annotator.rb +4 -4
  20. data/lib/rubocop/cop/metrics/abc_size.rb +1 -0
  21. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +31 -9
  22. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  23. data/lib/rubocop/cop/mixin/integer_node.rb +1 -1
  24. data/lib/rubocop/cop/mixin/method_preference.rb +2 -1
  25. data/lib/rubocop/cop/naming/constant_name.rb +6 -1
  26. data/lib/rubocop/cop/naming/predicate_name.rb +6 -0
  27. data/lib/rubocop/cop/rails/link_to_blank.rb +1 -1
  28. data/lib/rubocop/cop/rails/output.rb +18 -1
  29. data/lib/rubocop/cop/rails/reflection_class_name.rb +1 -1
  30. data/lib/rubocop/cop/rails/time_zone.rb +10 -0
  31. data/lib/rubocop/cop/rails/validation.rb +3 -2
  32. data/lib/rubocop/cop/style/block_delimiters.rb +30 -1
  33. data/lib/rubocop/cop/style/conditional_assignment.rb +3 -1
  34. data/lib/rubocop/cop/style/constant_visibility.rb +66 -0
  35. data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -12
  36. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +16 -4
  37. data/lib/rubocop/cop/style/numeric_literals.rb +16 -7
  38. data/lib/rubocop/cop/style/option_hash.rb +5 -0
  39. data/lib/rubocop/cop/style/redundant_freeze.rb +13 -1
  40. data/lib/rubocop/cop/style/redundant_self.rb +3 -1
  41. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  42. data/lib/rubocop/cop/style/symbol_array.rb +9 -1
  43. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -0
  44. data/lib/rubocop/cop/style/word_array.rb +0 -4
  45. data/lib/rubocop/cop/util.rb +4 -0
  46. data/lib/rubocop/core_ext/string.rb +47 -0
  47. data/lib/rubocop/node_pattern.rb +76 -55
  48. data/lib/rubocop/processed_source.rb +2 -2
  49. data/lib/rubocop/result_cache.rb +4 -4
  50. data/lib/rubocop/rspec/cop_helper.rb +5 -0
  51. data/lib/rubocop/rspec/expect_offense.rb +5 -5
  52. data/lib/rubocop/runner.rb +6 -13
  53. data/lib/rubocop/version.rb +1 -1
  54. metadata +15 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed6850978760ea5017481293cb1b14ac57cf36f3cdbc2592c54bbe10fd9be632
4
- data.tar.gz: 3389c4b2855e381dbfddbf1448e5b3216118d2c47fb6903ce91590ce00345b9b
3
+ metadata.gz: 7917fb6bc9ad3c4e8e80d2931b7c275f7485ece4bcd0d18be214949e2facb5c6
4
+ data.tar.gz: e243620f2c8903c4a71eb755397cb6f0b7094c47202df5bc6310f911ec161557
5
5
  SHA512:
6
- metadata.gz: cde514edb63d0f5bf73c690ec7eeea0fa3af4240bcdde7e570582854fe09760fc81907ca42a92042502cc15cf40b3166591cf859ba29837283fc46854545f1d0
7
- data.tar.gz: eceae6226ef3cae7ff49335ce9536138eaae8abb1151b505fb8b559c2c3fd82cbd271b0c5393236c4ed0cd5d37e19620b5404d0c85b39053d61f387dde00190a
6
+ metadata.gz: 398cf3d8e470cdece6665bd91f9960639acc9196989a80bf6189cea39bdc4f3345a3ff11c5073646d9d4c80369d5ae7e5cc132f01e7855940b546b62ea143352
7
+ data.tar.gz: bdc1aabc612fb36230023a06d8cb507a95539ecdc42386ac5f608aff02bb0d8a918f1b39412322905fab1bcb58f107296f4a84b2a34c80d64edf302ba8976d06
data/README.md CHANGED
@@ -31,7 +31,7 @@ automatically fix some of the problems for you.
31
31
 
32
32
  [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/bbatsov/rubocop?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
33
33
 
34
- **Please consider [supporting financially its ongoing development](#funding).**
34
+ **Please consider [financially supporting its ongoing development](#funding).**
35
35
 
36
36
  ## Installation
37
37
 
@@ -50,10 +50,10 @@ gem 'rubocop', require: false
50
50
  RuboCop's development is moving at a very rapid pace and there are
51
51
  often backward-incompatible changes between minor releases (since we
52
52
  haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
53
- might want to use a conservative version locking in your `Gemfile`:
53
+ might want to use a conservative version lock in your `Gemfile`:
54
54
 
55
55
  ```rb
56
- gem 'rubocop', '~> 0.65.0', require: false
56
+ gem 'rubocop', '~> 0.66.0', require: false
57
57
  ```
58
58
 
59
59
  ## Quickstart
@@ -581,6 +581,10 @@ Layout/ExtraSpacing:
581
581
  # things with the previous or next line, not counting empty lines or comment
582
582
  # lines.
583
583
  AllowForAlignment: true
584
+ # When true, allows things like 'obj.meth(arg) # comment',
585
+ # rather than insisting on 'obj.meth(arg) # comment'.
586
+ # If done for alignment, either this OR AllowForAlignment will allow it.
587
+ AllowBeforeTrailingComments: false
584
588
  # When true, forces the alignment of `=` in assignments on consecutive lines.
585
589
  ForceEqualSignAlignment: false
586
590
 
@@ -1479,6 +1483,11 @@ Lint/SafeNavigationConsistency:
1479
1483
  - try!
1480
1484
 
1481
1485
 
1486
+ Lint/SafeNavigationWithEmpty:
1487
+ Description: 'Avoid `foo&.empty?` in conditionals.'
1488
+ Enabled: true
1489
+ VersionAdded: '0.62'
1490
+
1482
1491
  Lint/ScriptPermission:
1483
1492
  Description: 'Grant script file execute permission.'
1484
1493
  Enabled: true
@@ -1519,6 +1528,10 @@ Lint/Syntax:
1519
1528
  VersionAdded: '0.9'
1520
1529
 
1521
1530
 
1531
+ Lint/ToJSON:
1532
+ Description: 'Ensure #to_json includes an optional argument.'
1533
+ Enabled: true
1534
+
1522
1535
  Lint/UnderscorePrefixedVariableName:
1523
1536
  Description: 'Do not use prefix `_` for a variable that is used.'
1524
1537
  Enabled: true
@@ -1632,9 +1645,12 @@ Metrics/AbcSize:
1632
1645
  Description: >-
1633
1646
  A calculated magnitude based on number of assignments,
1634
1647
  branches, and conditions.
1635
- Reference: 'http://c2.com/cgi/wiki?AbcMetric'
1648
+ Reference:
1649
+ - http://c2.com/cgi/wiki?AbcMetric
1650
+ - https://en.wikipedia.org/wiki/ABC_Software_Metric'
1636
1651
  Enabled: true
1637
1652
  VersionAdded: '0.27'
1653
+ VersionChanged: '0.66'
1638
1654
  # The ABC size is a calculated magnitude, so this number can be an Integer or
1639
1655
  # a Float.
1640
1656
  Max: 15
@@ -1643,13 +1659,15 @@ Metrics/BlockLength:
1643
1659
  Description: 'Avoid long blocks with many lines.'
1644
1660
  Enabled: true
1645
1661
  VersionAdded: '0.44'
1646
- VersionChanged: '0.58'
1662
+ VersionChanged: '0.66'
1647
1663
  CountComments: false # count full line comments?
1648
1664
  Max: 25
1649
1665
  ExcludedMethods:
1650
1666
  # By default, exclude the `#refine` method, as it tends to have larger
1651
1667
  # associated blocks.
1652
1668
  - refine
1669
+ Exclude:
1670
+ - '**/*.gemspec'
1653
1671
 
1654
1672
  Metrics/BlockNesting:
1655
1673
  Description: 'Avoid excessive block nesting'
@@ -2764,8 +2782,9 @@ Style/BlockDelimiters:
2764
2782
  - line_count_based
2765
2783
  # The `semantic` style enforces braces around functional blocks, where the
2766
2784
  # primary purpose of the block is to return a value and do..end for
2767
- # procedural blocks, where the primary purpose of the block is its
2768
- # side-effects.
2785
+ # multi-line procedural blocks, where the primary purpose of the block is
2786
+ # its side-effects. Single-line procedural blocks may only use do-end,
2787
+ # unless AllowBracesOnProceduralOneLiners has a truthy value (see below).
2769
2788
  #
2770
2789
  # This looks at the usage of a block's method to determine its type (e.g. is
2771
2790
  # the result of a `map` assigned to a variable or passed to another
@@ -2826,6 +2845,28 @@ Style/BlockDelimiters:
2826
2845
  - lambda
2827
2846
  - proc
2828
2847
  - it
2848
+ # The AllowBracesOnProceduralOneLiners option is ignored unless the
2849
+ # EnforcedStyle is set to `semantic`. If so:
2850
+ #
2851
+ # If AllowBracesOnProceduralOneLiners is unspecified, or set to any
2852
+ # falsey value, then semantic purity is maintained, so one-line
2853
+ # procedural blocks must use do-end, not braces.
2854
+ #
2855
+ # # bad
2856
+ # collection.each { |element| puts element }
2857
+ #
2858
+ # # good
2859
+ # collection.each do |element| puts element end
2860
+ #
2861
+ # If AllowBracesOnProceduralOneLiners is set to any truthy value,
2862
+ # then one-line procedural blocks may use either style.
2863
+ #
2864
+ # # good
2865
+ # collection.each { |element| puts element }
2866
+ #
2867
+ # # also good
2868
+ # collection.each do |element| puts element end
2869
+ AllowBracesOnProceduralOneLiners: false
2829
2870
 
2830
2871
  Style/BracesAroundHashParameters:
2831
2872
  Description: 'Enforce braces style around hash parameters.'
@@ -3020,6 +3061,13 @@ Style/ConditionalAssignment:
3020
3061
  # Notice: 'Copyright (\(c\) )?2015 Yahoo! Inc'
3021
3062
  # AutocorrectNotice: '# Copyright (c) 2015 Yahoo! Inc.'
3022
3063
  #
3064
+ Style/ConstantVisibility:
3065
+ Description: >-
3066
+ Check that class- and module constants have
3067
+ visibility declarations.
3068
+ Enabled: false
3069
+ VersionAdded: '0.66'
3070
+
3023
3071
  Style/Copyright:
3024
3072
  Description: 'Include a copyright notice in each file before any code.'
3025
3073
  Enabled: false
@@ -3867,6 +3915,7 @@ Style/RedundantFreeze:
3867
3915
  Description: "Checks usages of Object#freeze on immutable objects."
3868
3916
  Enabled: true
3869
3917
  VersionAdded: '0.34'
3918
+ VersionChanged: '0.66'
3870
3919
 
3871
3920
  Style/RedundantParentheses:
3872
3921
  Description: "Checks for parentheses that seem not to serve any purpose."
@@ -6,15 +6,11 @@ require 'rainbow'
6
6
  require 'English'
7
7
  require 'set'
8
8
  require 'forwardable'
9
- require 'powerpack/array/butfirst'
10
- require 'powerpack/enumerable/drop_last'
11
- require 'powerpack/hash/symbolize_keys'
12
- require 'powerpack/string/blank'
13
- require 'powerpack/string/strip_indent'
14
9
  require 'unicode/display_width/no_string_ext'
15
10
 
16
11
  require_relative 'rubocop/version'
17
12
 
13
+ require_relative 'rubocop/core_ext/string'
18
14
  require_relative 'rubocop/path_util'
19
15
  require_relative 'rubocop/file_finder'
20
16
  require_relative 'rubocop/platform'
@@ -313,12 +309,14 @@ require_relative 'rubocop/cop/lint/rescue_type'
313
309
  require_relative 'rubocop/cop/lint/return_in_void_context'
314
310
  require_relative 'rubocop/cop/lint/safe_navigation_consistency'
315
311
  require_relative 'rubocop/cop/lint/safe_navigation_chain'
312
+ require_relative 'rubocop/cop/lint/safe_navigation_with_empty'
316
313
  require_relative 'rubocop/cop/lint/script_permission'
317
314
  require_relative 'rubocop/cop/lint/shadowed_argument'
318
315
  require_relative 'rubocop/cop/lint/shadowed_exception'
319
316
  require_relative 'rubocop/cop/lint/shadowing_outer_local_variable'
320
317
  require_relative 'rubocop/cop/lint/string_conversion_in_interpolation'
321
318
  require_relative 'rubocop/cop/lint/syntax'
319
+ require_relative 'rubocop/cop/lint/to_json'
322
320
  require_relative 'rubocop/cop/lint/underscore_prefixed_variable_name'
323
321
  require_relative 'rubocop/cop/lint/unified_integer'
324
322
  require_relative 'rubocop/cop/lint/unneeded_cop_disable_directive'
@@ -421,6 +419,7 @@ require_relative 'rubocop/cop/style/command_literal'
421
419
  require_relative 'rubocop/cop/style/comment_annotation'
422
420
  require_relative 'rubocop/cop/style/commented_keyword'
423
421
  require_relative 'rubocop/cop/style/conditional_assignment'
422
+ require_relative 'rubocop/cop/style/constant_visibility'
424
423
  require_relative 'rubocop/cop/style/copyright'
425
424
  require_relative 'rubocop/cop/style/date_time'
426
425
  require_relative 'rubocop/cop/style/def_with_parentheses'
@@ -263,7 +263,7 @@ module RuboCop
263
263
 
264
264
  def config_lines(cop)
265
265
  cnf = @config_store.for(Dir.pwd).for_cop(cop)
266
- cnf.to_yaml.lines.to_a.butfirst.map { |line| ' ' + line }
266
+ cnf.to_yaml.lines.to_a.drop(1).map { |line| ' ' + line }
267
267
  end
268
268
 
269
269
  def display_warning_summary(warnings)
@@ -297,7 +297,7 @@ module RuboCop
297
297
  end
298
298
 
299
299
  def signature
300
- @signature ||= Digest::MD5.hexdigest(to_s)
300
+ @signature ||= Digest::SHA1.hexdigest(to_s)
301
301
  end
302
302
 
303
303
  def make_excludes_absolute
@@ -31,7 +31,7 @@ module RuboCop
31
31
  attr_reader :block_node, :method, :arguments
32
32
 
33
33
  def remove_unparenthesized_whitespace(corrector)
34
- return unless !arguments.empty? && !arguments.parenthesized_call?
34
+ return if arguments.empty? || arguments.parenthesized_call?
35
35
 
36
36
  remove_leading_whitespace(corrector)
37
37
  remove_trailing_whitespace(corrector)
@@ -69,10 +69,8 @@ module RuboCop
69
69
  end
70
70
 
71
71
  def remove_trailing_whitespace(corrector)
72
- corrector.remove_preceding(
73
- block_begin,
74
- block_begin.begin_pos - arguments.source_range.end_pos - 1
75
- )
72
+ size = block_begin.begin_pos - arguments.source_range.end_pos - 1
73
+ corrector.remove_preceding(block_begin, size) if size > 0
76
74
  end
77
75
 
78
76
  def replace_delimiters(corrector)
@@ -8,35 +8,43 @@ module RuboCop
8
8
  # `Categories` allows us to map macro names into a category.
9
9
  #
10
10
  # Consider an example of code style that covers the following order:
11
+ # - Module inclusion (include, prepend, extend)
11
12
  # - Constants
12
13
  # - Associations (has_one, has_many)
13
- # - Attributes (attr_accessor, attr_writer, attr_reader)
14
+ # - Public attribute macros (attr_accessor, attr_writer, attr_reader)
15
+ # - Other macros (validates, validate)
16
+ # - Public class methods
14
17
  # - Initializer
15
- # - Instance methods
16
- # - Protected methods
17
- # - Private methods
18
+ # - Public instance methods
19
+ # - Protected attribute macros (attr_accessor, attr_writer, attr_reader)
20
+ # - Protected instance methods
21
+ # - Private attribute macros (attr_accessor, attr_writer, attr_reader)
22
+ # - Private instance methods
18
23
  #
19
24
  # You can configure the following order:
20
25
  #
21
26
  # ```yaml
22
27
  # Layout/ClassStructure:
23
- # Categories:
24
- # module_inclusion:
25
- # - include
26
- # - prepend
27
- # - extend
28
28
  # ExpectedOrder:
29
- # - module_inclusion
30
- # - constants
31
- # - public_class_methods
32
- # - initializer
33
- # - public_methods
34
- # - protected_methods
35
- # - private_methods
36
- #
29
+ # - module_inclusion
30
+ # - constants
31
+ # - association
32
+ # - public_attribute_macros
33
+ # - public_delegate
34
+ # - macros
35
+ # - public_class_methods
36
+ # - initializer
37
+ # - public_methods
38
+ # - protected_attribute_macros
39
+ # - protected_methods
40
+ # - private_attribute_macros
41
+ # - private_delegate
42
+ # - private_methods
37
43
  # ```
44
+ #
38
45
  # Instead of putting all literals in the expected order, is also
39
- # possible to group categories of macros.
46
+ # possible to group categories of macros. Visibility levels are handled
47
+ # automatically.
40
48
  #
41
49
  # ```yaml
42
50
  # Layout/ClassStructure:
@@ -44,10 +52,17 @@ module RuboCop
44
52
  # association:
45
53
  # - has_many
46
54
  # - has_one
47
- # attribute:
55
+ # attribute_macros:
48
56
  # - attr_accessor
49
57
  # - attr_reader
50
58
  # - attr_writer
59
+ # macros:
60
+ # - validates
61
+ # - validate
62
+ # module_inclusion:
63
+ # - include
64
+ # - prepend
65
+ # - extend
51
66
  # ```
52
67
  #
53
68
  # @example
@@ -73,12 +88,15 @@ module RuboCop
73
88
  # # constants are next
74
89
  # SOME_CONSTANT = 20
75
90
  #
76
- # # afterwards we have attribute macros
91
+ # # afterwards we have public attribute macros
77
92
  # attr_reader :name
78
93
  #
79
94
  # # followed by other macros (if any)
80
95
  # validates :name
81
96
  #
97
+ # # then we have public delegate macros
98
+ # delegate :to_s, to: :name
99
+ #
82
100
  # # public class methods are next in line
83
101
  # def self.some_method
84
102
  # end
@@ -91,14 +109,22 @@ module RuboCop
91
109
  # def some_method
92
110
  # end
93
111
  #
94
- # # protected and private methods are grouped near the end
112
+ # # protected attribute macros and methods go next
95
113
  # protected
96
114
  #
115
+ # attr_reader :protected_name
116
+ #
97
117
  # def some_protected_method
98
118
  # end
99
119
  #
120
+ # # private attribute macros, delegate macros and methods
121
+ # # are grouped near the end
100
122
  # private
101
123
  #
124
+ # attr_reader :private_name
125
+ #
126
+ # delegate :some_private_delegate, to: :name
127
+ #
102
128
  # def some_private_method
103
129
  # end
104
130
  # end
@@ -108,7 +134,8 @@ module RuboCop
108
134
  HUMANIZED_NODE_TYPE = {
109
135
  casgn: :constants,
110
136
  defs: :class_methods,
111
- def: :public_methods
137
+ def: :public_methods,
138
+ sclass: :class_singleton
112
139
  }.freeze
113
140
 
114
141
  VISIBILITY_SCOPES = %i[private protected public].freeze
@@ -167,19 +194,23 @@ module RuboCop
167
194
  when :block
168
195
  classify(node.send_node)
169
196
  when :send
170
- find_category(node.method_name)
197
+ find_category(node)
171
198
  else
172
199
  humanize_node(node)
173
200
  end.to_s
174
201
  end
175
202
 
176
- # Categorize a method_name according to the {expected_order}
177
- # @param method_name try to match {categories} values
203
+ # Categorize a node according to the {expected_order}
204
+ # Try to match {categories} values against the node's method_name given
205
+ # also its visibility.
206
+ # @param node to be analysed.
178
207
  # @return [String] with the key category or the `method_name` as string
179
- def find_category(method_name)
180
- name = method_name.to_s
208
+ def find_category(node)
209
+ name = node.method_name.to_s
181
210
  category, = categories.find { |_, names| names.include?(name) }
182
- category || name
211
+ key = category || name
212
+ visibility_key = "#{node_visibility(node)}_#{key}"
213
+ expected_order.include?(visibility_key) ? visibility_key : key
183
214
  end
184
215
 
185
216
  def walk_over_nested_class_definition(class_node)
@@ -19,6 +19,17 @@ module RuboCop
19
19
  # # bad for any configuration
20
20
  # set_app("RuboCop")
21
21
  # website = "https://github.com/rubocop-hq/rubocop"
22
+ #
23
+ # # good only if AllowBeforeTrailingComments is true
24
+ # object.method(arg) # this is a comment
25
+ #
26
+ # # good even if AllowBeforeTrailingComments is false or not set
27
+ # object.method(arg) # this is a comment
28
+ #
29
+ # # good with either AllowBeforeTrailingComments or AllowForAlignment
30
+ # object.method(arg) # this is a comment
31
+ # another_object.method(arg) # this is another comment
32
+ # some_object.method(arg) # this is some comment
22
33
  class ExtraSpacing < Cop
23
34
  include PrecedingFollowingAlignment
24
35
  include RangeHelp
@@ -98,6 +109,9 @@ module RuboCop
98
109
  end
99
110
 
100
111
  def check_other(token1, token2, ast)
112
+ return false if allow_for_trailing_comments? &&
113
+ token2.text.start_with?('#')
114
+
101
115
  extra_space_range(token1, token2) do |range|
102
116
  # Unary + doesn't appear as a token and needs special handling.
103
117
  next if ignored_range?(ast, range.begin_pos)
@@ -222,6 +236,10 @@ module RuboCop
222
236
  optarg_eql = optargs.map { |o| o.loc.operator.begin_pos }.to_set
223
237
  asgn_tokens.reject { |t| optarg_eql.include?(t.begin_pos) }
224
238
  end
239
+
240
+ def allow_for_trailing_comments?
241
+ cop_config['AllowBeforeTrailingComments']
242
+ end
225
243
  end
226
244
  end
227
245
  end
@@ -54,6 +54,10 @@ module RuboCop
54
54
 
55
55
  SPECIAL_MODIFIERS = %w[private protected].freeze
56
56
 
57
+ def_node_matcher :access_modifier?, <<-PATTERN
58
+ [(send ...) access_modifier?]
59
+ PATTERN
60
+
57
61
  def on_rescue(node)
58
62
  _begin_node, *_rescue_nodes, else_node = *node
59
63
  check_indentation(node.loc.else, else_node)
@@ -161,15 +165,12 @@ module RuboCop
161
165
  private
162
166
 
163
167
  def check_members(base, members)
164
- check_indentation(base, members.first)
168
+ check_indentation(base, select_check_member(members.first))
165
169
 
166
170
  return unless members.any? && members.first.begin_type?
167
171
 
168
172
  if indentation_consistency_style == 'rails'
169
- each_member(members) do |member, previous_modifier|
170
- check_indentation(previous_modifier, member,
171
- indentation_consistency_style)
172
- end
173
+ check_members_for_rails_style(members)
173
174
  else
174
175
  members.first.children.each do |member|
175
176
  next if member.send_type? && member.access_modifier?
@@ -179,6 +180,23 @@ module RuboCop
179
180
  end
180
181
  end
181
182
 
183
+ def select_check_member(member)
184
+ return unless member
185
+
186
+ if access_modifier?(member.children.first)
187
+ member.children.first
188
+ else
189
+ member
190
+ end
191
+ end
192
+
193
+ def check_members_for_rails_style(members)
194
+ each_member(members) do |member, previous_modifier|
195
+ check_indentation(previous_modifier, member,
196
+ indentation_consistency_style)
197
+ end
198
+ end
199
+
182
200
  def each_member(members)
183
201
  previous_modifier = nil
184
202
  members.first.children.each do |member|
@@ -326,6 +344,8 @@ module RuboCop
326
344
  return unless body_node.begin_type?
327
345
 
328
346
  starting_node = body_node.children.first
347
+ return unless starting_node
348
+
329
349
  starting_node.send_type? && starting_node.bare_access_modifier?
330
350
  end
331
351