rubocop 1.34.1 → 1.54.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (474) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +345 -54
  5. data/exe/rubocop +1 -1
  6. data/lib/rubocop/arguments_env.rb +17 -0
  7. data/lib/rubocop/arguments_file.rb +17 -0
  8. data/lib/rubocop/cli/command/{auto_genenerate_config.rb → auto_generate_config.rb} +7 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +14 -9
  10. data/lib/rubocop/cli/command/lsp.rb +19 -0
  11. data/lib/rubocop/cli/command/suggest_extensions.rb +8 -1
  12. data/lib/rubocop/cli.rb +58 -9
  13. data/lib/rubocop/comment_config.rb +60 -1
  14. data/lib/rubocop/config.rb +47 -19
  15. data/lib/rubocop/config_loader.rb +34 -28
  16. data/lib/rubocop/config_loader_resolver.rb +6 -2
  17. data/lib/rubocop/config_obsoletion.rb +2 -2
  18. data/lib/rubocop/config_validator.rb +1 -1
  19. data/lib/rubocop/cop/autocorrect_logic.rb +29 -13
  20. data/lib/rubocop/cop/badge.rb +9 -4
  21. data/lib/rubocop/cop/base.rb +115 -83
  22. data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
  23. data/lib/rubocop/cop/bundler/gem_version.rb +2 -2
  24. data/lib/rubocop/cop/commissioner.rb +19 -6
  25. data/lib/rubocop/cop/cop.rb +53 -33
  26. data/lib/rubocop/cop/corrector.rb +31 -11
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -3
  28. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +3 -3
  29. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +3 -3
  30. data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
  31. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +23 -7
  32. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +2 -7
  33. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +32 -2
  34. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  35. data/lib/rubocop/cop/gemspec/dependency_version.rb +19 -21
  36. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -1
  37. data/lib/rubocop/cop/gemspec/development_dependencies.rb +107 -0
  38. data/lib/rubocop/cop/gemspec/require_mfa.rb +1 -1
  39. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -2
  40. data/lib/rubocop/cop/generator.rb +1 -2
  41. data/lib/rubocop/cop/internal_affairs/cop_description.rb +38 -12
  42. data/lib/rubocop/cop/internal_affairs/create_empty_file.rb +37 -0
  43. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +111 -0
  44. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
  45. data/lib/rubocop/cop/internal_affairs/lambda_or_proc.rb +46 -0
  46. data/lib/rubocop/cop/internal_affairs/location_expression.rb +37 -0
  47. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +6 -6
  48. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  49. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +69 -0
  50. data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
  51. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +11 -3
  52. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  53. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  54. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +66 -0
  55. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  56. data/lib/rubocop/cop/internal_affairs.rb +7 -0
  57. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  58. data/lib/rubocop/cop/layout/block_alignment.rb +16 -12
  59. data/lib/rubocop/cop/layout/block_end_newline.rb +9 -15
  60. data/lib/rubocop/cop/layout/class_structure.rb +44 -27
  61. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +2 -3
  62. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +2 -6
  63. data/lib/rubocop/cop/layout/comment_indentation.rb +3 -1
  64. data/lib/rubocop/cop/layout/empty_comment.rb +3 -3
  65. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +28 -5
  66. data/lib/rubocop/cop/layout/empty_lines.rb +3 -1
  67. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +7 -2
  68. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -0
  69. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -0
  70. data/lib/rubocop/cop/layout/end_alignment.rb +9 -1
  71. data/lib/rubocop/cop/layout/end_of_line.rb +4 -4
  72. data/lib/rubocop/cop/layout/extra_spacing.rb +15 -6
  73. data/lib/rubocop/cop/layout/first_argument_indentation.rb +9 -3
  74. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -2
  75. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +35 -8
  76. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -2
  77. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +36 -1
  78. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +57 -8
  79. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +52 -19
  80. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +10 -4
  81. data/lib/rubocop/cop/layout/heredoc_indentation.rb +8 -11
  82. data/lib/rubocop/cop/layout/indentation_style.rb +8 -3
  83. data/lib/rubocop/cop/layout/indentation_width.rb +8 -4
  84. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
  85. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  86. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +33 -9
  87. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +18 -8
  88. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
  89. data/lib/rubocop/cop/layout/line_length.rb +6 -1
  90. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +31 -1
  91. data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -1
  92. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +29 -1
  93. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +35 -1
  94. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +33 -1
  95. data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -11
  96. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
  97. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
  98. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -3
  99. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -2
  100. data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -0
  101. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  102. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
  103. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +22 -20
  104. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -0
  105. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +27 -9
  106. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +30 -3
  107. data/lib/rubocop/cop/layout/space_inside_parens.rb +2 -2
  108. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +34 -0
  109. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  110. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +10 -6
  111. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +5 -4
  112. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +1 -1
  113. data/lib/rubocop/cop/layout/trailing_whitespace.rb +12 -5
  114. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +16 -4
  115. data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -0
  116. data/lib/rubocop/cop/lint/assignment_in_condition.rb +11 -1
  117. data/lib/rubocop/cop/lint/constant_resolution.rb +5 -1
  118. data/lib/rubocop/cop/lint/debugger.rb +16 -26
  119. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +62 -112
  120. data/lib/rubocop/cop/lint/deprecated_constants.rb +8 -1
  121. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
  122. data/lib/rubocop/cop/lint/duplicate_branch.rb +0 -2
  123. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -1
  124. data/lib/rubocop/cop/lint/duplicate_magic_comment.rb +73 -0
  125. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
  126. data/lib/rubocop/cop/lint/duplicate_methods.rb +48 -18
  127. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +55 -11
  128. data/lib/rubocop/cop/lint/duplicate_require.rb +1 -1
  129. data/lib/rubocop/cop/lint/else_layout.rb +3 -7
  130. data/lib/rubocop/cop/lint/empty_block.rb +3 -7
  131. data/lib/rubocop/cop/lint/empty_class.rb +3 -1
  132. data/lib/rubocop/cop/lint/empty_conditional_body.rb +51 -7
  133. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  134. data/lib/rubocop/cop/lint/erb_new_arguments.rb +12 -13
  135. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +14 -7
  136. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +16 -18
  137. data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
  138. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  139. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
  140. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  141. data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
  142. data/lib/rubocop/cop/lint/interpolation_check.rb +4 -3
  143. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  144. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +48 -2
  145. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18 -3
  146. data/lib/rubocop/cop/lint/missing_super.rb +63 -5
  147. data/lib/rubocop/cop/lint/mixed_case_range.rb +111 -0
  148. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
  149. data/lib/rubocop/cop/lint/nested_method_definition.rb +53 -9
  150. data/lib/rubocop/cop/lint/next_without_accumulator.rb +25 -6
  151. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +15 -10
  152. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +12 -0
  153. data/lib/rubocop/cop/lint/number_conversion.rb +6 -1
  154. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
  155. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -0
  156. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +4 -6
  157. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +17 -2
  158. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +5 -0
  159. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
  160. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  161. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +49 -9
  162. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -6
  163. data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +7 -0
  164. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +120 -0
  165. data/lib/rubocop/cop/lint/redundant_require_statement.rb +53 -10
  166. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +9 -3
  167. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  168. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
  169. data/lib/rubocop/cop/lint/redundant_with_index.rb +14 -11
  170. data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -12
  171. data/lib/rubocop/cop/lint/refinement_import_methods.rb +2 -1
  172. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
  173. data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
  174. data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
  175. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +13 -14
  176. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
  177. data/lib/rubocop/cop/lint/script_permission.rb +1 -1
  178. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +6 -6
  179. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -23
  180. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -2
  181. data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
  182. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  183. data/lib/rubocop/cop/lint/syntax.rb +4 -0
  184. data/lib/rubocop/cop/lint/to_enum_arguments.rb +13 -3
  185. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
  186. data/lib/rubocop/cop/lint/unreachable_loop.rb +12 -6
  187. data/lib/rubocop/cop/lint/unused_method_argument.rb +6 -1
  188. data/lib/rubocop/cop/lint/useless_access_modifier.rb +17 -12
  189. data/lib/rubocop/cop/lint/useless_assignment.rb +59 -1
  190. data/lib/rubocop/cop/lint/useless_method_definition.rb +12 -4
  191. data/lib/rubocop/cop/lint/useless_rescue.rb +89 -0
  192. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +15 -5
  193. data/lib/rubocop/cop/lint/useless_times.rb +1 -1
  194. data/lib/rubocop/cop/lint/void.rb +86 -21
  195. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  196. data/lib/rubocop/cop/metrics/block_length.rb +10 -5
  197. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  198. data/lib/rubocop/cop/metrics/class_length.rb +11 -5
  199. data/lib/rubocop/cop/metrics/collection_literal_length.rb +76 -0
  200. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  201. data/lib/rubocop/cop/metrics/method_length.rb +9 -4
  202. data/lib/rubocop/cop/metrics/module_length.rb +10 -5
  203. data/lib/rubocop/cop/metrics/parameter_lists.rb +27 -0
  204. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  205. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -8
  206. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +39 -8
  207. data/lib/rubocop/cop/migration/department_name.rb +3 -3
  208. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  209. data/lib/rubocop/cop/mixin/allowed_identifiers.rb +2 -2
  210. data/lib/rubocop/cop/mixin/allowed_methods.rb +13 -6
  211. data/lib/rubocop/cop/mixin/allowed_pattern.rb +13 -5
  212. data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
  213. data/lib/rubocop/cop/mixin/annotation_comment.rb +14 -7
  214. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  215. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  216. data/lib/rubocop/cop/mixin/comments_help.rb +24 -6
  217. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +21 -9
  218. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  219. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  220. data/lib/rubocop/cop/mixin/first_element_line_break.rb +11 -7
  221. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -0
  222. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +1 -1
  223. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +152 -12
  224. data/lib/rubocop/cop/mixin/hash_transform_method.rb +13 -9
  225. data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
  226. data/lib/rubocop/cop/mixin/line_length_help.rb +11 -2
  227. data/lib/rubocop/cop/mixin/method_complexity.rb +9 -7
  228. data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
  229. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -1
  230. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +5 -6
  231. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  232. data/lib/rubocop/cop/mixin/percent_array.rb +3 -5
  233. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  234. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  235. data/lib/rubocop/cop/mixin/range_help.rb +20 -3
  236. data/lib/rubocop/cop/mixin/require_library.rb +2 -0
  237. data/lib/rubocop/cop/mixin/rescue_node.rb +5 -3
  238. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
  239. data/lib/rubocop/cop/mixin/statement_modifier.rb +18 -3
  240. data/lib/rubocop/cop/mixin/surrounding_space.rb +13 -11
  241. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -2
  242. data/lib/rubocop/cop/mixin/visibility_help.rb +40 -5
  243. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
  244. data/lib/rubocop/cop/naming/block_forwarding.rb +6 -2
  245. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  246. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +3 -1
  247. data/lib/rubocop/cop/naming/constant_name.rb +3 -3
  248. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
  249. data/lib/rubocop/cop/naming/inclusive_language.rb +28 -6
  250. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +25 -10
  251. data/lib/rubocop/cop/naming/method_name.rb +3 -3
  252. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  253. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -4
  254. data/lib/rubocop/cop/naming/variable_name.rb +6 -1
  255. data/lib/rubocop/cop/registry.rb +73 -45
  256. data/lib/rubocop/cop/security/compound_hash.rb +2 -1
  257. data/lib/rubocop/cop/style/access_modifier_declarations.rb +92 -3
  258. data/lib/rubocop/cop/style/accessor_grouping.rb +50 -20
  259. data/lib/rubocop/cop/style/alias.rb +9 -1
  260. data/lib/rubocop/cop/style/arguments_forwarding.rb +6 -5
  261. data/lib/rubocop/cop/style/array_intersect.rb +111 -0
  262. data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
  263. data/lib/rubocop/cop/style/attr.rb +11 -1
  264. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  265. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
  266. data/lib/rubocop/cop/style/block_comments.rb +3 -3
  267. data/lib/rubocop/cop/style/block_delimiters.rb +22 -7
  268. data/lib/rubocop/cop/style/case_equality.rb +40 -10
  269. data/lib/rubocop/cop/style/case_like_if.rb +20 -3
  270. data/lib/rubocop/cop/style/character_literal.rb +1 -1
  271. data/lib/rubocop/cop/style/class_and_module_children.rb +5 -12
  272. data/lib/rubocop/cop/style/class_equality_comparison.rb +58 -45
  273. data/lib/rubocop/cop/style/class_methods_definitions.rb +2 -1
  274. data/lib/rubocop/cop/style/collection_compact.rb +27 -5
  275. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  276. data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
  277. data/lib/rubocop/cop/style/combinable_loops.rb +29 -7
  278. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  279. data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
  280. data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
  281. data/lib/rubocop/cop/style/comparable_clamp.rb +125 -0
  282. data/lib/rubocop/cop/style/concat_array_literals.rb +94 -0
  283. data/lib/rubocop/cop/style/conditional_assignment.rb +11 -15
  284. data/lib/rubocop/cop/style/copyright.rb +6 -3
  285. data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
  286. data/lib/rubocop/cop/style/dir.rb +1 -1
  287. data/lib/rubocop/cop/style/dir_empty.rb +54 -0
  288. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  289. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +3 -3
  290. data/lib/rubocop/cop/style/documentation.rb +22 -10
  291. data/lib/rubocop/cop/style/documentation_method.rb +10 -4
  292. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  293. data/lib/rubocop/cop/style/each_for_simple_loop.rb +41 -6
  294. data/lib/rubocop/cop/style/each_with_object.rb +40 -9
  295. data/lib/rubocop/cop/style/empty_block_parameter.rb +2 -2
  296. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +2 -2
  297. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  298. data/lib/rubocop/cop/style/endless_method.rb +1 -1
  299. data/lib/rubocop/cop/style/eval_with_location.rb +8 -8
  300. data/lib/rubocop/cop/style/exact_regexp_match.rb +68 -0
  301. data/lib/rubocop/cop/style/explicit_block_argument.rb +5 -1
  302. data/lib/rubocop/cop/style/file_empty.rb +71 -0
  303. data/lib/rubocop/cop/style/file_read.rb +3 -3
  304. data/lib/rubocop/cop/style/file_write.rb +1 -1
  305. data/lib/rubocop/cop/style/for.rb +2 -0
  306. data/lib/rubocop/cop/style/format_string_token.rb +1 -1
  307. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  308. data/lib/rubocop/cop/style/guard_clause.rb +127 -38
  309. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -0
  310. data/lib/rubocop/cop/style/hash_each_methods.rb +36 -21
  311. data/lib/rubocop/cop/style/hash_except.rb +27 -12
  312. data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
  313. data/lib/rubocop/cop/style/hash_syntax.rb +26 -2
  314. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  315. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  316. data/lib/rubocop/cop/style/identical_conditional_branches.rb +21 -2
  317. data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
  318. data/lib/rubocop/cop/style/if_unless_modifier.rb +111 -15
  319. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +27 -2
  320. data/lib/rubocop/cop/style/if_with_semicolon.rb +6 -6
  321. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  322. data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
  323. data/lib/rubocop/cop/style/invertible_unless_condition.rb +118 -0
  324. data/lib/rubocop/cop/style/lambda.rb +3 -3
  325. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -1
  326. data/lib/rubocop/cop/style/magic_comment_format.rb +307 -0
  327. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +2 -2
  328. data/lib/rubocop/cop/style/map_to_hash.rb +4 -1
  329. data/lib/rubocop/cop/style/map_to_set.rb +64 -0
  330. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +41 -26
  331. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +44 -37
  332. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -0
  333. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +4 -1
  334. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -4
  335. data/lib/rubocop/cop/style/min_max.rb +3 -3
  336. data/lib/rubocop/cop/style/min_max_comparison.rb +83 -0
  337. data/lib/rubocop/cop/style/missing_else.rb +13 -1
  338. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -4
  339. data/lib/rubocop/cop/style/module_function.rb +28 -6
  340. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -1
  341. data/lib/rubocop/cop/style/multiline_if_modifier.rb +0 -4
  342. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +1 -1
  343. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  344. data/lib/rubocop/cop/style/multiline_method_signature.rb +7 -4
  345. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +18 -3
  346. data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
  347. data/lib/rubocop/cop/style/negated_if_else_condition.rb +17 -10
  348. data/lib/rubocop/cop/style/next.rb +3 -5
  349. data/lib/rubocop/cop/style/nil_lambda.rb +4 -4
  350. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
  351. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  352. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  353. data/lib/rubocop/cop/style/object_then.rb +5 -0
  354. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -6
  355. data/lib/rubocop/cop/style/operator_method_call.rb +67 -0
  356. data/lib/rubocop/cop/style/parallel_assignment.rb +29 -19
  357. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
  358. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  359. data/lib/rubocop/cop/style/perl_backrefs.rb +22 -1
  360. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  361. data/lib/rubocop/cop/style/proc.rb +4 -1
  362. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  363. data/lib/rubocop/cop/style/redundant_argument.rb +3 -0
  364. data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
  365. data/lib/rubocop/cop/style/redundant_begin.rb +4 -1
  366. data/lib/rubocop/cop/style/redundant_condition.rb +22 -4
  367. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -5
  368. data/lib/rubocop/cop/style/redundant_constant_base.rb +85 -0
  369. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +38 -0
  370. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +45 -0
  371. data/lib/rubocop/cop/style/redundant_each.rb +116 -0
  372. data/lib/rubocop/cop/style/redundant_fetch_block.rb +7 -5
  373. data/lib/rubocop/cop/style/redundant_filter_chain.rb +101 -0
  374. data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
  375. data/lib/rubocop/cop/style/redundant_initialize.rb +3 -1
  376. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  377. data/lib/rubocop/cop/style/redundant_line_continuation.rb +183 -0
  378. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -3
  379. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  380. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +99 -0
  381. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +9 -3
  382. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
  383. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +22 -4
  384. data/lib/rubocop/cop/style/redundant_return.rb +7 -0
  385. data/lib/rubocop/cop/style/redundant_self.rb +2 -0
  386. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +3 -1
  387. data/lib/rubocop/cop/style/redundant_sort.rb +5 -5
  388. data/lib/rubocop/cop/style/redundant_sort_by.rb +24 -8
  389. data/lib/rubocop/cop/style/redundant_string_escape.rb +185 -0
  390. data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
  391. data/lib/rubocop/cop/style/require_order.rb +139 -0
  392. data/lib/rubocop/cop/style/rescue_modifier.rb +2 -4
  393. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  394. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +81 -0
  395. data/lib/rubocop/cop/style/safe_navigation.rb +41 -10
  396. data/lib/rubocop/cop/style/select_by_regexp.rb +23 -5
  397. data/lib/rubocop/cop/style/self_assignment.rb +2 -2
  398. data/lib/rubocop/cop/style/semicolon.rb +37 -3
  399. data/lib/rubocop/cop/style/signal_exception.rb +9 -7
  400. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  401. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  402. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
  403. data/lib/rubocop/cop/style/sole_nested_conditional.rb +6 -6
  404. data/lib/rubocop/cop/style/special_global_vars.rb +3 -4
  405. data/lib/rubocop/cop/style/static_class.rb +32 -1
  406. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  407. data/lib/rubocop/cop/style/string_hash_keys.rb +4 -1
  408. data/lib/rubocop/cop/style/string_literals.rb +1 -5
  409. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  410. data/lib/rubocop/cop/style/symbol_array.rb +4 -2
  411. data/lib/rubocop/cop/style/symbol_proc.rb +8 -9
  412. data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -1
  413. data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
  414. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -4
  415. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  416. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
  417. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  418. data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
  419. data/lib/rubocop/cop/style/unpack_first.rb +3 -3
  420. data/lib/rubocop/cop/style/word_array.rb +57 -2
  421. data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
  422. data/lib/rubocop/cop/style/yoda_condition.rb +17 -8
  423. data/lib/rubocop/cop/style/yoda_expression.rb +90 -0
  424. data/lib/rubocop/cop/style/zero_length_predicate.rb +40 -19
  425. data/lib/rubocop/cop/team.rb +63 -56
  426. data/lib/rubocop/cop/util.rb +45 -9
  427. data/lib/rubocop/cop/utils/regexp_ranges.rb +100 -0
  428. data/lib/rubocop/cop/variable_force/assignment.rb +34 -2
  429. data/lib/rubocop/cop/variable_force/scope.rb +3 -3
  430. data/lib/rubocop/cop/variable_force/variable.rb +5 -3
  431. data/lib/rubocop/cop/variable_force/variable_table.rb +6 -4
  432. data/lib/rubocop/cop/variable_force.rb +19 -30
  433. data/lib/rubocop/cops_documentation_generator.rb +45 -15
  434. data/lib/rubocop/directive_comment.rb +4 -4
  435. data/lib/rubocop/ext/comment.rb +18 -0
  436. data/lib/rubocop/ext/processed_source.rb +2 -0
  437. data/lib/rubocop/ext/regexp_node.rb +1 -1
  438. data/lib/rubocop/ext/regexp_parser.rb +5 -2
  439. data/lib/rubocop/feature_loader.rb +6 -2
  440. data/lib/rubocop/file_patterns.rb +43 -0
  441. data/lib/rubocop/formatter/disabled_config_formatter.rb +25 -8
  442. data/lib/rubocop/formatter/html_formatter.rb +3 -3
  443. data/lib/rubocop/formatter/junit_formatter.rb +4 -1
  444. data/lib/rubocop/formatter/offense_count_formatter.rb +8 -5
  445. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  446. data/lib/rubocop/formatter/worst_offenders_formatter.rb +6 -3
  447. data/lib/rubocop/formatter.rb +4 -1
  448. data/lib/rubocop/lsp/logger.rb +22 -0
  449. data/lib/rubocop/lsp/routes.rb +231 -0
  450. data/lib/rubocop/lsp/runtime.rb +82 -0
  451. data/lib/rubocop/lsp/server.rb +66 -0
  452. data/lib/rubocop/lsp/severity.rb +27 -0
  453. data/lib/rubocop/options.rb +63 -17
  454. data/lib/rubocop/path_util.rb +50 -22
  455. data/lib/rubocop/result_cache.rb +4 -4
  456. data/lib/rubocop/rspec/cop_helper.rb +26 -3
  457. data/lib/rubocop/rspec/expect_offense.rb +6 -4
  458. data/lib/rubocop/rspec/shared_contexts.rb +18 -1
  459. data/lib/rubocop/rspec/support.rb +3 -2
  460. data/lib/rubocop/runner.rb +69 -18
  461. data/lib/rubocop/server/cache.rb +24 -10
  462. data/lib/rubocop/server/cli.rb +45 -19
  463. data/lib/rubocop/server/client_command/exec.rb +8 -2
  464. data/lib/rubocop/server/client_command/start.rb +6 -1
  465. data/lib/rubocop/server/core.rb +42 -10
  466. data/lib/rubocop/server/helper.rb +1 -1
  467. data/lib/rubocop/server/server_command/exec.rb +1 -1
  468. data/lib/rubocop/server/socket_reader.rb +5 -1
  469. data/lib/rubocop/server.rb +1 -1
  470. data/lib/rubocop/target_finder.rb +1 -1
  471. data/lib/rubocop/target_ruby.rb +5 -5
  472. data/lib/rubocop/version.rb +17 -7
  473. data/lib/rubocop.rb +52 -8
  474. metadata +80 -32
