rubocop 0.78.0 → 0.82.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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +158 -48
  5. data/lib/rubocop.rb +19 -4
  6. data/lib/rubocop/ast/builder.rb +45 -42
  7. data/lib/rubocop/ast/node.rb +12 -19
  8. data/lib/rubocop/ast/node/array_node.rb +13 -0
  9. data/lib/rubocop/ast/node/block_node.rb +5 -1
  10. data/lib/rubocop/ast/node/case_match_node.rb +56 -0
  11. data/lib/rubocop/ast/node/def_node.rb +11 -0
  12. data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
  13. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +8 -0
  14. data/lib/rubocop/ast/node/regexp_node.rb +2 -4
  15. data/lib/rubocop/ast/traversal.rb +29 -10
  16. data/lib/rubocop/cli.rb +10 -4
  17. data/lib/rubocop/cli/command/show_cops.rb +11 -4
  18. data/lib/rubocop/comment_config.rb +6 -1
  19. data/lib/rubocop/config.rb +36 -10
  20. data/lib/rubocop/config_loader.rb +42 -33
  21. data/lib/rubocop/config_loader_resolver.rb +1 -1
  22. data/lib/rubocop/config_obsoletion.rb +4 -1
  23. data/lib/rubocop/config_validator.rb +66 -92
  24. data/lib/rubocop/cop/autocorrect_logic.rb +6 -3
  25. data/lib/rubocop/cop/badge.rb +5 -5
  26. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  27. data/lib/rubocop/cop/corrector.rb +48 -24
  28. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  30. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  31. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
  32. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  34. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  35. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  36. data/lib/rubocop/cop/generator.rb +3 -4
  37. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  39. data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
  40. data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
  41. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  42. data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
  43. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
  44. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  45. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +16 -10
  46. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  47. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -4
  48. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
  49. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  50. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  51. data/lib/rubocop/cop/layout/leading_comment_space.rb +34 -3
  52. data/lib/rubocop/cop/layout/line_length.rb +32 -3
  53. data/lib/rubocop/cop/layout/multiline_block_layout.rb +15 -6
  54. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +0 -4
  55. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  56. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  57. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +133 -0
  58. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -1
  59. data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -2
  60. data/lib/rubocop/cop/layout/space_before_first_arg.rb +8 -0
  61. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  62. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  63. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -9
  64. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  65. data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
  66. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  67. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
  68. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  69. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  70. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  71. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  72. data/lib/rubocop/cop/lint/loop.rb +6 -4
  73. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
  74. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  75. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  76. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  77. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
  78. data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
  79. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -1
  80. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +12 -7
  81. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  82. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  83. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  84. data/lib/rubocop/cop/lint/suppressed_exception.rb +12 -22
  85. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  86. data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
  87. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  88. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -0
  89. data/lib/rubocop/cop/migration/department_name.rb +47 -6
  90. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +4 -0
  91. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
  92. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
  93. data/lib/rubocop/cop/mixin/hash_transform_method.rb +171 -0
  94. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -1
  95. data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
  96. data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -3
  97. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -10
  98. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  99. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  100. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  101. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  102. data/lib/rubocop/cop/naming/method_name.rb +30 -0
  103. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  104. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  105. data/lib/rubocop/cop/registry.rb +15 -3
  106. data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
  107. data/lib/rubocop/cop/style/alias.rb +4 -4
  108. data/lib/rubocop/cop/style/and_or.rb +5 -6
  109. data/lib/rubocop/cop/style/array_join.rb +1 -1
  110. data/lib/rubocop/cop/style/block_delimiters.rb +60 -1
  111. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  112. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  113. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  114. data/lib/rubocop/cop/style/conditional_assignment.rb +8 -8
  115. data/lib/rubocop/cop/style/copyright.rb +1 -1
  116. data/lib/rubocop/cop/style/dir.rb +1 -1
  117. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  118. data/lib/rubocop/cop/style/documentation.rb +43 -5
  119. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  120. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  121. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  122. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  123. data/lib/rubocop/cop/style/end_block.rb +6 -0
  124. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  125. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  126. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  127. data/lib/rubocop/cop/style/format_string.rb +2 -2
  128. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -11
  129. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  130. data/lib/rubocop/cop/style/hash_syntax.rb +3 -5
  131. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  132. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  133. data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
  134. data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
  135. data/lib/rubocop/cop/style/lambda.rb +3 -2
  136. data/lib/rubocop/cop/style/lambda_call.rb +2 -2
  137. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -205
  138. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  139. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
  140. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  141. data/lib/rubocop/cop/style/module_function.rb +58 -12
  142. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  143. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  144. data/lib/rubocop/cop/style/multiline_when_then.rb +5 -1
  145. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  146. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -4
  147. data/lib/rubocop/cop/style/next.rb +2 -2
  148. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  149. data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
  150. data/lib/rubocop/cop/style/not.rb +1 -1
  151. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  152. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  153. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -4
  154. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -3
  155. data/lib/rubocop/cop/style/or_assignment.rb +4 -3
  156. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
  157. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  158. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  159. data/lib/rubocop/cop/style/proc.rb +1 -1
  160. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  161. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  162. data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
  163. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  164. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  165. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  166. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  167. data/lib/rubocop/cop/style/redundant_return.rb +5 -7
  168. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  169. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  170. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  171. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  172. data/lib/rubocop/cop/style/safe_navigation.rb +1 -1
  173. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  174. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  175. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  176. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  177. data/lib/rubocop/cop/style/symbol_array.rb +3 -3
  178. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  179. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
  180. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -22
  181. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
  182. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  183. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
  184. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  185. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  186. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  187. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  188. data/lib/rubocop/cop/style/word_array.rb +1 -1
  189. data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
  190. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  191. data/lib/rubocop/cop/variable_force.rb +4 -1
  192. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  193. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  194. data/lib/rubocop/formatter/junit_formatter.rb +74 -0
  195. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  196. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  197. data/lib/rubocop/node_pattern.rb +96 -10
  198. data/lib/rubocop/options.rb +7 -1
  199. data/lib/rubocop/processed_source.rb +1 -4
  200. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  201. data/lib/rubocop/rspec/expect_offense.rb +1 -1
  202. data/lib/rubocop/rspec/shared_contexts.rb +5 -4
  203. data/lib/rubocop/runner.rb +1 -1
  204. data/lib/rubocop/target_ruby.rb +151 -0
  205. data/lib/rubocop/version.rb +1 -1
  206. metadata +39 -12
  207. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  208. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
  209. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
