rubocop 0.89.0 → 0.92.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 (416) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +128 -14
  4. data/lib/rubocop.rb +30 -4
  5. data/lib/rubocop/cached_data.rb +1 -0
  6. data/lib/rubocop/cli/command.rb +1 -0
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +9 -0
  10. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  11. data/lib/rubocop/cli/command/show_cops.rb +2 -1
  12. data/lib/rubocop/cli/command/version.rb +1 -0
  13. data/lib/rubocop/cli/environment.rb +1 -0
  14. data/lib/rubocop/comment_config.rb +17 -10
  15. data/lib/rubocop/config.rb +1 -1
  16. data/lib/rubocop/config_loader.rb +21 -10
  17. data/lib/rubocop/config_loader_resolver.rb +1 -0
  18. data/lib/rubocop/config_obsoletion.rb +1 -0
  19. data/lib/rubocop/config_regeneration.rb +33 -0
  20. data/lib/rubocop/config_store.rb +3 -3
  21. data/lib/rubocop/config_validator.rb +4 -1
  22. data/lib/rubocop/cop/base.rb +23 -0
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  25. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  26. data/lib/rubocop/cop/commissioner.rb +47 -7
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  28. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  29. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  30. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  31. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  32. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +5 -10
  34. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  35. data/lib/rubocop/cop/documentation.rb +22 -0
  36. data/lib/rubocop/cop/generator.rb +2 -1
  37. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
  42. data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
  43. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  44. data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
  45. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  46. data/lib/rubocop/cop/layout/class_structure.rb +14 -17
  47. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  48. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  49. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  50. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  51. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  52. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  53. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
  54. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  55. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  56. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  57. data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
  58. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +18 -14
  59. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  60. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +4 -7
  61. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  62. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  63. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  64. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
  65. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
  68. data/lib/rubocop/cop/layout/extra_spacing.rb +14 -21
  69. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  70. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  71. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
  72. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  73. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  74. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  75. data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
  76. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  77. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  78. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  79. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  80. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  81. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  82. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  83. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  84. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  86. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  87. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  88. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -22
  89. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  90. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  91. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  92. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  93. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  94. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +22 -17
  95. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  96. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  97. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  98. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  99. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  100. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  101. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  102. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  103. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
  104. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  105. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  106. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
  107. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  108. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  109. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  110. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
  111. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  112. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  113. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  114. data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
  115. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
  116. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -1
  117. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  118. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  119. data/lib/rubocop/cop/lint/debugger.rb +2 -3
  120. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
  121. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
  122. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  123. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -15
  124. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  125. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  126. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
  127. data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
  128. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  129. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  130. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
  131. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  132. data/lib/rubocop/cop/lint/missing_super.rb +11 -11
  133. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
  134. data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
  135. data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
  136. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +33 -15
  137. data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
  138. data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
  139. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  140. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +36 -29
  141. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
  142. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  143. data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
  144. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
  145. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
  146. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
  147. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
  148. data/lib/rubocop/cop/lint/to_json.rb +16 -5
  149. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  150. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  151. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -6
  152. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
  153. data/lib/rubocop/cop/lint/uri_regexp.rb +10 -25
  154. data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
  155. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  156. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  157. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +27 -16
  158. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
  159. data/lib/rubocop/cop/migration/department_name.rb +2 -2
  160. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  161. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  162. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  163. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  164. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  165. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  166. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  167. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  168. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  169. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  170. data/lib/rubocop/cop/mixin/enforce_superclass.rb +0 -2
  171. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  172. data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
  173. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  174. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  175. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  176. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  177. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  178. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  179. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  180. data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
  181. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  182. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  183. data/lib/rubocop/cop/mixin/statement_modifier.rb +12 -6
  184. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
  185. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  186. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  187. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  188. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  189. data/lib/rubocop/cop/offense.rb +1 -0
  190. data/lib/rubocop/cop/security/eval.rb +1 -0
  191. data/lib/rubocop/cop/security/json_load.rb +1 -0
  192. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  193. data/lib/rubocop/cop/security/open.rb +1 -0
  194. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  195. data/lib/rubocop/cop/severity.rb +0 -8
  196. data/lib/rubocop/cop/style/access_modifier_declarations.rb +8 -19
  197. data/lib/rubocop/cop/style/accessor_grouping.rb +20 -20
  198. data/lib/rubocop/cop/style/alias.rb +36 -33
  199. data/lib/rubocop/cop/style/and_or.rb +9 -11
  200. data/lib/rubocop/cop/style/array_coercion.rb +4 -0
  201. data/lib/rubocop/cop/style/array_join.rb +7 -8
  202. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  203. data/lib/rubocop/cop/style/attr.rb +12 -9
  204. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +4 -5
  205. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  206. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  207. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -12
  208. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  209. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  210. data/lib/rubocop/cop/style/case_equality.rb +11 -3
  211. data/lib/rubocop/cop/style/case_like_if.rb +37 -18
  212. data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
  213. data/lib/rubocop/cop/style/class_check.rb +6 -11
  214. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  215. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  216. data/lib/rubocop/cop/style/class_vars.rb +7 -12
  217. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  218. data/lib/rubocop/cop/style/colon_method_call.rb +6 -7
  219. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  220. data/lib/rubocop/cop/style/combinable_loops.rb +84 -0
  221. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  222. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  223. data/lib/rubocop/cop/style/commented_keyword.rb +8 -9
  224. data/lib/rubocop/cop/style/conditional_assignment.rb +50 -61
  225. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  226. data/lib/rubocop/cop/style/copyright.rb +12 -12
  227. data/lib/rubocop/cop/style/date_time.rb +13 -2
  228. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  229. data/lib/rubocop/cop/style/dir.rb +8 -10
  230. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  231. data/lib/rubocop/cop/style/documentation.rb +2 -4
  232. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  233. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  234. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  235. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  236. data/lib/rubocop/cop/style/each_with_object.rb +16 -17
  237. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  238. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  239. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  240. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  241. data/lib/rubocop/cop/style/empty_literal.rb +18 -17
  242. data/lib/rubocop/cop/style/empty_method.rb +5 -8
  243. data/lib/rubocop/cop/style/encoding.rb +5 -9
  244. data/lib/rubocop/cop/style/end_block.rb +4 -6
  245. data/lib/rubocop/cop/style/eval_with_location.rb +6 -10
  246. data/lib/rubocop/cop/style/even_odd.rb +8 -11
  247. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -26
  248. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
  249. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  250. data/lib/rubocop/cop/style/float_division.rb +3 -1
  251. data/lib/rubocop/cop/style/for.rb +11 -15
  252. data/lib/rubocop/cop/style/format_string.rb +18 -23
  253. data/lib/rubocop/cop/style/format_string_token.rb +4 -7
  254. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  255. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  256. data/lib/rubocop/cop/style/guard_clause.rb +4 -4
  257. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +24 -5
  258. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  259. data/lib/rubocop/cop/style/hash_syntax.rb +6 -7
  260. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
  261. data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
  262. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  263. data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
  264. data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -17
  265. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  266. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  267. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
  268. data/lib/rubocop/cop/style/infinite_loop.rb +23 -23
  269. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  270. data/lib/rubocop/cop/style/inverse_methods.rb +20 -29
  271. data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
  272. data/lib/rubocop/cop/style/lambda.rb +7 -12
  273. data/lib/rubocop/cop/style/lambda_call.rb +17 -14
  274. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  275. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  276. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +11 -11
  277. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  278. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +7 -6
  279. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  280. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  281. data/lib/rubocop/cop/style/min_max.rb +8 -12
  282. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  283. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
  284. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  285. data/lib/rubocop/cop/style/mixin_usage.rb +9 -28
  286. data/lib/rubocop/cop/style/module_function.rb +10 -13
  287. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  288. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  289. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  290. data/lib/rubocop/cop/style/multiline_memoization.rb +12 -10
  291. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  292. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  293. data/lib/rubocop/cop/style/multiline_when_then.rb +10 -11
  294. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  295. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  296. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  297. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  298. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  299. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  300. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  301. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  302. data/lib/rubocop/cop/style/next.rb +10 -14
  303. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  304. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  305. data/lib/rubocop/cop/style/not.rb +20 -26
  306. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  307. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -14
  308. data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
  309. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  310. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  311. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +12 -1
  312. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  313. data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
  314. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  315. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
  316. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  317. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  318. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  319. data/lib/rubocop/cop/style/proc.rb +6 -6
  320. data/lib/rubocop/cop/style/raise_args.rb +15 -24
  321. data/lib/rubocop/cop/style/random_with_offset.rb +19 -19
  322. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
  323. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  324. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  325. data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
  326. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  327. data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
  328. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  329. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
  330. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  331. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  332. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
  333. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  334. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  335. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
  336. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  337. data/lib/rubocop/cop/style/redundant_self.rb +9 -11
  338. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  339. data/lib/rubocop/cop/style/redundant_sort.rb +12 -31
  340. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  341. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  342. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  343. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  344. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  345. data/lib/rubocop/cop/style/safe_navigation.rb +22 -16
  346. data/lib/rubocop/cop/style/sample.rb +12 -14
  347. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  348. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  349. data/lib/rubocop/cop/style/send.rb +4 -5
  350. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  351. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
  352. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  353. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  354. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  355. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  356. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  357. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  358. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  359. data/lib/rubocop/cop/style/string_concatenation.rb +16 -2
  360. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  361. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  362. data/lib/rubocop/cop/style/strip.rb +9 -14
  363. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
  364. data/lib/rubocop/cop/style/symbol_array.rb +5 -16
  365. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  366. data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
  367. data/lib/rubocop/cop/style/ternary_parentheses.rb +22 -22
  368. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  369. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  370. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  371. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  372. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  373. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +11 -9
  374. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  375. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  376. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  377. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  378. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  379. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  380. data/lib/rubocop/cop/style/when_then.rb +4 -6
  381. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  382. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  383. data/lib/rubocop/cop/style/word_array.rb +5 -23
  384. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  385. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -18
  386. data/lib/rubocop/cop/team.rb +1 -0
  387. data/lib/rubocop/cop/util.rb +2 -1
  388. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  389. data/lib/rubocop/cop/variable_force.rb +2 -0
  390. data/lib/rubocop/cops_documentation_generator.rb +5 -3
  391. data/lib/rubocop/core_ext/string.rb +2 -2
  392. data/lib/rubocop/directive_comment.rb +32 -0
  393. data/lib/rubocop/ext/regexp_node.rb +46 -0
  394. data/lib/rubocop/file_finder.rb +1 -0
  395. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  396. data/lib/rubocop/formatter/disabled_config_formatter.rb +13 -6
  397. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  398. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  399. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  400. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  401. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  402. data/lib/rubocop/name_similarity.rb +1 -0
  403. data/lib/rubocop/options.rb +43 -20
  404. data/lib/rubocop/remote_config.rb +1 -0
  405. data/lib/rubocop/result_cache.rb +31 -13
  406. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  407. data/lib/rubocop/rspec/expect_offense.rb +14 -9
  408. data/lib/rubocop/rspec/shared_contexts.rb +13 -5
  409. data/lib/rubocop/runner.rb +35 -15
  410. data/lib/rubocop/string_interpreter.rb +3 -0
  411. data/lib/rubocop/target_finder.rb +5 -1
  412. data/lib/rubocop/target_ruby.rb +7 -1
  413. data/lib/rubocop/version.rb +7 -1
  414. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  415. metadata +26 -14
  416. data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -61,9 +61,10 @@ module RuboCop
