rubocop 0.49.1 → 0.50.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (292) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -3
  3. data/bin/rubocop +1 -1
  4. data/config/default.yml +160 -99
  5. data/config/disabled.yml +4 -5
  6. data/config/enabled.yml +149 -47
  7. data/lib/rubocop.rb +41 -14
  8. data/lib/rubocop/ast/builder.rb +4 -1
  9. data/lib/rubocop/ast/node.rb +36 -42
  10. data/lib/rubocop/ast/node/args_node.rb +1 -13
  11. data/lib/rubocop/ast/node/array_node.rb +9 -0
  12. data/lib/rubocop/ast/node/block_node.rb +9 -0
  13. data/lib/rubocop/ast/node/def_node.rb +71 -0
  14. data/lib/rubocop/ast/node/for_node.rb +8 -0
  15. data/lib/rubocop/ast/node/if_node.rb +10 -2
  16. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  17. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  18. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  19. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
  20. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  21. data/lib/rubocop/ast/node/send_node.rb +1 -154
  22. data/lib/rubocop/ast/node/super_node.rb +3 -24
  23. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  24. data/lib/rubocop/ast/traversal.rb +6 -6
  25. data/lib/rubocop/cli.rb +7 -3
  26. data/lib/rubocop/config.rb +45 -8
  27. data/lib/rubocop/config_loader.rb +7 -5
  28. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +64 -0
  30. data/lib/rubocop/cop/bundler/ordered_gems.rb +12 -12
  31. data/lib/rubocop/cop/commissioner.rb +8 -2
  32. data/lib/rubocop/cop/cop.rb +3 -1
  33. data/lib/rubocop/cop/generator.rb +94 -21
  34. data/lib/rubocop/cop/internal_affairs.rb +3 -0
  35. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +14 -3
  36. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +43 -0
  37. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +46 -0
  38. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +49 -0
  39. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -1
  40. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +2 -3
  41. data/lib/rubocop/cop/layout/align_array.rb +2 -2
  42. data/lib/rubocop/cop/layout/align_hash.rb +2 -2
  43. data/lib/rubocop/cop/layout/align_parameters.rb +5 -11
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/dot_position.rb +9 -0
  47. data/lib/rubocop/cop/layout/else_alignment.rb +30 -13
  48. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +4 -0
  49. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +20 -4
  50. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -3
  51. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -3
  52. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
  53. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +5 -2
  54. data/lib/rubocop/cop/layout/indent_heredoc.rb +19 -24
  55. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
  56. data/lib/rubocop/cop/layout/indentation_width.rb +12 -8
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +33 -18
  58. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -17
  59. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +3 -3
  60. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
  61. data/lib/rubocop/cop/layout/space_after_colon.rb +7 -0
  62. data/lib/rubocop/cop/layout/space_after_comma.rb +10 -0
  63. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -3
  64. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +13 -4
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -5
  67. data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -5
  68. data/lib/rubocop/cop/layout/space_before_comment.rb +7 -0
  69. data/lib/rubocop/cop/layout/space_before_semicolon.rb +7 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
  71. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  73. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +8 -4
  74. data/lib/rubocop/cop/layout/tab.rb +1 -1
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +4 -2
  76. data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
  77. data/lib/rubocop/cop/lint/block_alignment.rb +15 -6
  78. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  79. data/lib/rubocop/cop/lint/condition_position.rb +5 -1
  80. data/lib/rubocop/cop/lint/debugger.rb +16 -9
  81. data/lib/rubocop/cop/lint/def_end_alignment.rb +4 -4
  82. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
  83. data/lib/rubocop/cop/lint/duplicate_methods.rb +73 -5
  84. data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
  85. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  86. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  87. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  88. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  89. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  90. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  91. data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
  92. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +35 -40
  93. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  94. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +18 -13
  95. data/lib/rubocop/cop/lint/inherit_exception.rb +8 -7
  96. data/lib/rubocop/cop/lint/interpolation_check.rb +36 -0
  97. data/lib/rubocop/cop/lint/literal_in_condition.rb +3 -3
  98. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  99. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  100. data/lib/rubocop/cop/lint/nested_method_definition.rb +5 -7
  101. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  102. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -12
  103. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  104. data/lib/rubocop/cop/lint/rand_one.rb +7 -1
  105. data/lib/rubocop/cop/lint/redundant_with_index.rb +77 -0
  106. data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
  107. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/rescue_type.rb +13 -6
  109. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +38 -0
  110. data/lib/rubocop/cop/lint/return_in_void_context.rb +63 -0
  111. data/lib/rubocop/cop/lint/script_permission.rb +6 -0
  112. data/lib/rubocop/cop/lint/syntax.rb +17 -20
  113. data/lib/rubocop/cop/lint/unified_integer.rb +3 -2
  114. data/lib/rubocop/cop/lint/unneeded_disable.rb +1 -1
  115. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
  116. data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
  117. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
  118. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  119. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -8
  120. data/lib/rubocop/cop/lint/useless_setter_call.rb +10 -11
  121. data/lib/rubocop/cop/lint/void.rb +29 -23
  122. data/lib/rubocop/cop/metrics/line_length.rb +2 -2
  123. data/lib/rubocop/cop/metrics/method_length.rb +8 -3
  124. data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
  125. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +1 -1
  126. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -2
  127. data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
  128. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  129. data/lib/rubocop/cop/mixin/method_complexity.rb +9 -6
  130. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +68 -31
  131. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +18 -0
  132. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -1
  133. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  134. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  135. data/lib/rubocop/cop/{style → naming}/accessor_method_name.rb +11 -12
  136. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +1 -1
  137. data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +2 -2
  138. data/lib/rubocop/cop/{style → naming}/class_and_module_camel_case.rb +1 -1
  139. data/lib/rubocop/cop/{style → naming}/constant_name.rb +1 -1
  140. data/lib/rubocop/cop/{style → naming}/file_name.rb +8 -4
  141. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +68 -0
  142. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +58 -0
  143. data/lib/rubocop/cop/{style → naming}/method_name.rb +1 -1
  144. data/lib/rubocop/cop/{style → naming}/predicate_name.rb +6 -7
  145. data/lib/rubocop/cop/{style → naming}/variable_name.rb +11 -15
  146. data/lib/rubocop/cop/{style → naming}/variable_number.rb +1 -1
  147. data/lib/rubocop/cop/performance/caller.rb +39 -11
  148. data/lib/rubocop/cop/performance/casecmp.rb +4 -4
  149. data/lib/rubocop/cop/performance/compare_with_block.rb +4 -4
  150. data/lib/rubocop/cop/performance/double_start_end_with.rb +4 -4
  151. data/lib/rubocop/cop/performance/end_with.rb +3 -3
  152. data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
  153. data/lib/rubocop/cop/performance/hash_each_methods.rb +66 -25
  154. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -2
  155. data/lib/rubocop/cop/performance/range_include.rb +2 -2
  156. data/lib/rubocop/cop/performance/redundant_block_call.rb +6 -6
  157. data/lib/rubocop/cop/performance/redundant_match.rb +5 -5
  158. data/lib/rubocop/cop/performance/redundant_merge.rb +39 -23
  159. data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -2
  160. data/lib/rubocop/cop/performance/regexp_match.rb +13 -5
  161. data/lib/rubocop/cop/performance/size.rb +1 -1
  162. data/lib/rubocop/cop/performance/start_with.rb +3 -3
  163. data/lib/rubocop/cop/performance/times_map.rb +23 -12
  164. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  165. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  166. data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -1
  167. data/lib/rubocop/cop/rails/delegate.rb +36 -7
  168. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
  169. data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -2
  170. data/lib/rubocop/cop/rails/file_path.rb +3 -4
  171. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  172. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +48 -0
  173. data/lib/rubocop/cop/rails/http_positional_arguments.rb +5 -5
  174. data/lib/rubocop/cop/rails/not_null_column.rb +1 -1
  175. data/lib/rubocop/cop/rails/pluralization_grammar.rb +2 -2
  176. data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
  177. data/lib/rubocop/cop/rails/request_referer.rb +2 -2
  178. data/lib/rubocop/cop/rails/reversible_migration.rb +12 -12
  179. data/lib/rubocop/cop/rails/save_bang.rb +8 -6
  180. data/lib/rubocop/cop/rails/scope_args.rb +1 -1
  181. data/lib/rubocop/cop/security/eval.rb +2 -2
  182. data/lib/rubocop/cop/security/json_load.rb +2 -2
  183. data/lib/rubocop/cop/security/marshal_load.rb +2 -2
  184. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  185. data/lib/rubocop/cop/style/alias.rb +44 -20
  186. data/lib/rubocop/cop/style/and_or.rb +48 -34
  187. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
  188. data/lib/rubocop/cop/style/block_comments.rb +3 -1
  189. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  190. data/lib/rubocop/cop/style/command_literal.rb +20 -9
  191. data/lib/rubocop/cop/style/conditional_assignment.rb +30 -28
  192. data/lib/rubocop/cop/style/copyright.rb +10 -10
  193. data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -5
  194. data/lib/rubocop/cop/style/dir.rb +52 -0
  195. data/lib/rubocop/cop/style/documentation_method.rb +2 -6
  196. data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
  197. data/lib/rubocop/cop/style/empty_else.rb +3 -2
  198. data/lib/rubocop/cop/style/empty_literal.rb +1 -2
  199. data/lib/rubocop/cop/style/empty_method.rb +27 -17
  200. data/lib/rubocop/cop/style/flip_flop.rb +2 -2
  201. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  202. data/lib/rubocop/cop/style/guard_clause.rb +4 -2
  203. data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
  204. data/lib/rubocop/cop/style/identical_conditional_branches.rb +5 -1
  205. data/lib/rubocop/cop/style/if_with_semicolon.rb +1 -1
  206. data/lib/rubocop/cop/style/implicit_runtime_error.rb +4 -3
  207. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  208. data/lib/rubocop/cop/style/inverse_methods.rb +20 -8
  209. data/lib/rubocop/cop/style/lambda.rb +19 -9
  210. data/lib/rubocop/cop/style/lambda_call.rb +22 -1
  211. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -20
  212. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
  213. data/lib/rubocop/cop/style/method_def_parentheses.rb +18 -26
  214. data/lib/rubocop/cop/style/method_missing.rb +5 -18
  215. data/lib/rubocop/cop/style/min_max.rb +67 -0
  216. data/lib/rubocop/cop/style/missing_else.rb +16 -3
  217. data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
  218. data/lib/rubocop/cop/style/module_function.rb +8 -4
  219. data/lib/rubocop/cop/style/multiline_if_modifier.rb +5 -1
  220. data/lib/rubocop/cop/style/multiline_memoization.rb +25 -3
  221. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  222. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  223. data/lib/rubocop/cop/style/mutable_constant.rb +2 -6
  224. data/lib/rubocop/cop/style/negated_if.rb +8 -4
  225. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +8 -8
  226. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  227. data/lib/rubocop/cop/style/non_nil_check.rb +14 -14
  228. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -2
  229. data/lib/rubocop/cop/style/numeric_literals.rb +2 -2
  230. data/lib/rubocop/cop/style/numeric_predicate.rb +8 -4
  231. data/lib/rubocop/cop/style/one_line_conditional.rb +8 -3
  232. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  233. data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
  234. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  235. data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
  236. data/lib/rubocop/cop/style/parentheses_around_condition.rb +12 -11
  237. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  238. data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
  239. data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
  240. data/lib/rubocop/cop/style/proc.rb +1 -1
  241. data/lib/rubocop/cop/style/raise_args.rb +16 -17
  242. data/lib/rubocop/cop/style/redundant_begin.rb +6 -5
  243. data/lib/rubocop/cop/style/redundant_conditional.rb +95 -0
  244. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  245. data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -11
  246. data/lib/rubocop/cop/style/redundant_return.rb +23 -11
  247. data/lib/rubocop/cop/style/redundant_self.rb +18 -9
  248. data/lib/rubocop/cop/style/regexp_literal.rb +12 -4
  249. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  250. data/lib/rubocop/cop/style/return_nil.rb +98 -0
  251. data/lib/rubocop/cop/style/safe_navigation.rb +80 -43
  252. data/lib/rubocop/cop/style/single_line_block_params.rb +14 -13
  253. data/lib/rubocop/cop/style/single_line_methods.rb +9 -13
  254. data/lib/rubocop/cop/style/special_global_vars.rb +3 -3
  255. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -39
  256. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +22 -1
  257. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  258. data/lib/rubocop/cop/style/symbol_array.rb +5 -25
  259. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  260. data/lib/rubocop/cop/style/symbol_proc.rb +3 -18
  261. data/lib/rubocop/cop/style/ternary_parentheses.rb +14 -10
  262. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +28 -9
  263. data/lib/rubocop/cop/style/trivial_accessors.rb +39 -56
  264. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  265. data/lib/rubocop/cop/style/unneeded_capital_w.rb +1 -1
  266. data/lib/rubocop/cop/style/unneeded_interpolation.rb +1 -1
  267. data/lib/rubocop/cop/style/unneeded_percent_q.rb +1 -1
  268. data/lib/rubocop/cop/style/variable_interpolation.rb +8 -3
  269. data/lib/rubocop/cop/style/word_array.rb +7 -24
  270. data/lib/rubocop/cop/style/yoda_condition.rb +49 -14
  271. data/lib/rubocop/cop/style/zero_length_predicate.rb +25 -18
  272. data/lib/rubocop/cop/team.rb +16 -8
  273. data/lib/rubocop/cop/util.rb +11 -0
  274. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  275. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  276. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  277. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  278. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  279. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
  280. data/lib/rubocop/node_pattern.rb +44 -26
  281. data/lib/rubocop/options.rb +1 -0
  282. data/lib/rubocop/processed_source.rb +3 -1
  283. data/lib/rubocop/remote_config.rb +5 -1
  284. data/lib/rubocop/result_cache.rb +1 -0
  285. data/lib/rubocop/rspec/cop_helper.rb +10 -10
  286. data/lib/rubocop/rspec/expect_offense.rb +6 -8
  287. data/lib/rubocop/rspec/shared_examples.rb +8 -8
  288. data/lib/rubocop/string_util.rb +2 -0
  289. data/lib/rubocop/version.rb +1 -1
  290. metadata +51 -18
  291. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
  292. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