@@ -24,15 +24,18 @@ module RuboCop
24
24
  @options[:disable_uncorrectable] == true
25
25
  end
26
26
 
27
+ def safe_autocorrect?
28
+ cop_config.fetch('Safe', true) &&
29
+ cop_config.fetch('SafeAutoCorrect', true)
30
+ end
31
+
27
32
  def autocorrect_enabled?
28
33
  # allow turning off autocorrect on a cop by cop basis
29
34
  return true unless cop_config
30
35
 
31
36
  return false if cop_config['AutoCorrect'] == false
32
37
 
33
- if @options.fetch(:safe_auto_correct, false)
34
- return cop_config.fetch('SafeAutoCorrect', true)
35
- end
38
+ return safe_autocorrect? if @options.fetch(:safe_auto_correct, false)
36
39
 
37
40
  true
38
41
  end
@@ -4,11 +4,11 @@ module RuboCop
4
4
  module Cop
5
5
  # Identifier of all cops containing a department and cop name.
6
6
  #
7
- # All cops are identified by their badge. For example, the badge
8
- # for `RuboCop::Cop::Layout::Tab` is `Layout/Tab`. Badges can be
9
- # parsed as either `Department/CopName` or just `CopName` to allow
10
- # for badge references in source files that omit the department
11
- # for RuboCop to infer.
7
+ # All cops are identified by their badge. For example, the badge for
8
+ # `RuboCop::Cop::Layout::IndentationStyle` is `Layout/IndentationStyle`.
9
+ # Badges can be parsed as either `Department/CopName` or just `CopName` to
10
+ # allow for badge references in source files that omit the department for
11
+ # RuboCop to infer.
12
12
  class Badge
