rubocop 0.35.1 → 0.36.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubocop might be problematic. Click here for more details.

Files changed (385) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +164 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +72 -21
  5. data/bin/rubocop +1 -0
  6. data/config/default.yml +167 -18
  7. data/config/disabled.yml +19 -6
  8. data/config/enabled.yml +159 -14
  9. data/lib/rubocop.rb +67 -26
  10. data/lib/rubocop/ast_node.rb +488 -14
  11. data/lib/rubocop/ast_node/builder.rb +24 -0
  12. data/lib/rubocop/ast_node/sexp.rb +13 -0
  13. data/lib/rubocop/cached_data.rb +58 -0
  14. data/lib/rubocop/cli.rb +47 -10
  15. data/lib/rubocop/comment_config.rb +9 -2
  16. data/lib/rubocop/config.rb +99 -31
  17. data/lib/rubocop/config_loader.rb +23 -14
  18. data/lib/rubocop/config_store.rb +1 -0
  19. data/lib/rubocop/cop/autocorrect_logic.rb +2 -1
  20. data/lib/rubocop/cop/commissioner.rb +3 -5
  21. data/lib/rubocop/cop/cop.rb +23 -17
  22. data/lib/rubocop/cop/corrector.rb +25 -0
  23. data/lib/rubocop/cop/force.rb +1 -0
  24. data/lib/rubocop/cop/ignored_node.rb +3 -2
  25. data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -1
  26. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +2 -1
  27. data/lib/rubocop/cop/lint/assignment_in_condition.rb +4 -3
  28. data/lib/rubocop/cop/lint/block_alignment.rb +29 -91
  29. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -1
  30. data/lib/rubocop/cop/lint/condition_position.rb +2 -1
  31. data/lib/rubocop/cop/lint/debugger.rb +29 -12
  32. data/lib/rubocop/cop/lint/def_end_alignment.rb +16 -18
  33. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +6 -6
  34. data/lib/rubocop/cop/lint/duplicate_methods.rb +98 -74
  35. data/lib/rubocop/cop/lint/duplicated_key.rb +3 -2
  36. data/lib/rubocop/cop/lint/each_with_object_argument.rb +3 -2
  37. data/lib/rubocop/cop/lint/else_layout.rb +2 -1
  38. data/lib/rubocop/cop/lint/empty_ensure.rb +2 -1
  39. data/lib/rubocop/cop/lint/empty_interpolation.rb +2 -1
  40. data/lib/rubocop/cop/lint/end_alignment.rb +77 -39
  41. data/lib/rubocop/cop/lint/end_in_method.rb +2 -1
  42. data/lib/rubocop/cop/lint/ensure_return.rb +2 -1
  43. data/lib/rubocop/cop/lint/eval.rb +2 -1
  44. data/lib/rubocop/cop/lint/float_out_of_range.rb +31 -0
  45. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +14 -30
  46. data/lib/rubocop/cop/lint/handle_exceptions.rb +2 -1
  47. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +85 -0
  48. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +120 -0
  49. data/lib/rubocop/cop/lint/invalid_character_literal.rb +3 -1
  50. data/lib/rubocop/cop/lint/literal_in_condition.rb +6 -9
  51. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +6 -9
  52. data/lib/rubocop/cop/lint/loop.rb +2 -1
  53. data/lib/rubocop/cop/lint/nested_method_definition.rb +19 -3
  54. data/lib/rubocop/cop/lint/next_without_accumulator.rb +38 -0
  55. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +5 -8
  56. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -6
  57. data/lib/rubocop/cop/lint/rand_one.rb +36 -0
  58. data/lib/rubocop/cop/lint/require_parentheses.rb +6 -5
  59. data/lib/rubocop/cop/lint/rescue_exception.rb +3 -2
  60. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -1
  61. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -4
  62. data/lib/rubocop/cop/lint/syntax.rb +9 -5
  63. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +3 -2
  64. data/lib/rubocop/cop/lint/unneeded_disable.rb +121 -18
  65. data/lib/rubocop/cop/lint/unreachable_code.rb +5 -4
  66. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  67. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  68. data/lib/rubocop/cop/lint/useless_access_modifier.rb +56 -29
  69. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -16
  70. data/lib/rubocop/cop/lint/useless_comparison.rb +3 -2
  71. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +2 -1
  72. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -20
  73. data/lib/rubocop/cop/lint/void.rb +10 -11
  74. data/lib/rubocop/cop/metrics/abc_size.rb +3 -1
  75. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -1
  76. data/lib/rubocop/cop/metrics/class_length.rb +1 -0
  77. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +4 -2
  78. data/lib/rubocop/cop/metrics/line_length.rb +35 -13
  79. data/lib/rubocop/cop/metrics/method_length.rb +2 -1
  80. data/lib/rubocop/cop/metrics/module_length.rb +1 -0
  81. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -1
  82. data/lib/rubocop/cop/metrics/perceived_complexity.rb +4 -2
  83. data/lib/rubocop/cop/mixin/access_modifier_node.rb +3 -10
  84. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -0
  85. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +80 -0
  86. data/lib/rubocop/cop/mixin/array_syntax.rb +2 -1
  87. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +14 -20
  88. data/lib/rubocop/cop/mixin/autocorrect_unless_changing_ast.rb +5 -4
  89. data/lib/rubocop/cop/mixin/check_assignment.rb +20 -15
  90. data/lib/rubocop/cop/mixin/classish_length.rb +1 -0
  91. data/lib/rubocop/cop/mixin/code_length.rb +1 -0
  92. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +17 -15
  93. data/lib/rubocop/cop/mixin/configurable_max.rb +1 -0
  94. data/lib/rubocop/cop/mixin/configurable_naming.rb +4 -0
  95. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +9 -4
  96. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +24 -16
  97. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -2
  98. data/lib/rubocop/cop/mixin/hash_node.rb +15 -0
  99. data/lib/rubocop/cop/mixin/if_node.rb +1 -0
  100. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -0
  101. data/lib/rubocop/cop/mixin/method_preference.rb +1 -0
  102. data/lib/rubocop/cop/mixin/min_body_length.rb +1 -0
  103. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +177 -0
  104. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -0
  105. data/lib/rubocop/cop/mixin/on_method_def.rb +6 -5
  106. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +1 -0
  107. data/lib/rubocop/cop/mixin/parentheses.rb +22 -0
  108. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -0
  109. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -0
  110. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -0
  111. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -0
  112. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -1
  113. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +2 -1
  114. data/lib/rubocop/cop/mixin/space_inside.rb +2 -1
  115. data/lib/rubocop/cop/mixin/statement_modifier.rb +6 -5
  116. data/lib/rubocop/cop/mixin/string_help.rb +2 -9
  117. data/lib/rubocop/cop/mixin/string_literals_help.rb +13 -7
  118. data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -2
  119. data/lib/rubocop/cop/mixin/trailing_comma.rb +134 -0
  120. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -0
  121. data/lib/rubocop/cop/offense.rb +19 -14
  122. data/lib/rubocop/cop/performance/case_when_splat.rb +8 -8
  123. data/lib/rubocop/cop/performance/casecmp.rb +54 -0
  124. data/lib/rubocop/cop/performance/count.rb +10 -9
  125. data/lib/rubocop/cop/performance/detect.rb +6 -5
  126. data/lib/rubocop/cop/performance/double_start_end_with.rb +65 -0
  127. data/lib/rubocop/cop/performance/end_with.rb +55 -0
  128. data/lib/rubocop/cop/performance/fixed_size.rb +1 -0
  129. data/lib/rubocop/cop/performance/flat_map.rb +9 -8
  130. data/lib/rubocop/cop/performance/hash_each.rb +86 -0
  131. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +44 -0
  132. data/lib/rubocop/cop/performance/range_include.rb +40 -0
  133. data/lib/rubocop/cop/performance/redundant_block_call.rb +57 -0
  134. data/lib/rubocop/cop/performance/redundant_match.rb +51 -0
  135. data/lib/rubocop/cop/performance/redundant_merge.rb +85 -0
  136. data/lib/rubocop/cop/performance/redundant_sort_by.rb +45 -0
  137. data/lib/rubocop/cop/performance/reverse_each.rb +3 -2
  138. data/lib/rubocop/cop/performance/sample.rb +6 -5
  139. data/lib/rubocop/cop/performance/size.rb +2 -1
  140. data/lib/rubocop/cop/performance/start_with.rb +58 -0
  141. data/lib/rubocop/cop/performance/string_replacement.rb +18 -23
  142. data/lib/rubocop/cop/performance/times_map.rb +49 -0
  143. data/lib/rubocop/cop/rails/action_filter.rb +4 -3
  144. data/lib/rubocop/cop/rails/date.rb +5 -4
  145. data/lib/rubocop/cop/rails/delegate.rb +3 -2
  146. data/lib/rubocop/cop/rails/find_by.rb +20 -14
  147. data/lib/rubocop/cop/rails/find_each.rb +23 -2
  148. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +3 -2
  149. data/lib/rubocop/cop/rails/output.rb +4 -2
  150. data/lib/rubocop/cop/rails/pluralization_grammar.rb +3 -2
  151. data/lib/rubocop/cop/rails/read_write_attribute.rb +5 -7
  152. data/lib/rubocop/cop/rails/scope_args.rb +3 -2
  153. data/lib/rubocop/cop/rails/time_zone.rb +14 -10
  154. data/lib/rubocop/cop/rails/validation.rb +4 -3
  155. data/lib/rubocop/cop/severity.rb +8 -7
  156. data/lib/rubocop/cop/style/access_modifier_indentation.rb +5 -4
  157. data/lib/rubocop/cop/style/accessor_method_name.rb +1 -0
  158. data/lib/rubocop/cop/style/alias.rb +84 -24
  159. data/lib/rubocop/cop/style/align_array.rb +2 -1
  160. data/lib/rubocop/cop/style/align_hash.rb +13 -14
  161. data/lib/rubocop/cop/style/align_parameters.rb +3 -2
  162. data/lib/rubocop/cop/style/and_or.rb +9 -7
  163. data/lib/rubocop/cop/style/array_join.rb +5 -5
  164. data/lib/rubocop/cop/style/ascii_comments.rb +2 -1
  165. data/lib/rubocop/cop/style/ascii_identifiers.rb +2 -1
  166. data/lib/rubocop/cop/style/attr.rb +30 -5
  167. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -3
  168. data/lib/rubocop/cop/style/bare_percent_literals.rb +2 -1
  169. data/lib/rubocop/cop/style/begin_block.rb +2 -1
  170. data/lib/rubocop/cop/style/block_comments.rb +2 -1
  171. data/lib/rubocop/cop/style/block_delimiters.rb +10 -9
  172. data/lib/rubocop/cop/style/block_end_newline.rb +3 -2
  173. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +9 -8
  174. data/lib/rubocop/cop/style/case_equality.rb +2 -1
  175. data/lib/rubocop/cop/style/case_indentation.rb +2 -1
  176. data/lib/rubocop/cop/style/character_literal.rb +11 -7
  177. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +2 -1
  178. data/lib/rubocop/cop/style/class_and_module_children.rb +3 -2
  179. data/lib/rubocop/cop/style/class_check.rb +2 -1
  180. data/lib/rubocop/cop/style/class_methods.rb +2 -1
  181. data/lib/rubocop/cop/style/class_vars.rb +2 -1
  182. data/lib/rubocop/cop/style/closing_parenthesis_indentation.rb +3 -2
  183. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  184. data/lib/rubocop/cop/style/colon_method_call.rb +3 -2
  185. data/lib/rubocop/cop/style/command_literal.rb +8 -7
  186. data/lib/rubocop/cop/style/comment_annotation.rb +3 -2
  187. data/lib/rubocop/cop/style/comment_indentation.rb +4 -6
  188. data/lib/rubocop/cop/style/conditional_assignment.rb +362 -0
  189. data/lib/rubocop/cop/style/constant_name.rb +2 -1
  190. data/lib/rubocop/cop/style/copyright.rb +7 -6
  191. data/lib/rubocop/cop/style/def_with_parentheses.rb +2 -1
  192. data/lib/rubocop/cop/style/deprecated_hash_methods.rb +3 -2
  193. data/lib/rubocop/cop/style/documentation.rb +7 -11
  194. data/lib/rubocop/cop/style/dot_position.rb +3 -2
  195. data/lib/rubocop/cop/style/double_negation.rb +2 -1
  196. data/lib/rubocop/cop/style/each_with_object.rb +4 -3
  197. data/lib/rubocop/cop/style/else_alignment.rb +3 -2
  198. data/lib/rubocop/cop/style/empty_else.rb +4 -3
  199. data/lib/rubocop/cop/style/empty_line_between_defs.rb +2 -1
  200. data/lib/rubocop/cop/style/empty_lines.rb +10 -4
  201. data/lib/rubocop/cop/style/empty_lines_around_access_modifier.rb +13 -5
  202. data/lib/rubocop/cop/style/empty_lines_around_block_body.rb +7 -3
  203. data/lib/rubocop/cop/style/empty_lines_around_class_body.rb +6 -3
  204. data/lib/rubocop/cop/style/empty_lines_around_method_body.rb +4 -3
  205. data/lib/rubocop/cop/style/empty_lines_around_module_body.rb +4 -2
  206. data/lib/rubocop/cop/style/empty_literal.rb +20 -5
  207. data/lib/rubocop/cop/style/encoding.rb +8 -11
  208. data/lib/rubocop/cop/style/end_block.rb +3 -1
  209. data/lib/rubocop/cop/style/end_of_line.rb +2 -1
  210. data/lib/rubocop/cop/style/even_odd.rb +4 -3
  211. data/lib/rubocop/cop/style/extra_spacing.rb +110 -74
  212. data/lib/rubocop/cop/style/file_name.rb +103 -6
  213. data/lib/rubocop/cop/style/first_array_element_line_break.rb +3 -2
  214. data/lib/rubocop/cop/style/first_hash_element_line_break.rb +5 -6
  215. data/lib/rubocop/cop/style/first_method_argument_line_break.rb +14 -1
  216. data/lib/rubocop/cop/style/first_method_parameter_line_break.rb +2 -1
  217. data/lib/rubocop/cop/style/first_parameter_indentation.rb +6 -4
  218. data/lib/rubocop/cop/style/flip_flop.rb +2 -1
  219. data/lib/rubocop/cop/style/for.rb +2 -1
  220. data/lib/rubocop/cop/style/format_string.rb +1 -0
  221. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -0
  222. data/lib/rubocop/cop/style/global_vars.rb +2 -1
  223. data/lib/rubocop/cop/style/guard_clause.rb +63 -11
  224. data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
  225. data/lib/rubocop/cop/style/identical_conditional_branches.rb +93 -0
  226. data/lib/rubocop/cop/style/if_inside_else.rb +49 -0
  227. data/lib/rubocop/cop/style/if_unless_modifier.rb +6 -5
  228. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -1
  229. data/lib/rubocop/cop/style/indent_array.rb +89 -38
  230. data/lib/rubocop/cop/style/indent_assignment.rb +43 -0
  231. data/lib/rubocop/cop/style/indent_hash.rb +16 -77
  232. data/lib/rubocop/cop/style/indentation_consistency.rb +2 -1
  233. data/lib/rubocop/cop/style/indentation_width.rb +11 -11
  234. data/lib/rubocop/cop/style/infinite_loop.rb +5 -9
  235. data/lib/rubocop/cop/style/initial_indentation.rb +2 -1
  236. data/lib/rubocop/cop/style/inline_comment.rb +2 -1
  237. data/lib/rubocop/cop/style/lambda.rb +14 -11
  238. data/lib/rubocop/cop/style/lambda_call.rb +4 -4
  239. data/lib/rubocop/cop/style/leading_comment_space.rb +2 -1
  240. data/lib/rubocop/cop/style/line_end_concatenation.rb +3 -1
  241. data/lib/rubocop/cop/style/method_call_parentheses.rb +9 -1
  242. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -2
  243. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -4
  244. data/lib/rubocop/cop/style/method_name.rb +1 -0
  245. data/lib/rubocop/cop/style/missing_else.rb +5 -3
  246. data/lib/rubocop/cop/style/module_function.rb +2 -1
  247. data/lib/rubocop/cop/style/multiline_array_brace_layout.rb +95 -0
  248. data/lib/rubocop/cop/style/multiline_assignment_layout.rb +91 -0
  249. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  250. data/lib/rubocop/cop/style/multiline_block_layout.rb +11 -9
  251. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -0
  252. data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +137 -0
  253. data/lib/rubocop/cop/style/multiline_operation_indentation.rb +25 -135
  254. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +2 -1
  255. data/lib/rubocop/cop/style/mutable_constant.rb +4 -5
  256. data/lib/rubocop/cop/style/negated_if.rb +3 -3
  257. data/lib/rubocop/cop/style/negated_while.rb +3 -3
  258. data/lib/rubocop/cop/style/nested_modifier.rb +6 -5
  259. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +48 -0
  260. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -1
  261. data/lib/rubocop/cop/style/next.rb +79 -15
  262. data/lib/rubocop/cop/style/nil_comparison.rb +5 -5
  263. data/lib/rubocop/cop/style/non_nil_check.rb +5 -5
  264. data/lib/rubocop/cop/style/not.rb +5 -9
  265. data/lib/rubocop/cop/style/numeric_literals.rb +5 -4
  266. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -2
  267. data/lib/rubocop/cop/style/op_method.rb +7 -4
  268. data/lib/rubocop/cop/style/option_hash.rb +13 -7
  269. data/lib/rubocop/cop/style/optional_arguments.rb +3 -2
  270. data/lib/rubocop/cop/style/parallel_assignment.rb +40 -16
  271. data/lib/rubocop/cop/style/parentheses_around_condition.rb +3 -16
  272. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +3 -2
  273. data/lib/rubocop/cop/style/percent_q_literals.rb +3 -6
  274. data/lib/rubocop/cop/style/perl_backrefs.rb +4 -3
  275. data/lib/rubocop/cop/style/predicate_name.rb +1 -0
  276. data/lib/rubocop/cop/style/proc.rb +3 -2
  277. data/lib/rubocop/cop/style/raise_args.rb +2 -1
  278. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  279. data/lib/rubocop/cop/style/redundant_exception.rb +5 -5
  280. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -4
  281. data/lib/rubocop/cop/style/redundant_parentheses.rb +80 -0
  282. data/lib/rubocop/cop/style/redundant_return.rb +5 -4
  283. data/lib/rubocop/cop/style/redundant_self.rb +7 -8
  284. data/lib/rubocop/cop/style/regexp_literal.rb +9 -8
  285. data/lib/rubocop/cop/style/rescue_ensure_alignment.rb +3 -2
  286. data/lib/rubocop/cop/style/rescue_modifier.rb +11 -9
  287. data/lib/rubocop/cop/style/self_assignment.rb +4 -5
  288. data/lib/rubocop/cop/style/semicolon.rb +3 -2
  289. data/lib/rubocop/cop/style/send.rb +3 -1
  290. data/lib/rubocop/cop/style/signal_exception.rb +5 -3
  291. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -1
  292. data/lib/rubocop/cop/style/single_line_methods.rb +7 -7
  293. data/lib/rubocop/cop/style/space_after_colon.rb +2 -1
  294. data/lib/rubocop/cop/style/space_after_comma.rb +1 -0
  295. data/lib/rubocop/cop/style/space_after_control_keyword.rb +5 -5
  296. data/lib/rubocop/cop/style/space_after_method_name.rb +3 -2
  297. data/lib/rubocop/cop/style/space_after_not.rb +4 -3
  298. data/lib/rubocop/cop/style/space_after_semicolon.rb +1 -0
  299. data/lib/rubocop/cop/style/space_around_block_parameters.rb +8 -7
  300. data/lib/rubocop/cop/style/space_around_equals_in_parameter_default.rb +1 -0
  301. data/lib/rubocop/cop/style/space_around_operators.rb +72 -32
  302. data/lib/rubocop/cop/style/space_before_block_braces.rb +2 -1
  303. data/lib/rubocop/cop/style/space_before_comma.rb +1 -0
  304. data/lib/rubocop/cop/style/space_before_comment.rb +2 -1
  305. data/lib/rubocop/cop/style/{single_space_before_first_arg.rb → space_before_first_arg.rb} +13 -4
  306. data/lib/rubocop/cop/style/space_before_modifier_keyword.rb +4 -3
  307. data/lib/rubocop/cop/style/space_before_semicolon.rb +1 -0
  308. data/lib/rubocop/cop/style/space_inside_block_braces.rb +3 -2
  309. data/lib/rubocop/cop/style/space_inside_brackets.rb +1 -0
  310. data/lib/rubocop/cop/style/space_inside_hash_literal_braces.rb +4 -1
  311. data/lib/rubocop/cop/style/space_inside_parens.rb +1 -0
  312. data/lib/rubocop/cop/style/space_inside_range_literal.rb +5 -4
  313. data/lib/rubocop/cop/style/space_inside_string_interpolation.rb +8 -17
  314. data/lib/rubocop/cop/style/special_global_vars.rb +97 -52
  315. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +16 -9
  316. data/lib/rubocop/cop/style/string_literals.rb +41 -1
  317. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -1
  318. data/lib/rubocop/cop/style/string_methods.rb +2 -1
  319. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -2
  320. data/lib/rubocop/cop/style/symbol_array.rb +74 -7
  321. data/lib/rubocop/cop/style/symbol_literal.rb +4 -7
  322. data/lib/rubocop/cop/style/symbol_proc.rb +11 -7
  323. data/lib/rubocop/cop/style/tab.rb +25 -2
  324. data/lib/rubocop/cop/style/trailing_blank_lines.rb +1 -2
  325. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45 -0
  326. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +56 -0
  327. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -7
  328. data/lib/rubocop/cop/style/trailing_whitespace.rb +2 -1
  329. data/lib/rubocop/cop/style/trivial_accessors.rb +18 -9
  330. data/lib/rubocop/cop/style/unless_else.rb +2 -1
  331. data/lib/rubocop/cop/style/unneeded_capital_w.rb +4 -3
  332. data/lib/rubocop/cop/style/unneeded_interpolation.rb +87 -0
  333. data/lib/rubocop/cop/style/unneeded_percent_q.rb +23 -7
  334. data/lib/rubocop/cop/style/variable_interpolation.rb +8 -6
  335. data/lib/rubocop/cop/style/variable_name.rb +1 -0
  336. data/lib/rubocop/cop/style/when_then.rb +2 -1
  337. data/lib/rubocop/cop/style/while_until_do.rb +3 -2
  338. data/lib/rubocop/cop/style/while_until_modifier.rb +3 -4
  339. data/lib/rubocop/cop/style/word_array.rb +74 -51
  340. data/lib/rubocop/cop/team.rb +21 -15
  341. data/lib/rubocop/cop/util.rb +102 -69
  342. data/lib/rubocop/cop/variable_force.rb +2 -1
  343. data/lib/rubocop/cop/variable_force/assignment.rb +2 -1
  344. data/lib/rubocop/cop/variable_force/locatable.rb +1 -0
  345. data/lib/rubocop/cop/variable_force/reference.rb +1 -0
  346. data/lib/rubocop/cop/variable_force/scope.rb +2 -1
  347. data/lib/rubocop/cop/variable_force/variable.rb +2 -1
  348. data/lib/rubocop/cop/variable_force/variable_table.rb +2 -1
  349. data/lib/rubocop/error.rb +12 -0
  350. data/lib/rubocop/formatter/base_formatter.rb +10 -1
  351. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -0
  352. data/lib/rubocop/formatter/colorizable.rb +6 -1
  353. data/lib/rubocop/formatter/disabled_config_formatter.rb +29 -15
  354. data/lib/rubocop/formatter/disabled_lines_formatter.rb +3 -1
  355. data/lib/rubocop/formatter/emacs_style_formatter.rb +7 -3
  356. data/lib/rubocop/formatter/file_list_formatter.rb +1 -0
  357. data/lib/rubocop/formatter/formatter_set.rb +10 -19
  358. data/lib/rubocop/formatter/fuubar_style_formatter.rb +2 -1
  359. data/lib/rubocop/formatter/html_formatter.rb +15 -14
  360. data/lib/rubocop/formatter/json_formatter.rb +2 -1
  361. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -0
  362. data/lib/rubocop/formatter/progress_formatter.rb +3 -3
  363. data/lib/rubocop/formatter/simple_text_formatter.rb +50 -17
  364. data/lib/rubocop/formatter/text_util.rb +8 -10
  365. data/lib/rubocop/formatter/worst_offenders_formatter.rb +61 -0
  366. data/lib/rubocop/name_similarity.rb +22 -0
  367. data/lib/rubocop/node_pattern.rb +126 -35
  368. data/lib/rubocop/options.rb +28 -19
  369. data/lib/rubocop/path_util.rb +1 -0
  370. data/lib/rubocop/processed_source.rb +41 -16
  371. data/lib/rubocop/rake_task.rb +6 -9
  372. data/lib/rubocop/remote_config.rb +1 -0
  373. data/lib/rubocop/result_cache.rb +60 -43
  374. data/lib/rubocop/runner.rb +48 -45
  375. data/lib/rubocop/string_util.rb +1 -0
  376. data/lib/rubocop/target_finder.rb +2 -1
  377. data/lib/rubocop/token.rb +1 -0
  378. data/lib/rubocop/version.rb +3 -2
  379. data/lib/rubocop/warning.rb +1 -0
  380. data/relnotes/v0.36.0.md +306 -0
  381. data/rubocop.gemspec +3 -9
  382. metadata +48 -92
  383. data/lib/rubocop/cop/lint/space_before_first_arg.rb +0 -44
  384. data/lib/rubocop/cop/rails/default_scope.rb +0 -33
  385. data/lib/rubocop/cop/style/trailing_comma.rb +0 -182
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -6,7 +7,7 @@ module RuboCop
6
7
  # This cop checks for multi-line ternary op expressions.