@@ -68,6 +68,13 @@ module RuboCop
68
68
  # - extend
69
69
  # ----
70
70
  #
71
+ # @safety
72
+ # Autocorrection is unsafe because class methods and module inclusion
73
+ # can behave differently, based on which methods or constants have
74
+ # already been defined.
75
+ #
76
+ # Constants will only be moved when they are assigned with literals.
77
+ #
71
78
  # @example
72
79
  # # bad
73
80
  # # Expect extend be before constant
@@ -132,25 +139,20 @@ module RuboCop
132
139
  # end
133
140
  # end
134
141
  #
135
- # @see https://rubystyle.guide#consistent-classes
136
142
  class ClassStructure < Base
137
143
  include VisibilityHelp
144
+ include CommentsHelp
138
145
  extend AutoCorrector
139
146
 
140
147
  HUMANIZED_NODE_TYPE = {
141
148
  casgn: :constants,
142
- defs: :class_methods,
149
+ defs: :public_class_methods,
143
150
  def: :public_methods,
144
151
  sclass: :class_singleton
145
152
  }.freeze
146
153
 
147
154
  MSG = '`%<category>s` is supposed to appear before `%<previous>s`.'
148
155
 
149
- # @!method dynamic_constant?(node)
150
- def_node_matcher :dynamic_constant?, <<~PATTERN
151
- (casgn nil? _ (send ...))
152
- PATTERN
153
-
154
156
  # Validates code style on class declaration.
