rubocop 0.85.1 → 0.89.1

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 (409) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -4
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +227 -26
  5. data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
  6. data/lib/rubocop/cli/command/base.rb +1 -0
  7. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  8. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +3 -3
  10. data/lib/rubocop/cli/command/version.rb +2 -2
  11. data/lib/rubocop/cli.rb +2 -4
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +21 -4
  14. data/lib/rubocop/config_loader.rb +41 -69
  15. data/lib/rubocop/config_loader_resolver.rb +4 -4
  16. data/lib/rubocop/config_obsoletion.rb +6 -2
  17. data/lib/rubocop/config_store.rb +4 -0
  18. data/lib/rubocop/config_validator.rb +2 -4
  19. data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +407 -0
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  23. data/lib/rubocop/cop/commissioner.rb +47 -50
  24. data/lib/rubocop/cop/cop.rb +85 -236
  25. data/lib/rubocop/cop/corrector.rb +38 -115
  26. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  31. data/lib/rubocop/cop/force.rb +1 -0
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +39 -13
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  34. data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
  35. data/lib/rubocop/cop/generator.rb +1 -1
  36. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  44. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  45. data/lib/rubocop/cop/layout/class_structure.rb +5 -44
  46. data/lib/rubocop/cop/layout/comment_indentation.rb +4 -4
  47. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  48. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  50. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
  51. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  52. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  53. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  54. data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
  55. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  56. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  57. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
  58. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  59. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  60. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  64. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  68. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  69. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
  71. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  73. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  74. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  76. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  77. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  78. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  79. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  80. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  81. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  82. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  83. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  84. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  85. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  86. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  87. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  88. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  89. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  90. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  91. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  92. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  93. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  94. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  95. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  96. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  97. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  98. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  99. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  100. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  101. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  102. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  103. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  104. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
  105. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
  106. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  107. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  108. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  109. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  110. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  111. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  112. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  113. data/lib/rubocop/cop/lint/loop.rb +23 -2
  114. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  115. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  116. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  117. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  118. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  119. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  120. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  121. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  122. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  123. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  124. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  125. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  126. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  127. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
  128. data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
  129. data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
  130. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  131. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +43 -40
  132. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  133. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  134. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  135. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  136. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  137. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  138. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
  139. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  140. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  141. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  142. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  143. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  144. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  145. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  146. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  147. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  148. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  149. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  150. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  151. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  152. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  153. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  154. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  155. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  156. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  157. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  158. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  159. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  160. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  161. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  162. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  163. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  164. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  165. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  166. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  167. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  168. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  169. data/lib/rubocop/cop/lint/void.rb +3 -7
  170. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  171. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  172. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  173. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  174. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
  175. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  176. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  177. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  178. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  179. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
  180. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  181. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  182. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  183. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  184. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  185. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  186. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  187. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  188. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  189. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  190. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  191. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  192. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  193. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  194. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  195. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  196. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  197. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  198. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  199. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  200. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  201. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  202. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  203. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  204. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  205. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  206. data/lib/rubocop/cop/mixin/range_help.rb +19 -5
  207. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
  208. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  209. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  210. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
  211. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -5
  212. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
  213. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  214. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  215. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  216. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  217. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
  218. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  219. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  220. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  221. data/lib/rubocop/cop/naming/file_name.rb +4 -6
  222. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  223. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
  224. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  225. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  226. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  227. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  228. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  229. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  230. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  231. data/lib/rubocop/cop/offense.rb +16 -2
  232. data/lib/rubocop/cop/registry.rb +3 -3
  233. data/lib/rubocop/cop/security/eval.rb +2 -2
  234. data/lib/rubocop/cop/security/json_load.rb +6 -8
  235. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  236. data/lib/rubocop/cop/security/open.rb +2 -2
  237. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  238. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  239. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  240. data/lib/rubocop/cop/style/alias.rb +41 -36
  241. data/lib/rubocop/cop/style/and_or.rb +9 -11
  242. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  243. data/lib/rubocop/cop/style/array_join.rb +6 -8
  244. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  245. data/lib/rubocop/cop/style/attr.rb +11 -9
  246. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  247. data/lib/rubocop/cop/style/bare_percent_literals.rb +11 -13
  248. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  249. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
  250. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  251. data/lib/rubocop/cop/style/block_delimiters.rb +25 -27
  252. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  253. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  254. data/lib/rubocop/cop/style/class_and_module_children.rb +15 -12
  255. data/lib/rubocop/cop/style/class_check.rb +7 -9
  256. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  257. data/lib/rubocop/cop/style/class_vars.rb +24 -7
  258. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  259. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  260. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  261. data/lib/rubocop/cop/style/command_literal.rb +24 -25
  262. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  263. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  264. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
  265. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  266. data/lib/rubocop/cop/style/copyright.rb +15 -15
  267. data/lib/rubocop/cop/style/date_time.rb +2 -2
  268. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  269. data/lib/rubocop/cop/style/dir.rb +9 -12
  270. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +8 -10
  271. data/lib/rubocop/cop/style/documentation.rb +8 -10
  272. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  273. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  274. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  275. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  276. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  277. data/lib/rubocop/cop/style/empty_case_condition.rb +27 -26
  278. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  279. data/lib/rubocop/cop/style/empty_literal.rb +20 -21
  280. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  281. data/lib/rubocop/cop/style/encoding.rb +6 -10
  282. data/lib/rubocop/cop/style/end_block.rb +4 -6
  283. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  284. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  285. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
  286. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  287. data/lib/rubocop/cop/style/exponential_notation.rb +9 -11
  288. data/lib/rubocop/cop/style/float_division.rb +8 -11
  289. data/lib/rubocop/cop/style/for.rb +11 -15
  290. data/lib/rubocop/cop/style/format_string.rb +21 -19
  291. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  292. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +20 -42
  293. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  294. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  295. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  296. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  297. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  298. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  299. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  300. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  301. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  302. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  303. data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
  304. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  305. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  306. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  307. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  308. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  309. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  310. data/lib/rubocop/cop/style/inverse_methods.rb +23 -33
  311. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  312. data/lib/rubocop/cop/style/lambda.rb +7 -12
  313. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  314. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  315. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  316. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  317. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  318. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  319. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  320. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  321. data/lib/rubocop/cop/style/min_max.rb +8 -12
  322. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  323. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  324. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  325. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  326. data/lib/rubocop/cop/style/module_function.rb +10 -13
  327. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  328. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  329. data/lib/rubocop/cop/style/multiline_if_then.rb +5 -11
  330. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  331. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  332. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -8
  333. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  334. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  335. data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
  336. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
  337. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  338. data/lib/rubocop/cop/style/next.rb +2 -2
  339. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  340. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  341. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  342. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  343. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  344. data/lib/rubocop/cop/style/proc.rb +1 -1
  345. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  346. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  347. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  348. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  349. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  350. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  351. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  352. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
  353. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  354. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
  355. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
  356. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  357. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  358. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  359. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  360. data/lib/rubocop/cop/style/sample.rb +1 -1
  361. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  362. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  363. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  364. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  365. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  366. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  367. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  368. data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
  369. data/lib/rubocop/cop/style/symbol_array.rb +6 -6
  370. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  371. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  372. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  373. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  374. data/lib/rubocop/cop/style/word_array.rb +1 -1
  375. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  376. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  377. data/lib/rubocop/cop/team.rb +98 -82
  378. data/lib/rubocop/cop/tokens_util.rb +84 -0
  379. data/lib/rubocop/cop/util.rb +5 -15
  380. data/lib/rubocop/cop/utils/format_string.rb +2 -3
  381. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  382. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  383. data/lib/rubocop/cop/variable_force.rb +0 -2
  384. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  385. data/lib/rubocop/error.rb +1 -0
  386. data/lib/rubocop/file_finder.rb +12 -12
  387. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -3
  388. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  389. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  390. data/lib/rubocop/name_similarity.rb +7 -3
  391. data/lib/rubocop/options.rb +18 -11
  392. data/lib/rubocop/path_util.rb +19 -19
  393. data/lib/rubocop/platform.rb +1 -1
  394. data/lib/rubocop/rake_task.rb +7 -9
  395. data/lib/rubocop/result_cache.rb +12 -8
  396. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  397. data/lib/rubocop/rspec/expect_offense.rb +63 -22
  398. data/lib/rubocop/rspec/shared_contexts.rb +16 -17
  399. data/lib/rubocop/runner.rb +35 -34
  400. data/lib/rubocop/target_finder.rb +14 -11
  401. data/lib/rubocop/target_ruby.rb +2 -2
  402. data/lib/rubocop/version.rb +2 -2
  403. data/lib/rubocop.rb +33 -5
  404. metadata +49 -11
  405. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  406. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  407. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  408. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  409. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -55,6 +55,8 @@ module RuboCop