7
8
  class MultilineTernaryOperator < Cop
8
9
  MSG = 'Avoid multi-line ?: (the ternary operator);' \
9
- ' use `if`/`unless` instead.'
10
+ ' use `if`/`unless` instead.'.freeze
10
11
 
11
12
  def on_if(node)
12
13
  _condition, _if_branch, else_branch = *node
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -13,20 +14,18 @@ module RuboCop
13
14
  # # good
14
15
  # CONST = [1, 2, 3].freeze
15
16
  class MutableConstant < Cop
16
- MSG = 'Freeze mutable objects assigned to constants.'
17
-
18
- MUTABLE_TYPES = [:array, :hash, :str, :dstr].freeze
17
+ MSG = 'Freeze mutable objects assigned to constants.'.freeze
19
18
 
20
19
  def on_casgn(node)
21
20
  _scope, _const_name, value = *node
22
21
 
23
- return if value && !MUTABLE_TYPES.include?(value.type)
22
+ return if value && !value.mutable_literal?
24
23
 
25
24
  add_offense(value, :expression)
26
25
  end
27
26
 
28
27
  def autocorrect(node)
29
- expr = node.loc.expression
28
+ expr = node.source_range
30
29
  ->(corrector) { corrector.replace(expr, "#{expr.source}.freeze") }
