rubocop 0.51.0 → 0.87.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 (702) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.txt +1 -1
  3. data/README.md +53 -42
  4. data/assets/output.html.erb +1 -1
  5. data/bin/console +10 -0
  6. data/bin/setup +7 -0
  7. data/config/default.yml +3137 -552
  8. data/lib/rubocop/ast_aliases.rb +8 -0
  9. data/lib/rubocop/cached_data.rb +2 -2
  10. data/lib/rubocop/cli/command/auto_genenerate_config.rb +140 -0
  11. data/lib/rubocop/cli/command/base.rb +33 -0
  12. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  13. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  14. data/lib/rubocop/cli/command/show_cops.rb +76 -0
  15. data/lib/rubocop/cli/command/version.rb +17 -0
  16. data/lib/rubocop/cli/command.rb +21 -0
  17. data/lib/rubocop/cli/environment.rb +21 -0
  18. data/lib/rubocop/cli.rb +58 -131
  19. data/lib/rubocop/comment_config.rb +65 -14
  20. data/lib/rubocop/config.rb +106 -342
  21. data/lib/rubocop/config_loader.rb +122 -153
  22. data/lib/rubocop/config_loader_resolver.rb +198 -8
  23. data/lib/rubocop/config_obsoletion.rb +277 -0
  24. data/lib/rubocop/config_store.rb +12 -2
  25. data/lib/rubocop/config_validator.rb +223 -0
  26. data/lib/rubocop/cop/autocorrect_logic.rb +73 -4
  27. data/lib/rubocop/cop/badge.rb +6 -6
  28. data/lib/rubocop/cop/base.rb +399 -0
  29. data/lib/rubocop/cop/bundler/duplicated_gem.rb +12 -10
  30. data/lib/rubocop/cop/bundler/gem_comment.rb +133 -0
  31. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +21 -28
  32. data/lib/rubocop/cop/bundler/ordered_gems.rb +16 -5
  33. data/lib/rubocop/cop/commissioner.rb +68 -67
  34. data/lib/rubocop/cop/cop.rb +101 -208
  35. data/lib/rubocop/cop/corrector.rb +82 -98
  36. data/lib/rubocop/cop/correctors/alignment_corrector.rb +142 -0
  37. data/lib/rubocop/cop/correctors/condition_corrector.rb +27 -0
  38. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
  39. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  40. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
  41. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
  42. data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
  43. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
  44. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  45. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  46. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
  47. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  48. data/lib/rubocop/cop/correctors/space_corrector.rb +46 -0
  49. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  50. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
  51. data/lib/rubocop/cop/force.rb +1 -0
  52. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
  53. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +16 -8
  54. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
  55. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  56. data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
  57. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  58. data/lib/rubocop/cop/generator.rb +81 -99
  59. data/lib/rubocop/cop/ignored_node.rb +1 -3
  60. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  61. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
  62. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +13 -16
  63. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +11 -10
  64. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +7 -18
  65. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -4
  66. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  67. data/lib/rubocop/cop/internal_affairs.rb +2 -1
  68. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +22 -33
  69. data/lib/rubocop/cop/layout/{align_parameters.rb → argument_alignment.rb} +26 -24
  70. data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
  71. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +18 -5
  72. data/lib/rubocop/cop/{lint → layout}/block_alignment.rb +38 -32
  73. data/lib/rubocop/cop/layout/block_end_newline.rb +16 -13
  74. data/lib/rubocop/cop/layout/case_indentation.rb +26 -29
  75. data/lib/rubocop/cop/layout/class_structure.rb +343 -0
  76. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
  77. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +145 -30
  78. data/lib/rubocop/cop/layout/comment_indentation.rb +76 -8
  79. data/lib/rubocop/cop/{lint → layout}/condition_position.rb +15 -5
  80. data/lib/rubocop/cop/{lint → layout}/def_end_alignment.rb +10 -14
  81. data/lib/rubocop/cop/layout/dot_position.rb +34 -22
  82. data/lib/rubocop/cop/layout/else_alignment.rb +37 -20
  83. data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
  84. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
  85. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +6 -5
  86. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +30 -25
  87. data/lib/rubocop/cop/layout/empty_lines.rb +20 -4
  88. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +138 -33
  89. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
  90. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +121 -0
  91. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +8 -5
  92. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -11
  93. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +60 -11
  94. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +13 -4
  95. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +8 -4
  96. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +29 -11
  97. data/lib/rubocop/cop/{lint → layout}/end_alignment.rb +53 -21
  98. data/lib/rubocop/cop/layout/end_of_line.rb +48 -8
  99. data/lib/rubocop/cop/layout/extra_spacing.rb +66 -102
  100. data/lib/rubocop/cop/layout/first_argument_indentation.rb +251 -0
  101. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +171 -0
  102. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +6 -2
  103. data/lib/rubocop/cop/layout/{indent_hash.rb → first_hash_element_indentation.rb} +83 -33
  104. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +5 -1
  105. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -4
  106. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +5 -1
  107. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +61 -73
  108. data/lib/rubocop/cop/layout/hash_alignment.rb +365 -0
  109. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +285 -0
  110. data/lib/rubocop/cop/layout/heredoc_indentation.rb +173 -0
  111. data/lib/rubocop/cop/layout/indentation_consistency.rb +160 -8
  112. data/lib/rubocop/cop/layout/indentation_style.rb +117 -0
  113. data/lib/rubocop/cop/layout/indentation_width.rb +100 -45
  114. data/lib/rubocop/cop/layout/initial_indentation.rb +24 -8
  115. data/lib/rubocop/cop/layout/leading_comment_space.rb +67 -6
  116. data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
  117. data/lib/rubocop/cop/layout/line_length.rb +280 -0
  118. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +61 -24
  119. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
  120. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +21 -14
  121. data/lib/rubocop/cop/layout/multiline_block_layout.rb +63 -28
  122. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +54 -21
  123. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
  124. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +52 -0
  125. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +70 -33
  126. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -18
  127. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +82 -33
  128. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +34 -6
  129. data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
  130. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +125 -22
  131. data/lib/rubocop/cop/layout/space_after_colon.rb +6 -6
  132. data/lib/rubocop/cop/layout/space_after_comma.rb +7 -3
  133. data/lib/rubocop/cop/layout/space_after_method_name.rb +10 -7
  134. data/lib/rubocop/cop/layout/space_after_not.rb +4 -2
  135. data/lib/rubocop/cop/layout/space_after_semicolon.rb +12 -1
  136. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +74 -49
  137. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +41 -17
  138. data/lib/rubocop/cop/layout/space_around_keyword.rb +36 -20
  139. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  140. data/lib/rubocop/cop/layout/space_around_operators.rb +142 -46
  141. data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -11
  142. data/lib/rubocop/cop/layout/space_before_comma.rb +16 -1
  143. data/lib/rubocop/cop/layout/space_before_comment.rb +6 -7
  144. data/lib/rubocop/cop/layout/space_before_first_arg.rb +15 -4
  145. data/lib/rubocop/cop/layout/space_before_semicolon.rb +5 -1
  146. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +30 -39
  147. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +229 -0
  148. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +5 -5
  149. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +110 -19
  150. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +93 -46
  151. data/lib/rubocop/cop/layout/space_inside_parens.rb +92 -4
  152. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +3 -3
  153. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +17 -17
  154. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +148 -0
  155. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +37 -41
  156. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +54 -21
  157. data/lib/rubocop/cop/layout/trailing_whitespace.rb +51 -2
  158. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  159. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  160. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +16 -22
  161. data/lib/rubocop/cop/lint/ambiguous_operator.rb +42 -1
  162. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +15 -1
  163. data/lib/rubocop/cop/lint/assignment_in_condition.rb +29 -26
  164. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  165. data/lib/rubocop/cop/lint/boolean_symbol.rb +14 -2
  166. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -2
  167. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  168. data/lib/rubocop/cop/lint/debugger.rb +8 -10
  169. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +34 -13
  170. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  171. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
  172. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  173. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +2 -2
  174. data/lib/rubocop/cop/lint/duplicate_methods.rb +38 -25
  175. data/lib/rubocop/cop/lint/each_with_object_argument.rb +5 -2
  176. data/lib/rubocop/cop/lint/else_layout.rb +4 -3
  177. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  178. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  179. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -5
  180. data/lib/rubocop/cop/lint/empty_when.rb +30 -7
  181. data/lib/rubocop/cop/lint/ensure_return.rb +23 -3
  182. data/lib/rubocop/cop/lint/erb_new_arguments.rb +162 -0
  183. data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
  184. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
  185. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +62 -44
  186. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
  187. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +21 -15
  188. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +37 -59
  189. data/lib/rubocop/cop/lint/inherit_exception.rb +32 -16
  190. data/lib/rubocop/cop/lint/interpolation_check.rb +19 -3
  191. data/lib/rubocop/cop/lint/literal_as_condition.rb +16 -22
  192. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +33 -11
  193. data/lib/rubocop/cop/lint/loop.rb +8 -6
  194. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
  195. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  196. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +4 -4
  197. data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -7
  198. data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
  199. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -2
  200. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  201. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +14 -16
  202. data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
  203. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  204. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +45 -15
  205. data/lib/rubocop/cop/lint/percent_string_array.rb +18 -22
  206. data/lib/rubocop/cop/lint/percent_symbol_array.rb +18 -15
  207. data/lib/rubocop/cop/lint/raise_exception.rb +83 -0
  208. data/lib/rubocop/cop/lint/rand_one.rb +5 -5
  209. data/lib/rubocop/cop/lint/{unneeded_disable.rb → redundant_cop_disable_directive.rb} +87 -61
  210. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +119 -0
  211. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +10 -10
  212. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +58 -27
  213. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +18 -17
  214. data/lib/rubocop/cop/lint/redundant_with_index.rb +13 -8
  215. data/lib/rubocop/cop/lint/redundant_with_object.rb +9 -7
  216. data/lib/rubocop/cop/lint/regexp_as_condition.rb +7 -1
  217. data/lib/rubocop/cop/lint/require_parentheses.rb +7 -2
  218. data/lib/rubocop/cop/lint/rescue_exception.rb +3 -2
  219. data/lib/rubocop/cop/lint/rescue_type.rb +10 -6
  220. data/lib/rubocop/cop/lint/return_in_void_context.rb +3 -3
  221. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +23 -28
  222. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
  223. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +46 -0
  224. data/lib/rubocop/cop/lint/script_permission.rb +33 -11
  225. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  226. data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
  227. data/lib/rubocop/cop/lint/shadowed_exception.rb +42 -23
  228. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -2
  229. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  230. data/lib/rubocop/cop/lint/suppressed_exception.rb +92 -0
  231. data/lib/rubocop/cop/lint/syntax.rb +12 -28
  232. data/lib/rubocop/cop/lint/to_json.rb +41 -0
  233. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +26 -6
  234. data/lib/rubocop/cop/lint/unified_integer.rb +3 -3
  235. data/lib/rubocop/cop/lint/unreachable_code.rb +9 -7
  236. data/lib/rubocop/cop/lint/unused_block_argument.rb +26 -6
  237. data/lib/rubocop/cop/lint/unused_method_argument.rb +62 -12
  238. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +17 -15
  239. data/lib/rubocop/cop/lint/uri_regexp.rb +7 -7
  240. data/lib/rubocop/cop/lint/useless_access_modifier.rb +96 -37
  241. data/lib/rubocop/cop/lint/useless_assignment.rb +8 -10
  242. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  243. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +9 -1
  244. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -11
  245. data/lib/rubocop/cop/lint/void.rb +62 -30
  246. data/lib/rubocop/cop/message_annotator.rb +26 -13
  247. data/lib/rubocop/cop/metrics/abc_size.rb +4 -19
  248. data/lib/rubocop/cop/metrics/block_length.rb +42 -2
  249. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -1
  250. data/lib/rubocop/cop/metrics/class_length.rb +37 -2
  251. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
  252. data/lib/rubocop/cop/metrics/method_length.rb +29 -2
  253. data/lib/rubocop/cop/metrics/module_length.rb +37 -2
  254. data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
  255. data/lib/rubocop/cop/metrics/perceived_complexity.rb +5 -5
  256. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
  257. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  258. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  259. data/lib/rubocop/cop/migration/department_name.rb +85 -0
  260. data/lib/rubocop/cop/mixin/alignment.rb +72 -0
  261. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  262. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -0
  263. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  264. data/lib/rubocop/cop/mixin/array_syntax.rb +3 -1
  265. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  266. data/lib/rubocop/cop/mixin/check_assignment.rb +13 -9
  267. data/lib/rubocop/cop/mixin/check_line_breakable.rb +184 -0
  268. data/lib/rubocop/cop/mixin/code_length.rb +11 -1
  269. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +8 -5
  270. data/lib/rubocop/cop/mixin/configurable_formatting.rb +4 -7
  271. data/lib/rubocop/cop/mixin/configurable_max.rb +6 -2
  272. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  273. data/lib/rubocop/cop/mixin/def_node.rb +8 -2
  274. data/lib/rubocop/cop/mixin/documentation_comment.rb +13 -7
  275. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +34 -28
  276. data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
  277. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +19 -32
  278. data/lib/rubocop/cop/mixin/enforce_superclass.rb +6 -10
  279. data/lib/rubocop/cop/mixin/first_element_line_break.rb +6 -10
  280. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +32 -7
  281. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +38 -7
  282. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  283. data/lib/rubocop/cop/mixin/heredoc.rb +22 -18
  284. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  285. data/lib/rubocop/cop/mixin/ignored_pattern.rb +3 -1
  286. data/lib/rubocop/cop/mixin/integer_node.rb +3 -1
  287. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  288. data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
  289. data/lib/rubocop/cop/mixin/match_range.rb +4 -0
  290. data/lib/rubocop/cop/mixin/method_complexity.rb +38 -8
  291. data/lib/rubocop/cop/mixin/method_preference.rb +2 -1
  292. data/lib/rubocop/cop/mixin/min_body_length.rb +3 -1
  293. data/lib/rubocop/cop/mixin/{array_hash_indentation.rb → multiline_element_indentation.rb} +5 -2
  294. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
  295. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +50 -15
  296. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +15 -50
  297. data/lib/rubocop/cop/mixin/negative_conditional.rb +5 -16
  298. data/lib/rubocop/cop/mixin/nil_methods.rb +23 -0
  299. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +30 -32
  300. data/lib/rubocop/cop/mixin/parentheses.rb +3 -9
  301. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  302. data/lib/rubocop/cop/mixin/percent_array.rb +2 -2
  303. data/lib/rubocop/cop/mixin/percent_literal.rb +3 -65
  304. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +98 -6
  305. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
  306. data/lib/rubocop/cop/mixin/range_help.rb +117 -0
  307. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  308. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
  309. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -3
  310. data/lib/rubocop/cop/mixin/safe_assignment.rb +4 -1
  311. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +13 -14
  312. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +16 -16
  313. data/lib/rubocop/cop/mixin/statement_modifier.rb +20 -33
  314. data/lib/rubocop/cop/mixin/string_help.rb +2 -0
  315. data/lib/rubocop/cop/mixin/string_literals_help.rb +4 -14
  316. data/lib/rubocop/cop/mixin/surrounding_space.rb +120 -9
  317. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  318. data/lib/rubocop/cop/mixin/too_many_lines.rb +5 -19
  319. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  320. data/lib/rubocop/cop/mixin/trailing_comma.rb +96 -45
  321. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +113 -0
  322. data/lib/rubocop/cop/mixin/unused_argument.rb +3 -53
  323. data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
  324. data/lib/rubocop/cop/naming/ascii_identifiers.rb +64 -5
  325. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +11 -9
  326. data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
  327. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +28 -14
  328. data/lib/rubocop/cop/naming/constant_name.rb +59 -6
  329. data/lib/rubocop/cop/naming/file_name.rb +72 -36
  330. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
  331. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +8 -12
  332. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
  333. data/lib/rubocop/cop/naming/method_name.rb +58 -13
  334. data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
  335. data/lib/rubocop/cop/naming/predicate_name.rb +22 -13
  336. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
  337. data/lib/rubocop/cop/naming/variable_name.rb +20 -3
  338. data/lib/rubocop/cop/naming/variable_number.rb +12 -29
  339. data/lib/rubocop/cop/offense.rb +55 -13
  340. data/lib/rubocop/cop/registry.rb +118 -14
  341. data/lib/rubocop/cop/security/eval.rb +3 -2
  342. data/lib/rubocop/cop/security/json_load.rb +7 -5
  343. data/lib/rubocop/cop/security/marshal_load.rb +5 -3
  344. data/lib/rubocop/cop/security/open.rb +71 -0
  345. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  346. data/lib/rubocop/cop/severity.rb +2 -3
  347. data/lib/rubocop/cop/style/access_modifier_declarations.rb +132 -0
  348. data/lib/rubocop/cop/style/accessor_grouping.rb +136 -0
  349. data/lib/rubocop/cop/style/alias.rb +41 -37
  350. data/lib/rubocop/cop/style/and_or.rb +44 -38
  351. data/lib/rubocop/cop/style/array_join.rb +12 -3
  352. data/lib/rubocop/cop/style/ascii_comments.rb +29 -6
  353. data/lib/rubocop/cop/style/attr.rb +26 -8
  354. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +14 -5
  355. data/lib/rubocop/cop/style/bare_percent_literals.rb +34 -13
  356. data/lib/rubocop/cop/style/begin_block.rb +7 -1
  357. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +121 -0
  358. data/lib/rubocop/cop/style/block_comments.rb +27 -5
  359. data/lib/rubocop/cop/style/block_delimiters.rb +189 -30
  360. data/lib/rubocop/cop/style/case_equality.rb +37 -2
  361. data/lib/rubocop/cop/style/character_literal.rb +13 -3
  362. data/lib/rubocop/cop/style/class_and_module_children.rb +92 -10
  363. data/lib/rubocop/cop/style/class_check.rb +28 -9
  364. data/lib/rubocop/cop/style/class_methods.rb +20 -28
  365. data/lib/rubocop/cop/style/class_vars.rb +49 -3
  366. data/lib/rubocop/cop/style/collection_methods.rb +32 -2
  367. data/lib/rubocop/cop/style/colon_method_call.rb +19 -4
  368. data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
  369. data/lib/rubocop/cop/style/command_literal.rb +85 -28
  370. data/lib/rubocop/cop/style/comment_annotation.rb +51 -19
  371. data/lib/rubocop/cop/style/commented_keyword.rb +22 -30
  372. data/lib/rubocop/cop/style/conditional_assignment.rb +62 -92
  373. data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
  374. data/lib/rubocop/cop/style/copyright.rb +39 -29
  375. data/lib/rubocop/cop/style/date_time.rb +44 -11
  376. data/lib/rubocop/cop/style/def_with_parentheses.rb +28 -3
  377. data/lib/rubocop/cop/style/dir.rb +7 -7
  378. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  379. data/lib/rubocop/cop/style/documentation.rb +72 -16
  380. data/lib/rubocop/cop/style/documentation_method.rb +51 -2
  381. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  382. data/lib/rubocop/cop/style/double_negation.rb +43 -6
  383. data/lib/rubocop/cop/style/each_for_simple_loop.rb +9 -9
  384. data/lib/rubocop/cop/style/each_with_object.rb +25 -11
  385. data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
  386. data/lib/rubocop/cop/style/empty_case_condition.rb +30 -5
  387. data/lib/rubocop/cop/style/empty_else.rb +62 -26
  388. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
  389. data/lib/rubocop/cop/style/empty_literal.rb +32 -18
  390. data/lib/rubocop/cop/style/empty_method.rb +14 -21
  391. data/lib/rubocop/cop/style/encoding.rb +13 -5
  392. data/lib/rubocop/cop/style/end_block.rb +15 -1
  393. data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
  394. data/lib/rubocop/cop/style/even_odd.rb +9 -7
  395. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  396. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  397. data/lib/rubocop/cop/style/float_division.rb +94 -0
  398. data/lib/rubocop/cop/style/for.rb +54 -19
  399. data/lib/rubocop/cop/style/format_string.rb +63 -32
  400. data/lib/rubocop/cop/style/format_string_token.rb +45 -67
  401. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +170 -32
  402. data/lib/rubocop/cop/style/global_vars.rb +14 -4
  403. data/lib/rubocop/cop/style/guard_clause.rb +66 -13
  404. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  405. data/lib/rubocop/cop/style/hash_syntax.rb +69 -61
  406. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  407. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  408. data/lib/rubocop/cop/style/identical_conditional_branches.rb +17 -21
  409. data/lib/rubocop/cop/style/if_inside_else.rb +52 -10
  410. data/lib/rubocop/cop/style/if_unless_modifier.rb +132 -24
  411. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +14 -2
  412. data/lib/rubocop/cop/style/if_with_semicolon.rb +28 -2
  413. data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
  414. data/lib/rubocop/cop/style/infinite_loop.rb +51 -14
  415. data/lib/rubocop/cop/style/inline_comment.rb +5 -3
  416. data/lib/rubocop/cop/style/inverse_methods.rb +70 -22
  417. data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
  418. data/lib/rubocop/cop/style/lambda.rb +25 -112
  419. data/lib/rubocop/cop/style/lambda_call.rb +13 -27
  420. data/lib/rubocop/cop/style/line_end_concatenation.rb +22 -16
  421. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  422. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +52 -0
  423. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +134 -34
  424. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -14
  425. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +5 -2
  426. data/lib/rubocop/cop/style/method_def_parentheses.rb +102 -13
  427. data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
  428. data/lib/rubocop/cop/style/min_max.rb +14 -14
  429. data/lib/rubocop/cop/style/missing_else.rb +79 -12
  430. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
  431. data/lib/rubocop/cop/style/mixin_grouping.rb +46 -33
  432. data/lib/rubocop/cop/style/mixin_usage.rb +32 -15
  433. data/lib/rubocop/cop/style/module_function.rb +102 -20
  434. data/lib/rubocop/cop/style/multiline_block_chain.rb +14 -3
  435. data/lib/rubocop/cop/style/multiline_if_modifier.rb +7 -7
  436. data/lib/rubocop/cop/style/multiline_if_then.rb +16 -14
  437. data/lib/rubocop/cop/style/multiline_memoization.rb +12 -17
  438. data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
  439. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +31 -1
  440. data/lib/rubocop/cop/style/multiline_when_then.rb +74 -0
  441. data/lib/rubocop/cop/style/multiple_comparison.rb +19 -4
  442. data/lib/rubocop/cop/style/mutable_constant.rb +123 -15
  443. data/lib/rubocop/cop/style/negated_if.rb +26 -34
  444. data/lib/rubocop/cop/style/negated_unless.rb +89 -0
  445. data/lib/rubocop/cop/style/negated_while.rb +22 -6
  446. data/lib/rubocop/cop/style/nested_modifier.rb +28 -8
  447. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +25 -24
  448. data/lib/rubocop/cop/style/nested_ternary_operator.rb +39 -1
  449. data/lib/rubocop/cop/style/next.rb +64 -35
  450. data/lib/rubocop/cop/style/nil_comparison.rb +51 -11
  451. data/lib/rubocop/cop/style/non_nil_check.rb +42 -27
  452. data/lib/rubocop/cop/style/not.rb +21 -8
  453. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +46 -23
  454. data/lib/rubocop/cop/style/numeric_literals.rb +31 -18
  455. data/lib/rubocop/cop/style/numeric_predicate.rb +26 -32
  456. data/lib/rubocop/cop/style/one_line_conditional.rb +36 -18
  457. data/lib/rubocop/cop/style/option_hash.rb +22 -14
  458. data/lib/rubocop/cop/style/optional_arguments.rb +3 -6
  459. data/lib/rubocop/cop/style/or_assignment.rb +17 -9
  460. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  461. data/lib/rubocop/cop/style/parentheses_around_condition.rb +65 -5
  462. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +33 -6
  463. data/lib/rubocop/cop/style/percent_q_literals.rb +29 -8
  464. data/lib/rubocop/cop/style/perl_backrefs.rb +10 -3
  465. data/lib/rubocop/cop/style/preferred_hash_methods.rb +7 -10
  466. data/lib/rubocop/cop/style/proc.rb +12 -4
  467. data/lib/rubocop/cop/style/raise_args.rb +27 -21
  468. data/lib/rubocop/cop/style/random_with_offset.rb +152 -0
  469. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  470. data/lib/rubocop/cop/style/redundant_begin.rb +48 -5
  471. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +19 -9
  472. data/lib/rubocop/cop/style/redundant_condition.rb +124 -0
  473. data/lib/rubocop/cop/style/redundant_conditional.rb +17 -14
  474. data/lib/rubocop/cop/style/redundant_exception.rb +26 -17
  475. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  476. data/lib/rubocop/cop/style/redundant_freeze.rb +24 -2
  477. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +20 -24
  478. data/lib/rubocop/cop/style/redundant_parentheses.rb +59 -27
  479. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +40 -24
  480. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +90 -0
  481. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
  482. data/lib/rubocop/cop/style/redundant_return.rb +87 -51
  483. data/lib/rubocop/cop/style/redundant_self.rb +56 -41
  484. data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
  485. data/lib/rubocop/cop/{performance → style}/redundant_sort_by.rb +9 -7
  486. data/lib/rubocop/cop/style/regexp_literal.rb +126 -20
  487. data/lib/rubocop/cop/style/rescue_modifier.rb +39 -3
  488. data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
  489. data/lib/rubocop/cop/style/return_nil.rb +8 -12
  490. data/lib/rubocop/cop/style/safe_navigation.rb +123 -31
  491. data/lib/rubocop/cop/{performance → style}/sample.rb +17 -13
  492. data/lib/rubocop/cop/style/self_assignment.rb +14 -14
  493. data/lib/rubocop/cop/style/semicolon.rb +45 -14
  494. data/lib/rubocop/cop/style/send.rb +12 -2
  495. data/lib/rubocop/cop/style/signal_exception.rb +104 -3
  496. data/lib/rubocop/cop/style/single_line_block_params.rb +22 -2
  497. data/lib/rubocop/cop/style/single_line_methods.rb +41 -31
  498. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  499. data/lib/rubocop/cop/style/special_global_vars.rb +75 -24
  500. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +13 -21
  501. data/lib/rubocop/cop/style/stderr_puts.rb +14 -5
  502. data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
  503. data/lib/rubocop/cop/style/string_literals.rb +29 -3
  504. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +7 -9
  505. data/lib/rubocop/cop/style/string_methods.rb +19 -7
  506. data/lib/rubocop/cop/{performance/lstrip_rstrip.rb → style/strip.rb} +10 -7
  507. data/lib/rubocop/cop/style/struct_inheritance.rb +36 -8
  508. data/lib/rubocop/cop/style/symbol_array.rb +51 -17
  509. data/lib/rubocop/cop/style/symbol_literal.rb +3 -3
  510. data/lib/rubocop/cop/style/symbol_proc.rb +32 -54
  511. data/lib/rubocop/cop/style/ternary_parentheses.rb +69 -53
  512. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  513. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
  514. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  515. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +69 -24
  516. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +99 -0
  517. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  518. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +100 -0
  519. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
  520. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +19 -9
  521. data/lib/rubocop/cop/style/trivial_accessors.rb +51 -20
  522. data/lib/rubocop/cop/style/unless_else.rb +21 -5
  523. data/lib/rubocop/cop/style/unpack_first.rb +61 -0
  524. data/lib/rubocop/cop/style/variable_interpolation.rb +22 -21
  525. data/lib/rubocop/cop/style/when_then.rb +15 -2
  526. data/lib/rubocop/cop/style/while_until_do.rb +26 -4
  527. data/lib/rubocop/cop/style/while_until_modifier.rb +26 -7
  528. data/lib/rubocop/cop/style/word_array.rb +22 -18
  529. data/lib/rubocop/cop/style/yoda_condition.rb +96 -36
  530. data/lib/rubocop/cop/style/zero_length_predicate.rb +40 -20
  531. data/lib/rubocop/cop/team.rb +159 -91
  532. data/lib/rubocop/cop/util.rb +51 -209
  533. data/lib/rubocop/cop/utils/format_string.rb +137 -0
  534. data/lib/rubocop/cop/variable_force/assignment.rb +9 -2
  535. data/lib/rubocop/cop/variable_force/branch.rb +5 -3
  536. data/lib/rubocop/cop/variable_force/branchable.rb +2 -0
  537. data/lib/rubocop/cop/variable_force/scope.rb +8 -5
  538. data/lib/rubocop/cop/variable_force/variable.rb +21 -10
  539. data/lib/rubocop/cop/variable_force/variable_table.rb +4 -3
  540. data/lib/rubocop/cop/variable_force.rb +41 -36
  541. data/lib/rubocop/core_ext/string.rb +23 -0
  542. data/lib/rubocop/error.rb +23 -0
  543. data/lib/rubocop/ext/processed_source.rb +18 -0
  544. data/lib/rubocop/file_finder.rb +42 -0
  545. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
  546. data/lib/rubocop/formatter/base_formatter.rb +3 -7
  547. data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
  548. data/lib/rubocop/formatter/disabled_config_formatter.rb +84 -49
  549. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  550. data/lib/rubocop/formatter/file_list_formatter.rb +2 -1
  551. data/lib/rubocop/formatter/formatter_set.rb +17 -16
  552. data/lib/rubocop/formatter/fuubar_style_formatter.rb +2 -2
  553. data/lib/rubocop/formatter/html_formatter.rb +13 -6
  554. data/lib/rubocop/formatter/json_formatter.rb +16 -9
  555. data/lib/rubocop/formatter/junit_formatter.rb +84 -0
  556. data/lib/rubocop/formatter/offense_count_formatter.rb +17 -0
  557. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  558. data/lib/rubocop/formatter/progress_formatter.rb +1 -1
  559. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  560. data/lib/rubocop/formatter/simple_text_formatter.rb +18 -5
  561. data/lib/rubocop/formatter/tap_formatter.rb +17 -6
  562. data/lib/rubocop/magic_comment.rb +15 -11
  563. data/lib/rubocop/name_similarity.rb +17 -10
  564. data/lib/rubocop/options.rb +267 -139
  565. data/lib/rubocop/path_util.rb +45 -7
  566. data/lib/rubocop/platform.rb +1 -1
  567. data/lib/rubocop/rake_task.rb +7 -9
  568. data/lib/rubocop/remote_config.rb +23 -9
  569. data/lib/rubocop/result_cache.rb +50 -23
  570. data/lib/rubocop/rspec/cop_helper.rb +10 -37
  571. data/lib/rubocop/rspec/expect_offense.rb +124 -12
  572. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +1 -5
  573. data/lib/rubocop/rspec/shared_contexts.rb +78 -39
  574. data/lib/rubocop/rspec/support.rb +5 -1
  575. data/lib/rubocop/runner.rb +109 -59
  576. data/lib/rubocop/string_interpreter.rb +8 -8
  577. data/lib/rubocop/target_finder.rb +62 -68
  578. data/lib/rubocop/target_ruby.rb +154 -0
  579. data/lib/rubocop/version.rb +8 -4
  580. data/lib/rubocop/yaml_duplication_checker.rb +39 -0
  581. data/lib/rubocop.rb +188 -149
  582. metadata +257 -182
  583. data/config/disabled.yml +0 -118
  584. data/config/enabled.yml +0 -1892
  585. data/lib/rubocop/ast/builder.rb +0 -70
  586. data/lib/rubocop/ast/node/and_node.rb +0 -37
  587. data/lib/rubocop/ast/node/args_node.rb +0 -12
  588. data/lib/rubocop/ast/node/array_node.rb +0 -57
  589. data/lib/rubocop/ast/node/block_node.rb +0 -116
  590. data/lib/rubocop/ast/node/case_node.rb +0 -64
  591. data/lib/rubocop/ast/node/def_node.rb +0 -71
  592. data/lib/rubocop/ast/node/ensure_node.rb +0 -25
  593. data/lib/rubocop/ast/node/for_node.rb +0 -61
  594. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  595. data/lib/rubocop/ast/node/if_node.rb +0 -146
  596. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  597. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -23
  598. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  599. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  600. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  601. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -174
  602. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -89
  603. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  604. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  605. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  606. data/lib/rubocop/ast/node/or_node.rb +0 -37
  607. data/lib/rubocop/ast/node/pair_node.rb +0 -64
  608. data/lib/rubocop/ast/node/regexp_node.rb +0 -35
  609. data/lib/rubocop/ast/node/resbody_node.rb +0 -25
  610. data/lib/rubocop/ast/node/send_node.rb +0 -25
  611. data/lib/rubocop/ast/node/super_node.rb +0 -21
  612. data/lib/rubocop/ast/node/until_node.rb +0 -43
  613. data/lib/rubocop/ast/node/when_node.rb +0 -61
  614. data/lib/rubocop/ast/node/while_node.rb +0 -43
  615. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  616. data/lib/rubocop/ast/node.rb +0 -604
  617. data/lib/rubocop/ast/sexp.rb +0 -16
  618. data/lib/rubocop/ast/traversal.rb +0 -171
  619. data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
  620. data/lib/rubocop/cop/layout/align_array.rb +0 -35
  621. data/lib/rubocop/cop/layout/align_hash.rb +0 -235
  622. data/lib/rubocop/cop/layout/indent_array.rb +0 -114
  623. data/lib/rubocop/cop/layout/indent_heredoc.rb +0 -168
  624. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  625. data/lib/rubocop/cop/layout/tab.rb +0 -60
  626. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  627. data/lib/rubocop/cop/lint/handle_exceptions.rb +0 -56
  628. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
  629. data/lib/rubocop/cop/metrics/line_length.rb +0 -171
  630. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -149
  631. data/lib/rubocop/cop/mixin/classish_length.rb +0 -36
  632. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
  633. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
  634. data/lib/rubocop/cop/mixin/target_rails_version.rb +0 -16
  635. data/lib/rubocop/cop/performance/caller.rb +0 -69
  636. data/lib/rubocop/cop/performance/case_when_splat.rb +0 -176
  637. data/lib/rubocop/cop/performance/casecmp.rb +0 -107
  638. data/lib/rubocop/cop/performance/compare_with_block.rb +0 -111
  639. data/lib/rubocop/cop/performance/count.rb +0 -100
  640. data/lib/rubocop/cop/performance/detect.rb +0 -107
  641. data/lib/rubocop/cop/performance/double_start_end_with.rb +0 -99
  642. data/lib/rubocop/cop/performance/end_with.rb +0 -55
  643. data/lib/rubocop/cop/performance/fixed_size.rb +0 -56
  644. data/lib/rubocop/cop/performance/flat_map.rb +0 -75
  645. data/lib/rubocop/cop/performance/hash_each_methods.rb +0 -128
  646. data/lib/rubocop/cop/performance/range_include.rb +0 -41
  647. data/lib/rubocop/cop/performance/redundant_block_call.rb +0 -93
  648. data/lib/rubocop/cop/performance/redundant_match.rb +0 -56
  649. data/lib/rubocop/cop/performance/redundant_merge.rb +0 -167
  650. data/lib/rubocop/cop/performance/regexp_match.rb +0 -223
  651. data/lib/rubocop/cop/performance/reverse_each.rb +0 -40
  652. data/lib/rubocop/cop/performance/size.rb +0 -71
  653. data/lib/rubocop/cop/performance/start_with.rb +0 -58
  654. data/lib/rubocop/cop/performance/string_replacement.rb +0 -170
  655. data/lib/rubocop/cop/performance/times_map.rb +0 -72
  656. data/lib/rubocop/cop/performance/unfreeze_string.rb +0 -50
  657. data/lib/rubocop/cop/performance/uri_default_parser.rb +0 -47
  658. data/lib/rubocop/cop/rails/action_filter.rb +0 -94
  659. data/lib/rubocop/cop/rails/active_support_aliases.rb +0 -67
  660. data/lib/rubocop/cop/rails/application_job.rb +0 -32
  661. data/lib/rubocop/cop/rails/application_record.rb +0 -32
  662. data/lib/rubocop/cop/rails/blank.rb +0 -141
  663. data/lib/rubocop/cop/rails/date.rb +0 -128
  664. data/lib/rubocop/cop/rails/delegate.rb +0 -135
  665. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +0 -51
  666. data/lib/rubocop/cop/rails/dynamic_find_by.rb +0 -81
  667. data/lib/rubocop/cop/rails/enum_uniqueness.rb +0 -43
  668. data/lib/rubocop/cop/rails/exit.rb +0 -61
  669. data/lib/rubocop/cop/rails/file_path.rb +0 -72
  670. data/lib/rubocop/cop/rails/find_by.rb +0 -52
  671. data/lib/rubocop/cop/rails/find_each.rb +0 -47
  672. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +0 -18
  673. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +0 -72
  674. data/lib/rubocop/cop/rails/http_positional_arguments.rb +0 -107
  675. data/lib/rubocop/cop/rails/not_null_column.rb +0 -67
  676. data/lib/rubocop/cop/rails/output.rb +0 -23
  677. data/lib/rubocop/cop/rails/output_safety.rb +0 -99
  678. data/lib/rubocop/cop/rails/pluralization_grammar.rb +0 -106
  679. data/lib/rubocop/cop/rails/present.rb +0 -140
  680. data/lib/rubocop/cop/rails/read_write_attribute.rb +0 -65
  681. data/lib/rubocop/cop/rails/relative_date_constant.rb +0 -88
  682. data/lib/rubocop/cop/rails/request_referer.rb +0 -56
  683. data/lib/rubocop/cop/rails/reversible_migration.rb +0 -282
  684. data/lib/rubocop/cop/rails/safe_navigation.rb +0 -91
  685. data/lib/rubocop/cop/rails/save_bang.rb +0 -162
  686. data/lib/rubocop/cop/rails/scope_args.rb +0 -29
  687. data/lib/rubocop/cop/rails/skips_model_validations.rb +0 -70
  688. data/lib/rubocop/cop/rails/time_zone.rb +0 -198
  689. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +0 -95
  690. data/lib/rubocop/cop/rails/unknown_env.rb +0 -63
  691. data/lib/rubocop/cop/rails/validation.rb +0 -64
  692. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -141
  693. data/lib/rubocop/cop/style/flip_flop.rb +0 -20
  694. data/lib/rubocop/cop/style/method_missing.rb +0 -68
  695. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +0 -56
  696. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  697. data/lib/rubocop/node_pattern.rb +0 -561
  698. data/lib/rubocop/processed_source.rb +0 -147
  699. data/lib/rubocop/rspec/shared_examples.rb +0 -92
  700. data/lib/rubocop/string_util.rb +0 -158
  701. data/lib/rubocop/token.rb +0 -25
  702. /data/{bin → exe}/rubocop +0 -0
