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,11 +1,12 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
5
6
  # Common code for ordinary arrays with [] that can be written with %
6
7
  # syntax.
7
8
  module ArraySyntax
8
- def array_of?(element_type, node)
9
+ def bracketed_array_of?(element_type, node)
9
10
  return false unless square_brackets?(node)
10
11
 
11
12
  array_elems = node.children
@@ -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,8 @@ module RuboCop
9
10
  SPACE = ' '.freeze
10
11
 
11
12
  def configured_indentation_width
12
- config.for_cop('IndentationWidth')['Width']
13
+ cop_config['IndentationWidth'] ||
14
+ config.for_cop('IndentationWidth')['Width']
13
15
  end
14
16
 
15
17
  def indentation(node)
@@ -24,10 +26,11 @@ module RuboCop
24
26
  base_column ||= items.first.loc.column unless items.empty?
25
27
  prev_line = -1
26
28
  items.each do |current|
27
- if current.loc.line > prev_line && start_of_line?(current.loc)
29
+ if current.loc.line > prev_line &&
30
+ begins_its_line?(current.source_range)
28
31
  @column_delta = base_column - current.loc.column
29
32
  if @column_delta != 0
30
- expr = current.loc.expression
33
+ expr = current.source_range
31
34
  if offenses.any? { |o| within?(expr, o.location) }
32
35
  # If this offense is within a line range that is already being
33
36
  # realigned by autocorrect, we report the offense without
@@ -44,10 +47,6 @@ module RuboCop
44
47
  end
45
48
  end
46
49
 
47
- def start_of_line?(loc)
48
- loc.expression.source_line[0...loc.column].blank?
49
- end
50
-
51
50
  def autocorrect(arg)
52
51
  return unless arg
53
52
 
@@ -74,28 +73,24 @@ module RuboCop
74
73
  def autocorrect_line(corrector, line_begin_pos, expr, column_delta,
75
74
  heredoc_ranges)
76
75
  range = calculate_range(expr, line_begin_pos, column_delta)
77
- # We must not change indentation of heredoc stings.
76
+ # We must not change indentation of heredoc strings.
78
77
  return if heredoc_ranges.any? { |h| within?(range, h) }
79
78
 
80
79
  if column_delta > 0
81
80
  unless range.source == "\n"
82
81
  corrector.insert_before(range, ' ' * column_delta)
83
82
  end
84
- else
85
- remove(range, corrector) if range.source =~ /\A[ \t]+\z/
83
+ elsif range.source =~ /\A[ \t]+\z/
84
+ remove(range, corrector)
86
85
  end
87
86
  end
88
87
 
89
88
  def heredoc_ranges(arg)
90
89
  return [] unless arg.is_a?(Parser::AST::Node)
91
90
 
92
- heredoc_ranges = []
93
- arg.each_node(:dstr) do |n|
94
- if n.loc.respond_to?(:heredoc_body)
95
- heredoc_ranges << n.loc.heredoc_body.join(n.loc.heredoc_end)
96
- end
97
- end
98
- heredoc_ranges
91
+ arg.each_node(:dstr)
92
+ .select { |n| n.loc.respond_to?(:heredoc_body) }
93
+ .map { |n| n.loc.heredoc_body.join(n.loc.heredoc_end) }
99
94
  end
100
95
 
101
96
  def block_comment_within?(expr)
@@ -133,11 +128,10 @@ module RuboCop
133
128
  end
134
129
 
135
130
  def each_line(expr)
136
- offset = 0
131
+ line_begin_pos = expr.begin_pos
137
132
  expr.source.each_line do |line|
138
- line_begin_pos = expr.begin_pos + offset
139
133
  yield line_begin_pos
140
- offset += line.length
134
+ line_begin_pos += line.length
141
135
  end
142
136
  end
143
137
  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,11 +13,11 @@ module RuboCop
12
13
  module AutocorrectUnlessChangingAST
13
14
  def autocorrect(node)
14
15
  current_buffer_src = processed_source.buffer.source
15
- replaced_range = node.loc.expression
16
+ replaced_range = node.source_range
16
17
  pre = current_buffer_src[0...replaced_range.begin_pos]
17
18
  post = current_buffer_src[replaced_range.end_pos..-1]
18
19
  new_buffer_src = pre + rewrite_node(node) + post
19
- new_processed_src = ProcessedSource.new(new_buffer_src)
20
+ new_processed_src = parse(new_buffer_src, processed_source.buffer.name)
20
21
 
21
22
  # Make the correction only if it doesn't change the AST for the buffer.
22
23
  return if !new_processed_src.ast ||
@@ -29,7 +30,7 @@ module RuboCop
29
30
  private
30
31
 
31
32
  def rewrite_node(node)
32
- ps = ProcessedSource.new(node.loc.expression.source)
33
+ ps = parse(node.source)
33
34
  c = correction(ps.ast)
34
35
  Corrector.new(ps.buffer, [c]).rewrite
35
36
  end
@@ -46,7 +47,7 @@ module RuboCop
46
47
  #