13
13
  # Error raised when a badge parse fails.
14
14
  class InvalidBadge < Error
@@ -53,7 +53,7 @@ module RuboCop
53
53
  def autocorrect(node)
54
54
  lambda do |corrector|
55
55
  corrector.replace(
56
- node.first_argument.loc.expression, "'https://rubygems.org'"
56
+ node.first_argument, "'https://rubygems.org'"
57
57
  )
58
58
  end
59
59
  end
@@ -72,18 +72,18 @@ module RuboCop
72
72
 
73
73
  # Removes the source range.
74
74
  #
75
- # @param [Parser::Source::Range] range
76
- def remove(range)
77
- validate_range range
75
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
76
+ def remove(node_or_range)
77
+ range = to_range(node_or_range)
78
78
  @source_rewriter.remove(range)
79
79
  end
80
80
 
81
81
  # Inserts new code before the given source range.
82
82
  #
83
- # @param [Parser::Source::Range] range
83
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
84
84
  # @param [String] content
85
- def insert_before(range, content)
86
- validate_range range
85
+ def insert_before(node_or_range, content)
86
+ range = to_range(node_or_range)
87
87
  # TODO: Fix Cops using bad ranges instead
88
88
  if range.end_pos > @source_buffer.source.size
89
89
  range = range.with(end_pos: @source_buffer.source.size)
@@ -94,28 +94,38 @@ module RuboCop
94
94
 
95
95
  # Inserts new code after the given source range.
96
96
  #
97
- # @param [Parser::Source::Range] range
97
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
98
98
  # @param [String] content
99
- def insert_after(range, content)
100
- validate_range range
99
+ def insert_after(node_or_range, content)
100
+ range = to_range(node_or_range)
101
101
  @source_rewriter.insert_after(range, content)
102
102
  end
103
103
 
104
+ # Wraps the given source range with the given before and after texts
105
+ #
106
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
107
+ # @param [String] before
108
+ # @param [String] after
109
+ def wrap(node_or_range, before, after)
110
+ range = to_range(node_or_range)
111
+ @source_rewriter.wrap(range, before, after)
112
+ end
113
+
104
114
  # Replaces the code of the source range `range` with `content`.
105
115
  #
106
- # @param [Parser::Source::Range] range
116
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
107
117
  # @param [String] content
108
- def replace(range, content)
109
- validate_range range
118
+ def replace(node_or_range, content)
119
+ range = to_range(node_or_range)
110
120
  @source_rewriter.replace(range, content)
111
121
  end
112
122
 
113
123
  # Removes `size` characters prior to the source range.
114
124
  #
115
- # @param [Parser::Source::Range] range
125
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
116
126
  # @param [Integer] size
117
- def remove_preceding(range, size)
118
- validate_range range
127
+ def remove_preceding(node_or_range, size)
128
+ range = to_range(node_or_range)
119
129
  to_remove = Parser::Source::Range.new(range.source_buffer,
120
130
  range.begin_pos - size,
121
131
  range.begin_pos)
@@ -126,10 +136,10 @@ module RuboCop
126
136
  # If `size` is greater than the size of `range`, the removed region can
127
137
  # overrun the end of `range`.
128
138
  #
129
- # @param [Parser::Source::Range] range
139
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
130
140
  # @param [Integer] size
131
- def remove_leading(range, size)
132
- validate_range range
141
+ def remove_leading(node_or_range, size)
142
+ range = to_range(node_or_range)
133
143
  to_remove = Parser::Source::Range.new(range.source_buffer,
134
144
  range.begin_pos,
135
145
  range.begin_pos + size)