61
61
  # .each do
62
62
  # baz
63
63
  # end
64
- class BlockAlignment < Cop
64
+ class BlockAlignment < Base
65
65
  include ConfigurableEnforcedStyle
66
66
  include RangeHelp
67
+ extend AutoCorrector
67
68
 
68
69
  MSG = '%<current>s is not aligned with %<prefer>s%<alt_prefer>s.'
69
70
 
@@ -84,19 +85,6 @@ module RuboCop
84
85
  'EnforcedStyleAlignWith'
85
86
  end
86
87
 
87
- def autocorrect(node)
88
- ancestor_node = start_for_block_node(node)
89
- start_col = compute_start_col(ancestor_node, node)
90
- loc_end = node.loc.end
91
- delta = start_col - loc_end.column
92
-
93
- if delta.positive?
94
- add_space_before(loc_end, delta)
95
- elsif delta.negative?
96
- remove_space_before(loc_end.begin_pos, -delta)
97
- end
98
- end
99
-
100
88
  private
101
89
 
102
90
  def start_for_block_node(block_node)
@@ -163,7 +151,22 @@ module RuboCop
163
151
  message = format_message(start_loc, end_loc, do_source_line_column,
164
152
  error_source_line_column)
165
153
 
166
- add_offense(block_node, location: end_loc, message: message)
154
+ add_offense(end_loc, message: message) do |corrector|
155
+ autocorrect(corrector, block_node)
156
+ end
157
+ end
158
+
159
+ def autocorrect(corrector, node)
160
+ ancestor_node = start_for_block_node(node)
161
+ start_col = compute_start_col(ancestor_node, node)
162
+ loc_end = node.loc.end
163
+ delta = start_col - loc_end.column
164
+
165
+ if delta.positive?
166
+ add_space_before(corrector, loc_end, delta)
167
+ elsif delta.negative?
168
+ remove_space_before(corrector, loc_end.begin_pos, -delta)
169
+ end
167
170
  end
