rubocop 0.52.1 → 0.53.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 (292) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +118 -46
  5. data/config/disabled.yml +8 -8
  6. data/config/enabled.yml +84 -28
  7. data/lib/rubocop.rb +28 -8
  8. data/lib/rubocop/ast/builder.rb +35 -37
  9. data/lib/rubocop/ast/node.rb +16 -1
  10. data/lib/rubocop/ast/node/and_node.rb +0 -8
  11. data/lib/rubocop/ast/node/block_node.rb +1 -9
  12. data/lib/rubocop/ast/node/case_node.rb +0 -8
  13. data/lib/rubocop/ast/node/ensure_node.rb +0 -8
  14. data/lib/rubocop/ast/node/for_node.rb +0 -8
  15. data/lib/rubocop/ast/node/or_node.rb +0 -8
  16. data/lib/rubocop/ast/node/pair_node.rb +0 -8
  17. data/lib/rubocop/ast/node/resbody_node.rb +0 -8
  18. data/lib/rubocop/ast/node/send_node.rb +0 -8
  19. data/lib/rubocop/ast/node/symbol_node.rb +0 -8
  20. data/lib/rubocop/ast/node/until_node.rb +0 -8
  21. data/lib/rubocop/ast/node/when_node.rb +0 -8
  22. data/lib/rubocop/ast/node/while_node.rb +0 -8
  23. data/lib/rubocop/cli.rb +17 -7
  24. data/lib/rubocop/comment_config.rb +24 -3
  25. data/lib/rubocop/config.rb +75 -6
  26. data/lib/rubocop/config_loader.rb +18 -28
  27. data/lib/rubocop/config_loader_resolver.rb +61 -9
  28. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -1
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -2
  30. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  31. data/lib/rubocop/cop/commissioner.rb +2 -2
  32. data/lib/rubocop/cop/cop.rb +4 -0
  33. data/lib/rubocop/cop/corrector.rb +11 -1
  34. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
  35. data/lib/rubocop/cop/correctors/line_break_corrector.rb +59 -0
  36. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -1
  37. data/lib/rubocop/cop/correctors/space_corrector.rb +13 -0
  38. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +1 -1
  39. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -1
  40. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  41. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +3 -5
  42. data/lib/rubocop/cop/generator.rb +29 -8
  43. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +2 -0
  44. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -0
  45. data/lib/rubocop/cop/layout/align_hash.rb +106 -37
  46. data/lib/rubocop/cop/{lint → layout}/block_alignment.rb +8 -5
  47. data/lib/rubocop/cop/layout/block_end_newline.rb +7 -17
  48. data/lib/rubocop/cop/layout/case_indentation.rb +1 -0
  49. data/lib/rubocop/cop/layout/class_structure.rb +6 -7
  50. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  51. data/lib/rubocop/cop/{lint → layout}/condition_position.rb +3 -3
  52. data/lib/rubocop/cop/{lint → layout}/def_end_alignment.rb +2 -1
  53. data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
  54. data/lib/rubocop/cop/layout/empty_comment.rb +140 -0
  55. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -0
  56. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -0
  57. data/lib/rubocop/cop/layout/empty_lines.rb +3 -1
  58. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +7 -5
  59. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +20 -10
  60. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +20 -0
  61. data/lib/rubocop/cop/{lint → layout}/end_alignment.rb +37 -6
  62. data/lib/rubocop/cop/layout/end_of_line.rb +1 -0
  63. data/lib/rubocop/cop/layout/extra_spacing.rb +30 -37
  64. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -0
  65. data/lib/rubocop/cop/layout/indent_heredoc.rb +38 -2
  66. data/lib/rubocop/cop/layout/indentation_consistency.rb +105 -1
  67. data/lib/rubocop/cop/layout/indentation_width.rb +4 -3
  68. data/lib/rubocop/cop/layout/initial_indentation.rb +15 -1
  69. data/lib/rubocop/cop/layout/leading_comment_space.rb +4 -2
  70. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -0
  71. data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -0
  72. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +62 -29
  73. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  74. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +74 -33
  75. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +16 -2
  76. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -1
  77. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -0
  78. data/lib/rubocop/cop/layout/space_after_not.rb +2 -0
  79. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -0
  80. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +15 -2
  81. data/lib/rubocop/cop/layout/space_around_operators.rb +15 -13
  82. data/lib/rubocop/cop/layout/space_before_block_braces.rb +13 -1
  83. data/lib/rubocop/cop/layout/space_before_comment.rb +6 -4
  84. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -0
  85. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -0
  86. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +30 -45
  87. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +3 -2
  88. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +48 -18
  89. data/lib/rubocop/cop/layout/space_inside_parens.rb +8 -7
  90. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +57 -11
  91. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -0
  92. data/lib/rubocop/cop/layout/tab.rb +42 -16
  93. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +46 -13
  94. data/lib/rubocop/cop/layout/trailing_whitespace.rb +12 -0
  95. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +5 -3
  96. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  97. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
  98. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -2
  99. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  100. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +5 -4
  101. data/lib/rubocop/cop/lint/duplicate_methods.rb +20 -9
  102. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
  103. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +16 -10
  104. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +5 -4
  105. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  106. data/lib/rubocop/cop/lint/interpolation_check.rb +4 -3
  107. data/lib/rubocop/cop/lint/literal_as_condition.rb +2 -2
  108. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +2 -0
  109. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +7 -5
  110. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  111. data/lib/rubocop/cop/lint/number_conversion.rb +59 -0
  112. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  113. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2 -0
  114. data/lib/rubocop/cop/lint/percent_string_array.rb +0 -2
  115. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  116. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -0
  117. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -0
  118. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -0
  119. data/lib/rubocop/cop/lint/rescue_type.rb +6 -3
  120. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -2
  121. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -21
  122. data/lib/rubocop/cop/lint/script_permission.rb +30 -10
  123. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  124. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -0
  125. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -2
  126. data/lib/rubocop/cop/lint/unified_integer.rb +2 -2
  127. data/lib/rubocop/cop/lint/{unneeded_disable.rb → unneeded_cop_disable_directive.rb} +13 -7
  128. data/lib/rubocop/cop/lint/unneeded_cop_enable_directive.rb +97 -0
  129. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -0
  130. data/lib/rubocop/cop/lint/unreachable_code.rb +3 -3
  131. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +11 -10
  132. data/lib/rubocop/cop/lint/useless_access_modifier.rb +7 -5
  133. data/lib/rubocop/cop/lint/useless_assignment.rb +2 -2
  134. data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
  135. data/lib/rubocop/cop/lint/void.rb +49 -10
  136. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  137. data/lib/rubocop/cop/metrics/line_length.rb +5 -2
  138. data/lib/rubocop/cop/mixin/alignment.rb +4 -0
  139. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -1
  140. data/lib/rubocop/cop/mixin/def_node.rb +4 -0
  141. data/lib/rubocop/cop/mixin/documentation_comment.rb +11 -3
  142. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +12 -2
  143. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +20 -1
  144. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -0
  145. data/lib/rubocop/cop/mixin/hash_alignment.rb +2 -2
  146. data/lib/rubocop/cop/mixin/match_range.rb +2 -0
  147. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +6 -0
  148. data/lib/rubocop/cop/mixin/nil_methods.rb +19 -0
  149. data/lib/rubocop/cop/mixin/percent_literal.rb +57 -9
  150. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -5
  151. data/lib/rubocop/cop/mixin/range_help.rb +102 -0
  152. data/lib/rubocop/cop/mixin/rescue_node.rb +1 -1
  153. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -7
  154. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +11 -9
  155. data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -10
  156. data/lib/rubocop/cop/mixin/surrounding_space.rb +38 -8
  157. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  158. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  159. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +104 -0
  160. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -1
  161. data/lib/rubocop/cop/naming/file_name.rb +5 -10
  162. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +76 -0
  163. data/lib/rubocop/cop/naming/uncommunicative_block_param_name.rb +48 -0
  164. data/lib/rubocop/cop/naming/uncommunicative_method_param_name.rb +57 -0
  165. data/lib/rubocop/cop/offense.rb +3 -2
  166. data/lib/rubocop/cop/performance/case_when_splat.rb +1 -0
  167. data/lib/rubocop/cop/performance/casecmp.rb +17 -8
  168. data/lib/rubocop/cop/performance/compare_with_block.rb +2 -0
  169. data/lib/rubocop/cop/performance/count.rb +1 -0
  170. data/lib/rubocop/cop/performance/fixed_size.rb +41 -0
  171. data/lib/rubocop/cop/performance/flat_map.rb +2 -0
  172. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -0
  173. data/lib/rubocop/cop/performance/redundant_merge.rb +1 -1
  174. data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -0
  175. data/lib/rubocop/cop/performance/regexp_match.rb +4 -0
  176. data/lib/rubocop/cop/performance/reverse_each.rb +2 -0
  177. data/lib/rubocop/cop/performance/string_replacement.rb +2 -0
  178. data/lib/rubocop/cop/rails/active_record_aliases.rb +46 -0
  179. data/lib/rubocop/cop/rails/blank.rb +3 -3
  180. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +6 -0
  181. data/lib/rubocop/cop/rails/delegate.rb +6 -6
  182. data/lib/rubocop/cop/rails/file_path.rb +7 -1
  183. data/lib/rubocop/cop/rails/find_by.rb +2 -0
  184. data/lib/rubocop/cop/rails/http_positional_arguments.rb +17 -5
  185. data/lib/rubocop/cop/rails/inverse_of.rb +21 -2
  186. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +45 -9
  187. data/lib/rubocop/cop/rails/presence.rb +8 -2
  188. data/lib/rubocop/cop/rails/present.rb +5 -5
  189. data/lib/rubocop/cop/rails/read_write_attribute.rb +4 -3
  190. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -0
  191. data/lib/rubocop/cop/rails/relative_date_constant.rb +4 -3
  192. data/lib/rubocop/cop/rails/request_referer.rb +3 -2
  193. data/lib/rubocop/cop/rails/reversible_migration.rb +9 -8
  194. data/lib/rubocop/cop/rails/safe_navigation.rb +3 -2
  195. data/lib/rubocop/cop/rails/save_bang.rb +11 -12
  196. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
  197. data/lib/rubocop/cop/rails/time_zone.rb +38 -16
  198. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +26 -16
  199. data/lib/rubocop/cop/rails/validation.rb +30 -2
  200. data/lib/rubocop/cop/security/open.rb +48 -0
  201. data/lib/rubocop/cop/style/and_or.rb +1 -0
  202. data/lib/rubocop/cop/style/ascii_comments.rb +3 -1
  203. data/lib/rubocop/cop/style/attr.rb +2 -0
  204. data/lib/rubocop/cop/style/block_comments.rb +3 -1
  205. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +2 -5
  206. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -0
  207. data/lib/rubocop/cop/style/class_vars.rb +23 -0
  208. data/lib/rubocop/cop/style/colon_method_call.rb +1 -2
  209. data/lib/rubocop/cop/style/comment_annotation.rb +6 -4
  210. data/lib/rubocop/cop/style/commented_keyword.rb +3 -1
  211. data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
  212. data/lib/rubocop/cop/style/copyright.rb +3 -1
  213. data/lib/rubocop/cop/style/each_with_object.rb +15 -1
  214. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -0
  215. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -0
  216. data/lib/rubocop/cop/style/empty_else.rb +9 -5
  217. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -0
  218. data/lib/rubocop/cop/style/empty_line_after_guard_clause.rb +80 -0
  219. data/lib/rubocop/cop/style/empty_literal.rb +1 -0
  220. data/lib/rubocop/cop/style/encoding.rb +2 -0
  221. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  222. data/lib/rubocop/cop/style/for.rb +33 -0
  223. data/lib/rubocop/cop/style/format_string.rb +1 -1
  224. data/lib/rubocop/cop/style/format_string_token.rb +4 -5
  225. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
  226. data/lib/rubocop/cop/style/hash_syntax.rb +1 -0
  227. data/lib/rubocop/cop/style/if_unless_modifier.rb +1 -1
  228. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  229. data/lib/rubocop/cop/style/lambda.rb +1 -1
  230. data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -0
  231. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -0
  232. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -0
  233. data/lib/rubocop/cop/style/missing_else.rb +72 -7
  234. data/lib/rubocop/cop/style/mixin_usage.rb +3 -5
  235. data/lib/rubocop/cop/style/module_function.rb +10 -0
  236. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -0
  237. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -0
  238. data/lib/rubocop/cop/style/nested_modifier.rb +2 -0
  239. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -0
  240. data/lib/rubocop/cop/style/next.rb +1 -0
  241. data/lib/rubocop/cop/style/not.rb +2 -0
  242. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  243. data/lib/rubocop/cop/style/one_line_conditional.rb +2 -2
  244. data/lib/rubocop/cop/style/redundant_exception.rb +8 -3
  245. data/lib/rubocop/cop/style/redundant_return.rb +37 -3
  246. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  247. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -0
  248. data/lib/rubocop/cop/style/safe_navigation.rb +74 -32
  249. data/lib/rubocop/cop/style/semicolon.rb +3 -1
  250. data/lib/rubocop/cop/style/single_line_methods.rb +14 -23
  251. data/lib/rubocop/cop/style/stderr_puts.rb +2 -0
  252. data/lib/rubocop/cop/style/string_hash_keys.rb +12 -0
  253. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  254. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
  255. data/lib/rubocop/cop/style/symbol_array.rb +29 -0
  256. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  257. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  258. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +7 -54
  259. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  260. data/lib/rubocop/cop/style/{trailing_comma_in_literal.rb → trailing_comma_in_array_literal.rb} +2 -20
  261. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +56 -0
  262. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +17 -20
  263. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -0
  264. data/lib/rubocop/cop/style/unless_else.rb +2 -0
  265. data/lib/rubocop/cop/style/word_array.rb +0 -1
  266. data/lib/rubocop/cop/style/yoda_condition.rb +1 -0
  267. data/lib/rubocop/cop/team.rb +5 -5
  268. data/lib/rubocop/cop/util.rb +23 -188
  269. data/lib/rubocop/cop/variable_force.rb +1 -1
  270. data/lib/rubocop/file_finder.rb +45 -0
  271. data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -14
  272. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  273. data/lib/rubocop/formatter/html_formatter.rb +12 -5
  274. data/lib/rubocop/formatter/json_formatter.rb +1 -1
  275. data/lib/rubocop/node_pattern.rb +8 -5
  276. data/lib/rubocop/options.rb +40 -33
  277. data/lib/rubocop/path_util.rb +5 -8
  278. data/lib/rubocop/processed_source.rb +53 -0
  279. data/lib/rubocop/remote_config.rb +1 -1
  280. data/lib/rubocop/result_cache.rb +1 -1
  281. data/lib/rubocop/rspec/cop_helper.rb +0 -4
  282. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -4
  283. data/lib/rubocop/rspec/shared_contexts.rb +3 -1
  284. data/lib/rubocop/rspec/shared_examples.rb +23 -25
  285. data/lib/rubocop/rspec/support.rb +5 -0
  286. data/lib/rubocop/runner.rb +3 -2
  287. data/lib/rubocop/string_util.rb +10 -9
  288. data/lib/rubocop/target_finder.rb +4 -1
  289. data/lib/rubocop/token.rb +26 -16
  290. data/lib/rubocop/version.rb +6 -4
  291. metadata +31 -17
  292. data/lib/rubocop/cop/performance/hash_each_methods.rb +0 -129
