rubocop 0.67.2 → 0.68.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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +86 -233
  4. data/exe/rubocop +0 -12
  5. data/lib/rubocop.rb +13 -30
  6. data/lib/rubocop/ast/builder.rb +4 -0
  7. data/lib/rubocop/ast/node/alias_node.rb +24 -0
  8. data/lib/rubocop/ast/node/class_node.rb +31 -0
  9. data/lib/rubocop/ast/node/module_node.rb +24 -0
  10. data/lib/rubocop/ast/node/range_node.rb +7 -0
  11. data/lib/rubocop/ast/node/resbody_node.rb +12 -0
  12. data/lib/rubocop/ast/node/self_class_node.rb +24 -0
  13. data/lib/rubocop/cli.rb +40 -4
  14. data/lib/rubocop/config.rb +9 -7
  15. data/lib/rubocop/config_loader.rb +48 -7
  16. data/lib/rubocop/config_loader_resolver.rb +5 -4
  17. data/lib/rubocop/cop/commissioner.rb +24 -0
  18. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +18 -6
  19. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +12 -14
  20. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +9 -20
  21. data/lib/rubocop/cop/layout/align_arguments.rb +93 -0
  22. data/lib/rubocop/cop/layout/align_parameters.rb +57 -33
  23. data/lib/rubocop/cop/layout/class_structure.rb +5 -5
  24. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +6 -8
  25. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +3 -6
  26. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +1 -2
  27. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -0
  28. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +292 -0
  29. data/lib/rubocop/cop/layout/{first_parameter_indentation.rb → indent_first_argument.rb} +11 -12
  30. data/lib/rubocop/cop/layout/{indent_array.rb → indent_first_array_element.rb} +2 -2
  31. data/lib/rubocop/cop/layout/{indent_hash.rb → indent_first_hash_element.rb} +2 -2
  32. data/lib/rubocop/cop/layout/indent_first_parameter.rb +96 -0
  33. data/lib/rubocop/cop/layout/indentation_width.rb +4 -16
  34. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +2 -4
  35. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -16
  36. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  37. data/lib/rubocop/cop/lint/duplicate_methods.rb +6 -8
  38. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -8
  39. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +157 -0
  40. data/lib/rubocop/cop/lint/inherit_exception.rb +3 -4
  41. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +18 -1
  42. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -5
  43. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +25 -5
  44. data/lib/rubocop/cop/lint/useless_assignment.rb +2 -6
  45. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -2
  46. data/lib/rubocop/cop/message_annotator.rb +1 -0
  47. data/lib/rubocop/cop/metrics/line_length.rb +139 -28
  48. data/lib/rubocop/cop/metrics/perceived_complexity.rb +3 -4
  49. data/lib/rubocop/cop/mixin/check_line_breakable.rb +190 -0
  50. data/lib/rubocop/cop/mixin/{array_hash_indentation.rb → multiline_element_indentation.rb} +3 -2
  51. data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -7
  52. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +33 -4
  53. data/lib/rubocop/cop/rails/active_record_override.rb +23 -8
  54. data/lib/rubocop/cop/rails/delegate.rb +5 -8
  55. data/lib/rubocop/cop/rails/environment_comparison.rb +5 -3
  56. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  57. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +3 -3
  58. data/lib/rubocop/cop/rails/reflection_class_name.rb +1 -1
  59. data/lib/rubocop/cop/rails/skips_model_validations.rb +6 -7
  60. data/lib/rubocop/cop/rails/time_zone.rb +3 -10
  61. data/lib/rubocop/cop/rails/validation.rb +3 -0
  62. data/lib/rubocop/cop/registry.rb +3 -3
  63. data/lib/rubocop/cop/style/alias.rb +13 -7
  64. data/lib/rubocop/cop/style/block_delimiters.rb +20 -0
  65. data/lib/rubocop/cop/style/class_and_module_children.rb +19 -21
  66. data/lib/rubocop/cop/style/class_methods.rb +16 -24
  67. data/lib/rubocop/cop/style/conditional_assignment.rb +20 -49
  68. data/lib/rubocop/cop/style/documentation.rb +3 -7
  69. data/lib/rubocop/cop/style/format_string.rb +18 -21
  70. data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
  71. data/lib/rubocop/cop/style/inverse_methods.rb +4 -0
  72. data/lib/rubocop/cop/style/lambda.rb +12 -8
  73. data/lib/rubocop/cop/style/mixin_grouping.rb +8 -10
  74. data/lib/rubocop/cop/style/module_function.rb +2 -3
  75. data/lib/rubocop/cop/style/next.rb +10 -14
  76. data/lib/rubocop/cop/style/one_line_conditional.rb +5 -3
  77. data/lib/rubocop/cop/style/optional_arguments.rb +1 -4
  78. data/lib/rubocop/cop/style/random_with_offset.rb +44 -47
  79. data/lib/rubocop/cop/style/redundant_return.rb +6 -14
  80. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
  81. data/lib/rubocop/cop/style/safe_navigation.rb +3 -0
  82. data/lib/rubocop/cop/style/struct_inheritance.rb +2 -3
  83. data/lib/rubocop/cop/style/symbol_proc.rb +20 -40
  84. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  85. data/lib/rubocop/cop/style/yoda_condition.rb +8 -7
  86. data/lib/rubocop/cop/util.rb +2 -4
  87. data/lib/rubocop/file_finder.rb +5 -10
  88. data/lib/rubocop/formatter/disabled_config_formatter.rb +5 -0
  89. data/lib/rubocop/node_pattern.rb +304 -170
  90. data/lib/rubocop/options.rb +4 -1
  91. data/lib/rubocop/rspec/shared_contexts.rb +3 -0
  92. data/lib/rubocop/version.rb +1 -1
  93. data/lib/rubocop/yaml_duplication_checker.rb +1 -1
  94. metadata +26 -50
  95. data/lib/rubocop/cop/performance/caller.rb +0 -69
  96. data/lib/rubocop/cop/performance/case_when_splat.rb +0 -177
  97. data/lib/rubocop/cop/performance/casecmp.rb +0 -108
  98. data/lib/rubocop/cop/performance/chain_array_allocation.rb +0 -78
  99. data/lib/rubocop/cop/performance/compare_with_block.rb +0 -122
  100. data/lib/rubocop/cop/performance/count.rb +0 -102
  101. data/lib/rubocop/cop/performance/detect.rb +0 -110
  102. data/lib/rubocop/cop/performance/double_start_end_with.rb +0 -94
  103. data/lib/rubocop/cop/performance/end_with.rb +0 -56
  104. data/lib/rubocop/cop/performance/fixed_size.rb +0 -97
  105. data/lib/rubocop/cop/performance/flat_map.rb +0 -78
  106. data/lib/rubocop/cop/performance/inefficient_hash_search.rb +0 -99
  107. data/lib/rubocop/cop/performance/open_struct.rb +0 -46
  108. data/lib/rubocop/cop/performance/range_include.rb +0 -50
  109. data/lib/rubocop/cop/performance/redundant_block_call.rb +0 -93
  110. data/lib/rubocop/cop/performance/redundant_match.rb +0 -56
  111. data/lib/rubocop/cop/performance/redundant_merge.rb +0 -183
  112. data/lib/rubocop/cop/performance/regexp_match.rb +0 -265
  113. data/lib/rubocop/cop/performance/reverse_each.rb +0 -42
  114. data/lib/rubocop/cop/performance/size.rb +0 -77
  115. data/lib/rubocop/cop/performance/start_with.rb +0 -59
  116. data/lib/rubocop/cop/performance/string_replacement.rb +0 -173
  117. data/lib/rubocop/cop/performance/times_map.rb +0 -71
  118. data/lib/rubocop/cop/performance/unfreeze_string.rb +0 -50
  119. data/lib/rubocop/cop/performance/uri_default_parser.rb +0 -47
