rubocop 0.51.0 → 0.52.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 (360) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/config/default.yml +86 -10
  4. data/config/disabled.yml +9 -4
  5. data/config/enabled.yml +1105 -1006
  6. data/lib/rubocop.rb +30 -3
  7. data/lib/rubocop/ast/builder.rb +2 -0
  8. data/lib/rubocop/ast/node.rb +24 -2
  9. data/lib/rubocop/ast/node/args_node.rb +17 -0
  10. data/lib/rubocop/ast/node/array_node.rb +1 -1
  11. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  12. data/lib/rubocop/ast/node/send_node.rb +20 -0
  13. data/lib/rubocop/ast/node/str_node.rb +14 -0
  14. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  15. data/lib/rubocop/ast/traversal.rb +4 -4
  16. data/lib/rubocop/cli.rb +45 -4
  17. data/lib/rubocop/comment_config.rb +2 -5
  18. data/lib/rubocop/config.rb +42 -8
  19. data/lib/rubocop/config_loader.rb +39 -100
  20. data/lib/rubocop/config_loader_resolver.rb +99 -2
  21. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +7 -7
  23. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -3
  24. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
  25. data/lib/rubocop/cop/cop.rb +16 -46
  26. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  27. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -2
  28. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  29. data/lib/rubocop/cop/generator.rb +23 -4
  30. data/lib/rubocop/cop/internal_affairs.rb +1 -1
  31. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  32. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -2
  33. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  34. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  35. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  36. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +4 -7
  37. data/lib/rubocop/cop/layout/align_hash.rb +16 -16
  38. data/lib/rubocop/cop/layout/align_parameters.rb +6 -12
  39. data/lib/rubocop/cop/layout/block_end_newline.rb +19 -5
  40. data/lib/rubocop/cop/layout/case_indentation.rb +14 -17
  41. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  42. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -0
  43. data/lib/rubocop/cop/layout/comment_indentation.rb +39 -2
  44. data/lib/rubocop/cop/layout/dot_position.rb +22 -13
  45. data/lib/rubocop/cop/layout/else_alignment.rb +6 -6
  46. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +17 -17
  47. data/lib/rubocop/cop/layout/empty_lines.rb +15 -1
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  50. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  51. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  52. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  53. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -3
  54. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -2
  55. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  56. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  57. data/lib/rubocop/cop/layout/extra_spacing.rb +21 -24
  58. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +4 -1
  59. data/lib/rubocop/cop/layout/indent_array.rb +67 -20
  60. data/lib/rubocop/cop/layout/indent_hash.rb +70 -25
  61. data/lib/rubocop/cop/layout/indent_heredoc.rb +51 -11
  62. data/lib/rubocop/cop/layout/indentation_width.rb +24 -17
  63. data/lib/rubocop/cop/layout/initial_indentation.rb +7 -5
  64. data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
  65. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  66. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -9
  67. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  68. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  69. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -10
  70. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
  71. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -3
  72. data/lib/rubocop/cop/layout/space_after_colon.rb +4 -4
  73. data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
  74. data/lib/rubocop/cop/layout/space_after_method_name.rb +4 -4
  75. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  76. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +16 -19
  77. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +27 -16
  78. data/lib/rubocop/cop/layout/space_around_keyword.rb +13 -11
  79. data/lib/rubocop/cop/layout/space_around_operators.rb +26 -13
  80. data/lib/rubocop/cop/layout/space_before_block_braces.rb +10 -10
  81. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  82. data/lib/rubocop/cop/layout/space_before_comment.rb +2 -4
  83. data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -3
  84. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  85. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -12
  86. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  87. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -3
  88. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +87 -16
  89. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +57 -34
  90. data/lib/rubocop/cop/layout/space_inside_parens.rb +31 -3
  91. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  92. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  93. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -13
  94. data/lib/rubocop/cop/layout/tab.rb +2 -2
  95. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +7 -7
  96. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +11 -20
  97. data/lib/rubocop/cop/lint/block_alignment.rb +26 -23
  98. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  99. data/lib/rubocop/cop/lint/def_end_alignment.rb +5 -10
  100. data/lib/rubocop/cop/lint/else_layout.rb +2 -2
  101. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  102. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -4
  103. data/lib/rubocop/cop/lint/inherit_exception.rb +10 -14
  104. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  105. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  106. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  107. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  108. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -14
  109. data/lib/rubocop/cop/lint/percent_symbol_array.rb +11 -11
  110. data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -3
  111. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  112. data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
  113. data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
  114. data/lib/rubocop/cop/lint/script_permission.rb +1 -0
  115. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  116. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  117. data/lib/rubocop/cop/lint/unneeded_disable.rb +29 -11
  118. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +2 -1
  119. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +43 -17
  120. data/lib/rubocop/cop/message_annotator.rb +4 -2
  121. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  122. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  123. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  124. data/lib/rubocop/cop/metrics/line_length.rb +2 -2
  125. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  126. data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
  127. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  128. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  129. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -5
  130. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  131. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +7 -3
  132. data/lib/rubocop/cop/mixin/heredoc.rb +19 -19
  133. data/lib/rubocop/cop/mixin/method_complexity.rb +32 -8
  134. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
  135. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +6 -4
  136. data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
  137. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +16 -12
  138. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  139. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -8
  140. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -10
  141. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  142. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  143. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  144. data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -14
  145. data/lib/rubocop/cop/mixin/unused_argument.rb +3 -40
  146. data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
  147. data/lib/rubocop/cop/naming/ascii_identifiers.rb +33 -0
  148. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +5 -4
  149. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +16 -12
  150. data/lib/rubocop/cop/naming/constant_name.rb +32 -3
  151. data/lib/rubocop/cop/naming/file_name.rb +19 -8
  152. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
  153. data/lib/rubocop/cop/naming/method_name.rb +20 -14
  154. data/lib/rubocop/cop/naming/predicate_name.rb +7 -3
  155. data/lib/rubocop/cop/naming/variable_name.rb +17 -2
  156. data/lib/rubocop/cop/naming/variable_number.rb +10 -27
  157. data/lib/rubocop/cop/offense.rb +6 -1
  158. data/lib/rubocop/cop/performance/case_when_splat.rb +2 -6
  159. data/lib/rubocop/cop/performance/casecmp.rb +5 -4
  160. data/lib/rubocop/cop/performance/compare_with_block.rb +13 -7
  161. data/lib/rubocop/cop/performance/count.rb +5 -4
  162. data/lib/rubocop/cop/performance/detect.rb +7 -4
  163. data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -7
  164. data/lib/rubocop/cop/performance/end_with.rb +2 -2
  165. data/lib/rubocop/cop/performance/flat_map.rb +3 -2
  166. data/lib/rubocop/cop/performance/hash_each_methods.rb +41 -40
  167. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +5 -4
  168. data/lib/rubocop/cop/performance/redundant_block_call.rb +22 -22
  169. data/lib/rubocop/cop/performance/redundant_match.rb +2 -2
  170. data/lib/rubocop/cop/performance/redundant_merge.rb +6 -4
  171. data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -4
  172. data/lib/rubocop/cop/performance/regexp_match.rb +3 -2
  173. data/lib/rubocop/cop/performance/size.rb +2 -2
  174. data/lib/rubocop/cop/performance/start_with.rb +2 -2
  175. data/lib/rubocop/cop/performance/string_replacement.rb +4 -4
  176. data/lib/rubocop/cop/performance/times_map.rb +14 -15
  177. data/lib/rubocop/cop/performance/uri_default_parser.rb +3 -3
  178. data/lib/rubocop/cop/rails/action_filter.rb +22 -0
  179. data/lib/rubocop/cop/rails/active_support_aliases.rb +2 -2
  180. data/lib/rubocop/cop/rails/application_job.rb +4 -2
  181. data/lib/rubocop/cop/rails/application_record.rb +4 -2
  182. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  183. data/lib/rubocop/cop/rails/delegate.rb +20 -25
  184. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +2 -2
  185. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  186. data/lib/rubocop/cop/rails/exit.rb +7 -0
  187. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +7 -0
  188. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
  189. data/lib/rubocop/cop/rails/http_positional_arguments.rb +36 -41
  190. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  191. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  192. data/lib/rubocop/cop/rails/output.rb +9 -0
  193. data/lib/rubocop/cop/rails/output_safety.rb +14 -20
  194. data/lib/rubocop/cop/rails/pluralization_grammar.rb +8 -8
  195. data/lib/rubocop/cop/rails/presence.rb +105 -0
  196. data/lib/rubocop/cop/rails/read_write_attribute.rb +10 -10
  197. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  198. data/lib/rubocop/cop/rails/relative_date_constant.rb +9 -9
  199. data/lib/rubocop/cop/rails/reversible_migration.rb +3 -4
  200. data/lib/rubocop/cop/rails/safe_navigation.rb +5 -6
  201. data/lib/rubocop/cop/rails/save_bang.rb +2 -2
  202. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +1 -1
  203. data/lib/rubocop/cop/rails/validation.rb +7 -7
  204. data/lib/rubocop/cop/security/json_load.rb +4 -2
  205. data/lib/rubocop/cop/security/marshal_load.rb +4 -2
  206. data/lib/rubocop/cop/style/alias.rb +24 -26
  207. data/lib/rubocop/cop/style/and_or.rb +34 -28
  208. data/lib/rubocop/cop/style/array_join.rb +9 -0
  209. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  210. data/lib/rubocop/cop/style/attr.rb +14 -4
  211. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -3
  212. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  213. data/lib/rubocop/cop/style/block_comments.rb +14 -2
  214. data/lib/rubocop/cop/style/block_delimiters.rb +80 -15
  215. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +81 -48
  216. data/lib/rubocop/cop/style/case_equality.rb +12 -0
  217. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  218. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -2
  219. data/lib/rubocop/cop/style/class_check.rb +28 -9
  220. data/lib/rubocop/cop/style/class_methods.rb +8 -8
  221. data/lib/rubocop/cop/style/class_vars.rb +4 -3
  222. data/lib/rubocop/cop/style/collection_methods.rb +4 -2
  223. data/lib/rubocop/cop/style/colon_method_call.rb +16 -0
  224. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  225. data/lib/rubocop/cop/style/command_literal.rb +70 -21
  226. data/lib/rubocop/cop/style/comment_annotation.rb +35 -10
  227. data/lib/rubocop/cop/style/commented_keyword.rb +12 -9
  228. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -12
  229. data/lib/rubocop/cop/style/copyright.rb +19 -20
  230. data/lib/rubocop/cop/style/date_time.rb +2 -2
  231. data/lib/rubocop/cop/style/def_with_parentheses.rb +27 -2
  232. data/lib/rubocop/cop/style/dir.rb +2 -2
  233. data/lib/rubocop/cop/style/documentation.rb +17 -2
  234. data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
  235. data/lib/rubocop/cop/style/each_with_object.rb +5 -5
  236. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  237. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  238. data/lib/rubocop/cop/style/empty_else.rb +52 -22
  239. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  240. data/lib/rubocop/cop/style/empty_literal.rb +17 -5
  241. data/lib/rubocop/cop/style/empty_method.rb +4 -10
  242. data/lib/rubocop/cop/style/encoding.rb +2 -1
  243. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  244. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  245. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  246. data/lib/rubocop/cop/style/flip_flop.rb +11 -0
  247. data/lib/rubocop/cop/style/format_string.rb +29 -2
  248. data/lib/rubocop/cop/style/format_string_token.rb +15 -14
  249. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -3
  250. data/lib/rubocop/cop/style/global_vars.rb +11 -1
  251. data/lib/rubocop/cop/style/hash_syntax.rb +44 -43
  252. data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -8
  253. data/lib/rubocop/cop/style/if_inside_else.rb +10 -10
  254. data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -7
  255. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -2
  256. data/lib/rubocop/cop/style/if_with_semicolon.rb +9 -0
  257. data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
  258. data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
  259. data/lib/rubocop/cop/style/lambda.rb +23 -31
  260. data/lib/rubocop/cop/style/lambda_call.rb +15 -9
  261. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
  262. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -2
  263. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
  264. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -3
  265. data/lib/rubocop/cop/style/method_missing.rb +8 -8
  266. data/lib/rubocop/cop/style/min_max.rb +12 -12
  267. data/lib/rubocop/cop/style/missing_else.rb +5 -4
  268. data/lib/rubocop/cop/style/mixin_grouping.rb +29 -19
  269. data/lib/rubocop/cop/style/mixin_usage.rb +8 -10
  270. data/lib/rubocop/cop/style/module_function.rb +17 -5
  271. data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -4
  272. data/lib/rubocop/cop/style/multiline_if_then.rb +14 -13
  273. data/lib/rubocop/cop/style/multiline_memoization.rb +8 -14
  274. data/lib/rubocop/cop/style/mutable_constant.rb +12 -12
  275. data/lib/rubocop/cop/style/negated_if.rb +22 -30
  276. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  277. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +18 -17
  278. data/lib/rubocop/cop/style/next.rb +39 -11
  279. data/lib/rubocop/cop/style/nil_comparison.rb +6 -6
  280. data/lib/rubocop/cop/style/non_nil_check.rb +25 -22
  281. data/lib/rubocop/cop/style/not.rb +14 -4
  282. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
  283. data/lib/rubocop/cop/style/numeric_literals.rb +7 -7
  284. data/lib/rubocop/cop/style/numeric_predicate.rb +14 -18
  285. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -4
  286. data/lib/rubocop/cop/style/option_hash.rb +11 -14
  287. data/lib/rubocop/cop/style/or_assignment.rb +2 -2
  288. data/lib/rubocop/cop/style/parallel_assignment.rb +13 -13
  289. data/lib/rubocop/cop/style/parentheses_around_condition.rb +19 -3
  290. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +24 -3
  291. data/lib/rubocop/cop/style/percent_q_literals.rb +27 -6
  292. data/lib/rubocop/cop/style/perl_backrefs.rb +7 -0
  293. data/lib/rubocop/cop/style/preferred_hash_methods.rb +6 -10
  294. data/lib/rubocop/cop/style/proc.rb +8 -0
  295. data/lib/rubocop/cop/style/raise_args.rb +8 -14
  296. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  297. data/lib/rubocop/cop/style/redundant_begin.rb +14 -4
  298. data/lib/rubocop/cop/style/redundant_conditional.rb +9 -8
  299. data/lib/rubocop/cop/style/redundant_return.rb +5 -4
  300. data/lib/rubocop/cop/style/redundant_self.rb +25 -26
  301. data/lib/rubocop/cop/style/regexp_literal.rb +74 -21
  302. data/lib/rubocop/cop/style/rescue_modifier.rb +11 -0
  303. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  304. data/lib/rubocop/cop/style/return_nil.rb +4 -8
  305. data/lib/rubocop/cop/style/safe_navigation.rb +20 -2
  306. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  307. data/lib/rubocop/cop/style/semicolon.rb +18 -8
  308. data/lib/rubocop/cop/style/send.rb +9 -0
  309. data/lib/rubocop/cop/style/signal_exception.rb +100 -0
  310. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  311. data/lib/rubocop/cop/style/single_line_methods.rb +20 -8
  312. data/lib/rubocop/cop/style/special_global_vars.rb +16 -11
  313. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +7 -12
  314. data/lib/rubocop/cop/style/stderr_puts.rb +5 -3
  315. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  316. data/lib/rubocop/cop/style/string_literals.rb +22 -0
  317. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -8
  318. data/lib/rubocop/cop/style/string_methods.rb +18 -7
  319. data/lib/rubocop/cop/style/symbol_array.rb +5 -9
  320. data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
  321. data/lib/rubocop/cop/style/ternary_parentheses.rb +31 -40
  322. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  323. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  324. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  325. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  326. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -4
  327. data/lib/rubocop/cop/style/trivial_accessors.rb +32 -10
  328. data/lib/rubocop/cop/style/unless_else.rb +15 -0
  329. data/lib/rubocop/cop/style/unneeded_capital_w.rb +17 -7
  330. data/lib/rubocop/cop/style/unneeded_interpolation.rb +14 -18
  331. data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -12
  332. data/lib/rubocop/cop/style/variable_interpolation.rb +20 -9
  333. data/lib/rubocop/cop/style/when_then.rb +13 -0
  334. data/lib/rubocop/cop/style/while_until_do.rb +26 -4
  335. data/lib/rubocop/cop/style/while_until_modifier.rb +25 -6
  336. data/lib/rubocop/cop/style/word_array.rb +4 -8
  337. data/lib/rubocop/cop/style/yoda_condition.rb +10 -16
  338. data/lib/rubocop/cop/style/zero_length_predicate.rb +23 -15
  339. data/lib/rubocop/cop/util.rb +42 -33
  340. data/lib/rubocop/cop/variable_force.rb +1 -1
  341. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  342. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  343. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  344. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -3
  345. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  346. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  347. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  348. data/lib/rubocop/node_pattern.rb +2 -3
  349. data/lib/rubocop/options.rb +8 -8
  350. data/lib/rubocop/path_util.rb +15 -3
  351. data/lib/rubocop/processed_source.rb +5 -2
  352. data/lib/rubocop/rspec/shared_contexts.rb +4 -0
  353. data/lib/rubocop/runner.rb +1 -1
  354. data/lib/rubocop/token.rb +74 -0
  355. data/lib/rubocop/version.rb +1 -1
  356. metadata +37 -10
  357. data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
  358. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  359. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
  360. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