168
171
 
169
172
  def format_message(start_loc, end_loc, do_source_line_column,
@@ -230,13 +233,14 @@ module RuboCop
230
233
  (ancestor_node || node).source_range.column
231
234
  end
232
235
 
233
- def add_space_before(loc, delta)
234
- ->(corrector) { corrector.insert_before(loc, ' ' * delta) }
236
+ def add_space_before(corrector, loc, delta)
237
+ corrector.insert_before(loc, ' ' * delta)
235
238
  end
236
239
 
237
- def remove_space_before(end_pos, delta)
240
+ def remove_space_before(corrector, end_pos, delta)
238
241
  range = range_between(end_pos - delta, end_pos)
239
- ->(corrector) { corrector.remove(range) }
242
+
243
+ corrector.remove(range)
240
244
  end
241
245
  end
242
246
  end
@@ -105,7 +105,10 @@ module RuboCop
105
105
  end
106
106
 
107
107
  def incorrect_style(when_node)
108
- add_offense(when_node.loc.keyword) do |corrector|
108
+ depth = indent_one_step? ? 'one step more than' : 'as deep as'
109
+ message = format(MSG, depth: depth, base: style)
110
+
111
+ add_offense(when_node.loc.keyword, message: message) do |corrector|
109
112
  detect_incorrect_style(when_node)
110
113
 
111
114
  whitespace = whitespace_range(when_node)
@@ -125,12 +128,6 @@ module RuboCop
125
128
  end
126
129
  end
127
130
 
128
- def find_message(*)
129
- depth = indent_one_step? ? 'one step more than' : 'as deep as'
130
-
131
- format(MSG, depth: depth, base: style)
132
- end
133
-
134
131
  def base_column(case_node, base)
135
132
  case base
136
133
  when :case then case_node.location.keyword.column
@@ -133,8 +133,9 @@ module RuboCop
133
133
  # end
134
134
  #
135
135
  # @see https://rubystyle.guide#consistent-classes
136
- class ClassStructure < Cop
136
+ class ClassStructure < Base
137
137
  include VisibilityHelp
138
+ extend AutoCorrector
138
139
 
139
140
  HUMANIZED_NODE_TYPE = {
140
141
  casgn: :constants,
@@ -155,16 +156,20 @@ module RuboCop
155
156
  if index < previous
156
157
  message = format(MSG, category: category,
157
158
  previous: expected_order[previous])
158
- add_offense(node, message: message)
159
+ add_offense(node, message: message) do |corrector|
160
+ autocorrect(corrector, node)
161
+ end
159
162
  end
160
163
  previous = index
161
164
  end
162
165
  end
163
166
 
167
+ private
168
+
164
169
  # Autocorrect by swapping between two nodes autocorrecting them
165
- def autocorrect(node)
170
+ def autocorrect(corrector, node)
166
171
  node_classification = classify(node)
167
- previous = left_siblings_of(node).find do |sibling|
172
+ previous = node.left_siblings.find do |sibling|
168
173
  classification = classify(sibling)
169
174
  !ignore?(classification) && node_classification != classification
170
175
  end
@@ -172,14 +177,10 @@ module RuboCop
172
177
  current_range = source_range_with_comment(node)
173
178
  previous_range = source_range_with_comment(previous)
174
179
 
175
- lambda do |corrector|
176
- corrector.insert_before(previous_range, current_range.source)
177
- corrector.remove(current_range)
178
- end
180
+ corrector.insert_before(previous_range, current_range.source)
181
+ corrector.remove(current_range)
179
182
  end
180
183
 
181
- private
182
-
183
184
  # Classifies a node to match with something in the {expected_order}
184
185
  # @param node to be analysed
185
186
  # @return String when the node type is a `:block` then
@@ -269,15 +270,11 @@ module RuboCop
269
270
  end
270
271
 
271
272
  def begin_pos_with_comment(node)
272
- annotation_line = node.first_line - 1
273
273
  first_comment = nil
274
+ (node.first_line - 1).downto(1) do |annotation_line|
275
+ break unless (comment = processed_source.comment_at_line(annotation_line))
274
276
 
275
- processed_source.comments_before_line(annotation_line)
276
- .reverse_each do |comment|
277
- if comment.location.line == annotation_line
278
- first_comment = comment
279
- annotation_line -= 1
280
- end
277
+ first_comment = comment
281
278
  end
282
279
 
283
280
  start_line_position(first_comment || node)
@@ -46,8 +46,9 @@ module RuboCop
46
46
  # Hi
47
47
  # EOS
48
48
  #
49
- class ClosingHeredocIndentation < Cop
49
+ class ClosingHeredocIndentation < Base
50
50
  include Heredoc
51
+ extend AutoCorrector
51
52
 
52
53
  SIMPLE_HEREDOC = '<<'
53
54
  MSG = '`%<closing>s` is not aligned with `%<opening>s`.'
@@ -59,11 +60,8 @@ module RuboCop
59
60
  opening_indentation(node) == closing_indentation(node) ||
60
61
  argument_indentation_correct?(node)
61
62
 
62
- add_offense(node, location: :heredoc_end)
63
- end
64
-
65
- def autocorrect(node)
66
- lambda do |corrector|
63
+ message = message(node)
64
+ add_offense(node.loc.heredoc_end, message: message) do |corrector|
67
65
  corrector.replace(node.loc.heredoc_end, indented_end(node))
68
66
  end
69
67
  end
@@ -39,7 +39,7 @@ module RuboCop
39
39
  'instead of %<correct_comment_indentation>d).'
40
40
 
41
41
  def investigate(processed_source)
42
- processed_source.each_comment { |comment| check(comment) }
42
+ processed_source.comments.each { |comment| check(comment) }
43
43
  end
44
44
 
45
45
  def autocorrect(comment)
@@ -22,8 +22,9 @@ module RuboCop
22
22
  # if some_condition
23
23
  # do_something
24
24
  # end
25
- class ConditionPosition < Cop
25
+ class ConditionPosition < Base
26
26
  include RangeHelp
27
+ extend AutoCorrector
27
28
 
28
29
  MSG = 'Place the condition on the same line as `%<keyword>s`.'
29
30
 
@@ -38,27 +39,24 @@ module RuboCop
38
39
  end
39
40
  alias on_until on_while
40
41
 
41
- def autocorrect(node)
42
- lambda do |corrector|
43
- range = range_by_whole_lines(
44
- node.source_range, include_final_newline: true
45
- )
46
-
47
- corrector.insert_after(node.parent.loc.keyword, " #{node.source}")
48
- corrector.remove(range)
49
- end
50
- end
51
-
52
42
  private
53
43
 
54
44
  def check(node)
55
45
  return if node.modifier_form? || node.single_line_condition?
56
46
 
57
- add_offense(node.condition)
47
+ condition = node.condition
48
+ message = message(condition)
49
+
50
+ add_offense(condition, message: message) do |corrector|
51
+ range = range_by_whole_lines(condition.source_range, include_final_newline: true)
52
+
53
+ corrector.insert_after(condition.parent.loc.keyword, " #{condition.source}")
54
+ corrector.remove(range)
55
+ end
58
56
  end
59
57
 
60
- def message(node)
61
- format(MSG, keyword: node.parent.keyword)
58
+ def message(condition)
59
+ format(MSG, keyword: condition.parent.keyword)
62
60
  end
63
61
  end
64
62
  end
@@ -33,9 +33,10 @@ module RuboCop
33
33
  #
34
34
  # private def foo
35
35
  # end
36
- class DefEndAlignment < Cop
36
+ class DefEndAlignment < Base
37
37
  include EndKeywordAlignment
38
38
  include RangeHelp
39
+ extend AutoCorrector
39
40
 
40
41
  MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'
41
42
 
@@ -45,7 +46,7 @@ module RuboCop
45
46
  alias on_defs on_def
46
47
 
47
48
  def on_send(node)
48
- return unless node.def_modifier?
49
+ return if !node.def_modifier? || node.method?(:using)
49
50
 
50
51
  method_def = node.each_descendant(:def, :defs).first
51
52
  expr = node.source_range
@@ -61,11 +62,13 @@ module RuboCop
61
62
  ignore_node(method_def) # Don't check the same `end` again.
62
63
  end
63
64
 
64
- def autocorrect(node)
65
+ private
66
+
67
+ def autocorrect(corrector, node)
65
68
  if style == :start_of_line && node.parent && node.parent.send_type?
66
- AlignmentCorrector.align_end(processed_source, node, node.parent)
69
+ AlignmentCorrector.align_end(corrector, processed_source, node, node.parent)
67
70
  else
68
- AlignmentCorrector.align_end(processed_source, node, node)
71
+ AlignmentCorrector.align_end(corrector, processed_source, node, node)
69
72
  end
70
73
  end
71
74
  end
@@ -22,8 +22,9 @@ module RuboCop
22
22
  # # good
23
23
  # something.
24
24
  # method
25
- class DotPosition < Cop
25
+ class DotPosition < Base
26
26
  include ConfigurableEnforcedStyle
27
+ extend AutoCorrector
27
28
 
28
29
  def on_send(node)
29
30
  return unless node.dot? || ampersand_dot?(node)
@@ -31,29 +32,32 @@ module RuboCop
31
32
  if proper_dot_position?(node)
32
33
  correct_style_detected
33
34
  else
34
- add_offense(node, location: :dot) { opposite_style_detected }
35
- end
36
- end
37
- alias on_csend on_send
35
+ return unless opposite_style_detected
38
36
 
39
- def autocorrect(node)
40
- lambda do |corrector|
41
- dot = node.loc.dot.source
42
- corrector.remove(node.loc.dot)
43
- case style
44
- when :leading
45
- corrector.insert_before(selector_range(node), dot)
46
- when :trailing
47
- corrector.insert_after(node.receiver, dot)
37
+ dot = node.loc.dot
38
+ message = message(dot)
39
+
40
+ add_offense(dot, message: message) do |corrector|
41
+ autocorrect(corrector, dot, node)
48
42
  end
49
43
  end
50
44
  end
45
+ alias on_csend on_send
51
46
 
52
47
  private
53
48
 
54
- def message(node)
55
- dot = node.loc.dot.source
56
- "Place the #{dot} on the " +
49
+ def autocorrect(corrector, dot, node)
50
+ corrector.remove(dot)
51
+ case style
52
+ when :leading
53
+ corrector.insert_before(selector_range(node), dot.source)
54
+ when :trailing
55
+ corrector.insert_after(node.receiver, dot.source)
56
+ end
57
+ end
58
+
59
+ def message(dot)
60
+ "Place the #{dot.source} on the " +
57
61
  case style
58
62
  when :leading
59
63
  'next line, together with the method name.'
@@ -60,47 +60,54 @@ module RuboCop
60
60
  # class Foo
61
61
  # end
62
62
  #
63
- class EmptyComment < Cop
63
+ class EmptyComment < Base
64
64
  include RangeHelp
65
+ extend AutoCorrector
65
66
 
66
67
  MSG = 'Source code comment is empty.'
67
68
 
68
- def investigate(processed_source)
69
+ def on_new_investigation
69
70
  if allow_margin_comment?
70
71
  comments = concat_consecutive_comments(processed_source.comments)
71
72
 
72
- comments.each do |comment|
73
- next unless empty_comment_only?(comment[0])
74
-
75
- comment[1].each do |offense_comment|
76
- add_offense(offense_comment)
77
- end
78
- end
73
+ investigate(comments)
79
74
  else
80
75
  processed_source.comments.each do |comment|
81
76
  next unless empty_comment_only?(comment_text(comment))
82
77
 
83
- add_offense(comment)
78
+ add_offense(comment) do |corrector|
79
+ autocorrect(corrector, comment)
80
+ end
84
81
  end
85
82
  end
86
83
  end
87
84
 
88
- def autocorrect(node)
89
- lambda do |corrector|
90
- previous_token = previous_token(node)
91
- range = if previous_token && node.loc.line == previous_token.line
92
- range_with_surrounding_space(range: node.loc.expression,
93
- newlines: false)
94
- else
95
- range_by_whole_lines(node.loc.expression,
96
- include_final_newline: true)
97
- end
98
-
99
- corrector.remove(range)
85
+ private
86
+
87
+ def investigate(comments)
88
+ comments.each do |comment|
89
+ next unless empty_comment_only?(comment[0])
90
+
91
+ comment[1].each do |offense_comment|
92
+ add_offense(offense_comment) do |corrector|
93
+ autocorrect(corrector, offense_comment)
94
+ end
95
+ end
100
96
  end
101
97
  end
102
98
 
103
- private
99
+ def autocorrect(corrector, node)
100
+ previous_token = previous_token(node)
101
+ range = if previous_token && node.loc.line == previous_token.line
102
+ range_with_surrounding_space(range: node.loc.expression,
103
+ newlines: false)
104
+ else
105
+ range_by_whole_lines(node.loc.expression,
106
+ include_final_newline: true)
107
+ end
108
+
109
+ corrector.remove(range)
110
+ end
104
111
 
105
112
  def concat_consecutive_comments(comments)
106
113
  consecutive_comments =
@@ -35,8 +35,9 @@ module RuboCop
35
35
  # return if need_return?
36
36
  # end
37
37
  # end
38
- class EmptyLineAfterGuardClause < Cop
38
+ class EmptyLineAfterGuardClause < Base
39
39
  include RangeHelp
40
+ extend AutoCorrector
40
41
 
41
42
  MSG = 'Add empty line after guard clause.'
42
43
  END_OF_HEREDOC_LINE = 1
@@ -49,27 +50,29 @@ module RuboCop
49
50
 
50
51
  return if next_line_empty?(heredoc_line(node, heredoc_node))
51
52
 
52
- add_offense(heredoc_node, location: :heredoc_end)
53
+ add_offense(heredoc_node.loc.heredoc_end) do |corrector|
54
+ autocorrect(corrector, heredoc_node)
55
+ end
53
56
  else
54
57
  return if next_line_empty?(node.last_line)
55
58
 
56
- add_offense(node, location: offense_location(node))
59
+ add_offense(offense_location(node)) do |corrector|
60
+ autocorrect(corrector, node)
61
+ end
57
62
  end
58
63
  end
59
64
 
60
- def autocorrect(node)
61
- lambda do |corrector|
62
- node_range = if node.respond_to?(:heredoc?) && node.heredoc?
63
- range_by_whole_lines(node.loc.heredoc_body)
64
- else
65
- range_by_whole_lines(node.source_range)
66
- end
65
+ private
67
66
 
68
- corrector.insert_after(node_range, "\n")
69
- end
70
- end
67
+ def autocorrect(corrector, node)
68
+ node_range = if node.respond_to?(:heredoc?) && node.heredoc?
69
+ range_by_whole_lines(node.loc.heredoc_body)
70
+ else
71
+ range_by_whole_lines(node.source_range)
72
+ end
71
73
 
72
- private
74
+ corrector.insert_after(node_range, "\n")
75
+ end
73
76
 
74
77
  def correct_style?(node)
75
78
  !contains_guard_clause?(node) ||
@@ -92,7 +95,7 @@ module RuboCop
92
95
  end
93
96
 
94
97
  def next_sibling_parent_empty_or_else?(node)
95
- next_sibling = node.parent.children[node.sibling_index + 1]
98
+ next_sibling = node.right_sibling
96
99
  return true if next_sibling.nil?
97
100
 
98
101
  parent = next_sibling.parent
@@ -101,7 +104,7 @@ module RuboCop
101
104
  end
102
105
 
103
106
  def next_sibling_empty_or_guard_clause?(node)
104
- next_sibling = node.parent.children[node.sibling_index + 1]
107
+ next_sibling = node.right_sibling
105
108
  return true if next_sibling.nil?
106
109
 
107
110
  next_sibling.if_type? && contains_guard_clause?(next_sibling)
@@ -146,9 +149,9 @@ module RuboCop
146
149
 
147
150
  def offense_location(node)
148
151
  if node.loc.respond_to?(:end) && node.loc.end
149
- :end
152
+ node.loc.end
150
153
  else
151
- :expression
154
+ node
152
155
  end
153
156
  end
154
157
  end