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
@@ -7,6 +7,10 @@ module RuboCop
7
7
  # expected fields for format/sprintf/#% and what is actually
8
8
  # passed as arguments.
9
9
  #
10
+ # In addition it checks whether different formats are used in the same
11
+ # format string. Do not mix numbered, unnumbered, and named formats in
12
+ # the same format string.
13
+ #
10
14
  # @example
11
15
  #
12
16
  # # bad
@@ -18,21 +22,37 @@ module RuboCop
18
22
  # # good
19
23
  #
20
24
  # format('A value: %s and another: %i', a_value, another)
25
+ #
26
+ # @example
27
+ #
28
+ # # bad
29
+ #
30
+ # format('Unnumbered format: %s and numbered: %2$s', a_value, another)
31
+ #
32
+ # @example
33
+ #
34
+ # # good
35
+ #
36
+ # format('Numbered format: %1$s and numbered %2$s', a_value, another)
21
37
  class FormatParameterMismatch < Cop
22
38
  # http://rubular.com/r/CvpbxkcTzy
23
- MSG = "Number of arguments (%i) to `%s` doesn't match the number of " \
24
- 'fields (%i).'.freeze
25
- FIELD_REGEX =
26
- /(%(([\s#+-0\*]*)(\d*)?(\.\d+)?[bBdiouxXeEfgGaAcps]|%))/
27
- NAMED_FIELD_REGEX = /%\{[_a-zA-Z][_a-zA-Z]+\}/
28
- KERNEL = 'Kernel'.freeze
29
- SHOVEL = '<<'.freeze
30
- PERCENT = '%'.freeze
31
- PERCENT_PERCENT = '%%'.freeze
39
+ MSG = "Number of arguments (%<arg_num>i) to `%<method>s` doesn't " \
40
+ 'match the number of fields (%<field_num>i).'
41
+ MSG_INVALID = 'Format string is invalid because formatting sequence types ' \
42
+ '(numbered, named or unnumbered) are mixed.'
43
+
44
+ KERNEL = 'Kernel'
45
+ SHOVEL = '<<'
32
46
  STRING_TYPES = %i[str dstr].freeze
33
- NAMED_INTERPOLATION = /%(?:<\w+>|\{\w+\})/
34
47
 
35
48
  def on_send(node)
49
+ return unless format_string?(node)
50
+
51
+ if invalid_format_string?(node)
52
+ add_offense(node, location: :selector, message: MSG_INVALID)
53
+ return
54
+ end
55
+
36
56
  return unless offending_node?(node)
37
57
 
38
58
  add_offense(node, location: :selector)
@@ -40,52 +60,50 @@ module RuboCop
40
60
 
41
61
  private
42
62
 
63
+ def format_string?(node)
64
+ called_on_string?(node) && method_with_format_args?(node)
65
+ end
66
+
67
+ def invalid_format_string?(node)
68
+ string = if sprintf?(node) || format?(node)
69
+ node.first_argument.source
70
+ else
71
+ node.receiver.source
72
+ end
73
+ !RuboCop::Cop::Utils::FormatString.new(string).valid?
74
+ end
75
+
43
76
  def offending_node?(node)
44
- return false unless called_on_string?(node)
45
- return false unless method_with_format_args?(node)
46
- return false if named_mode?(node) || splat_args?(node)
77
+ return false if splat_args?(node)
47
78
 
48
79
  num_of_format_args, num_of_expected_fields = count_matches(node)
49
80
 
50
81
  return false if num_of_format_args == :unknown
82
+
51
83
  matched_arguments_count?(num_of_expected_fields, num_of_format_args)
52
84
  end
53
85
 
54
86
  def matched_arguments_count?(expected, passed)
55
- if passed < 0
87
+ if passed.negative?
56
88
  expected < passed.abs
57
89
  else
58
90
  expected != passed
59
91
  end
60
92
  end
61
93
 
62
- def called_on_string?(node)
63
- receiver_node, _method, format_string, = *node
64
- if receiver_node.nil? || receiver_node.const_type?
65
- format_string && format_string.str_type?
66
- else
67
- receiver_node.str_type?
68
- end
69
- end
94
+ def_node_matcher :called_on_string?, <<~PATTERN
95
+ {(send {nil? const_type?} _ (str _) ...)
96
+ (send (str ...) ...)}
97
+ PATTERN
70
98
 
71
99
  def method_with_format_args?(node)
72
100
  sprintf?(node) || format?(node) || percent?(node)
73
101
  end
74
102
 
75
- def named_mode?(node)
76
- relevant_node = if sprintf?(node) || format?(node)
77
- node.first_argument
78
- elsif percent?(node)
79
- node.receiver
80
- end
81
-
82
- !relevant_node.source.scan(NAMED_FIELD_REGEX).empty?
83
- end
84
-
85
103
  def splat_args?(node)
86
104
  return false if percent?(node)
87
105
 
88
- node.arguments.butfirst.any?(&:splat_type?)
106
+ node.arguments.drop(1).any?(&:splat_type?)
89
107
  end
90
108
 
91
109
  def heredoc?(node)
@@ -129,18 +147,17 @@ module RuboCop
129
147
 
130
148
  def expected_fields_count(node)
131
149
  return :unknown unless node.str_type?
132
- return 1 if node.source =~ NAMED_INTERPOLATION
133
150
 
134
- node
135
- .source
136
- .scan(FIELD_REGEX)
137
- .reject { |x| x.first == PERCENT_PERCENT }
138
- .reduce(0) { |acc, elem| acc + arguments_count(elem[2]) }
139
- end
151
+ format_string = RuboCop::Cop::Utils::FormatString.new(node.source)
152
+ return 1 if format_string.named_interpolation?
153
+
154
+ max_digit_dollar_num = format_string.max_digit_dollar_num
155
+ return max_digit_dollar_num if max_digit_dollar_num&.nonzero?
140
156
 
141
- # number of arguments required for the format sequence
142
- def arguments_count(format)
143
- format.scan('*').count + 1
157
+ format_string
158
+ .format_sequences
159
+ .reject(&:percent?)
160
+ .reduce(0) { |acc, seq| acc + seq.arity }
144
161
  end
145
162
 
146
163
  def format?(node)
@@ -169,7 +186,8 @@ module RuboCop
169
186
 
170
187
  method_name = node.method?(:%) ? 'String#%' : node.method_name
171
188
 
172
- format(MSG, num_args_for_format, method_name, num_expected_fields)
189
+ format(MSG, arg_num: num_args_for_format, method: method_name,
190
+ field_num: num_expected_fields)
173
191
  end
174
192
  end
175
193
  end
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for the ordering of a method call where
7
+ # the receiver of the call is a HEREDOC.
8
+ #
9
+ # @example
10
+ # # bad
11
+ #
12
+ # <<-SQL
13
+ # bar
14
+ # SQL
15
+ # .strip_indent
16
+ #
17
+ # <<-SQL
18
+ # bar
19
+ # SQL
20
+ # .strip_indent
21
+ # .trim
22
+ #
23
+ # # good
24
+ #
25
+ # <<~SQL
26
+ # bar
27
+ # SQL
28
+ #
29
+ # <<~SQL.trim
30
+ # bar
31
+ # SQL
32
+ #
33
+ class HeredocMethodCallPosition < Cop
34
+ include RangeHelp
35
+
36
+ MSG = 'Put a method call with a HEREDOC receiver on the ' \
37
+ 'same line as the HEREDOC opening.'
38
+
39
+ def on_send(node)
40
+ heredoc = heredoc_node_descendent_receiver(node)
41
+ return unless heredoc
42
+ return if correctly_positioned?(node, heredoc)
43
+
44
+ add_offense(node, location: call_after_heredoc_range(heredoc))
45
+ end
46
+ alias on_csend on_send
47
+
48
+ def autocorrect(node)
49
+ heredoc = heredoc_node_descendent_receiver(node)
50
+
51
+ lambda do |corrector|
52
+ call_range = call_range_to_safely_reposition(node, heredoc)
53
+ return if call_range.nil?
54
+
55
+ call_source = call_range.source.strip
56
+ corrector.remove(call_range)
57
+ corrector.insert_after(heredoc_begin_line_range(node), call_source)
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ def heredoc_node_descendent_receiver(node)
64
+ while send_node?(node)
65
+ return node.receiver if heredoc_node?(node.receiver)
66
+
67
+ node = node.receiver
68
+ end
69
+ end
70
+
71
+ def send_node?(node)
72
+ return nil unless node
73
+
74
+ node.call_type?
75
+ end
76
+
77
+ def heredoc_node?(node)
78
+ node.respond_to?(:heredoc?) && node.heredoc?
79
+ end
80
+
81
+ def call_after_heredoc_range(heredoc)
82
+ pos = heredoc_end_pos(heredoc)
83
+ range_between(pos + 1, pos + 2)
84
+ end
85
+
86
+ def correctly_positioned?(node, heredoc)
87
+ heredoc_end_pos(heredoc) > call_end_pos(node)
88
+ end
89
+
90
+ def calls_on_multiple_lines?(node, _heredoc)
91
+ last_line = node.last_line
92
+ while send_node?(node)
93
+ return true unless last_line == node.last_line
94
+ return true unless all_on_same_line?(node.arguments)
95
+
96
+ node = node.receiver
97
+ end
98
+ false
99
+ end
100
+
101
+ def all_on_same_line?(nodes)
102
+ return true if nodes.empty?
103
+
104
+ nodes.first.first_line == nodes.last.last_line
105
+ end
106
+
107
+ def heredoc_end_pos(heredoc)
108
+ heredoc.location.heredoc_end.end_pos
109
+ end
110
+
111
+ def call_end_pos(node)
112
+ node.source_range.end_pos
113
+ end
114
+
115
+ def heredoc_begin_line_range(heredoc)
116
+ pos = heredoc.source_range.begin_pos
117
+ range_by_whole_lines(range_between(pos, pos))
118
+ end
119
+
120
+ def call_line_range(node)
121
+ pos = node.source_range.end_pos
122
+ range_by_whole_lines(range_between(pos, pos))
123
+ end
124
+
125
+ # Returns nil if no range can be safely repositioned.
126
+ def call_range_to_safely_reposition(node, heredoc)
127
+ return nil if calls_on_multiple_lines?(node, heredoc)
128
+
129
+ heredoc_end_pos = heredoc_end_pos(heredoc)
130
+ call_end_pos = call_end_pos(node)
131
+
132
+ call_range = range_between(heredoc_end_pos, call_end_pos)
133
+ call_line_range = call_line_range(node)
134
+
135
+ call_source = call_range.source.strip
136
+ call_line_source = call_line_range.source.strip
137
+
138
+ return call_range if call_source == call_line_source
139
+
140
+ if trailing_comma?(call_source, call_line_source)
141
+ # If there's some on the last line other than the call, e.g.
142
+ # a trailing comma, then we leave the "\n" following the
143
+ # heredoc_end in place.
144
+ return range_between(heredoc_end_pos, call_end_pos + 1)
145
+ end
146
+
147
+ nil
148
+ end
149
+
150
+ def trailing_comma?(call_source, call_line_source)
151
+ call_source + ',' == call_line_source
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
@@ -23,20 +23,22 @@ module RuboCop
23
23
  # 'Item 2'
24
24
  # ]
25
25
  class ImplicitStringConcatenation < Cop
26
- MSG = 'Combine %s and %s into a single string literal, rather than ' \
27
- 'using implicit string concatenation.'.freeze
26
+ MSG = 'Combine %<string1>s and %<string2>s into a single string ' \
27
+ 'literal, rather than using implicit string concatenation.'
28
28
  FOR_ARRAY = ' Or, if they were intended to be separate array ' \
29
- 'elements, separate them with a comma.'.freeze
29
+ 'elements, separate them with a comma.'
30
30
  FOR_METHOD = ' Or, if they were intended to be separate method ' \
31
- 'arguments, separate them with a comma.'.freeze
31
+ 'arguments, separate them with a comma.'
32
32
 
33
33
  def on_dstr(node)
34
- each_bad_cons(node) do |child1, child2|
35
- range = child1.source_range.join(child2.source_range)
36
- message = format(MSG, display_str(child1), display_str(child2))
37
- if node.parent && node.parent.array_type?
34
+ each_bad_cons(node) do |child_node1, child_node2|
35
+ range = child_node1.source_range.join(child_node2.source_range)
36
+ message = format(MSG,
37
+ string1: display_str(child_node1),
38
+ string2: display_str(child_node2))
39
+ if node.parent&.array_type?
38
40
  message << FOR_ARRAY
39
- elsif node.parent && node.parent.send_type?
41
+ elsif node.parent&.send_type?
40
42
  message << FOR_METHOD
41
43
  end
42
44
  add_offense(node, location: range, message: message)
@@ -46,17 +48,17 @@ module RuboCop
46
48
  private
47
49
 
48
50
  def each_bad_cons(node)
49
- node.children.each_cons(2) do |child1, child2|
51
+ node.children.each_cons(2) do |child_node1, child_node2|
50
52
  # `'abc' 'def'` -> (dstr (str "abc") (str "def"))
51
- next unless string_literal?(child1) && string_literal?(child2)
52
- next unless child1.loc.last_line == child2.loc.line
53
+ next unless string_literals?(child_node1, child_node2)
54
+ next unless child_node1.last_line == child_node2.first_line
53
55
 
54
56
  # Make sure we don't flag a string literal which simply has
55
57
  # embedded newlines
56
58
  # `"abc\ndef"` also -> (dstr (str "abc") (str "def"))
57
- next unless child1.source[-1] == ending_delimiter(child1)
59
+ next unless child_node1.source[-1] == ending_delimiter(child_node1)
58
60
 
59
- yield child1, child2
61
+ yield child_node1, child_node2
60
62
  end
61
63
  end
62
64
 
@@ -74,8 +76,12 @@ module RuboCop
74
76
  (node.dstr_type? && node.children.all? { |c| string_literal?(c) })
75
77
  end
76
78
 
79
+ def string_literals?(node1, node2)
80
+ string_literal?(node1) && string_literal?(node2)
81
+ end
82
+
77
83
  def display_str(node)
78
- if node.source =~ /\n/
84
+ if /\n/.match?(node.source)
79
85
  str_content(node).inspect
80
86
  else
81
87
  node.source
@@ -46,14 +46,14 @@ module RuboCop
46
46
  # end
47
47
  # end
48
48
  class IneffectiveAccessModifier < Cop
49
- MSG = '`%s` (on line %d) does not make singleton methods %s. ' \
50
- 'Use %s instead.'.freeze
49
+ MSG = '`%<modifier>s` (on line %<line>d) does not make singleton ' \
50
+ 'methods %<modifier>s. Use %<alternative>s instead.'
51
51
  ALTERNATIVE_PRIVATE = '`private_class_method` or `private` inside a ' \
52
- '`class << self` block'.freeze
52
+ '`class << self` block'
53
53
  ALTERNATIVE_PROTECTED = '`protected` inside a `class << self` ' \
54
- 'block'.freeze
54
+ 'block'
55
55
 
56
- def_node_matcher :private_class_method, <<-PATTERN
56
+ def_node_search :private_class_methods, <<~PATTERN
57
57
  (send nil? :private_class_method $...)
58
58
  PATTERN
59
59
 
@@ -67,81 +67,59 @@ module RuboCop
67
67
 
68
68
  private
69
69
 
70
- def clear
71
- @useless = {}
72
- @last_access_modifier = nil
73
- end
74
-
75
70
  def check_node(node)
76
- return unless node && node.begin_type?
71
+ return unless node&.begin_type?
77
72
 
78
- clear
79
- check_scope(node)
73
+ ignored_methods = private_class_method_names(node)
80
74
 
81
- @useless.each do |_name, (defs_node, visibility, modifier)|
75
+ ineffective_modifier(node, ignored_methods) do |defs_node, modifier|
82
76
  add_offense(defs_node,
83
77
  location: :keyword,
84
- message: format_message(visibility, modifier))
78
+ message: format_message(modifier))
85
79
  end
86
80
  end
87
81
 
88
- def format_message(visibility, modifier)
82
+ def private_class_method_names(node)
83
+ private_class_methods(node).to_a.flatten
84
+ .select(&:basic_literal?)
85
+ .map(&:value)
86
+ end
87
+
88
+ def format_message(modifier)
89
+ visibility = modifier.method_name
89
90
  alternative = if visibility == :private
90
91
  ALTERNATIVE_PRIVATE
91
92
  else
92
93
  ALTERNATIVE_PROTECTED
93
94
  end
94
- format(MSG, visibility, modifier.location.expression.line, visibility,
95
- alternative)
96
- end
97
-
98
- def check_scope(node, cur_vis = :public)
99
- node.children.reduce(cur_vis) do |visibility, child|
100
- check_child_scope(child, visibility)
101
- end
95
+ format(MSG, modifier: visibility,
96
+ line: modifier.location.expression.line,
97
+ alternative: alternative)
102
98
  end
103
99
 
104
- def check_child_scope(node, cur_vis)
105
- case node.type
106
- when :send
107
- cur_vis = check_send(node, cur_vis)
108
- when :defs
109
- check_defs(node, cur_vis)
110
- when :kwbegin
111
- check_scope(node, cur_vis)
100
+ def ineffective_modifier(node, ignored_methods, modifier = nil, &block)
101
+ node.each_child_node do |child|
102
+ case child.type
103
+ when :send
104
+ modifier = child if access_modifier?(child)
105
+ when :defs
106
+ next if correct_visibility?(child, modifier, ignored_methods)
107
+
108
+ yield child, modifier
109
+ when :kwbegin
110
+ ineffective_modifier(child, ignored_methods, modifier, &block)
111
+ end
112
112
  end
113
-
114
- cur_vis
115
113
  end
116
114
 
117
- def check_send(node, cur_vis)
118
- if node.access_modifier? && !node.method?(:module_function)
119
- @last_access_modifier = node
120
- return node.method_name
121
- elsif (methods = private_class_method(node))
122
- # don't warn about defs nodes which are followed by a call to
123
- # `private_class_method :name`
124
- # obviously the programmer knows what they are doing
125
- revert_method_uselessness(methods)
126
- end
127
-
128
- cur_vis
115
+ def access_modifier?(node)
116
+ node.bare_access_modifier? && !node.method?(:module_function)
129
117
  end
130
118
 
131
- def check_defs(node, cur_vis)
132
- mark_method_as_useless(node, cur_vis) if cur_vis != :public
133
- end
119
+ def correct_visibility?(node, modifier, ignored_methods)
120
+ return true if modifier.nil? || modifier.method?(:public)
134
121
 
135
- def mark_method_as_useless(node, cur_vis)
136
- _, method_name, = *node
137
- @useless[method_name] = [node, cur_vis, @last_access_modifier]
138
- end
139
-
140
- def revert_method_uselessness(methods)
141
- methods.each do |sym|
142
- next unless sym.sym_type?
143
- @useless.delete(sym.children[0])
144
- end
122
+ ignored_methods.include?(node.method_name)
145
123
  end
146
124
  end
147
125
  end
@@ -8,31 +8,35 @@ module RuboCop
8
8
  # `StandardError`. It is configurable to suggest using either
9
9
  # `RuntimeError` (default) or `StandardError` instead.
10
10
  #
11
- # @example
12
- #
11
+ # @example EnforcedStyle: runtime_error (default)
13
12
  # # bad
14
13
  #
15
14
  # class C < Exception; end
16
15
  #
17
- # @example
18
- #
19
- # # EnforcedStyle: runtime_error (default)
16
+ # C = Class.new(Exception)
20
17
  #
21
18
  # # good
22
19
  #
23
20
  # class C < RuntimeError; end
24
21
  #
25
- # @example
22
+ # C = Class.new(RuntimeError)
23
+ #
24
+ # @example EnforcedStyle: standard_error
25
+ # # bad
26
+ #
27
+ # class C < Exception; end
26
28
  #
27
- # # EnforcedStyle: standard_error
29
+ # C = Class.new(Exception)
28
30
  #
29
31
  # # good
30
32
  #
31
33
  # class C < StandardError; end
34
+ #
35
+ # C = Class.new(StandardError)
32
36
  class InheritException < Cop
33
37
  include ConfigurableEnforcedStyle
34
38
 
35
- MSG = 'Inherit from `%s` instead of `%s`.'.freeze
39
+ MSG = 'Inherit from `%<prefer>s` instead of `%<current>s`.'
36
40
  PREFERRED_BASE_CLASS = {
37
41
  runtime_error: 'RuntimeError',
38
42
  standard_error: 'StandardError'
@@ -51,26 +55,38 @@ module RuboCop
51
55
  SystemExit
52
56
  ].freeze
53
57
 
54
- def on_class(node)
55
- _class, base_class, _body = *node
58
+ def_node_matcher :class_new_call?, <<~PATTERN
59
+ (send
60
+ (const {cbase nil?} :Class) :new
61
+ $(const {cbase nil?} _))
62
+ PATTERN
56
63
 
57
- return unless base_class && illegal_class_name?(base_class)
64
+ def on_class(node)
65
+ return unless node.parent_class &&
66
+ illegal_class_name?(node.parent_class)
58
67
 
59
- add_offense(base_class)
68
+ add_offense(node.parent_class)
60
69
  end
61
70
 
62
- private
71
+ def on_send(node)
72
+ constant = class_new_call?(node)
73
+ return unless constant && illegal_class_name?(constant)
63
74
 
64
- def message(node)
65
- format(MSG, preferred_base_class, node.const_name)
75
+ add_offense(constant)
66
76
  end
67
77
 
68
78
  def autocorrect(node)
69
79
  lambda do |corrector|
70
- corrector.replace(node.loc.expression, preferred_base_class)
80
+ corrector.replace(node, preferred_base_class)
71
81
  end
72
82
  end
73
83
 
84
+ private
85
+
86
+ def message(node)
87
+ format(MSG, prefer: preferred_base_class, current: node.const_name)
88
+ end
89
+
74
90
  def illegal_class_name?(class_node)
75
91
  ILLEGAL_CLASSES.include?(class_node.const_name)
76
92
  end
@@ -18,15 +18,31 @@ module RuboCop
18
18
  # foo = "something with #{interpolation} inside"
19
19
  class InterpolationCheck < Cop
20
20
  MSG = 'Interpolation in single quoted string detected. '\
21
- 'Use double quoted strings if you need interpolation.'.freeze
21
+ 'Use double quoted strings if you need interpolation.'
22
22
 
23
23
  def on_str(node)
24
24
  return if heredoc?(node)
25
- return if node.parent && node.parent.dstr_type?
26
- return unless node.str_content.scrub =~ /#\{.*\}/
25
+
26
+ parent = node.parent
27
+ return if parent && (parent.dstr_type? || parent.regexp_type?)
28
+ return unless /(?<!\\)#\{.*\}/.match?(node.source.scrub)
29
+
27
30
  add_offense(node)
28
31
  end
29
32
 
33
+ def autocorrect(node)
34
+ lambda do |corrector|
35
+ starting_token, ending_token = if node.source.include?('"')
36
+ ['%{', '}']
37
+ else
38
+ ['"', '"']
39
+ end
40
+
41
+ corrector.replace(node.loc.begin, starting_token)
42
+ corrector.replace(node.loc.end, ending_token)
43
+ end
44
+ end
45
+
30
46
  def heredoc?(node)
31
47
  node.loc.is_a?(Parser::Source::Map::Heredoc) ||
32
48
  (node.parent && heredoc?(node.parent))