@@ -57,7 +57,7 @@ module RuboCop
57
57
 
58
58
  return unless first_else.source_range.line == node.loc.else.line
59
59
 
60
- add_offense(first_else, :expression)
60
+ add_offense(first_else)
61
61
  end
62
62
  end
63
63
  end
@@ -28,7 +28,7 @@ module RuboCop
28
28
  def on_begin(node)
29
29
  return unless empty_expression?(node)
30
30
 
31
- add_offense(node, node.source_range, MSG)
31
+ add_offense(node, node.source_range)
32
32
  end
33
33
 
34
34
  private
@@ -21,7 +21,7 @@ module RuboCop
21
21
 
22
22
  def on_dstr(node)
23
23
  node.each_child_node(:begin) do |begin_node|
24
- add_offense(begin_node, :expression) if begin_node.children.empty?
24
+ add_offense(begin_node) if begin_node.children.empty?
25
25
  end
26
26
  end
27
27
 
@@ -29,7 +29,7 @@ module RuboCop
29
29
  node.each_when do |when_node|
30
30
  next if when_node.body
31
31
 
32
- add_offense(when_node, when_node.source_range, MSG)
32
+ add_offense(when_node, when_node.source_range)
33
33
  end
34
34
  end
35
35
  end
@@ -34,7 +34,7 @@ module RuboCop
34
34
  return unless ensure_body
