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
@@ -9,7 +10,7 @@ module RuboCop
9
10
  # To avoid false positives, it ignores cases in which we cannot know
10
11
  # for certain the type of value that would be assigned to a constant.
11
12
  class ConstantName < Cop
12
- MSG = 'Use SCREAMING_SNAKE_CASE for constants.'
13
+ MSG = 'Use SCREAMING_SNAKE_CASE for constants.'.freeze
13
14
  SNAKE_CASE = /^[\dA-Z_]+$/
14
15
 
15
16
  def on_casgn(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
@@ -61,7 +62,7 @@ module RuboCop
61
62
  notice_regexp = Regexp.new(notice)
62
63
  processed_source.tokens.each do |token|
63
64
  break unless token.type == :tCOMMENT
64
- notice_found = !((token.text =~ notice_regexp).nil?)
65
+ notice_found = !(token.text =~ notice_regexp).nil?
65
66
  break if notice_found
66
67
  end
67
68
  notice_found
@@ -75,11 +76,11 @@ module RuboCop
75
76
  "match Notice /#{notice}/" unless autocorrect_notice =~ regex
76
77
 
77
78
  lambda do |corrector|
78
- if token.nil?
79
- range = Parser::Source::Range.new('', 0, 0)
80
- else
81
- range = token.pos
82
- end
79
+ range = if token.nil?
80
+ Parser::Source::Range.new('', 0, 0)
81
+ else
82
+ token.pos
83
+ end
83
84
  corrector.insert_before(range, "#{autocorrect_notice}\n")
84
85
  end
85
86
  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
@@ -10,7 +11,7 @@ module RuboCop
10
11
  include OnMethodDef
11
12
 
12
13
  MSG = "Omit the parentheses in defs when the method doesn't accept " \
13
- 'any arguments.'
14
+ 'any arguments.'.freeze
14
15
 
15
16
  def on_method_def(node, _method_name, args, _body)
16
17
  start_line = node.loc.keyword.line
@@ -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,9 +7,9 @@ module RuboCop
6
7
  # This cop checks for uses of the deprecated methods Hash#has_key?
7
8
  # and Hash#has_value?
8
9
  class DeprecatedHashMethods < Cop
9
- MSG = '`Hash#%s` is deprecated in favor of `Hash#%s`.'
10
+ MSG = '`Hash#%s` is deprecated in favor of `Hash#%s`.'.freeze
10
11
 
11
- DEPRECATED_METHODS = [:has_key?, :has_value?]
12
+ DEPRECATED_METHODS = [:has_key?, :has_value?].freeze
12
13
 
13
14
  def on_send(node)
14
15
  _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
@@ -6,7 +7,7 @@ module RuboCop
6
7
  # This cop checks for missing top-level documentation of
7
8
  # classes and modules. Classes with no body are exempt from the
8
9
  # check and so are namespace modules - modules that have nothing in
9
- # their bodies except classes or other modules.
10
+ # their bodies except classes, other modules, or constant definitions.
10
11
  #
11
12
  # The documentation requirement is annulled if the class or module has
12
13
  # a "#:nodoc:" comment next to it. Likewise, "#:nodoc: all" does the
@@ -14,7 +15,9 @@ module RuboCop
14
15
  class Documentation < Cop
15
16
  include AnnotationComment
16
17
 
17
- MSG = 'Missing top-level %s documentation comment.'
18
+ MSG = 'Missing top-level %s documentation comment.'.freeze
19
+
20
+ def_node_matcher :constant_definition?, '{class module casgn}'
18
21
 
19
22
  def investigate(processed_source)
20
23
  ast = processed_source.ast
@@ -47,21 +50,14 @@ module RuboCop
47
50
  end
48
51
  end
49
52
 
50
- # 'Const = Class.new' or 'Const = Module.new' are module definitions
51
- mod_new = '(send (const nil {:Class :Module}) :new ...)'
52
- def_node_matcher :module_definition?,
53
- "{class
54
- module
55
- (casgn _ _ {#{mod_new} (block #{mod_new} ...)})}"
56
-
57
53
  def namespace?(body_node)
58
54
  return false unless body_node
59
55
 
60
56
  case body_node.type
61
57
  when :begin
62
- body_node.children.all? { |node| module_definition?(node) }
58
+ body_node.children.all? { |node| constant_definition?(node) }
63
59
  else
64
- module_definition?(body_node)
60
+ constant_definition?(body_node)
65
61
  end
66
62
  end
67
63
 
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -32,7 +33,7 @@ module RuboCop
32
33
  def proper_dot_position?(node)
33
34
  receiver, _method_name, *_args = *node
34
35
 
35
- receiver_line = receiver.loc.expression.end.line
36
+ receiver_line = receiver.source_range.end.line
36
37
 
37
38
  if node.loc.selector
38
39
  selector_line = node.loc.selector.line
@@ -73,7 +74,7 @@ module RuboCop
73
74
  when :leading
74
75
  corrector.insert_before(selector, '.')
75
76
  when :trailing
76
- corrector.insert_after(receiver.loc.expression, '.')
77
+ corrector.insert_after(receiver.source_range, '.')
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
@@ -20,7 +21,7 @@ module RuboCop
20
21
  # As you're unlikely to write code that can accept values of any type
21
22
  # this is rarely a problem in practice.
22
23
  class DoubleNegation < Cop
23
- MSG = 'Avoid the use of double negation (`!!`).'
24
+ MSG = 'Avoid the use of double negation (`!!`).'.freeze
24
25
 
25
26
  def_node_matcher :double_negative?, '(send (send _ :!) :!)'
26
27
 
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -17,8 +18,8 @@ module RuboCop
17
18
  # # good
18
19
  # [1, 2].each_with_object({}) { |e, a| a[e] = e }
19
20
  class EachWithObject < Cop
20
- MSG = 'Use `each_with_object` instead of `%s`.'
21
- METHODS = [:inject, :reduce]
21
+ MSG = 'Use `each_with_object` instead of `%s`.'.freeze
22
+ METHODS = [:inject, :reduce].freeze
22
23
 
23
24
  def on_block(node)
24
25
  method, args, body = *node
@@ -29,7 +30,7 @@ module RuboCop
29
30
  _, method_name, method_arg = *method
30
31
 
31
32
  return unless METHODS.include? method_name
32
- return if method_arg && BASIC_LITERALS.include?(method_arg.type)
33
+ return if method_arg && method_arg.basic_literal?
33
34
 
34
35
  return_value = return_value(body)
35
36
  return unless return_value
@@ -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 AutocorrectAlignment
13
14
  include CheckAssignment
14
15
 
15
- MSG = 'Align `%s` with `%s`.'
16
+ MSG = 'Align `%s` with `%s`.'.freeze
16
17
 
17
18
  def on_if(node, base = nil)
18
19
  return if ignored_node?(node)
@@ -59,7 +60,7 @@ module RuboCop
59
60
 
60
61
  def base_range(node, base)
61
62
  if base
62
- base.loc.expression
63
+ base.source_range
63
64
  else
64
65
  base = node
65
66
  until %w(if unless).include?(base.loc.keyword.source)
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -69,7 +70,7 @@ module RuboCop
69
70
  include OnNormalIfUnless
70
71
  include ConfigurableEnforcedStyle
71
72
 
72
- MSG = 'Redundant `else`-clause.'
73
+ MSG = 'Redundant `else`-clause.'.freeze
73
74
 
74
75
  def on_normal_if_unless(node)
75
76
  check(node, if_else_clause(node))
@@ -118,9 +119,9 @@ module RuboCop
118
119
  end_pos = if node.loc.end
119
120
  node.loc.end.begin_pos
120
121
  else
121
- node.loc.expression.end_pos + 1
122
+ node.source_range.end_pos + 1
122
123
  end
123
- range = Parser::Source::Range.new(node.loc.expression.source_buffer,
124
+ range = Parser::Source::Range.new(node.source_range.source_buffer,
124
125
  node.loc.else.begin_pos,
125
126
  end_pos)
126
127
  corrector.remove(range)
@@ -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
  # separated by empty lines.
8
9
  class EmptyLineBetweenDefs < Cop
9
10
  include OnMethodDef
10
- MSG = 'Use empty lines between method definitions.'
11
+ MSG = 'Use empty lines between method definitions.'.freeze
11
12
 
12
13
  def on_method_def(node, _method_name, _args, _body)
13
14
  return unless node.parent && node.parent.begin_type?
@@ -1,21 +1,27 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require 'set'
2
5
 
3
6
  module RuboCop
4
7
  module Cop
5
8
  module Style
6
9
  # This cops checks for two or more consecutive blank lines.
7
10
  class EmptyLines < Cop
8
- MSG = 'Extra blank line detected.'
11
+ MSG = 'Extra blank line detected.'.freeze
9
12
  LINE_OFFSET = 2
10
13
 
11
14
  def investigate(processed_source)
12
15
  return if processed_source.tokens.empty?
13
16
 
14
- prev_line = 1
17
+ lines = Set.new
18
+ processed_source.tokens.each do |token|
19
+ lines << token.pos.line
20
+ end
15
21
 
16
- processed_source.tokens.sort_by { |t| t.pos.line }.each do |token|
17
- cur_line = token.pos.line
22
+ prev_line = 1
18
23
 
24
+ lines.sort.each do |cur_line|
19
25
  line_diff = cur_line - prev_line
20
26
 
21
27
  if line_diff > LINE_OFFSET
@@ -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 EmptyLinesAroundAccessModifier < Cop
8
9
  include AccessModifierNode
9
10
 
10
- MSG = 'Keep a blank line before and after `%s`.'
11
+ MSG = 'Keep a blank line before and after `%s`.'.freeze
11
12
 
12
13
  def on_send(node)
13
14
  return unless modifier_node?(node)
@@ -25,8 +26,8 @@ module RuboCop
25
26
 
26
27
  line = Parser::Source::Range.new(
27
28
  processed_source.buffer,
28
- node.loc.expression.begin_pos - node.loc.column,
29
- node.loc.expression.end_pos
29
+ node.source_range.begin_pos - node.loc.column,
30
+ node.source_range.end_pos
30
31
  )
31
32
 
32
33
  unless previous_line_empty?(previous_line)
@@ -41,6 +42,12 @@ module RuboCop
41
42
 
42
43
  private
43
44
 
45
+ def previous_line_ignoring_comments(processed_source, send_line)
46
+ processed_source[0..send_line - 2].reverse.find do |line|
47
+ !comment_line?(line)
48
+ end
49
+ end
50
+
44
51
  def previous_line_empty?(previous_line)
45
52
  block_start?(previous_line.lstrip) ||
46
53
  class_def?(previous_line.lstrip) ||
@@ -53,14 +60,15 @@ module RuboCop
53
60
 
54
61
  def empty_lines_around?(node)
55
62
  send_line = node.loc.line
56
- previous_line = processed_source[send_line - 2]
63
+ previous_line = previous_line_ignoring_comments(processed_source,
64
+ send_line)
57
65
  next_line = processed_source[send_line]
58
66
 
59
67
  previous_line_empty?(previous_line) && next_line_empty?(next_line)
60
68
  end
61
69
 
62
70
  def class_def?(line)
63
- %w(class module).any? { |keyword| line.start_with?(keyword) }
71
+ line.start_with?('class', 'module')
64
72
  end
65
73
 
66
74
  def block_start?(line)
@@ -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,15 +17,18 @@ module RuboCop
16
17
  class EmptyLinesAroundBlockBody < Cop
17
18
  include EmptyLinesAroundBody
18
19
 
19
- KIND = 'block'
20
+ KIND = 'block'.freeze
20
21
 
21
22
  def on_block(node)
22
- check(node)
23
+ _send, _args, body = *node
24
+ check(node, body)
23
25
  end
24
26
 
25
27
  private
26
28
 
27
- def check(node)
29
+ def check(node, body)
30
+ return unless body || style == :no_empty_lines
31
+
28
32
  start_line = node.loc.begin.line
29
33
  end_line = node.loc.end.line
30
34
 
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -19,14 +20,16 @@ module RuboCop
19
20
  class EmptyLinesAroundClassBody < Cop
20
21
  include EmptyLinesAroundBody
21
22
 
22
- KIND = 'class'
23
+ KIND = 'class'.freeze
23
24
 
24
25
  def on_class(node)
25
- check(node)
26
+ _name, _superclass, body = *node
27
+ check(node, body)
26
28
  end
27
29
 
28
30
  def on_sclass(node)
29
- check(node)
31
+ _obj, body = *node
32
+ check(node, body)
30
33
  end
31
34
  end
32
35
  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
@@ -17,12 +18,12 @@ module RuboCop
17
18
  include EmptyLinesAroundBody
18
19
  include OnMethodDef
19
20
 
20
- KIND = 'method'
21
+ KIND = 'method'.freeze
21
22
 
22
23
  private
23
24
 
24
- def on_method_def(node, _method_name, _args, _body)
25
- check(node)
25
+ def on_method_def(node, _method_name, _args, body)
26
+ check(node, body)
26
27
  end
27
28
 
28
29
  # Override ConfigurableEnforcedStyle#style and hard-code
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -19,10 +20,11 @@ module RuboCop
19
20
  class EmptyLinesAroundModuleBody < Cop
20
21
  include EmptyLinesAroundBody
21
22
 
22
- KIND = 'module'
23
+ KIND = 'module'.freeze
23
24
 
24
25
  def on_module(node)
25
- check(node)
26
+ _name, body = *node
27
+ check(node, body)
26
28
  end
27
29
  end
28
30
  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,9 +7,9 @@ module RuboCop
6
7
  # This cop checks for the use of a method, the result of which
7
8
  # would be a literal, like an empty array, hash or string.
8
9
  class EmptyLiteral < Cop
9
- ARR_MSG = 'Use array literal `[]` instead of `Array.new`.'
10
- HASH_MSG = 'Use hash literal `{}` instead of `Hash.new`.'
11
- STR_MSG = "Use string literal `''` instead of `String.new`."
10
+ ARR_MSG = 'Use array literal `[]` instead of `Array.new`.'.freeze
11
+ HASH_MSG = 'Use hash literal `{}` instead of `Hash.new`.'.freeze
12
+ STR_MSG = "Use string literal `''` instead of `String.new`.".freeze
12
13
 
13
14
  # Empty array node
14
15
  #
@@ -54,9 +55,23 @@ module RuboCop
54
55
  return if first_arg_in_method_call_without_parentheses?(node)
55
56
  '{}'
56
57
  when STR_NODE
57
- "''"
58
+ if enforce_double_quotes?
59
+ '""'
60
+ else
61
+ "''"
62
+ end
58
63
  end
59
- ->(corrector) { corrector.replace(node.loc.expression, name) }
64
+ ->(corrector) { corrector.replace(node.source_range, name) }
65
+ end
66
+
67
+ private
68
+
69
+ def enforce_double_quotes?
70
+ string_literals_config['EnforcedStyle'] == 'double_quotes'
71
+ end
72
+
73
+ def string_literals_config
74
+ config.for_cop('Style/StringLiterals')
60
75
  end
61
76
 
62
77
  def first_arg_in_method_call_without_parentheses?(node)