@@ -5,9 +5,34 @@ module RuboCop
5
5
  module Layout
6
6
  # Checks that the equals signs in parameter default assignments
7
7
  # have or don't have surrounding space depending on configuration.
8
+ #
9
+ # @example EnforcedStyle: space (default)
10
+ # # bad
11
+ # def some_method(arg1=:default, arg2=nil, arg3=[])
12
+ # # do something...
13
+ # end
14
+ #
15
+ # # good
16
+ # def some_method(arg1 = :default, arg2 = nil, arg3 = [])
17
+ # # do something...
18
+ # end
19
+ #
20
+ # @example EnforcedStyle: no_space
21
+ # # bad
22
+ # def some_method(arg1 = :default, arg2 = nil, arg3 = [])
23
+ # # do something...
24
+ # end
25
+ #
26
+ # # good
27
+ # def some_method(arg1=:default, arg2=nil, arg3=[])
28
+ # # do something...
29
+ # end
8
30
  class SpaceAroundEqualsInParameterDefault < Cop
9
31
  include SurroundingSpace
10
32
  include ConfigurableEnforcedStyle
33
+ include RangeHelp
34
+
35
+ MSG = 'Surrounding space %<type>s in default value assignment.'
11
36
 
12
37
  def on_optarg(node)
13
38
  index = index_of_first_token(node)
