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
@@ -5,6 +5,13 @@ module RuboCop
5
5
  module Layout
6
6
  # This cop checks for missing space between a token and a comment on the
7
7
  # same line.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # 1 + 1# this operation does ...
12
+ #
13
+ # # good
14
+ # 1 + 1 # this operation does ...
8
15
  class SpaceBeforeComment < Cop
9
16
  MSG = 'Put a space before an end-of-line comment.'.freeze
10
17
 
@@ -4,6 +4,13 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # Checks for semicolon (;) preceded by space.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # x = 1 ; y = 2
11
+ #
12
+ # # good
13
+ # x = 1; y = 2
7
14
  class SpaceBeforeSemicolon < Cop
8
15
  include SpaceBeforePunctuation
9
16
 
@@ -26,7 +26,7 @@ module RuboCop
26
26
 
27
27
  def on_percent_literal(node)
28
28
  each_unnecessary_space_match(node) do |range|
29
- add_offense(node, range, MSG)
29
+ add_offense(node, range)
30
30
  end
31
31
  end
32
32
 
@@ -50,7 +50,7 @@ module RuboCop
50
50
  return unless node.single_line?
51
51
 
52
52
  regex_matches(node) do |match_range|
53
- add_offense(node, match_range, MSG)
53
+ add_offense(node, match_range)
54
54
  end
55
55
  end
56
56
 
@@ -40,7 +40,7 @@ module RuboCop
40
40
 
41
41
  return unless expression =~ /(\s#{escaped_op})|(#{escaped_op}\s)/
42
42
 
43
- add_offense(node, :expression)
43
+ add_offense(node)
44
44
  end
45
45
 
46
46
  def autocorrect(node)
@@ -18,8 +18,8 @@ module RuboCop
18
18
  SPACE_MSG = 'Missing space around string interpolation detected.'.freeze
19
19
 
20
20
  def on_dstr(node)
21
- each_style_violation(node) do |final_node, msg|
22
- add_offense(final_node, :expression, msg)
21
+ each_style_violation(node) do |final_node|
22
+ add_offense(final_node)
23
23
  end
24
24
  end
25
25
 
@@ -31,13 +31,17 @@ module RuboCop
31
31
  next unless final_node
32
32
 
33
33
  if style == :no_space && space_on_any_side?(final_node)
34
- yield final_node, NO_SPACE_MSG
34
+ yield final_node
35
35
  elsif style == :space && !space_on_each_side?(final_node)
36
- yield final_node, SPACE_MSG
36
+ yield final_node
37
37
  end
38
38
  end
39
39
  end
40
40
 
41
+ def message(_node)
42
+ style == :no_space ? NO_SPACE_MSG : SPACE_MSG
43
+ end
44
+
41
45
  def space_on_any_side?(node)
42
46
  interp = node.source_range
43
47
  interp_with_surrounding_space = range_with_surrounding_space(interp)
@@ -22,7 +22,7 @@ module RuboCop
22
22
  index + 1,
23
23
  (spaces.length)...(match.end(0)))
24
24
 
25
- add_offense(range, range, MSG)
25
+ add_offense(range, range)
26
26
  end
27
27
  end
28
28
 
@@ -36,7 +36,7 @@ module RuboCop
36
36
  last_param = node.last_argument.children.first
37
37
  return unless method_as_param?(last_param)
38
38
 
39
- add_offense(node, :expression, message(node.last_argument))
39
+ add_offense(node)
40
40
  end
41
41
 
42
42
  private
@@ -53,7 +53,9 @@ module RuboCop
53
53
  param && param.send_type? && !param.arguments?
54
54
  end
55
55
 
56
- def message(param)
56
+ def message(node)
57
+ param = node.last_argument
58
+
57
59
  format(MSG, param.source, param.children.first.source)
58
60
  end
59
61
 
@@ -24,7 +24,13 @@ module RuboCop
24
24
  class AssignmentInCondition < Cop
25
25
  include SafeAssignment
26
26
 
27
- MSG = 'Assignment in condition - you probably meant to use `==`.'.freeze
27
+ MSG_WITH_SAFE_ASSIGNMENT_ALLOWED =
28
+ 'Use `==` if you meant to do a comparison or wrap the expression ' \
29
+ 'in parentheses to indicate you meant to assign in a ' \
30
+ 'condition.'.freeze
31
+ MSG_WITHOUT_SAFE_ASSIGNMENT_ALLOWED =
32
+ 'Use `==` if you meant to do a comparison or move the assignment ' \
33
+ 'up out of the condition.'.freeze
28
34
  ASGN_TYPES = [:begin, *EQUALS_ASGN_NODES, :send].freeze
29
35
 
30
36
  def on_if(node)
@@ -41,6 +47,14 @@ module RuboCop
41
47
 
42
48
  private
43
49
 
50
+ def message(_node)
51
+ if safe_assignment_allowed?
52
+ MSG_WITH_SAFE_ASSIGNMENT_ALLOWED
53
+ else
54
+ MSG_WITHOUT_SAFE_ASSIGNMENT_ALLOWED
55
+ end
56
+ end
57
+
44
58
  def check(node)