@@ -140,10 +150,10 @@ module RuboCop
140
150
  # If `size` is greater than the size of `range`, the removed region can
141
151
  # overrun the beginning of `range`.
142
152
  #
143
- # @param [Parser::Source::Range] range
153
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
144
154
  # @param [Integer] size
145
- def remove_trailing(range, size)
146
- validate_range range
155
+ def remove_trailing(node_or_range, size)
156
+ range = to_range(node_or_range)
147
157
  to_remove = Parser::Source::Range.new(range.source_buffer,
148
158
  range.end_pos - size,
149
159
  range.end_pos)
@@ -153,11 +163,25 @@ module RuboCop
153
163
  private
154
164
 
155
165
  # :nodoc:
156
- def validate_range(range)
157
- buffer = range.source_buffer
166
+ def to_range(node_or_range)
167
+ range = case node_or_range
168
+ when ::RuboCop::AST::Node, ::Parser::Source::Comment
169
+ node_or_range.loc.expression
170
+ when ::Parser::Source::Range
171
+ node_or_range
172
+ else
173
+ raise TypeError,
174
+ 'Expected a Parser::Source::Range, Comment or ' \
175
+ "Rubocop::AST::Node, got #{node_or_range.class}"
176
+ end
177
+ validate_buffer(range.source_buffer)
178
+ range
179
+ end
180
+
181
+ def validate_buffer(buffer)
158
182
  return if buffer == @source_buffer
159
183
 
160
- unless buffer.is_a?(Parser::Source::Buffer)
184
+ unless buffer.is_a?(::Parser::Source::Buffer)
161
185
  # actually this should be enforced by parser gem
162
186
  raise 'Corrector expected range source buffer to be a ' \
163
187
  "Parser::Source::Buffer, but got #{buffer.class}"
@@ -51,7 +51,7 @@ module RuboCop
51
51
  unless range.resize(1).source == "\n"
52
52
  corrector.insert_before(range, ' ' * column_delta)
53
53
  end
54
- elsif range.source =~ /\A[ \t]+\z/
54
+ elsif /\A[ \t]+\z/.match?(range.source)
55
55
  remove(range, corrector)
56
56
  end
57
57
  end
@@ -112,7 +112,7 @@ module RuboCop
112
112
  corrector.remove(range)
113
113
  rescue RuntimeError
114
114
  range = range_between(range.begin_pos + 1, range.end_pos + 1)
115
- retry if range.source =~ /^ +$/
115
+ retry if /^ +$/.match?(range.source)
116
116
  ensure
117
117
  $stderr = original_stderr
118
118
  end
@@ -10,8 +10,7 @@ module RuboCop
10
10
 
11
11
  lambda do |corrector|
12
12
  corrector.replace(node.loc.keyword, node.inverse_keyword)
13
- corrector.replace(condition.source_range,
14
- condition.children.first.source)
13
+ corrector.replace(condition, condition.children.first.source)
15
14
  end
16
15
  end
17
16
 
@@ -18,7 +18,7 @@ module RuboCop
18
18
  end
19
19
 
20
20
  def insert_before(node)
21
- ->(corrector) { corrector.insert_before(node.source_range, "\n") }
21
+ ->(corrector) { corrector.insert_before(node, "\n") }
22
22
  end
23
23
  end
24
24
  end
@@ -44,13 +44,13 @@ module RuboCop
44
44
  end
45
45
 
46
46
  def replace_selector(corrector)
47
- corrector.replace(method.source_range, 'lambda')
47
+ corrector.replace(method, 'lambda')
48
48
  end
49
49
 
50
50
  def remove_arguments(corrector)
51
51
  return if arguments.empty_and_without_delimiters?
52
52
 
53
- corrector.remove(arguments.source_range)
53
+ corrector.remove(arguments)
54
54
  end
55
55
 
56
56
  def insert_arguments(corrector)