55
55
  MSG = 'Use `%<suggestion>s` instead of '\
56
56
  '`%<sorter>s...%<accessor_source>s`.'
57
57
 
58
+ SORT_METHODS = %i[sort sort_by].freeze
59
+
58
60
  def_node_matcher :redundant_sort?, <<~MATCHER
59
61
  {
60
62
  (send $(send _ $:sort ...) ${:last :first})
@@ -72,18 +74,21 @@ module RuboCop
72
74
  MATCHER
73
75
 
74
76
  def on_send(node)
75
- redundant_sort?(node) do |sort_node, sorter, accessor|
76
- range = range_between(
77
- sort_node.loc.selector.begin_pos,
78
- node.loc.expression.end_pos
79
- )
77
+ return unless sort_method?(node)
80
78
 
81
- add_offense(node,
82
- location: range,
83
- message: message(node,
84
- sorter,
85
- accessor))
79
+ if (sort_node, sorter, accessor = redundant_sort?(node.parent))
80
+ ancestor = node.parent
81
+ elsif (sort_node, sorter, accessor = redundant_sort?(node.parent&.parent))
82
+ ancestor = node.parent.parent
83
+ else
84
+ return
86
85
  end
86
+
87
+ add_offense(ancestor,
88
+ location: offense_range(sort_node, ancestor),
89
+ message: message(ancestor,
90
+ sorter,
91
+ accessor))
87
92
  end
88
93
 
89
94
  def autocorrect(node)
@@ -108,6 +113,14 @@ module RuboCop
108
113
 
109
114
  private
110
115
 
116
+ def sort_method?(node)
117
+ SORT_METHODS.include?(node.method_name)
118
+ end
119
+
120
+ def offense_range(sort_node, ancestor)
121
+ range_between(sort_node.loc.selector.begin_pos, ancestor.loc.expression.end_pos)
122
+ end
123
+
111
124
  def message(node, sorter, accessor)
112
125
  accessor_source = range_between(
113
126
  node.loc.selector.begin_pos,
@@ -135,9 +148,10 @@ module RuboCop
135
148
  end
136
149
 
137
150
  def suffix(sorter)
138
- if sorter == :sort
151
+ case sorter
152
+ when :sort
139
153
  ''
140
- elsif sorter == :sort_by
154
+ when :sort_by
141
155
  '_by'
142
156
  end
143
157
  end
@@ -85,7 +85,7 @@ module RuboCop
85
85
  PATTERN
86
86
 
87
87
  def_node_matcher :rescue_standard_error?, <<~PATTERN
88
- (resbody $(array (const nil? :StandardError)) _ _)
88
+ (resbody $(array (const {nil? cbase} :StandardError)) _ _)
89
89
  PATTERN
90
90
 
91
91
  def on_resbody(node)
@@ -136,10 +136,10 @@ module RuboCop
136
136
  end
137
137
 
138
138
  def comments(node)
139
- processed_source.comments.select do |comment|
140
- comment.loc.first_line > node.loc.first_line &&
141
- comment.loc.last_line < node.loc.last_line
142
- end
139
+ processed_source.each_comment_in_lines(
140
+ node.loc.first_line...
141
+ node.loc.last_line
142
+ ).to_a
143
143
  end
144
144
 
145
145
  def allowed_if_condition?(node)
@@ -92,7 +92,7 @@ module RuboCop
92
92
  second.int_type? ? second.to_a.first : :unknown
93
93
  end
94
94
 
95
- def range_size(range_node)
95
+ def range_size(range_node) # rubocop:todo Metrics/CyclomaticComplexity
96
96
  vals = range_node.to_a
97
97
  return :unknown unless vals.all?(&:int_type?)
98
98
 
@@ -39,7 +39,7 @@ module RuboCop
39
39
  check_for_line_terminator_or_opener
40
40
  end
41
41
 
42
- def on_begin(node)
42
+ def on_begin(node) # rubocop:todo Metrics/CyclomaticComplexity
43
43
  return if cop_config['AllowAsExpressionSeparator']
44
44
 
45
45
  exprs = node.children
@@ -111,7 +111,7 @@ module RuboCop
111
111
  RAISE_MSG = 'Use `raise` instead of `fail` to ' \
112
112
  'rethrow exceptions.'
113
113
 
114
- def_node_matcher :kernel_call?, '(send (const nil? :Kernel) %1 ...)'
114
+ def_node_matcher :kernel_call?, '(send (const {nil? cbase} :Kernel) %1 ...)'
115
115
  def_node_search :custom_fail_methods,
116
116
  '{(def :fail ...) (defs _ :fail ...)}'
117
117
 
@@ -191,6 +191,8 @@ module RuboCop
191
191
  end
192
192
 
193
193
  def command_or_kernel_call?(name, node)
194
+ return unless node.method?(name)
195
+
194
196
  node.command?(name) || kernel_call?(node, name)
195
197
  end
196
198
 
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Sometimes using dig method ends up with just a single
7
+ # argument. In such cases, dig should be replaced with [].
8
+ #
9
+ # @example
10
+ # # bad
11
+ # { key: 'value' }.dig(:key)
12
+ # [1, 2, 3].dig(0)
13
+ #
14
+ # # good
15
+ # { key: 'value' }[:key]
16
+ # [1, 2, 3][0]
17
+ #
18
+ # # good
19
+ # { key1: { key2: 'value' } }.dig(:key1, :key2)
20
+ # [1, [2, [3]]].dig(1, 1)
21
+ #
22
+ # # good
23
+ # keys = %i[key1 key2]
24
+ # { key1: { key2: 'value' } }.dig(*keys)
25
+ #
26
+ class SingleArgumentDig < Base
27
+ extend AutoCorrector
28
+
29
+ MSG = 'Use `%<receiver>s[%<argument>s]` instead of `%<original>s`.'
30
+
31
+ def_node_matcher :single_argument_dig?, <<~PATTERN
32
+ (send _ :dig $!splat)
33
+ PATTERN
34
+
35
+ def on_send(node)
36
+ return unless node.receiver
37
+
38
+ expression = single_argument_dig?(node)
39
+ return unless expression
40
+
41
+ receiver = node.receiver.source
42
+ argument = expression.source
43
+
44
+ message = format(MSG, receiver: receiver, argument: argument,
45
+ original: node.source)
46
+ add_offense(node, message: message) do |corrector|
47
+ correct_access = "#{receiver}[#{argument}]"
48
+ corrector.replace(node, correct_access)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -73,7 +73,7 @@ module RuboCop
73
73
 
74
74
  def move_comment(node, corrector)
75
75
  LineBreakCorrector.move_comment(
76
- eol_comment: end_of_line_comment(node.source_range.line),
76
+ eol_comment: processed_source.comment_at_line(node.source_range.line),
77
77
  node: node, corrector: corrector
78
78
  )
79
79
  end
@@ -34,9 +34,10 @@ module RuboCop
34
34
  end
35
35
 
36
36
  def autocorrect(node)
37
- if style == :require_parentheses
37
+ case style
38
+ when :require_parentheses
38
39
  missing_parentheses_corrector(node)
39
- elsif style == :require_no_parentheses
40
+ when :require_no_parentheses
40
41
  unwanted_parentheses_corrector(node)
41
42
  end
42
43
  end
@@ -22,7 +22,7 @@ module RuboCop
22
22
 
23
23
  def_node_matcher :stderr_puts?, <<~PATTERN
24
24
  (send
25
- {(gvar #stderr_gvar?) (const nil? :STDERR)}
25
+ {(gvar #stderr_gvar?) (const {nil? cbase} :STDERR)}
26
26
  :puts $_
27
27
  ...)
28
28
  PATTERN
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for places where string concatenation
7
+ # can be replaced with string interpolation.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # email_with_name = user.name + ' <' + user.email + '>'
12
+ #
13
+ # # good
14
+ # email_with_name = "#{user.name} <#{user.email}>"
15
+ # email_with_name = format('%s <%s>', user.name, user.email)
16
+ #
17
+ class StringConcatenation < Base
18
+ include Util
19
+ extend AutoCorrector
20
+
21
+ MSG = 'Prefer string interpolation to string concatenation.'
22
+
23
+ def_node_matcher :string_concatenation?, <<~PATTERN
24
+ {
25
+ (send str_type? :+ _)
26
+ (send _ :+ str_type?)
27
+ }
28
+ PATTERN
29
+
30
+ def on_send(node)
31
+ return unless node.method?(:+)
32
+ return unless string_concatenation?(node)
33
+
34
+ topmost_plus_node = find_topmost_plus_node(node)
35
+
36
+ parts = []
37
+ collect_parts(topmost_plus_node, parts)
38
+
39
+ add_offense(topmost_plus_node) do |corrector|
40
+ corrector.replace(topmost_plus_node, replacement(parts))
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def find_topmost_plus_node(node)
47
+ current = node
48
+ while (parent = current.parent) && plus_node?(parent)
49
+ current = parent
50
+ end
51
+ current
52
+ end
53
+
54
+ def collect_parts(node, parts)
55
+ return unless node
56
+
57
+ if plus_node?(node)
58
+ collect_parts(node.receiver, parts)
59
+ collect_parts(node.first_argument, parts)
60
+ else
61
+ parts << node
62
+ end
63
+ end
64
+
65
+ def plus_node?(node)
66
+ node.send_type? && node.method?(:+)
67
+ end
68
+
69
+ def replacement(parts)
70
+ interpolated_parts =
71
+ parts.map do |part|
72
+ if part.str_type?
73
+ if single_quoted?(part)
74
+ part.value.gsub('\\') { '\\\\' }
75
+ else
76
+ escape_string(part.value)
77
+ end
78
+ else
79
+ "\#{#{part.source}}"
80
+ end
81
+ end
82
+
83
+ "\"#{interpolated_parts.join}\""
84
+ end
85
+
86
+ def single_quoted?(str_node)
87
+ str_node.source.start_with?("'")
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -20,6 +20,8 @@ module RuboCop
20
20
  # end
21
21
  # end
22
22
  class StructInheritance < Cop
23
+ include RangeHelp
24
+
23
25
  MSG = "Don't extend an instance initialized by `Struct.new`. " \
24
26
  'Use a block to customize the struct.'
25
27
 
@@ -29,10 +31,29 @@ module RuboCop
29
31
  add_offense(node, location: node.parent_class.source_range)
30
32
  end
31
33
 
34
+ def autocorrect(node)
35
+ lambda do |corrector|
36
+ corrector.remove(range_with_surrounding_space(range: node.loc.keyword, newlines: false))
37
+ corrector.replace(node.loc.operator, '=')
38
+
39
+ correct_parent(node.parent_class, corrector)
40
+ end
41
+ end
42
+
32
43
  def_node_matcher :struct_constructor?, <<~PATTERN
33
- {(send (const nil? :Struct) :new ...)
34
- (block (send (const nil? :Struct) :new ...) ...)}
44
+ {(send (const {nil? cbase} :Struct) :new ...)
45
+ (block (send (const {nil? cbase} :Struct) :new ...) ...)}
35
46
  PATTERN
47
+
48
+ private
49
+
50
+ def correct_parent(parent, corrector)
51
+ if parent.block_type?
52
+ corrector.remove(range_with_surrounding_space(range: parent.loc.end, newlines: false))
53
+ else
54
+ corrector.insert_after(parent.loc.expression, ' do')
55
+ end
56
+ end
36
57
  end
37
58
  end
38
59
  end
@@ -65,7 +65,7 @@ module RuboCop
65
65
  def symbols_contain_spaces?(node)
66
66
  node.children.any? do |sym|
67
67
  content, = *sym
68
- content =~ / /
68
+ / /.match?(content)
69
69
  end
70
70
  end
71
71
 
@@ -74,7 +74,7 @@ module RuboCop
74
74
  if c.dsym_type?
75
75
  string_literal = to_string_literal(c.source)
76
76
 
77
- ':' + trim_string_interporation_escape_character(string_literal)
77
+ ":#{trim_string_interporation_escape_character(string_literal)}"
78
78
  else
79
79
  to_symbol_literal(c.value.to_s)
80
80
  end
@@ -104,12 +104,12 @@ module RuboCop
104
104
  )
105
105
 
106
106
  # method name
107
- string =~ /\A[a-zA-Z_]\w*[!?]?\z/ ||
107
+ /\A[a-zA-Z_]\w*[!?]?\z/.match?(string) ||
108
108
  # instance / class variable
109
- string =~ /\A@@?[a-zA-Z_]\w*\z/ ||
109
+ /\A@@?[a-zA-Z_]\w*\z/.match?(string) ||
110
110
  # global variable
111
- string =~ /\A\$[1-9]\d*\z/ ||
112
- string =~ /\A\$[a-zA-Z_]\w*\z/ ||
111
+ /\A\$[1-9]\d*\z/.match?(string) ||
112
+ /\A\$[a-zA-Z_]\w*\z/.match?(string) ||
113
113
  special_gvars.include?(string) ||
114
114
  redefinable_operators.include?(string)
115
115
  end
@@ -19,7 +19,7 @@ module RuboCop
19
19
  'instead of a block.'
20
20
  SUPER_TYPES = %i[super zsuper].freeze
21
21
 
22
- def_node_matcher :proc_node?, '(send (const nil? :Proc) :new)'
22
+ def_node_matcher :proc_node?, '(send (const {nil? cbase} :Proc) :new)'
23
23
  def_node_matcher :symbol_proc?, <<~PATTERN
24
24
  (block
25
25
  ${(send ...) (super ...) zsuper}
@@ -84,7 +84,7 @@ module RuboCop
84
84
  arg_range = args.last.source_range
85
85
  arg_range = range_with_surrounding_comma(arg_range, :right)
86
86
  replacement = " &:#{method_name}"
87
- replacement = ',' + replacement unless arg_range.source.end_with?(',')
87
+ replacement = ",#{replacement}" unless arg_range.source.end_with?(',')
88
88
  corrector.insert_after(arg_range, replacement)
89
89
  corrector.remove(block_range_with_space(node))
90
90
  end
@@ -174,7 +174,7 @@ module RuboCop
174
174
  end
175
175
 
176
176
  def unparenthesized_method_call?(child)
177
- method_name(child) =~ /^[a-z]/i && !child.parenthesized?
177
+ /^[a-z]/i.match?(method_name(child)) && !child.parenthesized?
178
178
  end
179
179
 
180
180
  def below_ternary_precedence?(child)
@@ -33,8 +33,8 @@ module RuboCop
33
33
  # end
34
34
  # end
35
35
  #
36
- class TrailingMethodEndStatement < Cop
37
- include Alignment
36
+ class TrailingMethodEndStatement < Base
37
+ extend AutoCorrector
38
38
 
39
39
  MSG = 'Place the end statement of a multi-line method on ' \
40
40
  'its own line.'
@@ -42,13 +42,11 @@ module RuboCop
42
42
  def on_def(node)
43
43
  return unless trailing_end?(node)
44
44
 
45
- add_offense(node, location: end_token(node).pos)
46
- end
47
-
48
- def autocorrect(node)
49
- lambda do |corrector|
50
- break_line_before_end(node, corrector)
51
- remove_semicolon(node, corrector)
45
+ add_offense(node.loc.end) do |corrector|
46
+ corrector.insert_before(
47
+ node.loc.end,
48
+ "\n#{' ' * node.loc.keyword.column}"
49
+ )
52
50
  end
53
51
  end
54
52
 
@@ -60,30 +58,9 @@ module RuboCop
60
58
  body_and_end_on_same_line?(node)
61
59
  end
62
60
 
63
- def end_token(node)
64
- tokens(node).reverse.find(&:end?)
65
- end
66
-
67
61
  def body_and_end_on_same_line?(node)
68
- end_token(node).line == token_before_end(node).line
69
- end
70
-
71
- def token_before_end(node)
72
- i = tokens(node).index(end_token(node))
73
- tokens(node)[i - 1]
74
- end
75
-
76
- def break_line_before_end(node, corrector)
77
- corrector.insert_before(
78
- end_token(node).pos,
79
- "\n" + ' ' * configured_indentation_width
80
- )
81
- end
82
-
83
- def remove_semicolon(node, corrector)
84
- return unless token_before_end(node).semicolon?
85
-
86
- corrector.remove(token_before_end(node).pos)
62
+ last_child = node.children.last
63
+ last_child.loc.last_line == node.loc.end.last_line
87
64
  end
88
65
  end
89
66
  end
@@ -28,6 +28,8 @@ module RuboCop
28
28
  # attr_reader :baz
29
29
  # end
30
30
  class TrivialAccessors < Cop
31
+ include AllowedMethods
32
+
31
33
  MSG = 'Use `attr_%<kind>s` to define trivial %<kind>s methods.'
32
34
 
33
35
  def on_def(node)
@@ -95,9 +97,8 @@ module RuboCop
95
97
  cop_config['IgnoreClassMethods']
96
98
  end
97
99
 
98
- def allowed_methods
99
- allowed_methods = cop_config['AllowedMethods']
100
- Array(allowed_methods).map(&:to_sym) + [:initialize]
100
+ def allowed_method_names
101
+ allowed_methods.map(&:to_sym) + [:initialize]
101
102
  end
102
103
 
103
104
  def dsl_writer?(method_name)
@@ -106,7 +107,7 @@ module RuboCop
106
107
 
107
108
  def trivial_reader?(node)
108
109
  looks_like_trivial_reader?(node) &&
109
- !allowed_method?(node) && !allowed_reader?(node)
110
+ !allowed_method_name?(node) && !allowed_reader?(node)
110
111
  end
111
112
 
112
113
  def looks_like_trivial_reader?(node)
@@ -115,7 +116,7 @@ module RuboCop
115
116
 
116
117
  def trivial_writer?(node)
117
118
  looks_like_trivial_writer?(node) &&
118
- !allowed_method?(node) && !allowed_writer?(node.method_name)
119
+ !allowed_method_name?(node) && !allowed_writer?(node.method_name)
119
120
  end
120
121
 
121
122
  def_node_matcher :looks_like_trivial_writer?, <<~PATTERN
@@ -123,8 +124,8 @@ module RuboCop
123
124
  (defs _ _ (args (arg ...)) (ivasgn _ (lvar _)))}
124
125
  PATTERN
125
126
 
126
- def allowed_method?(node)
127
- allowed_methods.include?(node.method_name) ||
127
+ def allowed_method_name?(node)
128
+ allowed_method_names.include?(node.method_name) ||
128
129
  exact_name_match? && !names_match?(node)
129
130
  end
130
131
 
@@ -73,7 +73,7 @@ module RuboCop
73
73
  strings.any? do |s|
74
74
  string = s.str_content.dup.force_encoding(::Encoding::UTF_8)
75
75
  !string.valid_encoding? ||
76
- string !~ word_regex || string =~ / /
76
+ !word_regex.match?(string) || / /.match?(string)
77
77
  end
78
78
  end
79
79
 
@@ -19,6 +19,8 @@ module RuboCop
19
19
  # foo == "bar"
20
20
  # foo <= 42
21
21
  # bar > 10
22
+ # "#{interpolation}" == foo
23
+ # /#{interpolation}/ == foo
22
24
  #
23
25
  # @example EnforcedStyle: forbid_for_equality_operators_only
24
26
  # # bad
@@ -109,7 +111,8 @@ module RuboCop
109
111
  rhs = node.first_argument
110
112
 
111
113
  return true if lhs.literal? && rhs.literal? ||
112
- !lhs.literal? && !rhs.literal?
114
+ !lhs.literal? && !rhs.literal? ||
115
+ interpolation?(lhs)
113
116
 
114
117
  enforce_yoda? ? lhs.literal? : rhs.literal?
115
118
  end
@@ -150,6 +153,20 @@ module RuboCop
150
153
  def program_name?(name)
151
154
  PROGRAM_NAMES.include?(name)
152
155
  end
156
+
157
+ def interpolation?(node)
158
+ return true if node.dstr_type?
159
+
160
+ # TODO: Use `RegexpNode#interpolation?` when the following is released.
161
+ # https://github.com/rubocop-hq/rubocop-ast/pull/18
162
+ if node.regexp_type?
163
+ return true if node.children.any? do |child|
164
+ child.respond_to?(:begin_type?) && child.begin_type?
165
+ end
166
+ end
167
+
168
+ false
169
+ end
153
170
  end
154
171
  end
155
172
  end
@@ -30,6 +30,8 @@ module RuboCop
30
30
  NONZERO_MSG = 'Use `!empty?` instead of ' \
31
31
  '`%<lhs>s %<opr>s %<rhs>s`.'
32
32
 
33
+ LENGTH_METHODS = %i[size length].freeze
34
+
33
35
  def on_send(node)
34
36
  check_zero_length_predicate(node)
35
37
  check_nonzero_length_predicate(node)
@@ -44,31 +46,33 @@ module RuboCop
44
46
  private
45
47
 
46
48
  def check_zero_length_predicate(node)
47
- zero_length_predicate = zero_length_predicate(node)
49
+ return unless LENGTH_METHODS.include?(node.method_name)
48
50
 
51
+ zero_length_predicate = zero_length_predicate(node.parent)
49
52
  return unless zero_length_predicate
50
53
 
51
54
  lhs, opr, rhs = zero_length_predicate
52
55
 
53
- return if non_polymorphic_collection?(node)
56
+ return if non_polymorphic_collection?(node.parent)
54
57
 
55
58
  add_offense(
56
- node,
59
+ node.parent,
57
60
  message: format(ZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
58
61
  )
59
62
  end
60
63
 
61
64
  def check_nonzero_length_predicate(node)
62
- nonzero_length_predicate = nonzero_length_predicate(node)
65
+ return unless LENGTH_METHODS.include?(node.method_name)
63
66
 
67
+ nonzero_length_predicate = nonzero_length_predicate(node.parent)
64
68
  return unless nonzero_length_predicate
65
69
 
66
70
  lhs, opr, rhs = nonzero_length_predicate
67
71
 
68
- return if non_polymorphic_collection?(node)
72
+ return if non_polymorphic_collection?(node.parent)
69
73
 
70
74
  add_offense(
71
- node,
75
+ node.parent,
72
76
  message: format(NONZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
73
77
  )
74
78
  end
@@ -108,8 +112,8 @@ module RuboCop
108
112
  # implement `#size`, but not `#empty`. We ignore those to
109
113
  # reduce false positives.
110
114
  def_node_matcher :non_polymorphic_collection?, <<~PATTERN
111
- {(send (send (send (const nil? :File) :stat _) ...) ...)
112
- (send (send (send (const nil? {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
115
+ {(send (send (send (const {nil? cbase} :File) :stat _) ...) ...)
116
+ (send (send (send (const {nil? cbase} {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
113
117
  PATTERN
114
118
  end
115
119
  end