@@ -2,8 +2,9 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
- # Common code for indenting literal arrays and hashes.
6
- module ArrayHashIndentation
5
+ # Common code for indenting the first elements in multiline
6
+ # array literals, hash literals, and method definitions.
7
+ module MultilineElementIndentation
7
8
  private
8
9
 
9
10
  def each_argument_node(node, type)
@@ -24,15 +24,11 @@ module RuboCop
24
24
 
25
25
  def extract_body(node)
26
26
  case node.type
27
- when :block, :def
28
- _receiver_or_method, _args, body = *node
29
- when :defs
30
- _self, _method, _args, body = *node
27
+ when :block, :def, :defs
28
+ node.body
31
29
  else
32
- body = node
30
+ node
33
31
  end
34
-
35
- body
36
32
  end
37
33
  end
38
34
  end
@@ -24,6 +24,13 @@ module RuboCop
24
24
  # # do something
25
25
  # end
26
26
  #
27
+ # # good
28
+ # begin
29
+ # # do something
30
+ # rescue MyException => _e
31
+ # # do something
32
+ # end
33
+ #
27
34
  # @example PreferredName: exception
28
35
  # # bad
29
36
  # begin
@@ -39,6 +46,13 @@ module RuboCop
39
46
  # # do something
40
47
  # end