@@ -14,7 +14,7 @@ module RuboCop
14
14
  # node.send_type?
15
15
  #
16
16
  class NodeTypePredicate < Cop
17
- MSG = 'Use `#%s_type?` to check node type.'.freeze
17
+ MSG = 'Use `#%<type>s_type?` to check node type.'.freeze
18
18
 
19
19
  def_node_matcher :node_type_check, <<-PATTERN
20
20
  (send (send $_ :type) :== (sym $_))
@@ -24,7 +24,7 @@ module RuboCop
24
24
  node_type_check(node) do |_receiver, node_type|
25
25
  return unless Parser::Meta::NODE_TYPES.include?(node_type)
26
26
 
27
- add_offense(node, message: format(MSG, node_type))
27
+ add_offense(node, message: format(MSG, type: node_type))
28
28
  end
29
29
  end
30
30
 
@@ -14,16 +14,23 @@ module RuboCop
14
14
  # # good
15
15
  # add_offense(node, location: :selector)
16
16
  class OffenseLocationKeyword < Cop
17
- MSG = 'Use `:%s` as the location argument to `#add_offense`.'.freeze
17
+ MSG = 'Use `:%<keyword>s` as the location argument to ' \
18
+ '`#add_offense`.'.freeze
18
19
 
19
20
  def on_send(node)
