rubocop 0.80.0 → 0.84.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 (293) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -4
  3. data/config/default.yml +171 -34
  4. data/lib/rubocop.rb +15 -62
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli.rb +11 -5
  7. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  8. data/lib/rubocop/config.rb +41 -13
  9. data/lib/rubocop/config_loader.rb +40 -36
  10. data/lib/rubocop/config_loader_resolver.rb +27 -4
  11. data/lib/rubocop/config_obsoletion.rb +2 -0
  12. data/lib/rubocop/config_validator.rb +18 -1
  13. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  14. data/lib/rubocop/cop/badge.rb +5 -5
  15. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  16. data/lib/rubocop/cop/corrector.rb +49 -27
  17. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -8
  18. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  19. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  20. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
  21. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  22. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -3
  23. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  24. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  25. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  26. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  27. data/lib/rubocop/cop/generator.rb +4 -3
  28. data/lib/rubocop/cop/ignored_node.rb +1 -3
  29. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  30. data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
  31. data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
  32. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  33. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  34. data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
  35. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  36. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
  37. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  38. data/lib/rubocop/cop/layout/first_argument_indentation.rb +0 -2
  39. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +14 -10
  40. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  41. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  42. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -8
  43. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  44. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  45. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  46. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  47. data/lib/rubocop/cop/layout/line_length.rb +7 -4
  48. data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -4
  49. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  50. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  51. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  52. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  53. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +129 -0
  54. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
  55. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  56. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  57. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
  58. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  59. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  60. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -6
  61. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  62. data/lib/rubocop/cop/lint/ambiguous_operator.rb +40 -0
  63. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  64. data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
  65. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  66. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +133 -0
  67. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  68. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  69. data/lib/rubocop/cop/lint/ensure_return.rb +18 -1
  70. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  71. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  72. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  73. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  74. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  75. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  76. data/lib/rubocop/cop/lint/loop.rb +6 -4
  77. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
  78. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  79. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  80. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  81. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +31 -11
  82. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
  83. data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
  84. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
  85. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  86. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  87. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  88. data/lib/rubocop/cop/lint/suppressed_exception.rb +20 -25
  89. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  90. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  91. data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
  92. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  93. data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
  94. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  95. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +5 -0
  96. data/lib/rubocop/cop/migration/department_name.rb +21 -12
  97. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  98. data/lib/rubocop/cop/mixin/array_min_size.rb +2 -6
  99. data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -12
  100. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  101. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -3
  102. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
  103. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
  104. data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -3
  105. data/lib/rubocop/cop/mixin/line_length_help.rb +2 -1
  106. data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
  107. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -3
  108. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  109. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
  110. data/lib/rubocop/cop/mixin/surrounding_space.rb +1 -3
  111. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  112. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  113. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  114. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  115. data/lib/rubocop/cop/naming/file_name.rb +1 -3
  116. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  117. data/lib/rubocop/cop/naming/method_name.rb +26 -0
  118. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  119. data/lib/rubocop/cop/registry.rb +13 -10
  120. data/lib/rubocop/cop/severity.rb +1 -3
  121. data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
  122. data/lib/rubocop/cop/style/alias.rb +4 -4
  123. data/lib/rubocop/cop/style/and_or.rb +7 -8
  124. data/lib/rubocop/cop/style/array_join.rb +1 -1
  125. data/lib/rubocop/cop/style/attr.rb +1 -3
  126. data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
  127. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  128. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  129. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  130. data/lib/rubocop/cop/style/conditional_assignment.rb +9 -11
  131. data/lib/rubocop/cop/style/copyright.rb +1 -1
  132. data/lib/rubocop/cop/style/dir.rb +1 -1
  133. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  134. data/lib/rubocop/cop/style/documentation.rb +43 -5
  135. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  136. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  137. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  138. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  139. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  140. data/lib/rubocop/cop/style/empty_method.rb +1 -5
  141. data/lib/rubocop/cop/style/end_block.rb +6 -0
  142. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  143. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  144. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  145. data/lib/rubocop/cop/style/format_string.rb +2 -2
  146. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -4
  147. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  148. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -3
  149. data/lib/rubocop/cop/style/hash_syntax.rb +15 -10
  150. data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -2
  151. data/lib/rubocop/cop/style/hash_transform_values.rb +6 -5
  152. data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
  153. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  154. data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
  155. data/lib/rubocop/cop/style/lambda.rb +3 -2
  156. data/lib/rubocop/cop/style/lambda_call.rb +1 -21
  157. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  158. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  159. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  160. data/lib/rubocop/cop/style/module_function.rb +58 -12
  161. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  162. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  163. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  164. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  165. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -4
  166. data/lib/rubocop/cop/style/next.rb +2 -2
  167. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  168. data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
  169. data/lib/rubocop/cop/style/not.rb +1 -1
  170. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  171. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  172. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  173. data/lib/rubocop/cop/style/one_line_conditional.rb +6 -9
  174. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  175. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  176. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  177. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  178. data/lib/rubocop/cop/style/proc.rb +1 -1
  179. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  180. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  181. data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
  182. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  183. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  184. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  185. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -6
  186. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  187. data/lib/rubocop/cop/style/redundant_return.rb +5 -7
  188. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  189. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  190. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  191. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  192. data/lib/rubocop/cop/style/safe_navigation.rb +3 -7
  193. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  194. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  195. data/lib/rubocop/cop/style/special_global_vars.rb +3 -7
  196. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  197. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  198. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  199. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  200. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -5
  201. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -0
  202. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
  203. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  204. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
  205. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +2 -6
  206. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  207. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  208. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  209. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  210. data/lib/rubocop/cop/style/word_array.rb +1 -1
  211. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  212. data/lib/rubocop/cop/util.rb +24 -0
  213. data/lib/rubocop/cop/variable_force.rb +3 -9
  214. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  215. data/lib/rubocop/cop/variable_force/branch.rb +2 -6
  216. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  217. data/lib/rubocop/cop/variable_force/variable.rb +3 -6
  218. data/lib/rubocop/ext/processed_source.rb +18 -0
  219. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  220. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  221. data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -12
  222. data/lib/rubocop/formatter/formatter_set.rb +1 -4
  223. data/lib/rubocop/formatter/junit_formatter.rb +17 -6
  224. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  225. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  226. data/lib/rubocop/name_similarity.rb +12 -9
  227. data/lib/rubocop/options.rb +20 -13
  228. data/lib/rubocop/remote_config.rb +1 -3
  229. data/lib/rubocop/result_cache.rb +1 -3
  230. data/lib/rubocop/rspec/cop_helper.rb +2 -4
  231. data/lib/rubocop/rspec/expect_offense.rb +4 -10
  232. data/lib/rubocop/rspec/shared_contexts.rb +54 -20
  233. data/lib/rubocop/runner.rb +15 -12
  234. data/lib/rubocop/target_finder.rb +5 -7
  235. data/lib/rubocop/target_ruby.rb +2 -2
  236. data/lib/rubocop/version.rb +5 -3
  237. metadata +32 -77
  238. data/lib/rubocop/ast/builder.rb +0 -83
  239. data/lib/rubocop/ast/node.rb +0 -632
  240. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  241. data/lib/rubocop/ast/node/and_node.rb +0 -29
  242. data/lib/rubocop/ast/node/args_node.rb +0 -29
  243. data/lib/rubocop/ast/node/array_node.rb +0 -57
  244. data/lib/rubocop/ast/node/block_node.rb +0 -117
  245. data/lib/rubocop/ast/node/break_node.rb +0 -17
  246. data/lib/rubocop/ast/node/case_node.rb +0 -56
  247. data/lib/rubocop/ast/node/class_node.rb +0 -31
  248. data/lib/rubocop/ast/node/def_node.rb +0 -82
  249. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  250. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  251. data/lib/rubocop/ast/node/float_node.rb +0 -12
  252. data/lib/rubocop/ast/node/for_node.rb +0 -53
  253. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  254. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  255. data/lib/rubocop/ast/node/if_node.rb +0 -175
  256. data/lib/rubocop/ast/node/int_node.rb +0 -12
  257. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  258. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  259. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  260. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  261. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  262. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  263. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -261
  264. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  265. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  266. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  267. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  268. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  269. data/lib/rubocop/ast/node/module_node.rb +0 -24
  270. data/lib/rubocop/ast/node/or_node.rb +0 -29
  271. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  272. data/lib/rubocop/ast/node/range_node.rb +0 -18
  273. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  274. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  275. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  276. data/lib/rubocop/ast/node/return_node.rb +0 -24
  277. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  278. data/lib/rubocop/ast/node/send_node.rb +0 -13
  279. data/lib/rubocop/ast/node/str_node.rb +0 -16
  280. data/lib/rubocop/ast/node/super_node.rb +0 -21
  281. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  282. data/lib/rubocop/ast/node/until_node.rb +0 -35
  283. data/lib/rubocop/ast/node/when_node.rb +0 -53
  284. data/lib/rubocop/ast/node/while_node.rb +0 -35
  285. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  286. data/lib/rubocop/ast/sexp.rb +0 -16
  287. data/lib/rubocop/ast/traversal.rb +0 -200
  288. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  289. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  290. data/lib/rubocop/node_pattern.rb +0 -887
  291. data/lib/rubocop/processed_source.rb +0 -216
  292. data/lib/rubocop/string_util.rb +0 -14
  293. data/lib/rubocop/token.rb +0 -114