@@ -2,7 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
- module Lint
5
+ module Layout
6
6
  # This cop checks whether the end keywords are aligned properly for do
7
7
  # end blocks.
8
8
  #
@@ -63,8 +63,9 @@ module RuboCop
63
63
  # end
64
64
  class BlockAlignment < Cop
65
65
  include ConfigurableEnforcedStyle
66
+ include RangeHelp
66
67
 
67
- MSG = '%s is not aligned with %s%s.'.freeze
68
+ MSG = '%<current>s is not aligned with %<prefer>s%<alt_prefer>s.'.freeze
68
69
 
69
70
  def_node_matcher :block_end_align_target?, <<-PATTERN
70
71
  {assignment?
@@ -169,9 +170,11 @@ module RuboCop
169
170
  error_source_line_column)
170
171
  format(
171
172
  MSG,
172
- format_source_line_column(loc_to_source_line_column(end_loc)),
173
- format_source_line_column(error_source_line_column),
174
- alt_start_msg(start_loc, do_source_line_column)
173
+ current: format_source_line_column(
174
+ loc_to_source_line_column(end_loc)
175
+ ),
176
+ prefer: format_source_line_column(error_source_line_column),
177
+ alt_prefer: alt_start_msg(start_loc, do_source_line_column)
175
178
  )