41
48
  #
49
+ # # good
50
+ # begin
51
+ # # do something
52
+ # rescue MyException => _exception
53
+ # # do something
54
+ # end
55
+ #
42
56
  class RescuedExceptionsVariableName < Cop
43
57
  MSG = 'Use `%<preferred>s` instead of `%<bad>s`.'.freeze
44
58
 
@@ -50,21 +64,36 @@ module RuboCop
50
64
  return if @exception_name.const_type? ||
51
65
  variable_name == preferred_name
52
66
 
53
- add_offense(node, location: location)
67
+ add_offense(node, location: offense_range(node))
68
+ end
69
+
70
+ def autocorrect(node)
71
+ lambda do |corrector|
72
+ corrector.replace(offense_range(node), preferred_name)
73
+ end
54
74
  end
55
75
 
56
76
  private
57
77
 
78
+ def offense_range(resbody)
79
+ variable = resbody.exception_variable
80
+ variable.loc.expression
81
+ end
82
+
58
83
  def preferred_name
59
- @preferred_name ||= cop_config.fetch('PreferredName', 'e')
84
+ @preferred_name ||= begin
85
+ name = cop_config.fetch('PreferredName', 'e')
86
+ name = "_#{name}" if variable_name.to_s.start_with?('_')
87
+ name
88
+ end
60
89
  end
61
90
 
62
91
  def variable_name
63
- @variable_name ||= location.source
92
+ location.source
64
93
  end
65
94
 
66
95
  def location
67
- @location ||= @exception_name.loc.expression
96
+ @exception_name.loc.expression
68
97
  end
69
98
 
70
99
  def message(_node = nil)
@@ -29,25 +29,26 @@ module RuboCop
29
29
  'Use %<prefer>s callbacks instead of overriding the Active Record ' \
30
30
  'method `%<bad>s`.'.freeze
31
31
  BAD_METHODS = %i[create destroy save update].freeze
32
+ ACTIVE_RECORD_CLASSES = %w[ApplicationRecord ActiveModel::Base
33
+ ActiveRecord::Base].freeze
32
34
 
33
35
  def on_def(node)
34
- method_name = node.method_name
35
36
  return unless BAD_METHODS.include?(node.method_name)
36
37
 
37
- parent_parts = node.parent.node_parts
38
- parent_class = parent_parts.take_while do |part|
39
- !part.nil? && part.const_type?
40
- end.last
41
- return unless %w[ApplicationRecord ActiveModel::Base]
42
- .include?(parent_class.const_name)
38
+ parent_class_name = find_parent_class_name(node)
39
+ return unless active_model?(parent_class_name)
43
40
 
44
41
  return unless node.descendants.any?(&:zsuper_type?)
45
42
 
46
- add_offense(node, message: message(method_name))
43
+ add_offense(node, message: message(node.method_name))
47
44
  end
48
45
 
49
46
  private
50
47
 
48
+ def active_model?(parent_class_name)
49
+ ACTIVE_RECORD_CLASSES.include?(parent_class_name)
50
+ end
51
+
51
52
  def callback_names(method_name)
52
53
  names = %w[before_ around_ after_].map do |prefix|
53
54
  "`#{prefix}#{method_name}`"
@@ -61,6 +62,20 @@ module RuboCop
61
62
  def message(method_name)
62
63
  format(MSG, prefer: callback_names(method_name), bad: method_name)
63
64
  end
65
+
66
+ def find_parent_class_name(node)
67
+ return nil unless node
68
+
69
+ if node.class_type?
70
+ parent_class_name = node.node_parts[1]
71
+
72
+ return nil if parent_class_name.nil?
73
+
74
+ return parent_class_name.source
75
+ end
76
+
77
+ find_parent_class_name(node.parent)
78
+ end
64
79
  end
65
80
  end
66
81
  end
@@ -68,11 +68,10 @@ module RuboCop
68
68
  end
69
69
 
70
70
  def autocorrect(node)
71
- method_name, _args, body = *node
72
- delegation = ["delegate :#{body.method_name}",
73
- "to: :#{body.receiver.method_name}"]
71
+ delegation = ["delegate :#{node.body.method_name}",
72
+ "to: :#{node.body.receiver.method_name}"]
74
73
 