31
30
  end
32
31
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -8,7 +9,7 @@ module RuboCop
8
9
  class NegatedIf < Cop
9
10
  include NegativeConditional
10
11
 
11
- MSG = 'Favor `%s` over `%s` for negative conditions.'
12
+ MSG = 'Favor `%s` over `%s` for negative conditions.'.freeze
12
13
 
13
14
  def on_if(node)
14
15
  return unless node.loc.respond_to?(:keyword)
@@ -38,8 +39,7 @@ module RuboCop
38
39
  node.loc.keyword,
39
40
  node.loc.keyword.is?('if') ? 'unless' : 'if'
40
41
  )
41
- corrector.replace(condition.loc.expression,
42
- pos_condition.loc.expression.source)
42
+ corrector.replace(condition.source_range, pos_condition.source)
43
43
  end
44
44
  end
45
45
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -7,7 +8,7 @@ module RuboCop
7
8
  class NegatedWhile < Cop
8
9
  include NegativeConditional
9
10
 
10
- MSG = 'Favor `%s` over `%s` for negative conditions.'
11
+ MSG = 'Favor `%s` over `%s` for negative conditions.'.freeze
11
12
 
12
13
  def on_while(node)
13
14
  check_negative_conditional(node)
@@ -37,8 +38,7 @@ module RuboCop
37
38
  corrector.replace(
38
39
  node.loc.keyword,
39
40
  node.type == :while ? 'until' : 'while')