20
21
  node_type_check(node) do |node_arg, kwargs|
21
22
  find_offending_argument(node_arg, kwargs) do |location, keyword|
22
- add_offense(location, message: format(MSG, keyword))
23
+ add_offense(location, message: format(MSG, keyword: keyword))
23
24
  end
24
25
  end
25
26
  end
26
27
 
28
+ def autocorrect(node)
29
+ (*, keyword) = offending_location_argument(node.parent)
30
+
31
+ ->(corrector) { corrector.replace(node.source_range, ":#{keyword}") }
32
+ end
33
+
27
34
  private
28
35
 
29
36
  def_node_matcher :node_type_check, <<-PATTERN
@@ -34,12 +41,6 @@ module RuboCop
34
41
  (pair (sym :location) $(send (send $_node :loc) $_keyword))
35
42
  PATTERN
36
43
 
37
- def autocorrect(node)
38
- (*, keyword) = offending_location_argument(node.parent)
39
-
40
- ->(corrector) { corrector.replace(node.source_range, ":#{keyword}") }
41
- end
42
-
43
44
  def find_offending_argument(searched_node, kwargs)
44
45
  kwargs.pairs.each do |pair|
45
46
  offending_location_argument(pair) do |location, node, keyword|
@@ -49,7 +49,7 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def offending_range(node)
52
- with_space = range_with_surrounding_space(node.loc.expression)
52
+ with_space = range_with_surrounding_space(range: node.loc.expression)
53
53
 