@@ -15,11 +40,18 @@ module RuboCop
15
40
  check_optarg(arg, equals, value)
16
41
  end
17
42
 
43
+ def autocorrect(range)
44
+ m = range.source.match(/=\s*(\S+)/)
45
+ rest = m ? m.captures[0] : ''
46
+ replacement = style == :space ? ' = ' : '='
47
+ ->(corrector) { corrector.replace(range, replacement + rest) }
48
+ end
49
+
18
50
  private
19
51
 
20
52
  def check_optarg(arg, equals, value)
21
- space_on_both_sides = space_on_both_sides?(arg, equals, value)
22
- no_surrounding_space = no_surrounding_space?(arg, equals, value)
53
+ space_on_both_sides = space_on_both_sides?(arg, equals)
54
+ no_surrounding_space = no_surrounding_space?(arg, equals)
23
55
 
24
56
  if style == :space && space_on_both_sides ||
25
57
  style == :no_space && no_surrounding_space
@@ -32,7 +64,7 @@ module RuboCop
32
64
 
33
65
  def incorrect_style_detected(arg, value, space_on_both_sides,
34
66
  no_surrounding_space)
35
- range = range_between(arg.pos.end_pos, value.pos.begin_pos)
67
+ range = range_between(arg.end_pos, value.begin_pos)
36
68
  add_offense(range, location: range) do