40
- corrector.replace(condition.loc.expression,
41
- pos_condition.loc.expression.source)
41
+ corrector.replace(condition.source_range, pos_condition.source)
42
42
  end
43
43
  end
44
44
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -16,7 +17,7 @@ module RuboCop
16
17
  class NestedModifier < Cop
17
18
  include IfNode
18
19
 
19
- MSG = 'Avoid using nested modifiers.'
20
+ MSG = 'Avoid using nested modifiers.'.freeze
20
21
 
21
22
  def on_while(node)
22
23
  check(node)
@@ -66,9 +67,9 @@ module RuboCop
66
67
  outer_cond, = *outer_node
67
68
 
68
69
  range =
69
- Parser::Source::Range.new(inner_node.loc.expression.source_buffer,
70
+ Parser::Source::Range.new(inner_node.source_range.source_buffer,
70
71
  inner_node.loc.keyword.begin_pos,
71
- outer_cond.loc.expression.end_pos)
72
+ outer_cond.source_range.end_pos)
72
73
 
73
74
  lambda do |corrector|
74
75
  corrector.replace(range, new_expression(outer_node, inner_node))
@@ -84,12 +85,12 @@ module RuboCop
84
85
 
85
86
  operator = outer_keyword == 'if' ? '&&' : '||'