54
54
  range_with_surrounding_comma(with_space, :left)
55
55
  end
@@ -51,7 +51,7 @@ module RuboCop
51
51
  private
52
52
 
53
53
  def offending_range(node)
54
- with_space = range_with_surrounding_space(node.loc.expression)
54
+ with_space = range_with_surrounding_space(range: node.loc.expression)
55
55
 
56
56
  range_with_surrounding_comma(with_space, :left)
57
57
  end
@@ -6,9 +6,7 @@ module RuboCop
6
6
  # Modifiers should be indented as deep as method definitions, or as deep
7
7
  # as the class/module keyword, depending on configuration.
8
8
  #
9
- # @example
10
- # # EnforcedStyle: indent (default)
11
- #
9
+ # @example EnforcedStyle: indent (default)
12
10
  # # bad
13
11
  # class Plumbus
14
12
  # private
@@ -21,8 +19,7 @@ module RuboCop
21
19
  # def smooth; end
22
20
  # end
23
21
  #
24
- # # EnforcedStyle: outdent
25
- #
22
+ # @example EnforcedStyle: outdent
26
23
  # # bad
27
24
  # class Plumbus
28
25
  # private
@@ -38,7 +35,7 @@ module RuboCop
38
35
  include AutocorrectAlignment
39
36
  include ConfigurableEnforcedStyle