37
69
  if style == :space && no_surrounding_space ||
38
70
  style == :no_space && space_on_both_sides
@@ -43,24 +75,16 @@ module RuboCop
43
75
  end
44
76
  end
45
77
 
46
- def space_on_both_sides?(arg, equals, value)
47
- space_between?(arg, equals) && space_between?(equals, value)
78
+ def space_on_both_sides?(arg, equals)
79
+ arg.space_after? && equals.space_after?
48
80
  end
49
81
 
50
- def no_surrounding_space?(arg, equals, value)
51
- !space_between?(arg, equals) && !space_between?(equals, value)
82
+ def no_surrounding_space?(arg, equals)
83
+ !arg.space_after? && !equals.space_after?
52
84
  end
53
85
 
54
- def message(_)
55
- format('Surrounding space %s in default value assignment.',
56
- style == :space ? 'missing' : 'detected')
57
- end
58
-
59
- def autocorrect(range)
60
- m = range.source.match(/=\s*(\S+)/)
61
- rest = m ? m.captures[0] : ''
62
- replacement = style == :space ? ' = ' : '='
63
- ->(corrector) { corrector.replace(range, replacement + rest) }
86
+ def message(_node)
87
+ format(MSG, type: style == :space ? 'missing' : 'detected')
64
88
  end