86
87
 
87
- inner_expr = inner_cond.loc.expression.source
88
+ inner_expr = inner_cond.source
88
89
  inner_expr = "(#{inner_expr})" if inner_cond.or_type?
89
90
  inner_expr = "!#{inner_expr}" unless outer_keyword == inner_keyword
90
91
 
91
92
  "#{outer_node.loc.keyword.source} " \
92
- "#{outer_cond.loc.expression.source} #{operator} #{inner_expr}"
93
+ "#{outer_cond.source} #{operator} #{inner_expr}"
93
94
  end
94
95
  end
95
96
  end
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module RuboCop
5
+ module Cop
6
+ module Style
7
+ # This cop checks for unparenthesized method calls in the argument list
8
+ # of a parenthesized method call.
9
+ #
10
+ # @example
11
+ # @good
12
+ # method1(method2(arg), method3(arg))
13
+ #
14
+ # @bad
15
+ # method1(method2 arg, method3, arg)
16
+ class NestedParenthesizedCalls < Cop
17
+ MSG = 'Add parentheses to nested method call `%s`.'.freeze
18
+ RSPEC_MATCHERS = [:be, :eq, :eql, :equal, :be_kind_of, :be_instance_of,
19
+ :respond_to, :be_between, :match, :be_within,
20
+ :start_with, :end_with, :include, :raise_error].freeze
21
+
22
+ def on_send(node)
23
+ return unless parenthesized_call?(node)
24
+
25
+ node.each_child_node(:send) do |nested|
26
+ next if nested.method_args.empty? ||
27
+ parenthesized_call?(nested) ||
28
+ operator?(nested.method_name) ||
29
+ rspec_matcher?(node, nested)
30
+ add_offense(nested, nested.source_range, format(MSG, nested.source))
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def parenthesized_call?(send)
37
+ send.loc.begin && send.loc.begin.is?('(')
38
+ end
39
+
40
+ def rspec_matcher?(parent, send)
41
+ parent.method_args.one? && # .to, .not_to, etc
42
+ RSPEC_MATCHERS.include?(send.method_name) &&
43
+ send.method_args.one?
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -6,7 +7,7 @@ module RuboCop
6
7
  # This cop checks for nested ternary op expressions.