40
37
 
41
- MSG = '%s access modifiers like `%s`.'.freeze
38
+ MSG = '%<style>s access modifiers like `%<node>s`.'.freeze
42
39
 
43
40
  def on_class(node)
44
41
  _name, _base_class, body = *node
@@ -91,7 +88,7 @@ module RuboCop
91
88
  end
92
89
 
93
90
  def message(node)
94
- format(MSG, style.capitalize, node.loc.selector.source)
91
+ format(MSG, style: style.capitalize, node: node.loc.selector.source)
95
92
  end
96
93
 
97
94
  def expected_indent_offset
@@ -116,7 +116,7 @@ module RuboCop
116
116
 
117
117
  def on_hash(node)
118
118
  return if ignored_node?(node)
119
- return if node.pairs.empty? || node.single_line?
119
+ return if node.empty? || node.single_line?
120
120
 
121
121
  return unless alignment_for_hash_rockets.checkable_layout?(node) &&
122
122
  alignment_for_colons.checkable_layout?(node)
@@ -124,6 +124,21 @@ module RuboCop
124
124
  check_pairs(node)
125
125
  end
126
126
 
127
+ def autocorrect(node)
128
+ # We can't use the instance variable inside the lambda. That would
129
+ # just give each lambda the same reference and they would all get the
130
+ # last value of each. A local variable fixes the problem.
131
+ key_delta = column_deltas[:key] || 0
132
+
133
+ if !node.value
134
+ correct_no_value(key_delta, node.source_range)
135
+ else
136
+ correct_key_value(key_delta, node.key.source_range,
137
+ node.value.source_range,
138
+ node.loc.operator)
139
+ end
140
+ end
141
+
127
142
  private
128
143
 
129
144
  attr_accessor :column_deltas
@@ -172,21 +187,6 @@ module RuboCop
172
187
  new_alignment('EnforcedColonStyle')
173
188
  end
174
189
 
175
- def autocorrect(node)
176
- # We can't use the instance variable inside the lambda. That would
177
- # just give each lambda the same reference and they would all get the
178
- # last value of each. A local variable fixes the problem.
179
- key_delta = column_deltas[:key] || 0
180
-
181
- if !node.value
182
- correct_no_value(key_delta, node.source_range)
183
- else
184
- correct_key_value(key_delta, node.key.source_range,
185
- node.value.source_range,
186
- node.loc.operator)
187
- end
188
- end
189
-
190
190
  def correct_no_value(key_delta, key)
191
191
  ->(corrector) { adjust(corrector, key_delta, key) }
192
192
  end
@@ -6,10 +6,7 @@ module RuboCop
6
6
  # Here we check if the parameters on a multi-line method call or
7
7
  # definition are aligned.
8
8
  #
9
- # @example
10
- #
11
- # # EnforcedStyle: with_first_parameter
12
- #
9
+ # @example EnforcedStyle: with_first_parameter (default)
13
10
  # # good
14
11
  #
15
12
  # foo :bar,
@@ -20,10 +17,7 @@ module RuboCop
20
17
  # foo :bar,
21
18
  # :baz
22
19
  #
23
- # @example
24
- #
25
- # # EnforcedStyle: with_fixed_indentation
26
- #
20
+ # @example EnforcedStyle: with_fixed_indentation
27
21
  # # good