65
89
  end
66
90
  end
@@ -25,15 +25,17 @@ module RuboCop
25
25
  #
26
26
  # something = 123 if test
27
27
  class SpaceAroundKeyword < Cop
28
- MSG_BEFORE = 'Space before keyword `%s` is missing.'.freeze
29
- MSG_AFTER = 'Space after keyword `%s` is missing.'.freeze
28
+ MSG_BEFORE = 'Space before keyword `%<range>s` is missing.'
29
+ MSG_AFTER = 'Space after keyword `%<range>s` is missing.'
30
30
 
31
- DO = 'do'.freeze
32
- SAFE_NAVIGATION = '&.'.freeze
31
+ DO = 'do'
32
+ SAFE_NAVIGATION = '&.'
33
+ NAMESPACE_OPERATOR = '::'
33
34
  ACCEPT_LEFT_PAREN =
34
35
  %w[break defined? next not rescue return super yield].freeze
35
36
  ACCEPT_LEFT_SQUARE_BRACKET =
36
37
  %w[super yield].freeze
38
+ ACCEPT_NAMESPACE_OPERATOR = 'super'
37
39
 
38
40
  def on_and(node)
39
41
  check(node, [:operator].freeze) if node.keyword?
@@ -60,7 +62,7 @@ module RuboCop
60
62
  end