7
8
  class NestedTernaryOperator < Cop
8
9
  MSG = 'Ternary operators must not be nested. Prefer `if`/`else` ' \
9
- 'constructs instead.'
10
+ 'constructs instead.'.freeze
10
11
 
11
12
  def on_if(node)
12
13
  loc = node.loc
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -31,6 +32,12 @@ module RuboCop
31
32
  :map, :reduce, :reject, :reject!, :reverse_each, :select,
32
33
  :select!, :times, :upto].freeze
33
34
 
35
+ def investigate(_processed_source)
36
+ # When correcting nested offenses, we need to keep track of how much
37
+ # we have adjusted the indentation of each line
38
+ @reindented_lines = Hash.new(0)
39
+ end
40
+
34
41
  def on_block(node)
35
42
  block_owner, _, body = *node
36
43
  return unless block_owner.send_type?
@@ -50,7 +57,7 @@ module RuboCop
50
57
  offense_node = offense_node(body)
51
58
  add_offense(offense_node, offense_location(offense_node), MSG)
52
59
  end
53
- alias_method :on_until, :on_while
60
+ alias on_until on_while
54
61
 
55
62
  def on_for(node)
56
63
  _, _, body = *node
@@ -95,27 +102,84 @@ module RuboCop
95
102
 
96
103
  def offense_location(offense_node)