176
179
  end
177
180
 
@@ -25,6 +25,8 @@ module RuboCop
25
25
  # foo(i)
26
26
  # }
27
27
  class BlockEndNewline < Cop
28
+ include Alignment
29
+
28
30
  MSG = 'Expression at %<line>d, %<column>d should be on its own line.'
29
31
  .freeze
30
32
 
@@ -41,9 +43,8 @@ module RuboCop
41
43
 
42
44
  def autocorrect(node)
43
45
  lambda do |corrector|
44
- indentation = indentation_of_block_start_line(node)
45
- new_block_end = "\n" + node.loc.end.source + (' ' * indentation)
46
- corrector.replace(delimiter_range(node), new_block_end)
46
+ corrector.replace(delimiter_range(node),
47
+ "\n#{node.loc.end.source}#{offset(node)}")
47
48
  end
48
49
  end
49
50
 
@@ -53,21 +54,10 @@ module RuboCop
53
54
  format(MSG, line: node.loc.end.line, column: node.loc.end.column + 1)
54
55
  end
55
56
 
56
- def indentation_of_block_start_line(node)
57
- match = /\S.*/.match(node.loc.begin.source_line)
58
- match.begin(0)
59
- end
60
-
61
57
  def delimiter_range(node)
62
- Parser::Source::Range.new(
63
- node.loc.end.source_buffer,
64
- index_of_delimiter_with_whitespaces(node),
65
- node.source.length
66
- )
67
- end
68
-
69
- def index_of_delimiter_with_whitespaces(node)
70
- node.source =~ /\s*#{node.closing_delimiter}/
58
+ Parser::Source::Range.new(node.loc.expression.source_buffer,
59
+ node.children.last.loc.expression.end_pos,
60
+ node.loc.expression.end_pos)
71
61
  end
