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
@@ -14,13 +15,13 @@ module RuboCop
14
15
  class RedundantFreeze < Cop
15
16
  MSG = 'Freezing immutable objects is pointless.'.freeze
16
17
 
17
- TARGET_NODES = [:int, :float, :sym].freeze
18
-
19
18
  def on_send(node)
20
19
  receiver, method_name, *args = *node
21
20
 
22
- return unless receiver && TARGET_NODES.include?(receiver.type)
23
- return unless method_name == :freeze && args.empty?
21
+ return unless receiver &&
22
+ method_name == :freeze &&
23
+ args.empty? &&
24
+ receiver.immutable_literal?
24
25
 
25
26
  add_offense(node, :expression)
26
27
  end
@@ -0,0 +1,80 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module RuboCop
5
+ module Cop
6
+ module Style
7
+ # This cop checks for redundant parentheses.
8
+ #
9
+ # @example
10
+ #
11
+ # # bad
12
+ # (x) if ((y.z).nil?)
13
+ #
14
+ # # good
15
+ # x if y.z.nil?
16
+ #
17
+ class RedundantParentheses < Cop
18
+ include Parentheses
19
+
20
+ ALLOWED_LITERALS = [:irange, :erange].freeze
21
+
22
+ def_node_matcher :square_brackets?, '(send (send _recv _msg) :[] ...)'
23
+ def_node_matcher :range_end?, '^^{irange erange}'
24
+ def_node_matcher :method_node_and_args, '$(send _recv _msg $...)'
25
+
26
+ def on_begin(node)
27
+ return unless parentheses?(node)
28
+
29
+ child_node = node.children.first
30
+ return if keyword_ancestor?(node) && parens_required?(node)
31
+
32
+ if keyword_with_redundant_parentheses?(child_node)
33
+ return offense(node, 'a keyword')
34
+ end
35
+ return offense(node, 'a literal') if disallowed_literal?(child_node)
36
+ return offense(node, 'a variable') if child_node.variable?
37
+ return offense(node, 'a constant') if child_node.const_type?
38
+ return unless method_call_with_redundant_parentheses?(child_node)
39
+
40
+ offense(node, 'a method call')
41
+ end
42
+
43
+ def offense(node, msg)
44
+ add_offense(node, :expression, "Don't use parentheses around #{msg}.")
45
+ end
46
+
47
+ def keyword_ancestor?(node)
48
+ node.ancestors.first && node.ancestors.first.keyword?
49
+ end
50
+
51
+ def disallowed_literal?(node)
52
+ node.literal? && !ALLOWED_LITERALS.include?(node.type)
53
+ end
54
+
55
+ def keyword_with_redundant_parentheses?(node)
56
+ return false unless node.keyword?
57
+ return true if node.special_keyword?
58
+
59
+ args = *node
60
+
61
+ if args.size == 1 && args.first && args.first.begin_type?
62
+ parentheses?(args.first)
63
+ else
64
+ args.empty? || parentheses?(node)
65
+ end
66
+ end
67
+
68
+ def method_call_with_redundant_parentheses?(node)
69
+ return false unless node.send_type?
70
+ return false if node.keyword_not?
71
+ return false if range_end?(node)
72
+
73
+ send_node, args = method_node_and_args(node)
74
+
75
+ args.empty? || parentheses?(send_node) || square_brackets?(send_node)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ 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
@@ -23,14 +24,14 @@ module RuboCop
23
24
  class RedundantReturn < Cop
24
25
  include OnMethodDef
25
26
 
26
- MSG = 'Redundant `return` detected.'
27
+ MSG = 'Redundant `return` detected.'.freeze
27
28
 
28
29
  private
29
30
 
30
31
  def autocorrect(node)
31
32
  lambda do |corrector|
32
33
  unless arguments?(node.children)
33
- corrector.replace(node.loc.expression, 'nil')
34
+ corrector.replace(node.source_range, 'nil')
34
35
  next
35
36
  end
36
37
 
@@ -50,13 +51,13 @@ module RuboCop
50
51
  end
51
52
 
52
53
  def add_brackets(corrector, node)