45
59
  return if node.condition.block_type?
46
60
 
@@ -93,14 +93,23 @@ module RuboCop
93
93
  end
94
94
 
95
95
  def block_end_align_target(node)
96
- while (parent = node.parent)
97
- break if !parent || !parent.loc
98
- break if parent.loc.line != node.loc.line && !parent.masgn_type?
99
- break unless block_end_align_target?(parent, node)
100
- node = parent
96
+ lineage = [node, *node.ancestors]
97
+
98
+ target = lineage.each_cons(2) do |current, parent|
99
+ break current if end_align_target?(current, parent)
101
100
  end
102
101
 
103
- node
102
+ target || lineage.last
103
+ end
104
+
105
+ def end_align_target?(node, parent)
106
+ disqualified_parent?(parent, node) ||
107
+ !block_end_align_target?(parent, node)
108
+ end
109
+
110
+ def disqualified_parent?(parent, node)
111
+ parent && parent.loc && parent.loc.line != node.loc.line &&
112
+ !parent.masgn_type?
104
113
  end
105
114
 
106
115
  def check_block_alignment(start_node, block_node)
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for `:true` and `:false` symbols.
7
+ # In most cases it would be a typo.
8
+ #
9
+ # @example
10
+ #
11
+ # # bad
12
+ # :true
13
+ #
14
+ # # good
15
+ # true
16
+ #
17
+ # @example
18
+ #
19
+ # # bad
20
+ # :false
21
+ #
22
+ # # good
23
+ # false
24
+ class BooleanSymbol < Cop
25
+ MSG = 'Symbol with a boolean name - ' \
26
+ 'you probably meant to use `%s`.'.freeze
27
+
28
+ def_node_matcher :boolean_symbol?, '(sym {:true :false})'
29
+
30
+ def on_sym(node)
31
+ return unless boolean_symbol?(node)
32
+
33
+ add_offense(node, :expression, format(MSG, node.source[1..-1]))
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -44,7 +44,11 @@ module RuboCop
44
44
  def check(node)
45
45
  return if node.modifier_form? || node.single_line_condition?
46
46
 
47
- add_offense(node.condition, :expression, format(MSG, node.keyword))
47
+ add_offense(node.condition)
48
+ end
49
+
50
+ def message(node)
51
+ format(MSG, node.parent.keyword)
48
52
  end
49
53
  end
50
54
  end
@@ -35,26 +35,33 @@ module RuboCop
35
35
  class Debugger < Cop
36
36
  MSG = 'Remove debugger entry point `%s`.'.freeze
37
37
 
