rubocop 0.65.0 → 0.66.0

Sign up to get free protection for your applications and to get access to all the features.
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