72
62
  end
73
63
  end
@@ -70,6 +70,7 @@ module RuboCop
70
70
  class CaseIndentation < Cop
71
71
  include Alignment
72
72
  include ConfigurableEnforcedStyle
73
+ include RangeHelp
73
74
 
74
75
  MSG = 'Indent `when` %<depth>s `%<base>s`.'.freeze
75
76
 
@@ -112,7 +112,8 @@ module RuboCop
112
112
  }.freeze
113
113
 
114
114
  VISIBILITY_SCOPES = %i[private protected public].freeze
115
- MSG = '`%s` is supposed to appear before `%s`.'.freeze
115
+ MSG = '`%<category>s` is supposed to appear before ' \
116
+ '`%<previous>s`.'.freeze
116
117
 
117
118
  def_node_matcher :visibility_block?, <<-PATTERN
118
119
  (send nil? { :private :protected :public })
@@ -125,7 +126,8 @@ module RuboCop
125
126
  walk_over_nested_class_definition(class_node) do |node, category|
126
127
  index = expected_order.index(category)
127
128
  if index < previous
128
- message = format(MSG, category, expected_order[previous])
129
+ message = format(MSG, category: category,
130
+ previous: expected_order[previous])
129
131
  add_offense(node, message: message)
130
132
  end