28
22
  #
29
23
  # foo :bar,
@@ -36,11 +30,11 @@ module RuboCop
36
30
  class AlignParameters < Cop
37
31
  include AutocorrectAlignment
38
32
 
39
- ALIGN_PARAMS_MSG = 'Align the parameters of a method %s if they span ' \
40
- 'more than one line.'.freeze
33
+ ALIGN_PARAMS_MSG = 'Align the parameters of a method %<type>s if ' \
34
+ 'they span more than one line.'.freeze
41
35
 
42
36
  FIXED_INDENT_MSG = 'Use one level of indentation for parameters ' \
43
- 'following the first line of a multi-line method %s.'.freeze
37
+ 'following the first line of a multi-line method %<type>s.'.freeze
44
38
 
45
39
  def on_send(node)
46
40
  return if node.arguments.size < 2 ||
@@ -57,7 +51,7 @@ module RuboCop
57
51
  type = node && node.parent.send_type? ? 'call' : 'definition'
58
52
  msg = fixed_indentation? ? FIXED_INDENT_MSG : ALIGN_PARAMS_MSG
59
53
 
60
- format(msg, type)
54
+ format(msg, type: type)
61
55
  end
62
56
 
63
57
  def fixed_indentation?
@@ -25,7 +25,8 @@ module RuboCop
25
25
  # foo(i)
26
26
  # }
27
27
  class BlockEndNewline < Cop
28
- MSG = 'Expression at %d, %d should be on its own line.'.freeze
28
+ MSG = 'Expression at %<line>d, %<column>d should be on its own line.'
29
+ .freeze
29
30
 
30
31
  def on_block(node)
31
32
  return if node.single_line?
@@ -38,23 +39,36 @@ module RuboCop
38
39
  add_offense(node, location: end_loc)
39
40
  end
40
41
 
41
- private
42
-
43
42
  def autocorrect(node)
44
43
  lambda do |corrector|
45
44
  indentation = indentation_of_block_start_line(node)
46
- corrector.insert_before(node.loc.end, "\n" + (' ' * indentation))
45
+ new_block_end = "\n" + node.loc.end.source + (' ' * indentation)
46
+ corrector.replace(delimiter_range(node), new_block_end)
47
47
  end
48
48
  end
49
49
 
50
+ private
51
+
50
52
  def message(node)
51
- format(MSG, node.loc.end.line, node.loc.end.column + 1)
53
+ format(MSG, line: node.loc.end.line, column: node.loc.end.column + 1)
52
54
  end
53
55
 
54
56
  def indentation_of_block_start_line(node)
55
57
  match = /\S.*/.match(node.loc.begin.source_line)
56
58
  match.begin(0)
57
59
  end
60
+
61
+ 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}/
71
+ end
58
72
  end
59
73
  end
60
74
  end
@@ -30,13 +30,11 @@ module RuboCop
30
30
  # y / 3
31
31
  # end
32
32
  #
33
- # @example
33
+ # @example EnforcedStyle: case (default)
34
34
  # # if EndAlignment is set to other style such as
35
35
  # # start_of_line (as shown below), then *when* alignment
36
36
  # # configuration does have an effect.
37
37
  #
38
- # # EnforcedStyle: case (default)
39
- #
40
38
  # # bad
41
39
  # a = case n
42
40
  # when 0
@@ -53,8 +51,7 @@ module RuboCop
53
51
  # y / 3
54
52
  # end
55
53
  #
56
- # # EnforcedStyle: end
57
- #
54
+ # @example EnforcedStyle: end
58
55
  # # bad
59
56
  # a = case n
60
57
  # when 0
@@ -74,7 +71,7 @@ module RuboCop
74
71
  include AutocorrectAlignment
75
72
  include ConfigurableEnforcedStyle
76
73
 
77
- MSG = 'Indent `when` %s `%s`.'.freeze
74
+ MSG = 'Indent `when` %<depth>s `%<base>s`.'.freeze
78
75
 
79
76
  def on_case(case_node)
80
77
  return if case_node.single_line?
@@ -84,6 +81,16 @@ module RuboCop
84
81
  end
85
82
  end
86
83
 
84
+ def autocorrect(node)
85
+ whitespace = whitespace_range(node)
86
+
87
+ return false unless whitespace.source.strip.empty?
88
+
89
+ lambda do |corrector|
90
+ corrector.replace(whitespace, replacement(node))
91
+ end
92
+ end
93
+
87
94
  private
88
95
 
89
96
  def check_when(when_node)
@@ -121,7 +128,7 @@ module RuboCop
121
128
  def message(base)
122
129
  depth = indent_one_step? ? 'one step more than' : 'as deep as'
123
130
 
124
- format(MSG, depth, base)
131
+ format(MSG, depth: depth, base: base)
125
132
  end
126
133
 
127
134
  def base_column(case_node, base)
@@ -131,16 +138,6 @@ module RuboCop
131
138
  end
132
139
  end
133
140
 