97
104
  condition_expression, = *offense_node
98
- offense_begin_pos = offense_node.loc.expression.begin
99
- offense_begin_pos.join(condition_expression.loc.expression)
105
+ offense_begin_pos = offense_node.source_range.begin
106
+ offense_begin_pos.join(condition_expression.source_range)
100
107
  end
101
108
 
102
109
  def autocorrect(node)
103
110
  lambda do |corrector|
104
- cond, if_body, else_body = *node
105
- if if_body.nil?
106
- opposite_kw = 'if'
107
- body = else_body
108
- else
109
- opposite_kw = 'unless'
110
- body = if_body
111
+ cond, if_body, = *node
112
+
113
+ opposite_kw = if_body.nil? ? 'if' : 'unless'
114
+ next_code = "next #{opposite_kw} #{cond.source}"
115
+ corrector.insert_before(node.source_range, next_code)
116
+
117
+ corrector.remove(cond_range(node, cond))
118
+ corrector.remove(end_range(node))
119
+
120
+ # end_range starts with the final newline of the if body
121
+ reindent_lines = (node.source_range.line + 1)...node.loc.end.line
122
+ reindent_lines = reindent_lines.to_a - heredoc_lines(node)
123
+ reindent(reindent_lines, cond, corrector)
124
+ end
125
+ end
126
+
127
+ def cond_range(node, cond)
128
+ Parser::Source::Range.new(node.source_range.source_buffer,
129
+ node.source_range.begin_pos,
130
+ cond.source_range.end_pos)
131
+ end
132
+
133
+ def end_range(node)
134
+ source_buffer = node.source_range.source_buffer
135
+ end_pos = node.loc.end.end_pos
136
+ begin_pos = node.loc.end.begin_pos - node.source_range.column
137
+ begin_pos -= 1 if end_followed_by_whitespace_only?(source_buffer,
138
+ end_pos)
139
+
140
+ Parser::Source::Range.new(source_buffer, begin_pos, end_pos)
141
+ end
142
+
143
+ def end_followed_by_whitespace_only?(source_buffer, end_pos)
144
+ source_buffer.source[end_pos..-1] =~ /\A\s*$/
145
+ end
146
+
147
+ # Adjust indentation of `lines` to match `node`
148
+ def reindent(lines, node, corrector)
149
+ range = node.source_range
150
+ buffer = range.source_buffer
151
+
152
+ target_indent = range.source_line =~ /\S/
153
+
154
+ # Skip blank lines
155
+ lines.reject! { |lineno| buffer.source_line(lineno) =~ /\A\s*\z/ }
156
+ return if lines.empty?
157
+
158
+ actual_indent = lines.map do |lineno|
159
+ buffer.source_line(lineno) =~ /\S/
160
+ end.min
161
+
162
+ delta = actual_indent - target_indent
163
+ lines.each do |lineno|
164
+ adjustment = delta
165
+ adjustment += @reindented_lines[lineno]
166
+ @reindented_lines[lineno] = adjustment
167
+
168
+ if adjustment > 0
169
+ corrector.remove_leading(buffer.line_range(lineno), adjustment)
170
+ elsif adjustment < 0
171
+ corrector.insert_before(buffer.line_range(lineno),
172
+ ' ' * -adjustment)
111
173
  end