155
157
  # Add offense when find a node out of expected order.
156
158
  def on_class(class_node)
@@ -164,12 +166,13 @@ module RuboCop
164
166
  previous = index
165
167
  end
166
168
  end
169
+ alias on_sclass on_class
167
170
 
168
171
  private
169
172
 
170
173
  # Autocorrect by swapping between two nodes autocorrecting them
171
174
  def autocorrect(corrector, node)
172
- previous = node.left_siblings.find do |sibling|
175
+ previous = node.left_siblings.reverse.find do |sibling|
173
176
  !ignore_for_autocorrect?(node, sibling)
174
177
  end
175
178
  return unless previous
@@ -222,7 +225,7 @@ module RuboCop
222
225
  def walk_over_nested_class_definition(class_node)
223
226
  class_elements(class_node).each do |node|
224
227
  classification = classify(node)
225
- next if ignore?(classification)
228
+ next if ignore?(node, classification)
226
229
 
227
230
  yield node, classification
228
231
  end
@@ -240,17 +243,20 @@ module RuboCop
240
243
  end
241
244
  end
242
245
 
243
- def ignore?(classification)
246
+ def ignore?(node, classification)
244
247
  classification.nil? ||
245
248
  classification.to_s.end_with?('=') ||
246
- expected_order.index(classification).nil?
249
+ expected_order.index(classification).nil? ||
250
+ private_constant?(node)
247
251
  end