134
- def autocorrect(node)
135
- whitespace = whitespace_range(node)
136
-
137
- return false unless whitespace.source.strip.empty?
138
-
139
- lambda do |corrector|
140
- corrector.replace(whitespace, replacement(node))
141
- end
142
- end
143
-
144
141
  def whitespace_range(node)
145
142
  when_column = node.location.keyword.column
146
143
  begin_pos = node.loc.keyword.begin_pos
@@ -0,0 +1,306 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # Checks if the code style follows the ExpectedOrder configuration:
7
+ #
8
+ # `Categories` allows us to map macro names into a category.
9
+ #
10
+ # Consider an example of code style that covers the following order:
11
+ # - Constants
12
+ # - Associations (has_one, has_many)
13
+ # - Attributes (attr_accessor, attr_writer, attr_reader)
14
+ # - Initializer
15
+ # - Instance methods
16
+ # - Protected methods
17
+ # - Private methods
18
+ #
19
+ # You can configure the following order:
20
+ #
21
+ # ```yaml
22
+ # Layout/ClassStructure:
23
+ # Categories:
24
+ # module_inclusion:
25
+ # - include
26
+ # - prepend
27
+ # - extend
28
+ # ExpectedOrder:
29
+ # - module_inclusion
30
+ # - constants
31
+ # - public_class_methods
32
+ # - initializer
33
+ # - public_methods
34
+ # - protected_methods
35
+ # - private_methods
36
+ #
37
+ # ```
38
+ # Instead of putting all literals in the expected order, is also
39
+ # possible to group categories of macros.
40
+ #
41
+ # ```yaml
42
+ # Layout/ClassStructure:
43
+ # Categories:
44
+ # association:
45
+ # - has_many
46
+ # - has_one
47
+ # attribute:
48
+ # - attr_accessor
49
+ # - attr_reader
50
+ # - attr_writer
51
+ # ```
52
+ #
53
+ # @example
54
+ # # bad
55
+ # # Expect extend be before constant
56
+ # class Person < ApplicationRecord
57
+ # has_many :orders
58
+ # ANSWER = 42
59
+ #
60
+ # extend SomeModule
61
+ # include AnotherModule
62
+ # end
63
+ #
64
+ # # good
65
+ # class Person
66
+ # # extend and include go first
67
+ # extend SomeModule
68
+ # include AnotherModule
69
+ #
70
+ # # inner classes
71
+ # CustomError = Class.new(StandardError)
72
+ #
73
+ # # constants are next
74
+ # SOME_CONSTANT = 20
75
+ #
76
+ # # afterwards we have attribute macros
77
+ # attr_reader :name
78
+ #
79
+ # # followed by other macros (if any)
80
+ # validates :name
81
+ #
82
+ # # public class methods are next in line
83
+ # def self.some_method
84
+ # end
85
+ #
86
+ # # initialization goes between class methods and instance methods
87
+ # def initialize
88
+ # end
89
+ #
90
+ # # followed by other public instance methods
91
+ # def some_method
92
+ # end
93
+ #
94
+ # # protected and private methods are grouped near the end
95
+ # protected
96
+ #
97
+ # def some_protected_method
98
+ # end
99
+ #
100
+ # private
101
+ #
102
+ # def some_private_method
103
+ # end
104
+ # end
105
+ #
106
+ # @see https://github.com/bbatsov/ruby-style-guide#consistent-classes
107
+ class ClassStructure < Cop
108
+ HUMANIZED_NODE_TYPE = {
109
+ casgn: :constants,
110
+ defs: :class_methods,
111
+ def: :public_methods
112
+ }.freeze
113
+
114
+ VISIBILITY_SCOPES = %i[private protected public].freeze
115
+ MSG = '`%s` is supposed to appear before `%s`.'.freeze
116
+
117
+ def_node_matcher :visibility_block?, <<-PATTERN
118
+ (send nil? { :private :protected :public })
119
+ PATTERN
120
+
121
+ # Validates code style on class declaration.
122
+ # Add offense when find a node out of expected order.
123
+ def on_class(class_node)
124
+ previous = -1
125
+ walk_over_nested_class_definition(class_node) do |node, category|
126
+ index = expected_order.index(category)
127
+ if index < previous
128
+ message = format(MSG, category, expected_order[previous])
129
+ add_offense(node, message: message)
130
+ end
131
+ previous = index
132
+ end
133
+ end
134
+
135
+ # Autocorrect by swapping between two nodes autocorrecting them
136
+ def autocorrect(node)
137
+ node_classification = classify(node)
138
+ previous = left_siblings_of(node).find do |sibling|
139
+ classification = classify(sibling)
140
+ !ignore?(classification) && node_classification != classification
141
+ end
142
+
143
+ current_range = source_range_with_comment(node)
144
+ previous_range = source_range_with_comment(previous)
145
+
146
+ lambda do |corrector|
147
+ corrector.insert_before(previous_range, current_range.source)
148
+ corrector.remove(current_range)
149
+ end
150
+ end
151
+
152
+ private
153
+
154
+ # Classifies a node to match with something in the {expected_order}
155
+ # @param node to be analysed
156
+ # @return String when the node type is a `:block` then
157
+ # {classify} recursively with the first children
158
+ # @return String when the node type is a `:send` then {find_category}
159
+ # by method name
160
+ # @return String otherwise trying to {humanize_node} of the current node
161
+ def classify(node)
162
+ return node.to_s unless node.respond_to?(:type)
163
+ case node.type
164
+ when :block
165
+ classify(node.send_node)
166
+ when :send
167
+ find_category(node.method_name)
168
+ else
169
+ humanize_node(node)
170
+ end.to_s
171
+ end
172
+
173
+ # Categorize a method_name according to the {expected_order}
174
+ # @param method_name try to match {categories} values
175
+ # @return [String] with the key category or the `method_name` as string
176
+ def find_category(method_name)
177
+ name = method_name.to_s
178
+ category, = categories.find { |_, names| names.include?(name) }
179
+ category || name
180
+ end
181
+
182
+ def walk_over_nested_class_definition(class_node)
183
+ class_elements(class_node).each do |node|
184
+ classification = classify(node)
185
+ next if ignore?(classification)
186
+ yield node, classification
187
+ end
188
+ end
189
+
190
+ def class_elements(class_node)
191
+ *, class_def = class_node.children
192
+ return [] unless class_def
193
+ if class_def.def_type? || class_def.send_type?
194
+ [class_def]
195
+ else
196
+ class_def.children.compact
197
+ end
198
+ end
199
+
200
+ def ignore?(classification)
201
+ classification.nil? ||
202
+ classification.to_s.end_with?('=') ||
203
+ expected_order.index(classification).nil?
204
+ end
205
+
206
+ def node_visibility(node)
207
+ _, method_name, = *find_visibility_start(node)
208
+ method_name || :public
209
+ end
210
+
211
+ def find_visibility_start(node)
212
+ left_siblings_of(node)
213
+ .reverse
214
+ .find(&method(:visibility_block?))
215
+ end
216
+
217
+ # Navigate to find the last protected method
218
+ def find_visibility_end(node)
219
+ possible_visibilities = VISIBILITY_SCOPES - [node_visibility(node)]
220
+ right = right_siblings_of(node)
221
+ right.find do |child_node|
222
+ possible_visibilities.include?(node_visibility(child_node))
223
+ end || right.last
224
+ end
225
+
226
+ def siblings_of(node)
227
+ node.parent.children
228
+ end
229
+
230
+ def right_siblings_of(node)
231
+ siblings_of(node)[node.sibling_index..-1]
232
+ end
233
+
234
+ def left_siblings_of(node)
235
+ siblings_of(node)[0, node.sibling_index]
236
+ end
237
+
238
+ def humanize_node(node)
239
+ method_name, = *node
240
+ if node.def_type?
241
+ return :initializer if method_name == :initialize
242
+ return "#{node_visibility(node)}_methods"
243
+ end
244
+ HUMANIZED_NODE_TYPE[node.type] || node.type
245
+ end
246
+
247
+ def source_range_with_comment(node)
248
+ begin_pos, end_pos =
249
+ if node.def_type?
250
+ start_node = find_visibility_start(node) || node
251
+ end_node = find_visibility_end(node) || node
252
+ [begin_pos_with_comment(start_node),
253
+ end_position_for(end_node) + 1]
254
+ else
255
+ [begin_pos_with_comment(node), end_position_for(node)]
256
+ end
257
+
258
+ Parser::Source::Range.new(buffer, begin_pos, end_pos)
259
+ end
260
+
261
+ def end_position_for(node)
262
+ end_line = buffer.line_for_position(node.loc.expression.end_pos)
263
+ buffer.line_range(end_line).end_pos
264
+ end
265
+
266
+ def begin_pos_with_comment(node)
267
+ annotation_line = node.loc.line - 1
268
+ first_comment = nil
269
+
270
+ comments_before_line(annotation_line).reverse_each do |comment|
271
+ if comment.location.line == annotation_line
272
+ first_comment = comment
273
+ annotation_line -= 1
274
+ end
275
+ end
276
+
277
+ start_line_position(first_comment || node)
278
+ end
279
+
280
+ def start_line_position(node)
281
+ buffer.line_range(node.loc.line).begin_pos - 1
282
+ end
283
+
284
+ def comments_before_line(line)
285
+ processed_source.comments.select { |c| c.location.line <= line }
286
+ end
287
+
288
+ def buffer
289
+ processed_source.buffer
290
+ end
291
+
292
+ # Load expected order from `ExpectedOrder` config.
293
+ # Define new terms in the expected order by adding new {categories}.
294
+ def expected_order
295
+ cop_config['ExpectedOrder']
296
+ end
297
+
298
+ # Setting categories hash allow you to group methods in group to match
299
+ # in the {expected_order}.
300
+ def categories
301
+ cop_config['Categories']
302
+ end
303
+ end
304
+ end
305
+ end
306
+ end