61
63
 
62
64
  def on_if(node)
63
- check(node, %i[keyword else begin end].freeze, 'then'.freeze)
65
+ check(node, %i[keyword else begin end].freeze, 'then')
64
66
  end
65
67
 
66
68
  def on_kwbegin(node)
@@ -96,7 +98,7 @@ module RuboCop
96
98
  end
97
99
 
98
100
  def on_send(node)
99
- check(node, [:selector].freeze) if node.keyword_not?
101
+ check(node, [:selector].freeze) if node.prefix_not?
100
102
  end
101
103
 
102
104
  def on_super(node)
@@ -127,11 +129,20 @@ module RuboCop
127
129
  check(node, [:keyword].freeze)
128
130
  end
129
131
 
132
+ def autocorrect(range)
133
+ if space_before_missing?(range)
134
+ ->(corrector) { corrector.insert_before(range, ' ') }
135
+ else
136
+ ->(corrector) { corrector.insert_after(range, ' ') }
137
+ end
138
+ end
139
+
130
140
  private
131
141
 
132
142
  def check(node, locations, begin_keyword = DO)
133
143
  locations.each do |loc|
134
144
  next unless node.loc.respond_to?(loc)
145
+
135
146
  range = node.loc.public_send(loc)
136
147
  next unless range
137
148
 
@@ -156,7 +167,7 @@ module RuboCop
156
167
  end
157
168
 
158
169
  def do?(node)
159
- node.loc.begin && node.loc.begin.is?(DO)
170
+ node.loc.begin&.is?(DO)
160
171
  end
161
172
 
162
173
  def check_keyword(node, range)
@@ -166,13 +177,16 @@ module RuboCop
166
177
  end
167
178
 
168
179
  def offense(range, msg)
169
- add_offense(range, location: range, message: msg % range.source)
180
+ add_offense(range,
181
+ location: range,
182
+ message: format(msg, range: range.source))
170
183
  end
171
184
 
172
185
  def space_before_missing?(range)
173
186
  pos = range.begin_pos - 1