@@ -62,7 +62,7 @@ module RuboCop
62
62
 
63
63
  def remove_leading_whitespace(corrector)
64
64
  corrector.remove_preceding(
65
- arguments.source_range,
65
+ arguments,
66
66
  arguments.source_range.begin_pos -
67
67
  block_node.send_node.source_range.end_pos
68
68
  )
@@ -38,9 +38,9 @@ module RuboCop
38
38
  return unless eol_comment
39
39
 
40
40
  text = eol_comment.loc.expression.source
41
- corrector.insert_before(node.source_range,
41
+ corrector.insert_before(node,
42
42
  text + "\n" + (' ' * node.loc.keyword.column))
43
- corrector.remove(eol_comment.loc.expression)
43
+ corrector.remove(eol_comment)
44
44
  end
45
45
 
46
46
  private
@@ -26,7 +26,7 @@ module RuboCop
26
26
  def wrap_contents(node, contents, char, delimiters)
27
27
  lambda do |corrector|
28
28
  corrector.replace(
29
- node.source_range,
29
+ node,
30
30
  "%#{char}#{delimiters[0]}#{contents}#{delimiters[1]}"
31
31
  )
32
32
  end
@@ -13,9 +13,9 @@ module RuboCop
13
13
  lambda do |corrector|
14
14
  str = node.str_content
15
15
  if style == :single_quotes
16
- corrector.replace(node.source_range, to_string_literal(str))
16
+ corrector.replace(node, to_string_literal(str))
17
17
  else
18
- corrector.replace(node.source_range, str.inspect)
18
+ corrector.replace(node, str.inspect)
19
19
  end
20
20
  end
21
21
  end
@@ -98,7 +98,7 @@ module RuboCop
98
98
  end
99
99
 
100
100
  def_node_search :dependency_declarations, <<~PATTERN
101
- (send (lvar _) {:add_dependency :add_runtime_dependency :add_development_dependency} ...)
101
+ (send (lvar _) {:add_dependency :add_runtime_dependency :add_development_dependency} (str _) ...)
102
102
  PATTERN
103
103
  end
104
104
  end
@@ -104,10 +104,9 @@ module RuboCop
104
104
  end
105
105
  SPEC
106
106
 
107
- CONFIGURATION_ADDED_MESSAGE = <<~MESSAGE
108
- [modify] A configuration for the cop is added into %<configuration_file_path>s.
109
- If you want to disable the cop by default, set `Enabled` option to false.
110
- MESSAGE
107
+ CONFIGURATION_ADDED_MESSAGE =
108
+ '[modify] A configuration for the cop is added into ' \
109
+ '%<configuration_file_path>s.'
111
110
 
112
111
  def initialize(name, github_user, output: $stdout)
113
112
  @badge = Badge.parse(name)
@@ -10,7 +10,7 @@ module RuboCop
10
10
  TEMPLATE = <<~YAML
11
11
  %<badge>s:
12
12
  Description: 'TODO: Write a description of the cop.'
13
- Enabled: true
13
+ Enabled: pending
14
14
  VersionAdded: '%<version_added>s'
15
15
  YAML
16
16
 
@@ -28,7 +28,7 @@ module RuboCop
28
28
  def autocorrect(node)
29
29
  (*, keyword) = offending_location_argument(node.parent)
30
30
 
31
- ->(corrector) { corrector.replace(node.source_range, ":#{keyword}") }
31
+ ->(corrector) { corrector.replace(node, ":#{keyword}") }
32
32
  end
33
33
 
34
34
  private
@@ -6,33 +6,76 @@ module RuboCop
6
6
  # Here we check if the elements of a multi-line array literal are
7
7
  # aligned.
8
8
  #
9
- # @example
9
+ # @example EnforcedStyle: with_first_element (default)
10
+ # # good
11
+ #
12
+ # array = [1, 2, 3,
13
+ # 4, 5, 6]
14
+ # array = ['run',
15
+ # 'forrest',
16
+ # 'run']
17
+ #
10
18
  # # bad
11
- # a = [1, 2, 3,
19
+ #
20
+ # array = [1, 2, 3,
12
21
  # 4, 5, 6]
13
22
  # array = ['run',
14
23
  # 'forrest',
15
24
  # 'run']
16
25
  #
26
+ # @example EnforcedStyle: with_fixed_indentation
17
27
  # # good
18
- # a = [1, 2, 3,
19
- # 4, 5, 6]
20
- # a = ['run',
21
- # 'forrest',
22
- # 'run']
28
+ #
29
+ # array = [1, 2, 3,
30
+ # 4, 5, 6]
31
+ #
32
+ # # bad
33
+ #
34
+ # array = [1, 2, 3,
35
+ # 4, 5, 6]
23
36
  class ArrayAlignment < Cop
24
37
  include Alignment
25
38
 
26
- MSG = 'Align the elements of an array literal if they span more ' \
27
- 'than one line.'
39
+ ALIGN_ELEMENTS_MSG = 'Align the elements of an array literal ' \
40
+ 'if they span more than one line.'
41
+
42
+ FIXED_INDENT_MSG = 'Use one level of indentation for elements ' \
43
+ 'following the first line of a multi-line array.'
28
44
 
29
45
  def on_array(node)
30
- check_alignment(node.children)
46
+ return if node.children.size < 2
47
+
48
+ check_alignment(node.children, base_column(node, node.children))
31
49
  end
32
50
 
33
51
  def autocorrect(node)
34
52
  AlignmentCorrector.correct(processed_source, node, column_delta)
35
53
  end
54
+
55
+ private
56
+
57
+ def message(_node)
58
+ fixed_indentation? ? FIXED_INDENT_MSG : ALIGN_ELEMENTS_MSG
59
+ end
60
+
61
+ def fixed_indentation?
62
+ cop_config['EnforcedStyle'] == 'with_fixed_indentation'
63
+ end
64
+
65
+ def base_column(node, args)
66
+ if fixed_indentation?
67
+ lineno = target_method_lineno(node)
68
+ line = node.source_range.source_buffer.source_line(lineno)
69
+ indentation_of_line = /\S.*/.match(line).begin(0)
70
+ indentation_of_line + configured_indentation_width
71
+ else
72
+ display_column(args.first.source_range)
73
+ end
74
+ end
75
+
76
+ def target_method_lineno(node)
77
+ node.loc.line
78
+ end
36
79
  end
37
80
  end
38
81
  end
@@ -52,9 +52,11 @@ module RuboCop
52
52
  end
53
53
 
54
54
  def delimiter_range(node)
55
- Parser::Source::Range.new(node.loc.expression.source_buffer,
56
- node.children.last.loc.expression.end_pos,
57
- node.loc.expression.end_pos)
55
+ Parser::Source::Range.new(
56
+ node.loc.expression.source_buffer,
57
+ node.children.compact.last.loc.expression.end_pos,
58
+ node.loc.expression.end_pos
59
+ )
58
60
  end
59
61
  end
60
62
  end
@@ -44,7 +44,7 @@ module RuboCop
44
44
  when :leading
45
45
  corrector.insert_before(selector_range(node), dot)
46
46
  when :trailing
47
- corrector.insert_after(node.receiver.source_range, dot)
47
+ corrector.insert_after(node.receiver, dot)
48
48
  end
49
49
  end
50
50
  end
@@ -59,6 +59,14 @@ module RuboCop
59
59
  check_alignment(node.when_branches.last.loc.keyword, node.loc.else)
60
60
  end
61
61
 
62
+ def on_case_match(node)
63
+ return unless node.else?
64
+
65
+ check_alignment(
66
+ node.in_pattern_branches.last.loc.keyword, node.loc.else
67
+ )
68
+ end
69
+
62
70
  def autocorrect(node)
63
71
  AlignmentCorrector.correct(processed_source, node, column_delta)
64
72
  end