@@ -84,7 +84,7 @@ module RuboCop
84
84
 
85
85
  def on_send(node)
86
86
  erb_new_with_non_keyword_arguments(node) do |arguments|
87
- return if correct_arguments?(arguments)
87
+ return if arguments.empty? || correct_arguments?(arguments)
88
88
 
89
89
  arguments[1..3].each_with_index do |argument, i|
90
90
  next if !argument || argument.hash_type?
@@ -141,13 +141,9 @@ module RuboCop
141
141
  arguments = node.arguments
142
142
  overridden_kwargs = kwargs.dup
143
143
 
144
- if arguments[2]
145
- overridden_kwargs[0] = "trim_mode: #{arguments[2].source}"
146
- end
144
+ overridden_kwargs[0] = "trim_mode: #{arguments[2].source}" if arguments[2]
147
145
 
148
- if arguments[3] && !arguments[3].hash_type?
149
- overridden_kwargs[1] = "eoutvar: #{arguments[3].source}"
150
- end
146
+ overridden_kwargs[1] = "eoutvar: #{arguments[3].source}" if arguments[3] && !arguments[3].hash_type?
151
147
 
152
148
  overridden_kwargs
153
149
  end
@@ -81,7 +81,7 @@ module RuboCop
81
81
  end
82
82
 