131
133
  previous = index
@@ -267,7 +269,8 @@ module RuboCop
267
269
  annotation_line = node.first_line - 1
268
270
  first_comment = nil
269
271
 
270
- comments_before_line(annotation_line).reverse_each do |comment|
272
+ processed_source.comments_before_line(annotation_line)
273
+ .reverse_each do |comment|
271
274
  if comment.location.line == annotation_line
272
275
  first_comment = comment
273
276
  annotation_line -= 1
@@ -281,10 +284,6 @@ module RuboCop
281
284
  buffer.line_range(node.first_line).begin_pos - 1
282
285
  end
283
286
 
284
- def comments_before_line(line)
285
- processed_source.comments.select { |c| c.location.line <= line }
286
- end
287
-
288
287
  def buffer
289
288
  processed_source.buffer
290
289
  end
@@ -39,7 +39,7 @@ module RuboCop
39
39
  'instead of %<correct_comment_indentation>d).'.freeze
40
40
 
41
41
  def investigate(processed_source)
42
- processed_source.comments.each { |comment| check(comment) }
42
+ processed_source.each_comment { |comment| check(comment) }
43
43
  end
44
44
 
45
45
  def autocorrect(node)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
- module Lint
5
+ module Layout
6
6
  # This cop checks for conditions that are not on the same line as