38
- def_node_matcher :debugger_call?, <<-END
39
- {(send nil {:debugger :byebug} ...)
40
- (send (send nil :binding)
38
+ def_node_matcher :kernel?, <<-PATTERN
39
+ {
40
+ (const nil :Kernel)
41
+ (const (cbase) :Kernel)
42
+ }
43
+ PATTERN
44
+
45
+ def_node_matcher :debugger_call?, <<-PATTERN
46
+ {(send {nil #kernel?} {:debugger :byebug} ...)
47
+ (send (send {#kernel? nil} :binding)
41
48
  {:pry :remote_pry :pry_remote} ...)
42
- (send (const nil :Pry) :rescue ...)
49
+ (send (const {nil (cbase)} :Pry) :rescue ...)
43
50
  (send nil {:save_and_open_page
44
51
  :save_and_open_screenshot
45
52
  :save_screenshot} ...)}
46
- END
53
+ PATTERN
47
54
 
48
- def_node_matcher :binding_irb_call?, <<-END
49
- (send (send nil :binding) :irb ...)
50
- END
55
+ def_node_matcher :binding_irb_call?, <<-PATTERN
56
+ (send (send {#kernel? nil} :binding) :irb ...)
57
+ PATTERN
51
58
 
52
59
  def_node_matcher :pry_rescue?, '(send (const nil :Pry) :rescue ...)'
53
60
 
54
61
  def on_send(node)
55
62
  return unless debugger_call?(node) || binding_irb?(node)
56
63
 
57
- add_offense(node, :expression)
64
+ add_offense(node)
58
65
  end
59
66
 
60
67
  private
@@ -37,19 +37,19 @@ module RuboCop
37
37
  # private def foo
38
38
  # end
39
39
  class DefEndAlignment < Cop
40
- include OnMethodDef
41
40
  include EndKeywordAlignment
42
41
 
43
42
  MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'.freeze
44
43
 
45
- def on_method_def(node, _method_name, _args, _body)
44
+ def on_def(node)
46
45
  check_end_kw_in_node(node)
47
46
  end
47
+ alias on_defs on_def
48
48
 
49
49
  def on_send(node)
50
- return unless modifier_and_def_on_same_line?(node)
50
+ return unless node.def_modifier?
51
51
 
52
- method_def = node.first_argument
52
+ method_def = node.each_descendant(:def, :defs).first
53
53
  expr = node.source_range
54
54
 
55
55
  line_start = range_between(expr.begin_pos,
@@ -33,9 +33,9 @@ module RuboCop
33
33
  def on_case(case_node)
34
34
  case_node.when_branches.each_with_object([]) do |when_node, previous|
35
35
  when_node.each_condition do |condition|
36
- if repeated_condition?(previous, condition)
37
- add_offense(condition, :expression, MSG)
38
- end
36
+ next unless repeated_condition?(previous, condition)
37
+
38
+ add_offense(condition)
39
39
  end
40
40
 
41
41
  previous.push(when_node.conditions)
@@ -20,6 +20,16 @@ module RuboCop
20
20
  #
21
21
  # @example
22
22
  #
23
+ # # bad
24
+ #
25
+ # def duplicated
26
+ # 1
27
+ # end
28
+ #
29
+ # alias duplicated other_duplicated
30
+ #
31
+ # @example
32
+ #
23
33
  # # good
24
34
  #
25
35
  # def duplicated
@@ -43,8 +53,8 @@ module RuboCop
43
53
  return if node.ancestors.any?(&:if_type?)
44
54
  return if possible_dsl?(node)
45
55
 
46
- return unless (scope = node.parent_module_name)
47
- found_instance_method(node, scope)
56
+ name, = *node
57
+ found_instance_method(node, name)
48
58
  end
49
59
 
50
60
  def on_defs(node)
@@ -60,6 +70,40 @@ module RuboCop
60
70
  end
61
71
  end
62
72
 
73
+ def_node_matcher :method_alias?, <<-PATTERN
74
+ (alias (sym $_name) sym)
75
+ PATTERN
76
+
77
+ def on_alias(node)
78
+ return unless (name = method_alias?(node))
79
+ return if node.ancestors.any?(&:if_type?)
80
+ return if possible_dsl?(node)
81
+
82
+ found_instance_method(node, name)
83
+ end
84
+
85
+ def_node_matcher :alias_method?, <<-PATTERN
86
+ (send nil :alias_method (sym $_name) _)
87
+ PATTERN
88
+
89
+ def_node_matcher :attr?, <<-PATTERN
90
+ (send nil ${:attr_reader :attr_writer :attr_accessor :attr} $...)
91
+ PATTERN
92
+
93
+ def_node_matcher :sym_name, '(sym $_name)'
94
+
95
+ def on_send(node)
96
+ if (name = alias_method?(node))
97
+ return unless name
98
+ return if node.ancestors.any?(&:if_type?)
99
+ return if possible_dsl?(node)
100
+
101
+ found_instance_method(node, name)
102
+ elsif (attr = attr?(node))
103
+ on_attr(node, *attr)
104
+ end
105
+ end
106
+
63
107
  private
64
108
 
65
109
  def check_const_receiver(node, name, const_name)
@@ -81,8 +125,8 @@ module RuboCop
81
125
  source_location(node))
82
126
  end
83
127
 
84
- def found_instance_method(node, scope)
85
- name, = *node
128
+ def found_instance_method(node, name)
129
+ return unless (scope = node.parent_module_name)
86
130
  if scope =~ /\A#<Class:(.*)>\Z/
87
131
  found_method(node, "#{Regexp.last_match(1)}.#{name}")
88
132
  else
@@ -92,12 +136,36 @@ module RuboCop
92
136
 
93
137
  def found_method(node, method_name)
94
138
  if @definitions.key?(method_name)
95
- add_offense(node, :keyword, message_for_dup(node, method_name))
139
+ loc = node.send_type? ? node.loc.selector : node.loc.keyword
140
+ add_offense(node, loc, message_for_dup(node, method_name))
96
141
  else
97
142
  @definitions[method_name] = source_location(node)
98
143
  end
99
144
  end
100
145
 
146
+ def on_attr(node, attr_name, args)
147
+ case attr_name
148
+ when :attr
149
+ writable = args.size == 2 && args.last.true_type?
150
+ found_attr(node, [args.first], readable: true, writable: writable)
151
+ when :attr_reader
152
+ found_attr(node, args, readable: true)
153
+ when :attr_writer
154
+ found_attr(node, args, writable: true)
155
+ when :attr_accessor
156
+ found_attr(node, args, readable: true, writable: true)
157
+ end
158
+ end
159
+
160
+ def found_attr(node, args, readable: false, writable: false)
161
+ args.each do |arg|
162
+ name = sym_name(arg)
163
+ next unless name
164
+ found_instance_method(node, name) if readable
165
+ found_instance_method(node, "#{name}=") if writable
166
+ end
167
+ end
168
+
101
169
  def lookup_constant(node, const_name)
102
170
  # this method is quite imperfect and can be fooled
103
171
  # to do much better, we would need to do global analysis of the whole
@@ -29,7 +29,7 @@ module RuboCop
29
29
  return unless duplicates?(keys)
30
30
 
31
31
  consecutive_duplicates(keys).each do |key|
32
- add_offense(key, :expression)
32
+ add_offense(key)
33
33
  end
34
34
  end
35
35
  end
@@ -30,7 +30,7 @@ module RuboCop
30
30
  each_with_object?(node) do |arg|
31
31
  return unless arg.immutable_literal?
32
32
 
33
- add_offense(node, :expression)
33
+ add_offense(node)
34
34
  end
35
35
  end
36
36
  end