248
252
 
249
253
  def ignore_for_autocorrect?(node, sibling)
250
254
  classification = classify(node)
251
255
  sibling_class = classify(sibling)
252
256
 
253
- ignore?(sibling_class) || classification == sibling_class || dynamic_constant?(node)
257
+ ignore?(sibling, sibling_class) ||
258
+ classification == sibling_class ||
259
+ dynamic_constant?(node)
254
260
  end
255
261
 
256
262
  def humanize_node(node)
@@ -262,26 +268,37 @@ module RuboCop
262
268
  HUMANIZED_NODE_TYPE[node.type] || node.type
263
269
  end
264
270
 
265
- def source_range_with_comment(node)
266
- begin_pos, end_pos =
267
- if (node.def_type? && !node.method?(:initialize)) ||
268
- (node.send_type? && node.def_modifier?)
269
- start_node = find_visibility_start(node) || node
270
- end_node = find_visibility_end(node) || node
271
- [begin_pos_with_comment(start_node),
272
- end_position_for(end_node) + 1]
273
- else
274
- [begin_pos_with_comment(node), end_position_for(node)]
275
- end
271
+ def dynamic_constant?(node)
272
+ return false unless node.casgn_type? && node.namespace.nil?
276
273
 
277
- Parser::Source::Range.new(buffer, begin_pos, end_pos)
274
+ expression = node.expression
275
+ expression.send_type? &&
276
+ !(expression.method?(:freeze) && expression.receiver&.recursive_basic_literal?)
277
+ end
278
+
279
+ def private_constant?(node)
280
+ return false unless node.casgn_type? && node.namespace.nil?
281
+ return false unless (parent = node.parent)
282
+
283
+ parent.each_child_node(:send) do |child_node|
284
+ return true if marked_as_private_constant?(child_node, node.name)
285
+ end
286
+ false
287
+ end
288
+
289
+ def marked_as_private_constant?(node, name)
290
+ return false unless node.method?(:private_constant)
291
+
292
+ node.arguments.any? { |arg| (arg.sym_type? || arg.str_type?) && arg.value == name }
278
293
  end