35
35
 
36
36
  ensure_body.each_node(:return) do |return_node|
37
- add_offense(return_node, :expression)
37
+ add_offense(return_node)
38
38
  end
39
39
  end
40
40
  end
@@ -23,11 +23,11 @@ module RuboCop
23
23
 
24
24
  def on_float(node)
25
25
  value, = *node
26
- if value.infinite?
27
- add_offense(node, :expression, MSG)
28
- elsif value.zero? && node.source =~ /[1-9]/
29
- add_offense(node, :expression, MSG)
30
- end
26
+
27
+ return unless value.infinite? ||
28
+ value.zero? && node.source =~ /[1-9]/
29
+
30
+ add_offense(node)
31
31
  end
32
32
  end
33
33
  end
@@ -23,7 +23,7 @@ module RuboCop
23
23
  MSG = "Number of arguments (%i) to `%s` doesn't match the number of " \
24
24
  'fields (%i).'.freeze
25
25
  FIELD_REGEX =
26
- /(%(([\s#+-0\*]*)(\d*)?(.\d+)?[bBdiouxXeEfgGaAcps]|%))/
26
+ /(%(([\s#+-0\*]*)(\d*)?(\.\d+)?[bBdiouxXeEfgGaAcps]|%))/
27
27
  NAMED_FIELD_REGEX = /%\{[_a-zA-Z][_a-zA-Z]+\}/
28
28
  KERNEL = 'Kernel'.freeze
29
29
  SHOVEL = '<<'.freeze
@@ -73,12 +73,10 @@ module RuboCop
73
73
  end
74
74
 
75
75
  def named_mode?(node)
76
- receiver_node, _method_name, *args = *node
77
-
78
76
  relevant_node = if sprintf?(node) || format?(node)
79
- args.first
77
+ node.first_argument
80
78
  elsif percent?(node)
81
- receiver_node
79
+ node.receiver
82
80
  end
83
81
 
84
82
  !relevant_node.source.scan(NAMED_FIELD_REGEX).empty?
@@ -95,31 +93,38 @@ module RuboCop
95
93
  end
96
94
 
97
95
  def count_matches(node)
98
- receiver_node, _method_name, *args = *node
99
-
100
- if (sprintf?(node) || format?(node)) && !heredoc?(node)
101
- number_of_args_for_format = arguments_count(args) - 1
102
- number_of_expected_fields = expected_fields_count(args.first)
103
- elsif percent?(node) && args.first.array_type?
104
- number_of_expected_fields = expected_fields_count(receiver_node)
105
- number_of_args_for_format = arguments_count(args.first.child_nodes)
96
+ if countable_format?(node)
97
+ count_format_matches(node)
98
+ elsif countable_percent?(node)
99
+ count_percent_matches(node)
106
100
  else
107
- number_of_args_for_format = number_of_expected_fields = :unknown
101
+ [:unknown] * 2
108
102
  end
103
+ end
109
104
 
110
- [number_of_args_for_format, number_of_expected_fields]
105
+ def countable_format?(node)
106
+ (sprintf?(node) || format?(node)) && !heredoc?(node)
111
107
  end
112
108
 
113
- def format_method?(name, node)
114
- receiver, method_name, *args = *node
109
+ def countable_percent?(node)
110
+ percent?(node) && node.first_argument.array_type?
111
+ end
115
112
 
116
- if receiver && receiver.const_type?
117
- return false unless receiver.loc.name.is?(KERNEL)
118
- end
113
+ def count_format_matches(node)
114
+ [node.arguments.count - 1, expected_fields_count(node.first_argument)]
115
+ end
119
116
 
120
- return false unless method_name == name
117
+ def count_percent_matches(node)
118
+ [node.first_argument.child_nodes.count,
119
+ expected_fields_count(node.receiver)]
120
+ end
121
+
122
+ def format_method?(name, node)
123
+ return false if node.const_receiver? &&
124
+ !node.receiver.loc.name.is?(KERNEL)
125
+ return false unless node.method?(name)
121
126
 
122
- args.size > 1 && args.first.str_type?
127
+ node.arguments.size > 1 && node.first_argument.str_type?
123
128
  end
124
129
 
125
130
  def expected_fields_count(node)
@@ -130,17 +135,12 @@ module RuboCop
130
135
  .source
131
136
  .scan(FIELD_REGEX)
132
137
  .reject { |x| x.first == PERCENT_PERCENT }
133
- .reduce(0) { |acc, elem| acc + (elem[2] =~ /\*/ ? 2 : 1) }
138
+ .reduce(0) { |acc, elem| acc + arguments_count(elem[2]) }
134
139
  end
135
140
 
136
- def arguments_count(args)
137
- if args.empty?
138
- 0
139
- elsif args.last.splat_type?
140
- -(args.count - 1)
141
- else
142
- args.count
143
- end
141
+ # number of arguments required for the format sequence
142
+ def arguments_count(format)
143
+ format.scan('*').count + 1
144
144
  end
145
145
 
146
146
  def format?(node)
@@ -154,13 +154,12 @@ module RuboCop
154
154
  def percent?(node)
155
155
  receiver = node.receiver
156
156
 
157
- percent = node.method_name == :% &&
157
+ percent = node.method?(:%) &&
158
158
  (STRING_TYPES.include?(receiver.type) ||
159
159
  node.first_argument.array_type?)
160
160
 
161
- if percent && STRING_TYPES.include?(receiver.type)
162
- return false if heredoc?(node)
163
- end
161
+ return false if percent && STRING_TYPES.include?(receiver.type) &&
162
+ heredoc?(node)
164
163
 
165
164
  percent
166
165
  end
@@ -168,11 +167,7 @@ module RuboCop
168
167
  def message(node)
169
168
  num_args_for_format, num_expected_fields = count_matches(node)
170
169
 
171
- method_name = if node.method_name.to_s == PERCENT
172
- 'String#%'
173
- else
174
- node.method_name
175
- end
170
+ method_name = node.method?(:%) ? 'String#%' : node.method_name
176
171
 
177
172
  format(MSG, num_args_for_format, method_name, num_expected_fields)
178
173
  end
@@ -48,7 +48,7 @@ module RuboCop
48
48
  MSG = 'Do not suppress exceptions.'.freeze
49
49
 
50
50
  def on_resbody(node)
51
- add_offense(node, :expression) unless node.body
51
+ add_offense(node) unless node.body
52
52
  end
53
53
  end
54
54
  end
@@ -53,10 +53,6 @@ module RuboCop
53
53
  ALTERNATIVE_PROTECTED = '`protected` inside a `class << self` ' \
54
54
  'block'.freeze
55
55
 
56
- def_node_matcher :access_modifier, <<-PATTERN
57
- (send nil ${:public :protected :private})
58
- PATTERN
59
-
60
56
  def_node_matcher :private_class_method, <<-PATTERN
61
57
  (send nil :private_class_method $...)
62
58
  PATTERN
@@ -105,25 +101,34 @@ module RuboCop
105
101
  end
106
102
 
107
103
  def check_child_scope(node, cur_vis)
108
- if (new_vis = access_modifier(node))
109
- cur_vis = change_visibility(node, new_vis)
110
- elsif node.defs_type?
111
- mark_method_as_useless(node, cur_vis) if cur_vis != :public
104
+ case node.type
105
+ when :send
106
+ cur_vis = check_send(node, cur_vis)
107
+ when :defs
108
+ check_defs(node, cur_vis)
109
+ when :kwbegin
110
+ check_scope(node, cur_vis)
111
+ end
112
+
113
+ cur_vis
114
+ end
115
+
116
+ def check_send(node, cur_vis)
117
+ if node.access_modifier? && !node.method?(:module_function)
118
+ @last_access_modifier = node
119
+ return node.method_name
112
120
  elsif (methods = private_class_method(node))
113
121
  # don't warn about defs nodes which are followed by a call to
114
122
  # `private_class_method :name`
115
123
  # obviously the programmer knows what they are doing
116
124
  revert_method_uselessness(methods)
117
- elsif node.kwbegin_type?
118
- cur_vis = check_scope(node, cur_vis)
119
125
  end
120
126
 
121
127
  cur_vis
122
128
  end
123
129
 
124
- def change_visibility(node, new_vis)
125
- @last_access_modifier = node
126
- new_vis
130
+ def check_defs(node, cur_vis)
131
+ mark_method_as_useless(node, cur_vis) if cur_vis != :public
127
132
  end
128
133
 
129
134
  def mark_method_as_useless(node, cur_vis)
@@ -54,18 +54,15 @@ module RuboCop
54
54
  def on_class(node)
55
55
  _class, base_class, _body = *node
56
56
 
57
- return if base_class.nil?
57
+ return unless base_class && illegal_class_name?(base_class)
58
58
 
59
- check(base_class)
59
+ add_offense(base_class)
60
60
  end
61
61
 
62
62
  private
63
63
 
64
- def check(node)
65
- return unless ILLEGAL_CLASSES.include?(node.const_name)
66
-
67
- msg = format(MSG, preferred_base_class, node.const_name)
68
- add_offense(node, :expression, msg)
64
+ def message(node)
65
+ format(MSG, preferred_base_class, node.const_name)
69
66
  end
70
67
 
71
68
  def autocorrect(node)
@@ -74,6 +71,10 @@ module RuboCop
74
71
  end
75
72
  end
76
73
 
74
+ def illegal_class_name?(class_node)
75
+ ILLEGAL_CLASSES.include?(class_node.const_name)
76
+ end
77
+
77
78
  def preferred_base_class
78
79
  PREFERRED_BASE_CLASS[style]
79
80
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for interpolation in a single quoted string.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ #
12
+ # foo = 'something with #{interpolation} inside'
13
+ #
14
+ # @example
15
+ #
16
+ # # good
17
+ #
18
+ # foo = "something with #{interpolation} inside"
19
+ class InterpolationCheck < Cop
20
+ MSG = 'Interpolation in single quoted string detected. '\
21
+ 'Use double quoted strings if you need interpolation.'.freeze
22
+
23
+ def on_str(node)
24
+ return if heredoc?(node)
25
+ return unless scrub_string(node.str_content) =~ /#\{.*\}/
26
+ add_offense(node)
27
+ end
28
+
29
+ def heredoc?(node)
30
+ node.loc.is_a?(Parser::Source::Map::Heredoc) ||
31
+ (node.parent && heredoc?(node.parent))
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -60,7 +60,7 @@ module RuboCop
60
60
  case_node.each_when do |when_node|
61
61
  next unless when_node.conditions.all?(&:literal?)
62
62
 
63
- add_offense(when_node, :expression)
63
+ add_offense(when_node)
64
64
  end
65
65
  end
66
66
  end
@@ -73,7 +73,7 @@ module RuboCop
73
73
 
74
74
  def check_for_literal(node)
75
75
  if node.condition.literal?
76
- add_offense(node.condition, :expression)
76
+ add_offense(node.condition)
77
77
  else
78
78
  check_node(node.condition)
79
79
  end
@@ -107,7 +107,7 @@ module RuboCop
107
107
 
108
108
  def handle_node(node)
109
109
  if node.literal?
110
- add_offense(node, :expression)
110
+ add_offense(node)
111
111
  elsif %i[send and or begin].include?(node.type)
112
112
  check_node(node)
113
113
  end
@@ -27,7 +27,7 @@ module RuboCop
27
27
  next if special_keyword?(final_node)
28
28
  next unless prints_as_self?(final_node)
29
29
 
30
- add_offense(final_node, :expression)
30
+ add_offense(final_node)
31
31
  end
32
32
  end
33
33
 
@@ -31,7 +31,7 @@ module RuboCop
31
31
  def on_send(node)
32
32
  return unless multiple_compare?(node)
33
33
 
34
- add_offense(node, :expression)
34
+ add_offense(node)
35
35
  end
36
36
 
37
37
  def autocorrect(node)
@@ -55,17 +55,17 @@ module RuboCop
55
55
  # end
56
56
  # end
57
57
  class NestedMethodDefinition < Cop
58
- include OnMethodDef
59
- extend RuboCop::NodePattern::Macros
60
-
61
58
  MSG = 'Method definitions must not be nested. ' \
62
59
  'Use `lambda` instead.'.freeze
63
60
 
64
- def on_method_def(node, _method_name, _args, _body)
61
+ def on_def(node)
65
62
  find_nested_defs(node) do |nested_def_node|
66
- add_offense(nested_def_node, :expression)
63
+ add_offense(nested_def_node)
67
64
  end
68
65
  end
66
+ alias on_defs on_def
67
+
68
+ private
69
69
 
70
70
  def find_nested_defs(node, &block)
71
71
  node.each_child_node do |child|
@@ -81,8 +81,6 @@ module RuboCop
81
81
  end
82
82
  end
83
83
 
84
- private
85
-
86
84
  def scoping_method_call?(child)
87
85
  eval_call?(child) || exec_call?(child) || child.sclass_type? ||
88
86
  class_or_module_or_struct_new_call?(child)
@@ -35,7 +35,7 @@ module RuboCop
35
35
  n.children.empty? && parent_block_node(n) == node
36
36
  end
37
37
 
38
- add_offense(void_next, :expression) if void_next
38
+ add_offense(void_next) if void_next
39
39
  end
40
40
  end
41
41
 
@@ -37,7 +37,7 @@ module RuboCop
37
37
  def on_percent_literal(node)
38
38
  return unless contains_quotes_or_commas?(node)
39
39
 
40
- add_offense(node, :expression, MSG)
40
+ add_offense(node)
41
41
  end
42
42
 
43
43
  private
@@ -53,6 +53,7 @@ module RuboCop
53
53
  end
54
54
  end
55
55
 
56
+ # rubocop:disable Performance/HashEachMethods
56
57
  def autocorrect(node)
57
58
  lambda do |corrector|
58
59
  node.values.each do |value|
@@ -67,17 +68,7 @@ module RuboCop
67
68
  end
68
69
  end
69
70
  end
70
-
71
- def scrub_string(string)
72
- if string.respond_to?(:scrub)
73
- string.scrub
74
- else
75
- string
76
- .encode('UTF-16BE', 'UTF-8',
77
- invalid: :replace, undef: :replace, replace: '?')
78
- .encode('UTF-8')
79
- end
80
- end
71
+ # rubocop:enable Performance/HashEachMethod
81
72
  end
82
73
  end
83
74
  end