53
- kids = node.children.map { |child| child.loc.expression }
54
+ kids = node.children.map(&:source_range)
54
55
  corrector.insert_before(kids.first, '[')
55
56
  corrector.insert_after(kids.last, ']')
56
57
  end
57
58
 
58
59
  def add_braces(corrector, node)
59
- kids = node.children.map { |child| child.loc.expression }
60
+ kids = node.children.map(&:source_range)
60
61
  corrector.insert_before(kids.first, '{')
61
62
  corrector.insert_after(kids.last, '}')
62
63
  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
@@ -43,7 +44,7 @@ module RuboCop
43
44
  # We allow uses of `self` with operators because it would be awkward
44
45
  # otherwise.
45
46
  class RedundantSelf < Cop
46
- MSG = 'Redundant `self` detected.'
47
+ MSG = 'Redundant `self` detected.'.freeze
47
48
 
48
49
  def initialize(config = nil, options = nil)
49
50
  super
@@ -58,7 +59,7 @@ module RuboCop
58
59
  allow_self(lhs)
59
60
  end
60
61
 
61
- alias_method :on_and_asgn, :on_or_asgn
62
+ alias on_and_asgn on_or_asgn
62
63
 
63
64
  def on_op_asgn(node)
64
65
  lhs, _op, _rhs = *node
@@ -93,8 +94,10 @@ module RuboCop
93
94
  def on_send(node)
94
95
  receiver, method_name, *_args = *node
95
96
  return unless receiver && receiver.type == :self
96
- return if operator?(method_name) || keyword?(method_name) ||
97
+ return if operator?(method_name) ||
98
+ keyword?(method_name) ||
97
99
  constant_name?(method_name) ||
100
+ node.asgn_method_call? ||
98
101
  @allowed_send_nodes.include?(node) ||
99
102
  @local_variables.include?(method_name)
100
103
 
@@ -104,7 +107,7 @@ module RuboCop
104
107
  def autocorrect(node)
105
108
  receiver, _method_name, *_args = *node
106
109
  lambda do |corrector|
107
- corrector.remove(receiver.loc.expression)
110
+ corrector.remove(receiver.source_range)
108
111
  corrector.remove(node.loc.dot)
109
112
  end
110
113
  end
@@ -116,10 +119,6 @@ module RuboCop
116
119
  @local_variables << name
117
120
  end
118
121
 
119
- def operator?(method_name)
120
- method_name.to_s =~ /\W/
121
- end
122
-
123
122
  def keyword?(method_name)