83
83
  def display_str(node)
84
- if node.source =~ /\n/
84
+ if /\n/.match?(node.source)
85
85
  str_content(node).inspect
86
86
  else
87
87
  node.source
@@ -77,7 +77,7 @@ module RuboCop
77
77
 
78
78
  def autocorrect(node)
79
79
  lambda do |corrector|
80
- corrector.replace(node.loc.expression, preferred_base_class)
80
+ corrector.replace(node, preferred_base_class)
81
81
  end
82
82
  end
83
83
 
@@ -25,7 +25,7 @@ module RuboCop
25
25
 
26
26
  parent = node.parent
27
27
  return if parent && (parent.dstr_type? || parent.regexp_type?)
28
- return unless node.source.scrub =~ /(?<!\\)#\{.*\}/
28
+ return unless /(?<!\\)#\{.*\}/.match?(node.source.scrub)
29
29
 
30
30
  add_offense(node)
31
31
  end
@@ -10,26 +10,25 @@ module RuboCop
10
10
  # @example
11
11
  #
12
12
  # # bad
13
- #
14
13
  # if 20
15
14
  # do_something
16
15
  # end
17
16
  #
18
- # @example
19
- #
20
17
  # # bad
21
- #
22
18
  # if some_var && true
23
19
  # do_something
24
20
  # end
25
21
  #
26
- # @example
27
- #
28
22
  # # good
29
- #
30
23
  # if some_var && some_condition
31
24
  # do_something
32
25
  # end
26
+ #
27
+ # # good
28
+ # # When using a boolean value for an infinite loop.
29
+ # while true
30
+ # break if condition
31
+ # end
33
32
  class LiteralAsCondition < Cop