112
- next_code = 'next ' << opposite_kw << ' ' <<
113
- cond.loc.expression.source << "\n"
114
- corrector.insert_before(node.loc.expression, next_code)
115
- corrector.replace(node.loc.expression,
116
- body.loc.expression.source)
117
174
  end
118
175
  end
176
+
177
+ def heredoc_lines(node)
178
+ node.each_node(:dstr)
179
+ .select { |n| n.loc.respond_to?(:heredoc_body) }
180
+ .map { |n| n.loc.heredoc_body }
181
+ .flat_map { |b| (b.line...b.last_line).to_a }
182
+ end
119
183
  end
120
184
  end
121
185
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -13,9 +14,9 @@ module RuboCop
13
14
  # # good
14
15
  # if x.nil?
15
16
  class NilComparison < Cop
16
- MSG = 'Prefer the use of the `nil?` predicate.'
17
+ MSG = 'Prefer the use of the `nil?` predicate.'.freeze
17
18
 
18
- OPS = [:==, :===]
19
+ OPS = [:==, :===].freeze
19
20
 
20
21
  NIL_NODE = s(:nil)
21
22
 
@@ -29,9 +30,8 @@ module RuboCop
29
30
  private
30
31
 
31
32
  def autocorrect(node)
32
- expr = node.loc.expression
33
- new_code = expr.source.sub(/\s*={2,3}\s*nil/, '.nil?')
34
- ->(corrector) { corrector.replace(expr, new_code) }
33
+ new_code = node.source.sub(/\s*={2,3}\s*nil/, '.nil?')
34
+ ->(corrector) { corrector.replace(node.source_range, new_code) }
35
35
  end
36
36
  end
37
37
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -84,7 +85,7 @@ module RuboCop
84
85
  end
85
86
 
86
87
  def autocorrect_comparison(node)
87
- expr = node.loc.expression.source
88
+ expr = node.source
88
89
 
89
90
  new_code =
90
91
  if include_semantic_changes?
@@ -96,7 +97,7 @@ module RuboCop
96
97
  return if expr == new_code
97
98
 
98
99
  lambda do |corrector|
99
- corrector.replace(node.loc.expression, new_code)
100
+ corrector.replace(node.source_range, new_code)
100
101
  end
101
102
  end
102
103
 
@@ -104,10 +105,9 @@ module RuboCop
104
105
  lambda do |corrector|
105
106
  receiver, _method, _args = *inner_node
106
107
  if receiver
107
- corrector.replace(node.loc.expression,
108
- receiver.loc.expression.source)
108
+ corrector.replace(node.source_range, receiver.source)
109
109
  else
110
- corrector.replace(node.loc.expression, 'self')
110
+ corrector.replace(node.source_range, 'self')
111
111
  end
112
112
  end
113
113
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -7,14 +8,10 @@ module RuboCop
7
8
  class Not < Cop
8
9
  include AutocorrectUnlessChangingAST
9
10
 
10
- MSG = 'Use `!` instead of `not`.'
11
+ MSG = 'Use `!` instead of `not`.'.freeze
11
12
 
12
13
  def on_send(node)
13
- _receiver, method_name, *args = *node
14
-
15
- # not does not take any arguments
16
- return unless args.empty? && method_name == :! &&
17
- node.loc.selector.is?('not')
14
+ return unless node.keyword_not?
18
15
 
19
16
  add_offense(node, :selector)
20
17
  end
@@ -22,9 +19,8 @@ module RuboCop
22
19
  private
23
20
 
24
21
  def correction(node)
25
- old_source = node.loc.expression.source
26
- new_source = old_source.sub(/not\s+/, '!')
27
- ->(corrector) { corrector.replace(node.loc.expression, new_source) }
22
+ new_source = node.source.sub(/not\s+/, '!')
23
+ ->(corrector) { corrector.replace(node.source_range, new_source) }
28
24
  end
29
25
  end
30
26
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -12,7 +13,7 @@ module RuboCop
12
13
  include ConfigurableMax
13
14
 
14
15
  MSG = 'Separate every 3 digits in the integer portion of a number ' \
15
- 'with underscores(_).'
16
+ 'with underscores(_).'.freeze
16
17
 
17
18
  def on_int(node)
18
19
  check(node)
@@ -47,12 +48,12 @@ module RuboCop
47
48
 
48
49
  def autocorrect(node)
49
50
  lambda do |corrector|
50
- corrector.replace(node.loc.expression, format_number(node))
51
+ corrector.replace(node.source_range, format_number(node))
51
52
  end
52
53
  end
53
54
 
54
55
  def format_number(node)
55
- int_part, float_part = node.loc.expression.source.split('.')
56
+ int_part, float_part = node.source.split('.')
56
57
  int_part = int_part.to_i
57
58
  formatted_int = int_part
58
59
  .abs
@@ -70,7 +71,7 @@ module RuboCop
70
71
  end
71
72
 
72
73
  def integer_part(node)
73
- node.loc.expression.source.sub(/^[+-]/, '').split('.').first
74
+ node.source.sub(/^[+-]/, '').split('.').first
74
75
  end
75
76
 
76
77
  def min_digits