47
48
  class InlineBeginNodes < Parser::AST::Processor
48
49
  def on_begin(node)
49
- node.children.one? ? node.children[0] : node
50
+ node.children.one? ? process(node.children[0]) : super
50
51
  end
51
52
  end
52
53
 
@@ -1,36 +1,41 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
5
6
  # Common functionality for checking assignment nodes.
6
7
  module CheckAssignment
7
- TYPES = Util::ASGN_NODES - [:casgn, :op_asgn]
8
- TYPES.each do |type|
8
+ Util::ASGN_NODES.each do |type|
9
9
  define_method("on_#{type}") do |node|
10
- _lhs, rhs = *node
11
- check_assignment(node, rhs)
10
+ check_assignment(node, extract_rhs(node))
12
11
  end
13
12
  end
14
13
 
15
- def on_casgn(node)
16
- _scope, _lhs, rhs = *node
17
- check_assignment(node, rhs)
18
- end
19
-
20
- def on_op_asgn(node)
21
- _lhs, _op, rhs = *node
22
- check_assignment(node, rhs)
23
- end
24
-
25
14
  def on_send(node)
26
15
  # we only want to indent relative to the receiver
27
16
  # when the method called looks like a setter
28
17
  return unless node.asgn_method_call?
29
18
 
30
19
  # This will match if, case, begin, blocks, etc.
31
- rhs = node.children.last
20
+ rhs = extract_rhs(node)
32
21
  check_assignment(node, rhs) if rhs.is_a?(AST::Node)
33
22
  end
23
+
24
+ private
25
+
26
+ def extract_rhs(node)
27
+ if node.casgn_type?
28
+ _scope, _lhs, rhs = *node
29
+ elsif node.op_asgn_type?
30
+ _lhs, _op, rhs = *node
31
+ elsif Util::ASGN_NODES.include?(node.type)
32
+ _lhs, rhs = *node
33
+ elsif node.send_type?
34
+ rhs = node.children.last
35
+ end
36
+
37
+ rhs
38
+ end
34
39
  end
35
40
  end
36
41
  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
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -49,47 +50,48 @@ module RuboCop
49
50
 
50
51
  def no_acceptable_style!
51
52
  self.config_to_allow_offenses = { 'Enabled' => false }
53
+ Formatter::DisabledConfigFormatter.detected_styles[cop_name] = []
52
54
  end
53
55
 
54
56
  def detected_style
55
- config_to_allow_offenses[parameter_name]
57
+ Formatter::DisabledConfigFormatter.detected_styles[cop_name] ||= nil
56
58
  end
57
59
 
58
60
  def detected_style=(style)
61
+ Formatter::DisabledConfigFormatter.detected_styles[cop_name] = style
62
+
59
63
  if style.nil?
60
64
  no_acceptable_style!
61
65
  elsif style.is_a?(Array)
62
66
  if style.empty?
63
67
  no_acceptable_style!
64
- elsif style.one?
65
- config_to_allow_offenses[parameter_name] = style[0]
66
68
  else
67
- config_to_allow_offenses[parameter_name] = style
69
+ config_to_allow_offenses[parameter_name] = style[0]
68
70
  end
69
71
  else
70
72
  config_to_allow_offenses[parameter_name] = style
71
73
  end
72
74
  end
73
75
 
74
- alias_method :conflicting_styles_detected, :no_acceptable_style!
75
- alias_method :unrecognized_style_detected, :no_acceptable_style!
76
+ alias conflicting_styles_detected no_acceptable_style!
77
+ alias unrecognized_style_detected no_acceptable_style!
76
78
 
77
79
  def style
78
- s = cop_config[parameter_name]
79
- if cop_config['SupportedStyles'].include?(s)
80
- s.to_sym
81
- else
82
- fail "Unknown style #{s} selected!"
83
- end
80
+ s = cop_config[parameter_name].to_sym
81
+ return s if supported_styles.include?(s)
82
+ fail "Unknown style #{s} selected!"
84
83
  end
85
84
 
86
85
  def alternative_style
87
- a = cop_config['SupportedStyles'].map(&:to_sym)
88
- if a.size != 2
86
+ if supported_styles.size != 2
89
87
  fail 'alternative_style can only be used when there are exactly ' \
90
88
  '2 SupportedStyles'
91
89
  end
92
- style == a.first ? a.last : a.first
90
+ (supported_styles - [style]).first
91
+ end
92
+
93
+ def supported_styles
94
+ @supported_styles ||= cop_config['SupportedStyles'].map(&:to_sym)
93
95
  end
94
96
 
95
97
  def parameter_name
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module RuboCop
4
5
  module Cop
@@ -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,9 @@ module RuboCop
31
32
  # the method has the same name as a class defined in the class/module.
32
33
  def class_emitter_method?(node, name)
33
34
  return false unless node.defs_type?
35
+ # a class emitter method may be defined inside `def self.included`,
36
+ # `def self.extended`, etc.
37
+ node = node.parent while node.parent && node.parent.defs_type?
34
38
  return false unless node.parent