34
33
  MSG = 'Literal `%<literal>s` appeared as a condition.'
35
34
 
@@ -38,20 +37,18 @@ module RuboCop
38
37
  end
39
38
 
40
39
  def on_while(node)
41
- check_for_literal(node)
42
- end
40
+ return if condition(node).true_type?
43
41
 
44
- def on_while_post(node)
45
42
  check_for_literal(node)
46
43
  end
44
+ alias on_while_post on_while
47
45
 
48
46
  def on_until(node)
49
- check_for_literal(node)
50
- end
47
+ return if condition(node).false_type?
51
48
 
52
- def on_until_post(node)
53
49
  check_for_literal(node)
54
50
  end
51
+ alias on_until_post on_until
55
52
 
56
53
  def on_case(case_node)
57
54
  if case_node.condition
@@ -37,7 +37,7 @@ module RuboCop
37
37
  return if node.dstr_type? # nested, fixed in next iteration
38
38
 
39
39
  value = autocorrected_value(node)
40
- ->(corrector) { corrector.replace(node.parent.source_range, value) }
40
+ ->(corrector) { corrector.replace(node.parent, value) }
41
41
  end
42
42
 
43
43
  private
@@ -27,18 +27,20 @@ module RuboCop
27
27
  #
28
28
  # # good
29
29
  #
30
- # # using while
31
- # while some_condition
30
+ # # while replacement
31
+ # loop do
32
32
  # do_something
33
+ # break unless some_condition
33
34
  # end
34
35
  #
35
36
  # @example
36
37
  #
37
38
  # # good
38
39
  #
39
- # # using until
40
- # until some_condition
40
+ # # until replacement
41
+ # loop do
41
42
  # do_something
43
+ # break if some_condition
42
44
  # end
43
45
  class Loop < Cop
44
46
  MSG = 'Use `Kernel#loop` with `break` rather than ' \
@@ -39,7 +39,7 @@ module RuboCop
39
39
  new_center = "#{center.source} && #{center.source}"
40
40
 
41
41
  lambda do |corrector|
42
- corrector.replace(center.source_range, new_center)
42
+ corrector.replace(center, new_center)
43
43
  end
44
44
  end
45
45
  end
@@ -31,14 +31,14 @@ module RuboCop
31
31
  # # good
32
32
  #
33
33
  # def foo
34
- # self.class_eval do
34
+ # self.class.class_eval do
35
35
  # def bar
36
36
  # end
37
37
  # end
38
38
  # end
39
39
  #
40
40
  # def foo
41
- # self.module_exec do
41
+ # self.class.module_exec do
42
42
  # def bar
43
43
  # end
44
44
  # end
@@ -52,12 +52,12 @@ module RuboCop
52
52
  def autocorrect(node)
53
53
  if unsorted_dir_block?(node)
54
54
  lambda do |corrector|
55
- corrector.replace(node.loc.expression, "#{node.source}.sort.each")
55
+ corrector.replace(node, "#{node.source}.sort.each")
56
56
  end
57
57
  else
58
58
  lambda do |corrector|
59
59
  source = node.receiver.source
60
- corrector.replace(node.loc.expression, "#{source}.sort.each")
60
+ corrector.replace(node, "#{source}.sort.each")
61
61
  end
62
62
  end
63
63
  end
@@ -55,7 +55,7 @@ module RuboCop
55
55
 
56
56
  def autocorrect(node)
57
57
  lambda do |corrector|