174
- return false if pos < 0
175
- range.source_buffer.source[pos] !~ /[\s\(\|\{\[;,\*\=]/
187
+ return false if pos.negative?
188
+
189
+ !/[\s(|{\[;,*=]/.match?(range.source_buffer.source[pos])
176
190
  end
177
191
 
178
192
  def space_after_missing?(range)
@@ -181,8 +195,10 @@ module RuboCop
181
195
 
182
196
  return false if accepted_opening_delimiter?(range, char)
183
197
  return false if safe_navigation_call?(range, pos)
198
+ return false if accept_namespace_operator?(range) &&
199
+ namespace_operator?(range, pos)
184
200
 
185
- char !~ /[\s;,#\\\)\}\]\.]/
201
+ !/[\s;,#\\)}\].]/.match?(char)
186
202
  end
187
203
 
188
204
  def accepted_opening_delimiter?(range, char)
@@ -200,28 +216,28 @@ module RuboCop
200
216
  ACCEPT_LEFT_SQUARE_BRACKET.include?(range.source)
201
217
  end
202
218
 
219
+ def accept_namespace_operator?(range)
220
+ ACCEPT_NAMESPACE_OPERATOR == range.source
221
+ end
222
+
203
223
  def safe_navigation_call?(range, pos)
204
224
  range.source_buffer.source[pos, 2].start_with?(SAFE_NAVIGATION)
205
225
  end
206
226
 
227
+ def namespace_operator?(range, pos)
228
+ range.source_buffer.source[pos, 2].start_with?(NAMESPACE_OPERATOR)
229
+ end
230
+
207
231
  def preceded_by_operator?(node, _range)
208
232
  # regular dotted method calls bind more tightly than operators
209
233
  # so we need to climb up the AST past them
210
234
  node.each_ancestor do |ancestor|
211
235
  return true if ancestor.and_type? || ancestor.or_type?
212
236
  return false unless ancestor.send_type?
213
- return true if operator?(ancestor.method_name)
237
+ return true if ancestor.operator_method?
214
238
  end
215
239
  false
216
240
  end
217
-
218
- def autocorrect(range)
219
- if space_before_missing?(range)
220
- ->(corrector) { corrector.insert_before(range, ' '.freeze) }
221
- else
222
- ->(corrector) { corrector.insert_after(range, ' '.freeze) }
223
- end
224
- end
225
241
  end
226
242
  end
227
243
  end
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # Checks method call operators to not have spaces around them.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # foo. bar
11
+ # foo .bar
12
+ # foo . bar
13
+ # foo. bar .buzz
14
+ # foo
15
+ # . bar
16
+ # . buzz
17
+ # foo&. bar
18
+ # foo &.bar
19
+ # foo &. bar
20
+ # foo &. bar&. buzz
21
+ # RuboCop:: Cop
22
+ # RuboCop:: Cop:: Cop
23
+ # :: RuboCop::Cop
24
+ #
25
+ # # good
26
+ # foo.bar
27
+ # foo.bar.buzz
28
+ # foo
29
+ # .bar
30
+ # .buzz
31
+ # foo&.bar
32
+ # foo&.bar&.buzz
33
+ # RuboCop::Cop
34
+ # RuboCop::Cop::Cop
35
+ # ::RuboCop::Cop
36
+ #
37
+ class SpaceAroundMethodCallOperator < Cop
38
+ include SurroundingSpace
39
+
40
+ MSG = 'Avoid using spaces around a method call operator.'
41
+
42
+ def on_send(node)
43
+ return unless dot_or_safe_navigation_operator?(node)
44
+
45
+ check_and_add_offense(node)
46
+ end
47
+
48
+ def on_const(node)
49
+ return unless node.loc.double_colon
50
+
51
+ check_and_add_offense(node, false)
52
+ end
53
+
54
+ def autocorrect(node)
55
+ operator = operator_token(node)
56
+ left = left_token_for_auto_correction(node, operator)
57
+ right = right_token_for_auto_correction(operator)
58
+
59
+ lambda do |corrector|
60
+ SpaceCorrector.remove_space(
61
+ processed_source, corrector, left, right
62
+ )
63
+ end
64
+ end
65
+
66
+ alias on_csend on_send
67
+
68
+ private
69
+
70
+ def check_and_add_offense(node, add_left_offense = true)
71
+ operator = operator_token(node)
72
+ left = previous_token(operator)
73
+ right = next_token(operator)
74
+
75
+ if !right.comment? && valid_right_token?(right, operator)
76
+ no_space_offenses(node, operator, right, MSG)
77
+ end
78
+ return unless valid_left_token?(left, operator)
79
+
80
+ no_space_offenses(node, left, operator, MSG) if add_left_offense
81
+ end
82
+
83
+ def operator_token(node)
84
+ operator_location =
85
+ node.const_type? ? node.loc.double_colon : node.loc.dot
86
+
87
+ processed_source.find_token do |token|
88
+ token.pos == operator_location
89
+ end
90
+ end
91
+
92
+ def previous_token(current_token)
93
+ index = processed_source.tokens.index(current_token)
94
+ index.zero? ? nil : processed_source.tokens[index - 1]
95
+ end
96
+
97
+ def next_token(current_token)
98
+ index = processed_source.tokens.index(current_token)
99
+ processed_source.tokens[index + 1]
100
+ end
101
+
102
+ def dot_or_safe_navigation_operator?(node)
103
+ node.dot? || node.safe_navigation?
104
+ end
105
+
106
+ def valid_left_token?(left, operator)
107
+ left && left.line == operator.line
108
+ end
109
+
110
+ def valid_right_token?(right, operator)
111
+ right && right.line == operator.line
112
+ end
113
+
114
+ def left_token_for_auto_correction(node, operator)
115
+ left_token = previous_token(operator)
116
+ return operator if node.const_type?
117
+ return left_token if valid_left_token?(left_token, operator)
118
+
119
+ operator
120
+ end
121
+
122
+ def right_token_for_auto_correction(operator)
123
+ right_token = next_token(operator)
124
+ return right_token if !right_token.comment? && valid_right_token?(right_token, operator)
125
+
126
+ operator
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -3,12 +3,58 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Checks that operators have space around them, except for **
7
- # which should not have surrounding space.
6
+ # Checks that operators have space around them, except for ** which
7
+ # should or shouldn't have surrounding space depending on configuration.
8
+ #
9
+ # This cop has `AllowForAlignment` option. When `true`, allows most
10
+ # uses of extra spacing if the intent is to align with an operator on
11
+ # the previous or next line, not counting empty lines or comment lines.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # total = 3*4
16
+ # "apple"+"juice"
17
+ # my_number = 38/4
18
+ #
19
+ # # good
20
+ # total = 3 * 4
21
+ # "apple" + "juice"
22
+ # my_number = 38 / 4
23
+ #
24
+ # @example AllowForAlignment: true (default)
25
+ # # good
26
+ # {
27
+ # 1 => 2,
28
+ # 11 => 3
29
+ # }
30
+ #
31
+ # @example AllowForAlignment: false
32
+ # # bad
33
+ # {
34
+ # 1 => 2,
35
+ # 11 => 3
36
+ # }
37
+ #
38
+ # @example EnforcedStyleForExponentOperator: no_space (default)
39
+ # # bad
40
+ # a ** b
41
+ #
42
+ # # good
43
+ # a**b
44
+ #
45
+ # @example EnforcedStyleForExponentOperator: space
46
+ # # bad
47
+ # a**b
48
+ #
49
+ # # good
50
+ # a ** b
8
51
  class SpaceAroundOperators < Cop
9
52
  include PrecedingFollowingAlignment
53
+ include RangeHelp
54
+ include RationalLiteral
10
55
 
11
56
  IRREGULAR_METHODS = %i[[] ! []=].freeze
57
+ EXCESSIVE_SPACE = ' '
12
58
 
13
59
  def self.autocorrect_incompatible_with
14
60
  [Style::SelfAssignment]
@@ -19,14 +65,14 @@ module RuboCop
19
65
 
20
66
  return if hash_table_style? && !node.parent.pairs_on_same_line?
21
67
 
22
- check_operator(node.loc.operator, node.source_range)
68
+ check_operator(:pair, node.loc.operator, node.source_range)
23
69
  end
24
70
 
25
71
  def on_if(node)
26
72
  return unless node.ternary?
27
73
 
28
- check_operator(node.loc.question, node.if_branch.source_range)
29
- check_operator(node.loc.colon, node.else_branch.source_range)
74
+ check_operator(:if, node.loc.question, node.if_branch.source_range)
75
+ check_operator(:if, node.loc.colon, node.else_branch.source_range)
30
76
  end
31
77
 
32
78
  def on_resbody(node)
@@ -34,45 +80,70 @@ module RuboCop
34
80
 
35
81
  _, variable, = *node
36
82
 
37
- check_operator(node.loc.assoc, variable.source_range)
83
+ check_operator(:resbody, node.loc.assoc, variable.source_range)
38
84
  end
39
85
 
40
86
  def on_send(node)
87
+ return if rational_literal?(node)
88
+
41
89
  if node.setter_method?
42
90
  on_special_asgn(node)
43
91
  elsif regular_operator?(node)
44
- check_operator(node.loc.selector, node.first_argument.source_range)
92
+ check_operator(:send,
93
+ node.loc.selector,
94
+ node.first_argument.source_range)
45
95
  end
46
96
  end
47
97
 
98
+ def on_assignment(node)
99
+ _, rhs, = *node
100
+
101
+ return unless rhs
102
+
103
+ check_operator(:assignment, node.loc.operator, rhs.source_range)
104
+ end
105
+
48
106
  def on_binary(node)
49
107
  _, rhs, = *node
50
108
 
51
109
  return unless rhs
52
110
 
53
- check_operator(node.loc.operator, rhs.source_range)
111
+ check_operator(:binary, node.loc.operator, rhs.source_range)
54
112
  end
55
113
 
56
114
  def on_special_asgn(node)
57
115
  _, _, right, = *node
58
116
 
59
117
  return unless right
60
- check_operator(node.loc.operator, right.source_range)
118
+
119
+ check_operator(:special_asgn, node.loc.operator, right.source_range)
61
120
  end
62
121
 
63
122
  alias on_or on_binary
64
123
  alias on_and on_binary
65
- alias on_lvasgn on_binary
66
- alias on_masgn on_binary
124
+ alias on_lvasgn on_assignment
125
+ alias on_masgn on_assignment
67
126
  alias on_casgn on_special_asgn
68
- alias on_ivasgn on_binary
69
- alias on_cvasgn on_binary
70
- alias on_gvasgn on_binary
127
+ alias on_ivasgn on_assignment
128
+ alias on_cvasgn on_assignment
129
+ alias on_gvasgn on_assignment
71
130
  alias on_class on_binary
72
- alias on_or_asgn on_binary
73
- alias on_and_asgn on_binary
131
+ alias on_or_asgn on_assignment
132
+ alias on_and_asgn on_assignment
74
133
  alias on_op_asgn on_special_asgn
75
134
 
135
+ def autocorrect(range)
136
+ lambda do |corrector|
137
+ if /\*\*/.match?(range.source) && !space_around_exponent_operator?
138
+ corrector.replace(range, '**')
139
+ elsif range.source.end_with?("\n")
140
+ corrector.replace(range, " #{range.source.strip}\n")
141
+ else
142
+ enclose_operator_with_space(corrector, range)
143
+ end
144
+ end
145
+ end
146
+
76
147
  private
77
148
 
78
149
  def regular_operator?(send_node)
@@ -85,61 +156,86 @@ module RuboCop
85
156
  !IRREGULAR_METHODS.include?(send_node.method_name)
86
157
  end
87
158
 
88
- def check_operator(op, right_operand)
89
- with_space = range_with_surrounding_space(op)
159
+ def check_operator(type, operator, right_operand)
160
+ with_space = range_with_surrounding_space(range: operator)
90
161
  return if with_space.source.start_with?("\n")
91
162
 
92
- offense(op, with_space, right_operand) do |msg|
93
- add_offense(with_space, location: op, message: msg)
163
+ offense(type, operator, with_space, right_operand) do |msg|
164
+ add_offense(with_space, location: operator, message: msg)
94
165
  end
95
166
  end
96
167
 
97
- def offense(op, with_space, right_operand)
98
- msg = offense_message(op, with_space, right_operand)
168
+ def offense(type, operator, with_space, right_operand)
169
+ msg = offense_message(type, operator, with_space, right_operand)
99
170
  yield msg if msg
100
171
  end
101
172
 
102
- def offense_message(op, with_space, right_operand)
103
- if op.is?('**')
104
- 'Space around operator `**` detected.' unless with_space.is?('**')
105
- elsif with_space.source !~ /^\s.*\s$/
106
- "Surrounding space missing for operator `#{op.source}`."
107
- elsif excess_leading_space?(op, with_space) ||
173
+ def enclose_operator_with_space(corrector, range)
174
+ operator = range.source
175
+
176
+ # If `ForceEqualSignAlignment` is true, `Layout/ExtraSpacing` cop
177
+ # inserts spaces before operator. If `Layout/SpaceAroundOperators` cop
178
+ # inserts a space, it collides and raises the infinite loop error.
179
+ if force_equal_sign_alignment?
180
+ corrector.insert_after(range, ' ') unless operator.end_with?(' ')
181
+ else
182
+ corrector.replace(range, " #{operator.strip} ")
183
+ end
184
+ end
185
+
186
+ def offense_message(type, operator, with_space, right_operand)
187
+ if should_not_have_surrounding_space?(operator)
188
+ return if with_space.is?(operator.source)
189
+
190
+ "Space around operator `#{operator.source}` detected."
191
+ elsif !/^\s.*\s$/.match?(with_space.source)
192
+ "Surrounding space missing for operator `#{operator.source}`."
193
+ elsif excess_leading_space?(type, operator, with_space) ||
108
194
  excess_trailing_space?(right_operand, with_space)
109
- "Operator `#{op.source}` should be surrounded by a single space."
195
+ "Operator `#{operator.source}` should be surrounded " \
196
+ 'by a single space.'
110
197
  end
111
198
  end
112
199
 
113
- def excess_leading_space?(op, with_space)
114
- with_space.source =~ /^ / &&
115
- (!allow_for_alignment? || !aligned_with_operator?(op))
200
+ def excess_leading_space?(type, operator, with_space)
201
+ return false unless allow_for_alignment?
202
+ return false unless with_space.source.start_with?(EXCESSIVE_SPACE)
203
+
204
+ return !aligned_with_operator?(operator) unless type == :assignment
205
+
206
+ token = Token.new(operator, nil, operator.source)
207
+ align_preceding = aligned_with_preceding_assignment(token)
208
+
209
+ return align_preceding == :no unless align_preceding == :none
210
+
211
+ aligned_with_subsequent_assignment(token) != :yes
116
212
  end
117
213
 
118
214
  def excess_trailing_space?(right_operand, with_space)
119
- with_space.source =~ / $/ &&
215
+ with_space.source.end_with?(EXCESSIVE_SPACE) &&
120
216
  (!allow_for_alignment? || !aligned_with_something?(right_operand))
121
217
  end
122
218
 
123
- def autocorrect(range)
124
- lambda do |corrector|
125
- if range.source =~ /\*\*/
126
- corrector.replace(range, '**')
127
- elsif range.source.end_with?("\n")
128
- corrector.replace(range, " #{range.source.strip}\n")
129
- else
130
- corrector.replace(range, " #{range.source.strip} ")
131
- end
132
- end
133
- end
134
-
135
219
  def align_hash_cop_config
136
- config.for_cop('Layout/AlignHash')
220
+ config.for_cop('Layout/HashAlignment')
137
221
  end
138
222
 
139
223
  def hash_table_style?
140
224
  align_hash_cop_config &&
141
225
  align_hash_cop_config['EnforcedHashRocketStyle'] == 'table'
142
226
  end
227
+
228
+ def space_around_exponent_operator?
229
+ cop_config['EnforcedStyleForExponentOperator'] == 'space'
230
+ end
231
+
232
+ def force_equal_sign_alignment?
233
+ config.for_cop('Layout/ExtraSpacing')['ForceEqualSignAlignment']
234
+ end
235
+
236
+ def should_not_have_surrounding_space?(operator)
237
+ operator.is?('**') ? !space_around_exponent_operator? : false
238
+ end
143
239
  end
144
240
  end
145
241
  end