rubocop 0.49.1 → 0.50.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 (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