75
- if method_name == prefixed_method_name(body)
74
+ if node.method_name == prefixed_method_name(node.body)
76
75
  delegation << ['prefix: true']
77
76
  end
78
77
 
@@ -84,11 +83,9 @@ module RuboCop
84
83
  private
85
84
 
86
85
  def trivial_delegate?(def_node)
87
- method_name, args, body = *def_node
88
-
89
86
  delegate?(def_node) &&
90
- method_name_matches?(method_name, body) &&
91
- arguments_match?(args, body)
87
+ method_name_matches?(def_node.method_name, def_node.body) &&
88
+ arguments_match?(def_node.arguments, def_node.body)
92
89
  end
93
90
 
94
91
  def arguments_match?(arg_array, body)
@@ -56,10 +56,12 @@ module RuboCop
56
56
  private
57
57
 
58
58
  def replacement(node)
59
- receiver, _, compared = *node
60
- environment, = *compared
61
- "#{receiver.source}.#{environment}?"
59
+ "#{node.receiver.source}.#{content(node.first_argument)}?"
62
60
  end
61
+
62
+ def_node_matcher :content, <<-PATTERN
63
+ ({str sym} $_)
64
+ PATTERN
63
65
  end
64
66
  end
65
67
  end
@@ -39,7 +39,7 @@ module RuboCop
39
39
  private
40
40
 
41
41
  def method_chain(node)
42
- [*node.descendants.select(&:send_type?), node].map(&:method_name)
42
+ node.each_node(:send).map(&:method_name)
43
43
  end
44
44
 
45
45
  def ignored_by_find_each?(relation_method)
@@ -79,10 +79,10 @@ module RuboCop
79
79
  node.each_descendant do |descendant|
80
80
  next unless descendant.pair_type?
81
81
 
82
- key = descendant.children.first.value
82
+ key = descendant.children.first.source
83
83
 
84
- allow_nil = descendant if key == :allow_nil
85
- allow_blank = descendant if key == :allow_blank
84
+ allow_nil = descendant if key == 'allow_nil'
85
+ allow_blank = descendant if key == 'allow_blank'
86
86
 
87
87
  break if allow_nil && allow_blank
88
88
  end
@@ -21,7 +21,7 @@ module RuboCop
21
21
  PATTERN
22
22
 
23
23
  def_node_search :reflection_class_name, <<-PATTERN
24
- (pair (sym :class_name) [!str !sym])
24
+ (pair (sym :class_name) [!dstr !str !sym])
25
25
  PATTERN
26
26
 
27
27
  def on_send(node)
@@ -56,13 +56,7 @@ module RuboCop
56
56
  def on_send(node)
57
57
  return if whitelist.include?(node.method_name.to_s)
58
58
  return unless blacklist.include?(node.method_name.to_s)
59
-
60
- _receiver, method_name, *args = *node
61
-
62
- if METHODS_WITH_ARGUMENTS.include?(method_name.to_s) && args.empty?
63
- return
64
- end
65
-
59
+ return if allowed_method?(node)
66
60
  return if good_touch?(node)
67
61
 
68
62
  add_offense(node, location: :selector)
@@ -75,6 +69,11 @@ module RuboCop
75
69
  format(MSG, method: node.method_name)
76
70
  end
77
71
 
72
+ def allowed_method?(node)
73
+ METHODS_WITH_ARGUMENTS.include?(node.method_name.to_s) &&
74
+ !node.arguments?
75
+ end
76
+
78
77
  def blacklist
79
78
  cop_config['Blacklist'] || []
80
79
  end
@@ -128,17 +128,12 @@ module RuboCop
128
128
  def extract_method_chain(node)
129
129
  chain = []
130
130
  while !node.nil? && node.send_type?
131
- chain << extract_method(node) if method_from_time_class?(node)
131
+ chain << node.method_name if method_from_time_class?(node)
132
132
  node = node.parent
133
133
  end
134
134
  chain
135
135
  end
136
136
 
137
- def extract_method(node)
138
- _receiver, method_name, *_args = *node
139
- method_name
140
- end
141
-
142
137
  # Only add the method to the chain if the method being
143
138
  # called is part of the time class.
144
139
  def method_from_time_class?(node)
@@ -155,9 +150,7 @@ module RuboCop
155
150
  def method_send?(node)