124
123
  [:alias, :and, :begin, :break, :case, :class, :def, :defined, :do,
125
124
  :else, :elsif, :end, :ensure, :false, :for, :if, :in, :module,
@@ -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,8 +32,8 @@ module RuboCop
31
32
  class RegexpLiteral < Cop
32
33
  include ConfigurableEnforcedStyle
33
34
 
34
- MSG_USE_SLASHES = 'Use `//` around regular expression.'
35
- MSG_USE_PERCENT_R = 'Use `%r` around regular expression.'
35
+ MSG_USE_SLASHES = 'Use `//` around regular expression.'.freeze
36
+ MSG_USE_PERCENT_R = 'Use `%r` around regular expression.'.freeze
36
37
 
37
38
  def on_regexp(node)
38
39
  if slash_literal?(node)
@@ -76,7 +77,7 @@ module RuboCop
76
77
 
77
78
  def node_body(node)
78
79
  string_parts = node.children.select { |child| child.type == :str }
79
- string_parts.map { |s| s.loc.expression.source }.join
80
+ string_parts.map(&:source).join
80
81
  end
81
82
 
82
83
  def slash_literal?(node)
@@ -91,11 +92,11 @@ module RuboCop
91
92
  def autocorrect(node)
92
93
  return if contains_slash?(node)
93
94
 
94
- if slash_literal?(node)
95
- replacement = ['%r', ''].zip(preferred_delimiters).map(&:join)
96
- else
97
- replacement = %w(/ /)
98
- end
95
+ replacement = if slash_literal?(node)
96
+ ['%r', ''].zip(preferred_delimiters).map(&:join)
97
+ else
98
+ %w(/ /)
99
+ end
99
100
 
100
101
  lambda do |corrector|
101
102
  corrector.replace(node.loc.begin, replacement.first)
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -22,7 +23,7 @@ module RuboCop
22
23
  # puts 'error'
23
24
  # end
24
25
  class RescueEnsureAlignment < Cop
25
- MSG = '`%s` at %d, %d is not aligned with `end` at %d, %d.'
26
+ MSG = '`%s` at %d, %d is not aligned with `end` at %d, %d.'.freeze
26
27
 
27
28
  def on_resbody(node)
28
29
  check(node) unless modifier?(node)
@@ -73,7 +74,7 @@ module RuboCop
73
74
  end
74
75
 
75
76
  def ancestor_node(node)
76
- node.each_ancestor(:kwbegin, :def, :defs).first
77
+ node.each_ancestor(:kwbegin, :def, :defs, :class, :module).first
77
78
  end
78
79
  end
79
80
  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,10 +8,11 @@ module RuboCop
7
8
  class RescueModifier < Cop
8
9
  include AutocorrectAlignment
9
10
 
10
- MSG = 'Avoid using `rescue` in its modifier form.'
11
+ MSG = 'Avoid using `rescue` in its modifier form.'.freeze
11
12
 
12
13
  def investigate(processed_source)
13
- @modifier_locations = processed_source.tokens
14
+ @modifier_locations = processed_source
15
+ .tokens
14
16
  .select { |t| t.type == :kRESCUE_MOD }
15
17
  .map(&:pos)
16
18
  end
@@ -25,14 +27,14 @@ module RuboCop
25
27
  *_, rescue_args = *rescue_modifier
26
28
 
27
29
  correction =
28
- "begin\n" <<
29
- indentation(node) << operation.loc.expression.source <<
30
- "\n#{offset(node)}rescue\n" <<
31
- indentation(node) << rescue_args.loc.expression.source <<
30
+ "begin\n" \
31
+ "#{indentation(node)}#{operation.source}" \
32
+ "\n#{offset(node)}rescue\n" \
33
+ "#{indentation(node)}#{rescue_args.source}" \
32
34
  "\n#{offset(node)}end"
33
- range = Parser::Source::Range.new(node.loc.expression.source_buffer,
34
- node.loc.expression.begin_pos,
35
- node.loc.expression.end_pos)
35
+ range = Parser::Source::Range.new(node.source_range.source_buffer,
36
+ node.source_range.begin_pos,
37
+ node.source_range.end_pos)
36
38
 
37
39
  lambda do |corrector|
38
40
  corrector.replace(range, correction)
@@ -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,10 +14,8 @@ module RuboCop
13
14
  # # good
14
15
  # x += 1
15
16
  class SelfAssignment < Cop
16
- include AST::Sexp
17
-
18
- MSG = 'Use self-assignment shorthand `%s=`.'
19
- OPS = [:+, :-, :*, :**, :/, :|, :&]
17
+ MSG = 'Use self-assignment shorthand `%s=`.'.freeze
18
+ OPS = [:+, :-, :*, :**, :/, :|, :&].freeze
20
19
 
21
20
  def on_lvasgn(node)
22
21
  check(node, :lvar)
@@ -86,7 +85,7 @@ module RuboCop
86
85
  def apply_autocorrect(node, rhs, operator, new_rhs)
87
86
  lambda do |corrector|
88
87
  corrector.insert_before(node.loc.operator, operator)
89
- corrector.replace(rhs.loc.expression, new_rhs.loc.expression.source)
88
+ corrector.replace(rhs.source_range, new_rhs.source)
90
89
  end
91
90
  end
92
91
  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 multiple expressions placed on the same line.
7
8
  # It also checks for lines terminated with a semicolon.
8
9
  class Semicolon < Cop
9
- MSG = 'Do not use semicolons to terminate expressions.'
10
+ MSG = 'Do not use semicolons to terminate expressions.'.freeze
10
11
 
11
12
  def investigate(processed_source)
12
13
  return unless processed_source.ast
@@ -22,7 +23,7 @@ module RuboCop
22
23
  return if exprs.size < 2
23
24
 
24
25
  # create a map matching lines to the number of expressions on them
25
- exprs_lines = exprs.map { |e| e.loc.expression.line }
26
+ exprs_lines = exprs.map { |e| e.source_range.line }
26
27
  lines = exprs_lines.group_by { |i| i }
27
28
 
28
29
  # every line with more than 1 expression on it is an offense
@@ -1,11 +1,13 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
5
6
  module Style
6
7
  # This cop checks for the use of the send method.
7
8
  class Send < Cop
8
- MSG = 'Prefer `Object#__send__` or `Object#public_send` to `send`.'
9
+ MSG = 'Prefer `Object#__send__` or `Object#public_send` to ' \
10
+ '`send`.'.freeze
9
11
 
10
12
  def on_send(node)
11
13
  _receiver, method_name, *args = *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
@@ -7,8 +8,9 @@ module RuboCop
7
8
  class SignalException < Cop
8
9
  include ConfigurableEnforcedStyle
9
10
 
10
- FAIL_MSG = 'Use `fail` instead of `raise` to signal exceptions.'
11
- RAISE_MSG = 'Use `raise` instead of `fail` to rethrow exceptions.'
11
+ FAIL_MSG = 'Use `fail` instead of `raise` to signal exceptions.'.freeze
12
+ RAISE_MSG = 'Use `raise` instead of `fail` to ' \
13
+ 'rethrow exceptions.'.freeze
12
14
 
13
15
  def on_rescue(node)
14
16
  return unless style == :semantic
@@ -77,7 +79,7 @@ module RuboCop
77
79
  end
78
80
 
79
81
  def command_or_kernel_call?(name, node)
80
- command?(name, node) || kernel_call?(name, node)
82
+ node.command?(name) || kernel_call?(name, node)
81
83
  end
82
84
 
83
85
  def kernel_call?(name, 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
@@ -11,7 +12,7 @@ module RuboCop
11
12
  class SingleLineBlockParams < Cop
12
13
  def on_block(node)
13
14
  # we care only for single line blocks
14
- return unless Util.block_length(node) == 0
15
+ return unless block_length(node) == 0
15
16
 
16
17
  method_node, args_node, _body_node = *node
17
18
  receiver, method_name, _method_args = *method_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
@@ -9,7 +10,7 @@ module RuboCop
9
10
  include AutocorrectAlignment
10
11
  include OnMethodDef
11
12
 
12
- MSG = 'Avoid single-line method definitions.'
13
+ MSG = 'Avoid single-line method definitions.'.freeze
13
14
 
14
15
  def allow_empty?
15
16
  cop_config['AllowIfMethodIsEmpty']
@@ -31,16 +32,16 @@ module RuboCop
31
32
  def autocorrect(node)
32
33
  body = @body
33
34
  eol_comment = processed_source.comments.find do |c|
34
- c.loc.line == node.loc.expression.line
35
+ c.loc.line == node.source_range.line
35
36
  end
36
37
  lambda do |corrector|
37
38
  if body
38
39
  if body.type == :begin
39
40
  body.children.each do |part|
40
- break_line_before(part.loc.expression, node, corrector, 1)
41
+ break_line_before(part.source_range, node, corrector, 1)
41
42
  end
42
43
  else
43
- break_line_before(body.loc.expression, node, corrector, 1)
44
+ break_line_before(body.source_range, node, corrector, 1)
44
45
  end
45
46
  end
46
47
 
@@ -60,9 +61,8 @@ module RuboCop
60
61
 
61
62
  def move_comment(eol_comment, node, corrector)
62
63
  text = eol_comment.loc.expression.source
63
- corrector.insert_before(node.loc.expression,
64
- text + "\n" +
65
- ' ' * node.loc.keyword.column)
64
+ corrector.insert_before(node.source_range,
65
+ text + "\n" + (' ' * node.loc.keyword.column))
66
66
  corrector.remove(eol_comment.loc.expression)
67
67
  end
68
68
  end