7
7
  # if/while/until.
8
8
  #
@@ -23,7 +23,7 @@ module RuboCop
23
23
  # do_something
24
24
  # end
25
25
  class ConditionPosition < Cop
26
- MSG = 'Place the condition on the same line as `%s`.'.freeze
26
+ MSG = 'Place the condition on the same line as `%<keyword>s`.'.freeze
27
27
 
28
28
  def on_if(node)
29
29
  return if node.ternary?
@@ -48,7 +48,7 @@ module RuboCop
48
48
  end
49
49
 
50
50
  def message(node)
51
- format(MSG, node.parent.keyword)
51
+ format(MSG, keyword: node.parent.keyword)
52
52
  end
53
53
  end
54
54
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
- module Lint
5
+ module Layout
6
6
  # This cop checks whether the end keywords of method definitions are
7
7
  # aligned properly.
8
8
  #
@@ -35,6 +35,7 @@ module RuboCop
35
35
  # end
36
36
  class DefEndAlignment < Cop
37
37
  include EndKeywordAlignment
38
+ include RangeHelp
38
39
 
39
40
  MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'.freeze
40
41
 
@@ -102,7 +102,7 @@ module RuboCop
102
102
  rhs = first_part_of_call_chain(rhs)
103
103
  return unless rhs
104
104
 
105
- end_config = config.for_cop('Lint/EndAlignment')
105
+ end_config = config.for_cop('Layout/EndAlignment')
106
106
  style = end_config['EnforcedStyleAlignWith'] || 'keyword'
107
107
  base = variable_alignment?(node.loc, rhs, style.to_sym) ? node : rhs