156
151
  return false unless node.parent && node.parent.send_type?
157
152
 
158
- receiver, _method_name, *_args = *node.parent
159
-
160
- receiver == node
153
+ node.parent.receiver == node
161
154
  end
162
155
 
163
156
  def safe_method(method_name, node)
@@ -174,7 +167,7 @@ module RuboCop
174
167
  selector_node = node
175
168
 
176
169
  while node && node.send_type?
177
- break if extract_method(node) == :localtime
170
+ break if node.method_name == :localtime
178
171
 
179
172
  node = node.parent
180
173
  end
@@ -15,6 +15,7 @@ module RuboCop
15
15
  # validates_length_of :foo
16
16
  # validates_numericality_of :foo
17
17
  # validates_presence_of :foo
18
+ # validates_absence_of :foo
18
19
  # validates_size_of :foo
19
20
  # validates_uniqueness_of :foo
20
21
  #
@@ -27,6 +28,7 @@ module RuboCop
27
28
  # validates :foo, length: true
28
29
  # validates :foo, numericality: true
29
30
  # validates :foo, presence: true
31
+ # validates :foo, absence: true
30
32
  # validates :foo, size: true
31
33
  # validates :foo, uniqueness: true
32
34
  #
@@ -43,6 +45,7 @@ module RuboCop
43
45
  length
44
46
  numericality
45
47
  presence
48
+ absence
46
49
  size
47
50
  uniqueness
48
51
  ].freeze
@@ -65,17 +65,17 @@ module RuboCop
65
65
  #
66
66
  # cops = RuboCop::Cop::Cop.all
67
67
  # cops.
68
- # qualified_cop_name('Layout/IndentArray') # => 'Layout/IndentArray'
68
+ # qualified_cop_name('Layout/EndOfLine') # => 'Layout/EndOfLine'
69
69
  #
70
70
  # @example fixes incorrect namespaces
71
71
  #
72
72
  # cops = RuboCop::Cop::Cop.all
73
- # cops.qualified_cop_name('Lint/IndentArray') # => 'Layout/IndentArray'
73
+ # cops.qualified_cop_name('Lint/EndOfLine') # => 'Layout/EndOfLine'
74
74
  #
75
75
  # @example namespaces bare cop identifiers
76
76
  #
77
77
  # cops = RuboCop::Cop::Cop.all
78
- # cops.qualified_cop_name('IndentArray') # => 'Layout/IndentArray'
78
+ # cops.qualified_cop_name('EndOfLine') # => 'Layout/EndOfLine'
79
79
  #
80
80
  # @example passes back unrecognized cop names
81
81
  #
@@ -114,27 +114,33 @@ module RuboCop
114
114
  def correct_alias_method_to_alias(send_node)
115
115
  lambda do |corrector|
116
116
  new, old = *send_node.arguments
117
- replacement = "alias #{new.children.first} #{old.children.first}"
117
+ replacement = "alias #{identifier(new)} #{identifier(old)}"
118
118
  corrector.replace(send_node.source_range, replacement)
119
119
  end
120
120
  end
121
121
 
122
122
  def correct_alias_to_alias_method(node)
123
123
  lambda do |corrector|
124
- new, old = *node
125
- replacement = "alias_method :#{new.children.first}, " \
126
- ":#{old.children.first}"
124
+ replacement =
125
+ 'alias_method ' \
126
+ ":#{identifier(node.new_identifier)}, " \
127
+ ":#{identifier(node.old_identifier)}"
127
128
  corrector.replace(node.source_range, replacement)
128
129
  end
129
130
  end
130
131
 
131
132
  def correct_alias_with_symbol_args(node)
132
133
  lambda do |corrector|
133
- new, old = *node
134
- corrector.replace(new.source_range, new.children.first.to_s)
135
- corrector.replace(old.source_range, old.children.first.to_s)
134
+ corrector.replace(node.new_identifier.source_range,
135
+ node.new_identifier.source[1..-1])
136
+ corrector.replace(node.old_identifier.source_range,
137
+ node.old_identifier.source[1..-1])
136
138
  end
137
139
  end
140
+
141
+ def_node_matcher :identifier, <<-PATTERN
142
+ (sym $_)
143
+ PATTERN
138
144
  end
139
145
  end
140
146
  end
@@ -95,10 +95,24 @@ module RuboCop
95
95
  # word.flip.flop
96
96
  # }.join("-")
97
97
  #