35
39
 
36
40
  node.parent.children.compact.any? do |c|
@@ -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,8 +9,8 @@ module RuboCop
8
9
  module EmptyLinesAroundBody
9
10
  include ConfigurableEnforcedStyle
10
11
 
11
- MSG_EXTRA = 'Extra empty line detected at %s body %s.'
12
- MSG_MISSING = 'Empty line missing at %s body %s.'
12
+ MSG_EXTRA = 'Extra empty line detected at %s body %s.'.freeze
13
+ MSG_MISSING = 'Empty line missing at %s body %s.'.freeze
13
14
 
14
15
  def autocorrect(range)
15
16
  lambda do |corrector|
@@ -22,10 +23,14 @@ module RuboCop
22
23
 
23
24
  private
24
25
 
25
- def check(node)
26
+ def check(node, body)
27
+ # When style is `empty_lines`, if the body is empty, we don't enforce
28
+ # the presence OR absence of an empty line
29
+ # But if style is `no_empty_lines`, there must not be an empty line
30
+ return unless body || style == :no_empty_lines
31
+
26
32
  start_line = node.loc.keyword.line
27
33
  end_line = node.loc.end.line
28
-
29
34
  return if start_line == end_line
30
35
 
31
36
  check_source(start_line, end_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,31 +7,32 @@ module RuboCop
6
7
  module EndKeywordAlignment
7
8
  include ConfigurableEnforcedStyle
8
9
 
9
- MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'
10
+ MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'.freeze
10
11
 
11
12
  private
12
13
 
13
- def check_offset_of_node(node)
14
- check_offset(node, node.loc.keyword.source, 0)
14
+ def check_end_kw_in_node(node)
15
+ check_end_kw_alignment(node, style => node.loc.keyword)
15
16
  end
16
17
 
17
- def check_offset(node, alignment_base, offset)
18
+ def check_end_kw_alignment(node, align_ranges)
18
19
  return if ignored_node?(node)
19
20
 
20
21
  end_loc = node.loc.end
21
22
  return unless end_loc # Discard modifier forms of if/while/until.
22
23
 
23
- kw_loc = node.loc.keyword
24
+ matching = align_ranges.select do |_, range|
25
+ range.line == end_loc.line || range.column == end_loc.column
26
+ end
24
27
 
25
- if kw_loc.line != end_loc.line &&
26
- kw_loc.column != end_loc.column + offset
27
- add_offense(node, end_loc,
28
- format(MSG, end_loc.line, end_loc.column,
29
- alignment_base, kw_loc.line, kw_loc.column)) do
30
- opposite_style_detected
31
- end
32
- else
28
+ if matching.key?(style)
33
29
  correct_style_detected
30
+ else
31
+ align_with = align_ranges[style]
32
+ msg = format(MSG, end_loc.line, end_loc.column, align_with.source,
33
+ align_with.line, align_with.column)
34
+ add_offense(node, end_loc, msg)
35
+ style_detected(matching.keys)
34
36
  end
35
37
  end
36
38
 
@@ -47,15 +49,21 @@ module RuboCop
47
49
  rhs.loc.line > whole_expression.line
48
50
  end
49
51
 
50
- def align(node, alignment_node)
51
- source_buffer = node.loc.expression.source_buffer
52
+ def align(node, align_to)
53
+ source_buffer = node.source_range.source_buffer
52
54
  begin_pos = node.loc.end.begin_pos
53
55
  whitespace = Parser::Source::Range.new(source_buffer,
54
56
  begin_pos - node.loc.end.column,
55
57
  begin_pos)
56
58
  return false unless whitespace.source.strip.empty?
57
59
 
58
- column = alignment_node ? alignment_node.loc.expression.column : 0
60
+ column = if !align_to
61
+ 0
62
+ elsif align_to.respond_to?(:loc)
63
+ align_to.source_range.column
64
+ else
65
+ align_to.column
66
+ end
59
67
 
60
68
  ->(corrector) { corrector.replace(whitespace, ' ' * column) }
61
69
  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
  # element in a multi-line collection.
7
8
  module FirstElementLineBreak
8
9
  def autocorrect(node)
9
- ->(corrector) { corrector.insert_before(node.loc.expression, "\n") }
10
+ ->(corrector) { corrector.insert_before(node.source_range, "\n") }
10
11
  end
11
12
 
12
13
  private
@@ -20,7 +21,7 @@ module RuboCop
20
21
  end
21
22
 
22
23
  def method_uses_parens?(node, limit)
23
- source = node.loc.expression.source_line[0...limit.loc.column]
24
+ source = node.source_range.source_line[0...limit.loc.column]
24
25
  source =~ /\s*\(\s*$/
25
26
  end
26
27
 
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module RuboCop
5
+ module Cop
6
+ # Common functionality for checking hash nodes.
7
+ module HashNode
8
+ def any_pairs_on_the_same_line?(node)
9
+ node.children.butfirst.any? do |pair|
10
+ !Util.begins_its_line?(pair.loc.expression)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end