108
108
 
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # This cop checks empty comment.
7
+ #
8
+ # @example
9
+ # # bad
10
+ #
11
+ # #
12
+ # class Foo
13
+ # end
14
+ #
15
+ # # good
16
+ #
17
+ # #
18
+ # # Description of `Foo` class.
19
+ # #
20
+ # class Foo
21
+ # end
22
+ #
23
+ # @example AllowBorderComment: true (default)
24
+ # # good
25
+ #
26
+ # def foo
27
+ # end
28
+ #
29
+ # #################
30
+ #
31
+ # def bar
32
+ # end
33
+ #
34
+ # @example AllowBorderComment: false
35
+ # # bad
36
+ #
37
+ # def foo
38
+ # end
39
+ #
40
+ # #################
41
+ #
42
+ # def bar
43
+ # end
44
+ #
45
+ # @example AllowMarginComment: true (default)
46
+ # # good
47
+ #
48
+ # #
49
+ # # Description of `Foo` class.
50
+ # #
51
+ # class Foo
52
+ # end
53
+ #
54
+ # @example AllowMarginComment: false
55
+ # # bad
56
+ #
57
+ # #
58
+ # # Description of `Foo` class.
59
+ # #
60
+ # class Foo
61
+ # end
62
+ #
63
+ class EmptyComment < Cop
64
+ include RangeHelp
65
+
66
+ MSG = 'Source code comment is empty.'.freeze
67
+
68
+ def investigate(processed_source)
69
+ if allow_margin_comment?
70
+ comments = concat_consecutive_comments(processed_source.comments)
71
+
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
79
+ else
80
+ processed_source.comments.each do |comment|
81
+ next unless empty_comment_only?(comment_text(comment))
82
+
83
+ add_offense(comment)
84
+ end
85
+ end
86
+ end
87
+
88
+ def autocorrect(node)
89
+ lambda do |corrector|
90
+ range = range_by_whole_lines(node.loc.expression,
91
+ include_final_newline: true)
92
+
93
+ corrector.remove(range)
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ def concat_consecutive_comments(comments)
100
+ prev_line = nil
101
+
102
+ comments.each_with_object([]) do |comment, concatenated_comments|
103
+ if prev_line && comment.loc.line == prev_line.next
104
+ last_concatenated_comment = concatenated_comments.last
105
+
106
+ last_concatenated_comment[0] << comment_text(comment)
107
+ last_concatenated_comment[1] << comment
108
+ else
109
+ concatenated_comments << [comment_text(comment).dup, [comment]]
110
+ end
111
+
112
+ prev_line = comment.loc.line
113
+ end
114
+ end
115
+
116
+ def empty_comment_only?(comment_text)
117
+ empty_comment_pattern = if allow_border_comment?
118
+ /\A(#\n)+\z/
119
+ else
120
+ /\A(#+\n)+\z/
121
+ end
122
+
123
+ !(comment_text =~ empty_comment_pattern).nil?
124
+ end
125
+
126
+ def comment_text(comment)
127
+ "#{comment.text.strip}\n"
128
+ end
129
+
130
+ def allow_border_comment?
131
+ cop_config['AllowBorderComment']
132
+ end
133
+
134
+ def allow_margin_comment?
135
+ cop_config['AllowMarginComment']
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -21,6 +21,8 @@ module RuboCop
21
21
  # # Some code
22
22
  # end
23
23
  class EmptyLineAfterMagicComment < Cop
24
+ include RangeHelp
25
+
24
26
  MSG = 'Add an empty line after magic comments.'.freeze
25
27
  BLANK_LINE = /\A\s*\z/
26
28
 
@@ -30,6 +30,8 @@ module RuboCop
30
30
  # def b
31
31
  # end
32
32
  class EmptyLineBetweenDefs < Cop
33
+ include RangeHelp
34
+
33
35
  MSG = 'Use empty lines between method definitions.'.freeze
34
36
 
35
37
  def self.autocorrect_incompatible_with
@@ -21,6 +21,8 @@ module RuboCop
21
21
  # some_method
22
22
  #
23
23
  class EmptyLines < Cop
24
+ include RangeHelp
25
+
24
26
  MSG = 'Extra blank line detected.'.freeze
25
27
  LINE_OFFSET = 2
26
28
 
@@ -28,7 +30,7 @@ module RuboCop
28
30
  return if processed_source.tokens.empty?
29
31
 
30
32
  lines = Set.new
31
- processed_source.tokens.each do |token|
33
+ processed_source.each_token do |token|
32
34
  lines << token.line
33
35
  end
34
36
 
@@ -23,9 +23,11 @@ module RuboCop
23
23
  # def baz; end
24
24
  # end
25
25
  class EmptyLinesAroundAccessModifier < Cop
26
- MSG_AFTER = 'Keep a blank line after `%s`.'.freeze
27
- MSG_BEFORE_AND_AFTER = 'Keep a blank line before and after `%<node>s`.'
28
- .freeze
26
+ include RangeHelp
27
+
28
+ MSG_AFTER = 'Keep a blank line after `%<modifier>s`.'.freeze
29
+ MSG_BEFORE_AND_AFTER = 'Keep a blank line before and after ' \
30
+ '`%<modifier>s`.'.freeze
29
31
 
30
32
  def on_send(node)
31
33
  return unless node.access_modifier?
@@ -96,9 +98,9 @@ module RuboCop
96
98
 
97
99
  if block_start?(previous_line) ||
98
100
  class_def?(previous_line)
99
- format(MSG_AFTER, node.loc.selector.source)
101
+ format(MSG_AFTER, modifier: node.loc.selector.source)
100
102
  else
101
- format(MSG_BEFORE_AND_AFTER, node: node.loc.selector.source)
103
+ format(MSG_BEFORE_AND_AFTER, modifier: node.loc.selector.source)
102
104
  end
103
105
  end
104
106
  end
@@ -39,6 +39,8 @@ module RuboCop
39
39
  # )
40
40
  #
41
41
  class EmptyLinesAroundArguments < Cop
42
+ include RangeHelp
43
+
42
44
  MSG = 'Empty line detected around arguments.'.freeze
43
45
 
44
46
  def on_send(node)
@@ -55,7 +57,7 @@ module RuboCop
55
57
  private
56
58
 
57
59
  def empty_lines(node)
58
- lines = processed_lines(node).map.with_index(first_line(node)).to_a
60
+ lines = processed_lines(node)
59
61
  lines.select! { |code, _| code.empty? }
60
62
  lines.map { |_, line| line }
61
63
  end
@@ -67,19 +69,27 @@ module RuboCop
67
69
  end
68
70
  end
69
71
 
70
- def first_line(node)
71
- node.receiver ? node.receiver.last_line : node.first_line
72
+ def processed_lines(node)
73
+ line_numbers(node).each_with_object([]) do |num, array|
74
+ array << [processed_source.lines[num - 1], num]
75
+ end
72
76
  end
73
77
 
74
- def last_line(node)
75
- last_arg = node.arguments.last
76
- last_arg.block_type? ? last_arg.first_line : node.last_line
78
+ def line_numbers(node)
79
+ inner_lines = []
80
+ line_nums = node.arguments.each_with_object([]) do |arg_node, lines|
81
+ lines << outer_lines(arg_node)
82
+ inner_lines << inner_lines(arg_node) if arg_node.multiline?
83
+ end
84
+ line_nums.flatten.uniq - inner_lines.flatten - outer_lines(node)
77
85
  end
78
86
 
79
- def processed_lines(node)
80
- start = first_line(node) - 1
81
- stop = last_line(node) - 1
82
- processed_source.lines[start..stop]
87
+ def inner_lines(node)
88
+ [node.first_line + 1, node.last_line - 1]
89
+ end
90
+
91
+ def outer_lines(node)
92
+ [node.first_line - 1, node.last_line + 1]
83
93
  end
84
94
  end
85
95
  end