98
+ # @example EnforcedStyle: always_braces
99
+ # # bad
100
+ # words.each do |word|
101
+ # word.flip.flop
102
+ # end
103
+ #
104
+ # # good
105
+ # words.each { |word|
106
+ # word.flip.flop
107
+ # }
108
+ #
98
109
  class BlockDelimiters < Cop
99
110
  include ConfigurableEnforcedStyle
100
111
  include IgnoredMethods
101
112
 
113
+ ALWAYS_BRACES_MESSAGE = 'Prefer `{...}` over `do...end` for blocks.'
114
+ .freeze
115
+
102
116
  def on_send(node)
103
117
  return unless node.arguments?
104
118
  return if node.parenthesized? || node.operator_method?
@@ -166,6 +180,7 @@ module RuboCop
166
180
  when :line_count_based then line_count_based_message(node)
167
181
  when :semantic then semantic_message(node)
168
182
  when :braces_for_chaining then braces_for_chaining_message(node)
183
+ when :always_braces then ALWAYS_BRACES_MESSAGE
169
184
  end
170
185
  end
171
186
 
@@ -229,6 +244,7 @@ module RuboCop
229
244
  when :line_count_based then line_count_based_block_style?(node)
230
245
  when :semantic then semantic_block_style?(node)
231
246
  when :braces_for_chaining then braces_for_chaining_style?(node)
247
+ when :always_braces then braces_style?(node)
232
248
  end
233
249
  end
234
250
 
@@ -257,6 +273,10 @@ module RuboCop
257
273
  end
258
274
  end
259
275
 
276
+ def braces_style?(node)
277
+ node.loc.begin.source == '{'
278
+ end
279
+
260
280
  def return_value_chaining?(node)
261
281
  node.parent && node.parent.send_type? && node.parent.dot?
262
282
  end
@@ -31,36 +31,30 @@ module RuboCop
31
31
  'nested style.'.freeze
32
32
 
33
33
  def on_class(node)
34
- _name, superclass, body = *node
35
- return if superclass && style != :nested
34
+ return if node.parent_class && style != :nested
36
35
 
37
- check_style(node, body)
36
+ check_style(node, node.body)
38
37
  end
39
38
 
40
39
  def on_module(node)
41
- _name, body = *node
42
- check_style(node, body)
40
+ check_style(node, node.body)
43
41
  end
44
42
 
45
43
  def autocorrect(node)
46
44
  lambda do |corrector|
47
- if node.class_type?
48
- name, superclass, body = *node
49
- return if superclass && style != :nested
50
- else
51
- name, body = *node
52
- end
53
- nest_or_compact(corrector, node, name, body)
45
+ return if node.class_type? && node.parent_class && style != :nested
46
+
47
+ nest_or_compact(corrector, node)
54
48
  end
55
49
  end
56
50
 
57
51
  private
58
52
 
59
- def nest_or_compact(corrector, node, name, body)
53
+ def nest_or_compact(corrector, node)
60
54
  if style == :nested
61
55
  nest_definition(corrector, node)
62
56
  else
63
- compact_definition(corrector, node, name, body)
57
+ compact_definition(corrector, node)
64
58
  end
65
59
  end
66
60
 
@@ -91,19 +85,23 @@ module RuboCop
91
85
  corrector.replace(node.loc.end, replacement)
92
86
  end
93
87
 
94
- def compact_definition(corrector, node, name, body)
95
- compact_node(corrector, node, name, body)
96
- remove_end(corrector, body)
88
+ def compact_definition(corrector, node)
89
+ compact_node(corrector, node)
90
+ remove_end(corrector, node.body)
97
91
  end
98
92
 
99
- def compact_node(corrector, node, name, body)
100
- const_name = "#{name.const_name}::#{body.children.first.const_name}"
101
- replacement = "#{body.type} #{const_name}"
93
+ def compact_node(corrector, node)
94
+ replacement = "#{node.body.type} #{compact_identifier_name(node)}"
102
95
  range = range_between(node.loc.keyword.begin_pos,
103
- body.loc.name.end_pos)
96
+ node.body.loc.name.end_pos)
104
97
  corrector.replace(range, replacement)
105
98
  end
106
99
 
100
+ def compact_identifier_name(node)
101
+ "#{node.identifier.const_name}::" \
102
+ "#{node.body.children.first.const_name}"
103
+ end
104
+
107
105
  def remove_end(corrector, body)
108
106
  range = range_between(
109
107
  body.loc.end.begin_pos - leading_spaces(body).size,