58
- corrector.replace(node.loc.expression,
58
+ corrector.replace(node,
59
59
  correct_method(node, node.receiver))
60
60
  end
61
61
  end
@@ -9,36 +9,56 @@ module RuboCop
9
9
  # @example
10
10
  #
11
11
  # # bad
12
- #
13
- # puts (x + y)
14
- #
15
- # @example
12
+ # do_something (foo)
16
13
  #
17
14
  # # good
18
- #
19
- # puts(x + y)
15
+ # do_something(foo)
16
+ # do_something (2 + 3) * 4
17
+ # do_something (foo * bar).baz
20
18
  class ParenthesesAsGroupedExpression < Cop
21
19
  include RangeHelp
22
20
 
23
21
  MSG = '`(...)` interpreted as grouped expression.'
24
22
 
25
23
  def on_send(node)
26
- return unless node.arguments.one?
27
- return if node.operator_method? || node.setter_method?
28
-
29
- return unless node.first_argument.source.start_with?('(')
24
+ return if valid_context?(node)
30
25
 
31
26
  space_length = spaces_before_left_parenthesis(node)
32
27
  return unless space_length.positive?
33
28
 
34
29
  range = space_range(node.first_argument.source_range, space_length)
35
30
 
36
- add_offense(nil, location: range)
31
+ add_offense(node, location: range)
37
32
  end
38
33
  alias on_csend on_send
39
34
 
35
+ def autocorrect(node)
36
+ space_length = spaces_before_left_parenthesis(node)
37
+ range = space_range(node.first_argument.source_range, space_length)
38
+
39
+ lambda do |corrector|
40
+ corrector.remove(range)
41
+ end
42
+ end
43
+
40
44
  private
41
45
 
46
+ def valid_context?(node)
47
+ return true unless node.arguments.one? && first_argument_starts_with_left_parenthesis?(node)
48
+
49
+ node.operator_method? || node.setter_method? || grouped_parentheses?(node)
50
+ end
51
+
52
+ def first_argument_starts_with_left_parenthesis?(node)
53
+ node.first_argument.source.start_with?('(')
54
+ end
55
+
56
+ def grouped_parentheses?(node)
57
+ first_argument = node.first_argument
58
+
59
+ first_argument.send_type? && first_argument.receiver&.begin_type?
60
+ end
61
+
42
62
  def spaces_before_left_parenthesis(node)
43
63
  receiver = node.receiver
44
64
  receiver_length = if receiver
@@ -42,15 +42,13 @@ module RuboCop
42
42
 
43
43
  def autocorrect(node)
44
44
  lambda do |corrector|
45
- node.values.each do |value|
45
+ node.each_value do |value|
46
46
  range = value.loc.expression
47
47
 
48
48
  match = range.source.match(TRAILING_QUOTE)
49
49
  corrector.remove_trailing(range, match[0].length) if match
50
50
 
51
- if range.source =~ LEADING_QUOTE
52
- corrector.remove_leading(range, 1)
53
- end
51
+ corrector.remove_leading(range, 1) if LEADING_QUOTE.match?(range.source)
54
52
  end
55
53
  end
56
54
  end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for `raise` or `fail` statements which are
7
+ # raising `Exception` class.
8
+ #
9
+ # You can specify a module name that will be an implicit namespace
10
+ # using `AllowedImplicitNamespaces` option. The cop cause a false positive
11
+ # for namespaced `Exception` when a namespace is omitted. This option can
12
+ # prevent the false positive by specifying a namespace to be omitted for
13
+ # `Exception`. Alternatively, make `Exception` a fully qualified class
14
+ # name with an explicit namespace.
15
+ #
16
+ # @example
17
+ # # bad
18
+ # raise Exception, 'Error message here'
19
+ #
20
+ # # good
21
+ # raise StandardError, 'Error message here'
22
+ #
23
+ # @example AllowedImplicitNamespaces: ['Gem']
24
+ # # good
25
+ # module Gem
26
+ # def self.foo
27
+ # raise Exception # This exception means `Gem::Exception`.
28
+ # end
29
+ # end
30
+ class RaiseException < Cop
31
+ MSG = 'Use `StandardError` over `Exception`.'
32
+
33
+ def_node_matcher :exception?, <<~PATTERN
34
+ (send nil? {:raise :fail} (const ${cbase nil?} :Exception) ... )
35
+ PATTERN
36
+
37
+ def_node_matcher :exception_new_with_message?, <<~PATTERN
38
+ (send nil? {:raise :fail}
39
+ (send (const ${cbase nil?} :Exception) :new ... ))
40
+ PATTERN
41
+
42
+ def on_send(node)
43
+ exception?(node, &check(node)) ||
44
+ exception_new_with_message?(node, &check(node))
45
+ end
46
+
47
+ private
48
+
49
+ def check(node)
50
+ lambda do |cbase|
51
+ return if cbase.nil? && implicit_namespace?(node)
52
+
53
+ add_offense(node)
54
+ end
55
+ end
56
+
57
+ def implicit_namespace?(node)
58
+ return false unless (parent = node.parent)
59
+
60
+ if parent.module_type?
61
+ namespace = parent.identifier.source
62
+
63
+ return allow_implicit_namespaces.include?(namespace)
64
+ end
65
+
66
+ implicit_namespace?(parent)
67
+ end
68
+
69
+ def allow_implicit_namespaces
70
+ cop_config['AllowedImplicitNamespaces'] || []
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -26,7 +26,6 @@ module RuboCop
26
26
  # # good
27
27
  # x += 1
28
28
  class RedundantCopDisableDirective < Cop
29
- include NameSimilarity
30
29
  include RangeHelp
31
30
 
32
31
  COP_NAME = 'Lint/RedundantCopDisableDirective'
@@ -235,7 +234,7 @@ module RuboCop
235
234
  elsif all_cop_names.include?(cop)
236
235
  "`#{cop}`"
237
236
  else
238
- similar = find_similar_name(cop, [])
237
+ similar = NameSimilarity.find_similar_name(cop, all_cop_names)
239
238
  if similar
240
239
  "`#{cop}` (did you mean `#{similar}`?)"
241
240
  else
@@ -244,10 +243,6 @@ module RuboCop
244
243
  end
245
244
  end
246
245
 
247
- def collect_variable_like_names(scope)
248
- all_cop_names.each { |name| scope << name }
249
- end
250
-
251
246
  def all_cop_names
252
247
  @all_cop_names ||= Cop.registry.names
253
248
  end
@@ -38,7 +38,7 @@ module RuboCop
38
38
  lambda do |corrector|
39
39
  receiver = node.receiver
40
40
  corrector.replace(
41
- node.source_range,
41
+ node,
42
42
  if receiver
43
43
  receiver.source
44
44
  else
@@ -32,7 +32,7 @@ module RuboCop
32
32
  def_node_matcher :bad_method?, <<~PATTERN
33
33
  {
34
34
  (send $(csend ...) $_ ...)
35
- (send $(block (csend ...) ...) $_ ...)
35
+ (send $({block numblock} (csend ...) ...) $_ ...)
36
36
  }
37
37
  PATTERN
38
38
 
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks unexpected overrides of the `Struct` built-in methods
7
+ # via `Struct.new`.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # Bad = Struct.new(:members, :clone, :count)
12
+ # b = Bad.new([], true, 1)
13
+ # b.members #=> [] (overriding `Struct#members`)
14
+ # b.clone #=> true (overriding `Object#clone`)
15
+ # b.count #=> 1 (overriding `Enumerable#count`)
16
+ #
17
+ # # good
18
+ # Good = Struct.new(:id, :name)
19
+ # g = Good.new(1, "foo")
20
+ # g.members #=> [:id, :name]
21
+ # g.clone #=> #<struct Good id=1, name="foo">
22
+ # g.count #=> 2
23
+ #
24
+ class StructNewOverride < Cop
25
+ MSG = '`%<member_name>s` member overrides `Struct#%<method_name>s`' \
26
+ ' and it may be unexpected.'
27
+
28
+ STRUCT_METHOD_NAMES = Struct.instance_methods
29
+ STRUCT_MEMBER_NAME_TYPES = %i[sym str].freeze
30
+
31
+ def_node_matcher :struct_new, <<~PATTERN
32
+ (send
33
+ (const ${nil? cbase} :Struct) :new ...)
34
+ PATTERN
35
+
36
+ def on_send(node)
37
+ return unless struct_new(node) do
38
+ node.arguments.each_with_index do |arg, index|
39
+ # Ignore if the first argument is a class name
40
+ next if index.zero? && arg.str_type?
41
+
42
+ # Ignore if the argument is not a member name
43
+ next unless STRUCT_MEMBER_NAME_TYPES.include?(arg.type)
44
+
45
+ member_name = arg.value
46
+
47
+ next unless STRUCT_METHOD_NAMES.include?(member_name.to_sym)
48
+
49
+ message = format(MSG, member_name: member_name.inspect,
50
+ method_name: member_name.to_s)
51
+ add_offense(arg, message: message)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end