279
294
 
280
295
  def end_position_for(node)
281
- heredoc = find_heredoc(node)
282
- return heredoc.location.heredoc_end.end_pos + 1 if heredoc
296
+ if node.casgn_type?
297
+ heredoc = find_heredoc(node)
298
+ return heredoc.location.heredoc_end.end_pos + 1 if heredoc
299
+ end
283
300
 
284
- end_line = buffer.line_for_position(node.loc.expression.end_pos)
301
+ end_line = buffer.line_for_position(node.source_range.end_pos)
285
302
  buffer.line_range(end_line).end_pos
286
303
  end
287
304
 
@@ -3,7 +3,6 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- #
7
6
  # Checks the indentation of here document closings.
8
7
  #
9
8
  # @example
@@ -73,7 +72,7 @@ module RuboCop
73
72
  end
74
73
 
75
74
  def argument_indentation_correct?(node)
76
- return unless node.argument? || node.chained?
75
+ return false unless node.argument? || node.chained?
77
76
 
78
77
  opening_indentation(
79
78
  find_node_used_heredoc_argument(node.parent)
@@ -85,7 +84,7 @@ module RuboCop
85
84
  end
86
85
 
87
86
  def heredoc_opening(node)
88
- node.loc.expression.source_line
87
+ node.source_range.source_line
89
88
  end
90
89
 
91
90
  def heredoc_closing(node)
@@ -144,7 +144,7 @@ module RuboCop
144
144
  def expected_column(left_paren, elements)
145
145
  if line_break_after_left_paren?(left_paren, elements)
146
146
  source_indent = processed_source.line_indentation(first_argument_line(elements))
147
- new_indent = source_indent - indentation_width
147
+ new_indent = source_indent - configured_indentation_width
148
148
 
149
149
  new_indent.negative? ? 0 : new_indent
150
150
  elsif all_elements_aligned?(elements)
@@ -157,7 +157,7 @@ module RuboCop
157
157
  def all_elements_aligned?(elements)
158
158
  elements.flat_map do |e|
159
159
  if e.hash_type?
160
- e.each_pair.map { |pair| pair.loc.column }
160
+ e.each_child_node.map { |child| child.loc.column }
161
161
  else
162
162
  e.loc.column
163
163
  end
@@ -184,10 +184,6 @@ module RuboCop
184
184
  end
185
185
  end
186
186
 
187
- def indentation_width
188
- @config.for_cop('Layout/IndentationWidth')['Width'] || 2
189
- end
190
-
191
187
  def line_break_after_left_paren?(left_paren, elements)
192
188
  elements.first && elements.first.loc.line > left_paren.line
193
189
  end
@@ -154,7 +154,9 @@ module RuboCop
154
154
  end
155
155
 
156
156
  def less_indented?(line)
157
- /^\s*(end\b|[)}\]])/.match?(line)
157
+ rule = config.for_cop('Layout/AccessModifierIndentation')['EnforcedStyle'] == 'outdent'
158
+ access_modifier = 'private|protected|public'
159
+ /\A\s*(end\b|[)}\]])/.match?(line) || (rule && /\A\s*(#{access_modifier})\b/.match?(line))
158
160
  end
159
161
 
160
162
  def two_alternatives?(line)
@@ -97,9 +97,9 @@ module RuboCop
97
97
  def autocorrect(corrector, node)
98
98
  previous_token = previous_token(node)
99
99
  range = if previous_token && same_line?(node, previous_token)
100
- range_with_surrounding_space(node.loc.expression, newlines: false)
100
+ range_with_surrounding_space(node.source_range, newlines: false)
101
101
  else
102
- range_by_whole_lines(node.loc.expression, include_final_newline: true)
102
+ range_by_whole_lines(node.source_range, include_final_newline: true)
103
103
  end
104
104
 
105
105
  corrector.remove(range)
@@ -137,7 +137,7 @@ module RuboCop
137
137
  end
138
138
 
139
139
  def current_token(comment)
140
- processed_source.find_token { |token| token.pos == comment.loc.expression }
140
+ processed_source.tokens.find { |token| token.pos == comment.source_range }
141
141
  end
142
142
 
143
143
  def previous_token(node)
@@ -135,7 +135,8 @@ module RuboCop
135
135
  return if nodes.all?(&:single_line?) && cop_config['AllowAdjacentOneLineDefs']
136
136
 
137
137
  correction_node = nodes.last
138
- location = correction_node.loc.keyword.join(correction_node.loc.name)
138
+
139
+ location = def_location(correction_node)
139
140
  add_offense(location, message: message(correction_node, count: count)) do |corrector|
140
141
  autocorrect(corrector, *nodes, count)
141
142
  end
@@ -159,10 +160,28 @@ module RuboCop
159
160
 
160
161
  private
161
162
 
163
+ def def_location(correction_node)
164
+ if correction_node.block_type?
165
+ correction_node.source_range.join(correction_node.children.first.source_range)
166
+ else
167
+ correction_node.loc.keyword.join(correction_node.loc.name)
168
+ end
169
+ end
170
+
162
171
  def candidate?(node)
163
- return unless node
172
+ return false unless node
164
173
 
165
- method_candidate?(node) || class_candidate?(node) || module_candidate?(node)
174
+ method_candidate?(node) || class_candidate?(node) || module_candidate?(node) ||
175
+ macro_candidate?(node)
176
+ end
177
+
178
+ def empty_line_between_macros
179
+ cop_config.fetch('DefLikeMacros', []).map(&:to_sym)
180
+ end
181
+
182
+ def macro_candidate?(node)
183
+ node.block_type? && node.children.first.macro? &&
184
+ empty_line_between_macros.include?(node.children.first.method_name)
166
185
  end
167
186
 
168
187
  def method_candidate?(node)
@@ -226,7 +245,11 @@ module RuboCop
226
245
  end
227
246
 
228
247
  def def_start(node)
229
- node.loc.keyword.line
248
+ if node.block_type? && node.children.first.send_type?
249
+ node.source_range.line
250
+ else
251
+ node.loc.keyword.line
252
+ end
230
253
  end
231
254
 
232
255
  def def_end(node)
@@ -235,7 +258,7 @@ module RuboCop
235
258
 
236
259
  def end_loc(node)
237
260
  if (node.def_type? || node.defs_type?) && node.endless?
238
- node.loc.expression.end
261
+ node.source_range.end
239
262
  else
240
263
  node.loc.end
241
264
  end
@@ -27,9 +27,11 @@ module RuboCop
27
27
 
28
28
  def on_new_investigation
29
29
  return if processed_source.tokens.empty?
30
+ # Quick check if we possibly have consecutive blank lines.
31
+ return unless processed_source.raw_source.include?("\n\n\n")
30
32
 
31
33
  lines = Set.new
32
- processed_source.each_token { |token| lines << token.line }
34
+ processed_source.tokens.each { |token| lines << token.line }
33
35
 
34
36
  each_extra_empty_line(lines.sort) do |range|
35
37
  add_offense(range) do |corrector|
@@ -51,6 +51,8 @@ module RuboCop
51
51
  MSG_BEFORE_FOR_ONLY_BEFORE = 'Keep a blank line before `%<modifier>s`.'
52
52
  MSG_AFTER_FOR_ONLY_BEFORE = 'Remove a blank line after `%<modifier>s`.'
53
53
 
54
+ RESTRICT_ON_SEND = %i[public protected private module_function].freeze
55
+
54
56
  def initialize(config = nil, options = nil)
55
57
  super
56
58
 
@@ -80,8 +82,11 @@ module RuboCop
80
82
  @block_line = node.source_range.first_line
81
83
  end
82
84
 
83
- def on_send(node)
84
- return unless node.bare_access_modifier? && !node.parent&.block_type?
85
+ alias on_numblock on_block
86
+
87
+ def on_send(node) # rubocop:disable Metrics/CyclomaticComplexity
88
+ return unless node.bare_access_modifier? &&
89
+ !(node.parent&.block_type? || node.parent&.numblock_type?)
85
90
  return if expected_empty_lines?(node)
86
91
 
87
92
  message = message(node)
@@ -32,6 +32,8 @@ module RuboCop
32
32
 
33
33
  check(node, node.body, adjusted_first_line: first_line)
34
34
  end
35
+
36
+ alias on_numblock on_block
35
37
  end
36
38
  end
37
39
  end
@@ -68,6 +68,8 @@ module RuboCop
68
68
  check_body(node.body, node.loc.line)
69
69
  end
70
70
  alias on_defs on_def
71
+ alias on_block on_def
72
+ alias on_numblock on_def
71
73
 
72
74
  def on_kwbegin(node)
73
75
  body, = *node
@@ -82,6 +82,10 @@ module RuboCop
82
82
  check_other_alignment(node)
83
83
  end
84
84
 
85
+ def on_sclass(node)
86
+ check_other_alignment(node)
87
+ end
88
+
85
89
  def on_module(node)
86
90
  check_other_alignment(node)
87
91
  end
@@ -105,6 +109,7 @@ module RuboCop
105
109
  check_other_alignment(node)
106
110
  end
107
111
  end
112
+ alias on_case_match on_case
108
113
 
109
114
  private
110
115
 
@@ -165,7 +170,10 @@ module RuboCop
165
170
  end
166
171
 
167
172
  def alignment_node_for_variable_style(node)
168
- return node.parent if node.case_type? && node.argument? && same_line?(node, node.parent)
173
+ if (node.case_type? || node.case_match_type?) && node.argument? &&
174
+ same_line?(node, node.parent)
175
+ return node.parent
176
+ end
169
177
 
170
178
  assignment = assignment_or_operator_method(node)
171
179
 
@@ -22,20 +22,20 @@ module RuboCop
22
22
  # # all platforms.
23
23
  #
24
24
  # # bad
25
- # puts 'Hello' # Return character is CR+LF on all platfoms.
25
+ # puts 'Hello' # Return character is CR+LF on all platforms.
26
26
  #
27
27
  # # good
28
- # puts 'Hello' # Return character is LF on all platfoms.
28
+ # puts 'Hello' # Return character is LF on all platforms.
29
29
  #
30
30
  # @example EnforcedStyle: crlf
31
31
  # # The `crlf` style means that CR+LF (Carriage Return + Line Feed) is
32
32
  # # enforced on all platforms.
33
33
  #
34
34
  # # bad
35
- # puts 'Hello' # Return character is LF on all platfoms.
35
+ # puts 'Hello' # Return character is LF on all platforms.
36
36
  #
37
37
  # # good
38
- # puts 'Hello' # Return character is CR+LF on all platfoms.
38
+ # puts 'Hello' # Return character is CR+LF on all platforms.
39
39
  #
40
40
  class EndOfLine < Base
41
41
  include ConfigurableEnforcedStyle
@@ -49,7 +49,7 @@ module RuboCop
49
49
 
50
50
  private
51
51
 
52
- def aligned_locations(locs)
52
+ def aligned_locations(locs) # rubocop:disable Metrics/AbcSize
53
53
  return [] if locs.empty?
54
54
 
55
55
  aligned = Set[locs.first.line, locs.last.line]
@@ -57,6 +57,11 @@ module RuboCop
57
57
  col = loc.column
58
58
  aligned << loc.line if col == before.column || col == after.column
59
59
  end
60
+
61
+ # if locs.size > 2 and the size of variable `aligned`
62
+ # has not increased from its initial value, there are not aligned lines.
63
+ return [] if locs.size > 2 && aligned.size == 2
64
+
60
65
  aligned
61
66
  end
62
67
 
@@ -119,12 +124,16 @@ module RuboCop
119
124
  def ignored_ranges(ast)
120
125
  return [] unless ast
121
126
 
122
- @ignored_ranges ||= on_node(:pair, ast).map do |pair|
123
- next if pair.parent.single_line?
127
+ @ignored_ranges ||= begin
128
+ ranges = []
129
+ on_node(:pair, ast) do |pair|
130
+ next if pair.parent.single_line?
124
131
 
125
- key, value = *pair
126
- key.source_range.end_pos...value.source_range.begin_pos
127
- end.compact
132
+ key, value = *pair
133
+ ranges << (key.source_range.end_pos...value.source_range.begin_pos)
134
+ end
135
+ ranges
136
+ end
128
137
  end
129
138
 
130
139
  def force_equal_sign_alignment?
@@ -153,18 +153,24 @@ module RuboCop
153
153
  MSG = 'Indent the first argument one step more than %<base>s.'
154
154
 
155
155
  def on_send(node)
156
+ return unless should_check?(node)
157
+ return if same_line?(node, node.first_argument)
156
158
  return if style != :consistent && enforce_first_argument_with_fixed_indentation? &&
157
159
  !enable_layout_first_method_argument_line_break?
158
- return if !node.arguments? || bare_operator?(node) || node.setter_method?
159
160
 
160
161
  indent = base_indentation(node) + configured_indentation_width
161
162
 
162
163
  check_alignment([node.first_argument], indent)
163
164
  end
164
165
  alias on_csend on_send
166
+ alias on_super on_send
165
167
 
166
168
  private
167
169
 
170
+ def should_check?(node)
171
+ node.arguments? && !bare_operator?(node) && !node.setter_method?
172
+ end
173
+
168
174
  def autocorrect(corrector, node)
169
175
  AlignmentCorrector.correct(corrector, processed_source, node, column_delta)
170
176
  end
@@ -178,7 +184,7 @@ module RuboCop
178
184
 
179
185
  send_node = arg_node.parent
180
186
  text = base_range(send_node, arg_node).source.strip
181
- base = if !/\n/.match?(text) && special_inner_call_indentation?(send_node)
187
+ base = if !text.include?("\n") && special_inner_call_indentation?(send_node)
182
188
  "`#{text}`"
183
189
  elsif comment_line?(text.lines.reverse_each.first)
184
190
  'the start of the previous line (not counting the comment)'
@@ -254,7 +260,7 @@ module RuboCop
254
260
  @comment_lines ||=
255
261
  processed_source
256
262
  .comments
257
- .select { |c| begins_its_line?(c.loc.expression) }
263
+ .select { |c| begins_its_line?(c.source_range) }
258
264
  .map { |c| c.loc.line }
259
265
  end
260
266
 
@@ -143,7 +143,7 @@ module RuboCop
143
143
  case indent_base_type
144
144
  when :left_brace_or_bracket
145
145
  'the position of the opening bracket'
146
- when :first_colmn_after_left_parenthesis
146
+ when :first_column_after_left_parenthesis
147
147
  'the first position after the preceding left parenthesis'
148
148
  when :parent_hash_key
149
149
  'the parent hash key'
@@ -164,7 +164,7 @@ module RuboCop
164
164
  case indent_base_type
165
165
  when :left_brace_or_bracket
166
166
  'Indent the right bracket the same as the left bracket.'
167
- when :first_colmn_after_left_parenthesis
167
+ when :first_column_after_left_parenthesis
168
168
  'Indent the right bracket the same as the first position ' \
169
169
  'after the preceding left parenthesis.'
170
170
  when :parent_hash_key
@@ -8,14 +8,37 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  #
11
- # # bad
12
- # [ :a,
13
- # :b]
11
+ # # bad
12
+ # [ :a,
13
+ # :b]
14
14
  #
15
- # # good
16
- # [
17
- # :a,
18
- # :b]
15
+ # # good
16
+ # [
17
+ # :a,
18
+ # :b]
19
+ #
20
+ # # good
21
+ # [:a, :b]
22
+ #
23
+ # @example AllowMultilineFinalElement: false (default)
24
+ #
25
+ # # bad
26
+ # [ :a, {
27
+ # :b => :c
28
+ # }]
29
+ #
30
+ # # good
31
+ # [
32
+ # :a, {
33
+ # :b => :c
34
+ # }]
35
+ #
36
+ # @example AllowMultilineFinalElement: true
37
+ #
38
+ # # good
39
+ # [:a, {
40
+ # :b => :c
41
+ # }]
19
42
  #
20
43
  class FirstArrayElementLineBreak < Base
21
44
  include FirstElementLineBreak
@@ -26,7 +49,7 @@ module RuboCop
26
49
  def on_array(node)
27
50
  return if !node.loc.begin && !assignment_on_same_line?(node)
28
51
 
29
- check_children_line_break(node, node.children)
52
+ check_children_line_break(node, node.children, ignore_last: ignore_last_element?)
30
53
  end
31
54
 
32
55
  private
@@ -35,6 +58,10 @@ module RuboCop
35
58
  source = node.source_range.source_line[0...node.loc.column]
36
59
  /\s*=\s*$/.match?(source)
37
60
  end
61
+
62
+ def ignore_last_element?
63
+ !!cop_config['AllowMultilineFinalElement']
64
+ end
38
65
  end
39
66
  end
40
67
  end
@@ -192,7 +192,7 @@ module RuboCop
192
192
  case indent_base_type
193
193
  when :left_brace_or_bracket
194
194
  'the position of the opening brace'
195
- when :first_colmn_after_left_parenthesis
195
+ when :first_column_after_left_parenthesis
196
196
  'the first position after the preceding left parenthesis'
197
197
  when :parent_hash_key
198
198
  'the parent hash key'
@@ -213,7 +213,7 @@ module RuboCop
213
213
  case indent_base_type
214
214
  when :left_brace_or_bracket
215
215
  'Indent the right brace the same as the left brace.'
216
- when :first_colmn_after_left_parenthesis
216
+ when :first_column_after_left_parenthesis
217
217
  'Indent the right brace the same as the first position ' \
218
218
  'after the preceding left parenthesis.'
219
219
  when :parent_hash_key
@@ -16,6 +16,33 @@ module RuboCop
16
16
  # {
17
17
  # a: 1,
18
18
  # b: 2 }
19
+ #
20
+ # # good
21
+ # {
22
+ # a: 1, b: {
23
+ # c: 3
24
+ # }}
25
+ #
26
+ # @example AllowMultilineFinalElement: false (default)
27
+ #
28
+ # # bad
29
+ # { a: 1, b: {
30
+ # c: 3
31
+ # }}
32
+ #
33
+ # @example AllowMultilineFinalElement: true
34
+ #
35
+ # # bad
36
+ # { a: 1,
37
+ # b: {
38
+ # c: 3
39
+ # }}
40
+ #
41
+ # # good
42
+ # { a: 1, b: {
43
+ # c: 3
44
+ # }}
45
+ #
19
46
  class FirstHashElementLineBreak < Base
20
47
  include FirstElementLineBreak
21
48
  extend AutoCorrector
@@ -25,7 +52,15 @@ module RuboCop
25
52
  def on_hash(node)
26
53
  # node.loc.begin tells us whether the hash opens with a {
27
54
  # If it doesn't, Style/FirstMethodArgumentLineBreak will handle it
28
- check_children_line_break(node, node.children) if node.loc.begin
55
+ return unless node.loc.begin
56
+
57
+ check_children_line_break(node, node.children, ignore_last: ignore_last_element?)
58
+ end
59
+
60
+ private
61
+
62
+ def ignore_last_element?
63
+ !!cop_config['AllowMultilineFinalElement']
29
64
  end
30
65
  end
31
66
  end