rubocop 0.49.1 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -9
  3. data/bin/rubocop +1 -1
  4. data/config/default.yml +264 -118
  5. data/config/disabled.yml +13 -9
  6. data/config/enabled.yml +1156 -918
  7. data/lib/rubocop.rb +555 -489
  8. data/lib/rubocop/ast/builder.rb +6 -1
  9. data/lib/rubocop/ast/node.rb +68 -52
  10. data/lib/rubocop/ast/node/args_node.rb +15 -10
  11. data/lib/rubocop/ast/node/array_node.rb +10 -1
  12. data/lib/rubocop/ast/node/block_node.rb +9 -0
  13. data/lib/rubocop/ast/node/def_node.rb +71 -0
  14. data/lib/rubocop/ast/node/for_node.rb +8 -0
  15. data/lib/rubocop/ast/node/if_node.rb +10 -2
  16. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  17. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  18. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  19. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  20. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
  21. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  22. data/lib/rubocop/ast/node/send_node.rb +21 -150
  23. data/lib/rubocop/ast/node/str_node.rb +14 -0
  24. data/lib/rubocop/ast/node/super_node.rb +3 -24
  25. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  26. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  27. data/lib/rubocop/ast/traversal.rb +7 -7
  28. data/lib/rubocop/cached_data.rb +1 -6
  29. data/lib/rubocop/cli.rb +59 -13
  30. data/lib/rubocop/comment_config.rb +2 -5
  31. data/lib/rubocop/config.rb +136 -29
  32. data/lib/rubocop/config_loader.rb +61 -104
  33. data/lib/rubocop/config_loader_resolver.rb +102 -4
  34. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  35. data/lib/rubocop/cop/bundler/duplicated_gem.rb +13 -11
  36. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
  37. data/lib/rubocop/cop/bundler/ordered_gems.rb +7 -58
  38. data/lib/rubocop/cop/commissioner.rb +6 -3
  39. data/lib/rubocop/cop/cop.rb +11 -6
  40. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  41. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +97 -0
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  43. data/lib/rubocop/cop/generator.rb +122 -25
  44. data/lib/rubocop/cop/internal_affairs.rb +6 -2
  45. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  46. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +16 -5
  47. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  48. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
  49. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
  50. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  51. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -10
  52. data/lib/rubocop/cop/layout/align_array.rb +2 -2
  53. data/lib/rubocop/cop/layout/align_hash.rb +18 -18
  54. data/lib/rubocop/cop/layout/align_parameters.rb +11 -23
  55. data/lib/rubocop/cop/layout/block_end_newline.rb +20 -6
  56. data/lib/rubocop/cop/layout/case_indentation.rb +15 -18
  57. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  58. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +7 -6
  59. data/lib/rubocop/cop/layout/comment_indentation.rb +42 -3
  60. data/lib/rubocop/cop/layout/dot_position.rb +31 -13
  61. data/lib/rubocop/cop/layout/else_alignment.rb +37 -17
  62. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +1 -1
  63. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +22 -18
  64. data/lib/rubocop/cop/layout/empty_lines.rb +16 -2
  65. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +23 -6
  66. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  67. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  68. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  69. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +10 -6
  71. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +5 -5
  72. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  73. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  74. data/lib/rubocop/cop/layout/extra_spacing.rb +23 -26
  75. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
  76. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +9 -3
  77. data/lib/rubocop/cop/layout/indent_array.rb +68 -21
  78. data/lib/rubocop/cop/layout/indent_hash.rb +71 -26
  79. data/lib/rubocop/cop/layout/indent_heredoc.rb +70 -35
  80. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
  81. data/lib/rubocop/cop/layout/indentation_width.rb +40 -27
  82. data/lib/rubocop/cop/layout/initial_indentation.rb +10 -7
  83. data/lib/rubocop/cop/layout/leading_comment_space.rb +32 -17
  84. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  85. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +12 -11
  86. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  87. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  88. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +29 -27
  89. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +7 -3
  90. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
  91. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +12 -4
  92. data/lib/rubocop/cop/layout/space_after_colon.rb +13 -6
  93. data/lib/rubocop/cop/layout/space_after_comma.rb +11 -1
  94. data/lib/rubocop/cop/layout/space_after_method_name.rb +8 -6
  95. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  96. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  97. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +32 -25
  98. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +28 -17
  99. data/lib/rubocop/cop/layout/space_around_keyword.rb +22 -16
  100. data/lib/rubocop/cop/layout/space_around_operators.rb +27 -14
  101. data/lib/rubocop/cop/layout/space_before_block_braces.rb +61 -12
  102. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  103. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -5
  104. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -4
  105. data/lib/rubocop/cop/layout/space_before_semicolon.rb +8 -1
  106. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +12 -14
  107. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  108. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +4 -4
  109. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +89 -18
  110. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +62 -36
  111. data/lib/rubocop/cop/layout/space_inside_parens.rb +40 -3
  112. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  113. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  114. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  115. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +32 -17
  116. data/lib/rubocop/cop/layout/tab.rb +7 -4
  117. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +11 -9
  118. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  119. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +12 -19
  120. data/lib/rubocop/cop/lint/assignment_in_condition.rb +16 -2
  121. data/lib/rubocop/cop/lint/block_alignment.rb +42 -30
  122. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  123. data/lib/rubocop/cop/lint/circular_argument_reference.rb +3 -14
  124. data/lib/rubocop/cop/lint/condition_position.rb +5 -1
  125. data/lib/rubocop/cop/lint/debugger.rb +18 -11
  126. data/lib/rubocop/cop/lint/def_end_alignment.rb +9 -14
  127. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
  128. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
  129. data/lib/rubocop/cop/lint/duplicate_methods.rb +75 -5
  130. data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
  131. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  132. data/lib/rubocop/cop/lint/else_layout.rb +3 -3
  133. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  134. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  135. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  136. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  137. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  138. data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
  139. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  140. data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
  141. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +36 -41
  142. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  143. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  144. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +25 -20
  145. data/lib/rubocop/cop/lint/inherit_exception.rb +16 -19
  146. data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
  147. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +21 -7
  148. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  149. data/lib/rubocop/cop/lint/loop.rb +1 -1
  150. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  151. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  152. data/lib/rubocop/cop/lint/nested_method_definition.rb +6 -8
  153. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  154. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  155. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
  156. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -3
  157. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -22
  158. data/lib/rubocop/cop/lint/percent_symbol_array.rb +12 -12
  159. data/lib/rubocop/cop/lint/rand_one.rb +8 -2
  160. data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
  161. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  162. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  163. data/lib/rubocop/cop/lint/require_parentheses.rb +5 -3
  164. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  165. data/lib/rubocop/cop/lint/rescue_type.rb +18 -9
  166. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  167. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  168. data/lib/rubocop/cop/lint/script_permission.rb +8 -1
  169. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  170. data/lib/rubocop/cop/lint/shadowed_exception.rb +37 -10
  171. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
  172. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +7 -7
  173. data/lib/rubocop/cop/lint/syntax.rb +23 -20
  174. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
  175. data/lib/rubocop/cop/lint/unified_integer.rb +5 -4
  176. data/lib/rubocop/cop/lint/unneeded_disable.rb +41 -16
  177. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
  178. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +45 -19
  179. data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
  180. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  181. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
  182. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  183. data/lib/rubocop/cop/lint/useless_access_modifier.rb +12 -16
  184. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  185. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  186. data/lib/rubocop/cop/lint/useless_setter_call.rb +15 -12
  187. data/lib/rubocop/cop/lint/void.rb +38 -27
  188. data/lib/rubocop/cop/message_annotator.rb +4 -2
  189. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  190. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  191. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  192. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  193. data/lib/rubocop/cop/metrics/line_length.rb +8 -5
  194. data/lib/rubocop/cop/metrics/method_length.rb +8 -3
  195. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  196. data/lib/rubocop/cop/metrics/parameter_lists.rb +14 -5
  197. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  198. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +3 -2
  199. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +2 -2
  200. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  201. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  202. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  203. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  204. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +14 -7
  205. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  206. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +8 -4
  207. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -3
  208. data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
  209. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  210. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -7
  211. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +74 -33
  212. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +34 -8
  213. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -1
  214. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +67 -0
  215. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  216. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -1
  217. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  218. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +9 -8
  219. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +11 -10
  220. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  221. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  222. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  223. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  224. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  225. data/lib/rubocop/cop/mixin/trailing_comma.rb +25 -17
  226. data/lib/rubocop/cop/mixin/unused_argument.rb +6 -2
  227. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  228. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +35 -2
  229. data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +7 -6
  230. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  231. data/lib/rubocop/cop/naming/constant_name.rb +58 -0
  232. data/lib/rubocop/cop/{style → naming}/file_name.rb +28 -13
  233. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  234. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
  235. data/lib/rubocop/cop/naming/method_name.rb +40 -0
  236. data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
  237. data/lib/rubocop/cop/naming/variable_name.rb +50 -0
  238. data/lib/rubocop/cop/{style → naming}/variable_number.rb +11 -28
  239. data/lib/rubocop/cop/offense.rb +6 -1
  240. data/lib/rubocop/cop/performance/caller.rb +39 -11
  241. data/lib/rubocop/cop/performance/case_when_splat.rb +3 -7
  242. data/lib/rubocop/cop/performance/casecmp.rb +9 -8
  243. data/lib/rubocop/cop/performance/compare_with_block.rb +23 -13
  244. data/lib/rubocop/cop/performance/count.rb +7 -4
  245. data/lib/rubocop/cop/performance/detect.rb +9 -6
  246. data/lib/rubocop/cop/performance/double_start_end_with.rb +12 -20
  247. data/lib/rubocop/cop/performance/end_with.rb +6 -6
  248. data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
  249. data/lib/rubocop/cop/performance/flat_map.rb +5 -2
  250. data/lib/rubocop/cop/performance/hash_each_methods.rb +85 -40
  251. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +9 -6
  252. data/lib/rubocop/cop/performance/range_include.rb +3 -3
  253. data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -28
  254. data/lib/rubocop/cop/performance/redundant_match.rb +13 -12
  255. data/lib/rubocop/cop/performance/redundant_merge.rb +44 -26
  256. data/lib/rubocop/cop/performance/redundant_sort_by.rb +9 -6
  257. data/lib/rubocop/cop/performance/regexp_match.rb +19 -10
  258. data/lib/rubocop/cop/performance/reverse_each.rb +1 -1
  259. data/lib/rubocop/cop/performance/sample.rb +1 -1
  260. data/lib/rubocop/cop/performance/size.rb +3 -3
  261. data/lib/rubocop/cop/performance/start_with.rb +6 -6
  262. data/lib/rubocop/cop/performance/string_replacement.rb +6 -6
  263. data/lib/rubocop/cop/performance/times_map.rb +32 -22
  264. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  265. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  266. data/lib/rubocop/cop/rails/action_filter.rb +23 -1
  267. data/lib/rubocop/cop/rails/active_support_aliases.rb +4 -5
  268. data/lib/rubocop/cop/rails/application_job.rb +5 -3
  269. data/lib/rubocop/cop/rails/application_record.rb +5 -3
  270. data/lib/rubocop/cop/rails/blank.rb +20 -17
  271. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  272. data/lib/rubocop/cop/rails/date.rb +7 -6
  273. data/lib/rubocop/cop/rails/delegate.rb +53 -29
  274. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +4 -4
  275. data/lib/rubocop/cop/rails/dynamic_find_by.rb +2 -2
  276. data/lib/rubocop/cop/rails/enum_uniqueness.rb +4 -4
  277. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  278. data/lib/rubocop/cop/rails/exit.rb +8 -1
  279. data/lib/rubocop/cop/rails/file_path.rb +8 -11
  280. data/lib/rubocop/cop/rails/find_by.rb +2 -1
  281. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  282. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +8 -1
  283. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +76 -0
  284. data/lib/rubocop/cop/rails/http_positional_arguments.rb +40 -44
  285. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  286. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  287. data/lib/rubocop/cop/rails/not_null_column.rb +6 -6
  288. data/lib/rubocop/cop/rails/output.rb +11 -2
  289. data/lib/rubocop/cop/rails/output_safety.rb +16 -21
  290. data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -10
  291. data/lib/rubocop/cop/rails/presence.rb +105 -0
  292. data/lib/rubocop/cop/rails/present.rb +14 -17
  293. data/lib/rubocop/cop/rails/read_write_attribute.rb +13 -13
  294. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  295. data/lib/rubocop/cop/rails/relative_date_constant.rb +11 -11
  296. data/lib/rubocop/cop/rails/request_referer.rb +3 -3
  297. data/lib/rubocop/cop/rails/reversible_migration.rb +36 -35
  298. data/lib/rubocop/cop/rails/safe_navigation.rb +7 -8
  299. data/lib/rubocop/cop/rails/save_bang.rb +19 -17
  300. data/lib/rubocop/cop/rails/scope_args.rb +2 -2
  301. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
  302. data/lib/rubocop/cop/rails/time_zone.rb +3 -2
  303. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +4 -2
  304. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  305. data/lib/rubocop/cop/rails/validation.rb +8 -8
  306. data/lib/rubocop/cop/registry.rb +2 -1
  307. data/lib/rubocop/cop/security/eval.rb +4 -4
  308. data/lib/rubocop/cop/security/json_load.rb +7 -5
  309. data/lib/rubocop/cop/security/marshal_load.rb +8 -6
  310. data/lib/rubocop/cop/security/yaml_load.rb +4 -4
  311. data/lib/rubocop/cop/style/alias.rb +49 -27
  312. data/lib/rubocop/cop/style/and_or.rb +65 -45
  313. data/lib/rubocop/cop/style/array_join.rb +10 -1
  314. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  315. data/lib/rubocop/cop/style/attr.rb +15 -5
  316. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +7 -5
  317. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  318. data/lib/rubocop/cop/style/begin_block.rb +1 -1
  319. data/lib/rubocop/cop/style/block_comments.rb +17 -3
  320. data/lib/rubocop/cop/style/block_delimiters.rb +82 -16
  321. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +68 -32
  322. data/lib/rubocop/cop/style/case_equality.rb +13 -1
  323. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  324. data/lib/rubocop/cop/style/class_and_module_children.rb +8 -4
  325. data/lib/rubocop/cop/style/class_check.rb +29 -10
  326. data/lib/rubocop/cop/style/class_methods.rb +10 -9
  327. data/lib/rubocop/cop/style/class_vars.rb +5 -4
  328. data/lib/rubocop/cop/style/collection_methods.rb +5 -3
  329. data/lib/rubocop/cop/style/colon_method_call.rb +18 -2
  330. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  331. data/lib/rubocop/cop/style/command_literal.rb +90 -30
  332. data/lib/rubocop/cop/style/comment_annotation.rb +39 -11
  333. data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
  334. data/lib/rubocop/cop/style/conditional_assignment.rb +41 -41
  335. data/lib/rubocop/cop/style/copyright.rb +27 -28
  336. data/lib/rubocop/cop/style/date_time.rb +44 -0
  337. data/lib/rubocop/cop/style/def_with_parentheses.rb +31 -5
  338. data/lib/rubocop/cop/style/dir.rb +48 -0
  339. data/lib/rubocop/cop/style/documentation.rb +17 -2
  340. data/lib/rubocop/cop/style/documentation_method.rb +2 -6
  341. data/lib/rubocop/cop/style/double_negation.rb +1 -1
  342. data/lib/rubocop/cop/style/each_for_simple_loop.rb +8 -8
  343. data/lib/rubocop/cop/style/each_with_object.rb +6 -5
  344. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  345. data/lib/rubocop/cop/style/empty_case_condition.rb +3 -3
  346. data/lib/rubocop/cop/style/empty_else.rb +55 -24
  347. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  348. data/lib/rubocop/cop/style/empty_literal.rb +25 -14
  349. data/lib/rubocop/cop/style/empty_method.rb +29 -25
  350. data/lib/rubocop/cop/style/encoding.rb +8 -51
  351. data/lib/rubocop/cop/style/end_block.rb +1 -1
  352. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  353. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  354. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  355. data/lib/rubocop/cop/style/flip_flop.rb +13 -2
  356. data/lib/rubocop/cop/style/for.rb +6 -2
  357. data/lib/rubocop/cop/style/format_string.rb +33 -5
  358. data/lib/rubocop/cop/style/format_string_token.rb +17 -15
  359. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -6
  360. data/lib/rubocop/cop/style/global_vars.rb +12 -2
  361. data/lib/rubocop/cop/style/guard_clause.rb +6 -4
  362. data/lib/rubocop/cop/style/hash_syntax.rb +56 -56
  363. data/lib/rubocop/cop/style/identical_conditional_branches.rb +12 -8
  364. data/lib/rubocop/cop/style/if_inside_else.rb +11 -11
  365. data/lib/rubocop/cop/style/if_unless_modifier.rb +8 -7
  366. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -2
  367. data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -1
  368. data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -6
  369. data/lib/rubocop/cop/style/infinite_loop.rb +4 -4
  370. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  371. data/lib/rubocop/cop/style/inverse_methods.rb +24 -14
  372. data/lib/rubocop/cop/style/lambda.rb +45 -43
  373. data/lib/rubocop/cop/style/lambda_call.rb +37 -10
  374. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -5
  375. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +3 -19
  376. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
  377. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -1
  378. data/lib/rubocop/cop/style/method_def_parentheses.rb +20 -25
  379. data/lib/rubocop/cop/style/method_missing.rb +13 -26
  380. data/lib/rubocop/cop/style/min_max.rb +68 -0
  381. data/lib/rubocop/cop/style/missing_else.rb +20 -6
  382. data/lib/rubocop/cop/style/mixin_grouping.rb +31 -21
  383. data/lib/rubocop/cop/style/mixin_usage.rb +71 -0
  384. data/lib/rubocop/cop/style/module_function.rb +27 -11
  385. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  386. data/lib/rubocop/cop/style/multiline_if_modifier.rb +8 -4
  387. data/lib/rubocop/cop/style/multiline_if_then.rb +15 -13
  388. data/lib/rubocop/cop/style/multiline_memoization.rb +33 -17
  389. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  390. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  391. data/lib/rubocop/cop/style/mutable_constant.rb +11 -15
  392. data/lib/rubocop/cop/style/negated_if.rb +27 -31
  393. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  394. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  395. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +26 -23
  396. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  397. data/lib/rubocop/cop/style/next.rb +41 -12
  398. data/lib/rubocop/cop/style/nil_comparison.rb +8 -8
  399. data/lib/rubocop/cop/style/non_nil_check.rb +41 -38
  400. data/lib/rubocop/cop/style/not.rb +15 -5
  401. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +8 -4
  402. data/lib/rubocop/cop/style/numeric_literals.rb +9 -9
  403. data/lib/rubocop/cop/style/numeric_predicate.rb +21 -21
  404. data/lib/rubocop/cop/style/one_line_conditional.rb +9 -4
  405. data/lib/rubocop/cop/style/option_hash.rb +11 -25
  406. data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
  407. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  408. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  409. data/lib/rubocop/cop/style/parentheses_around_condition.rb +30 -13
  410. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +25 -4
  411. data/lib/rubocop/cop/style/percent_q_literals.rb +29 -8
  412. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -1
  413. data/lib/rubocop/cop/style/preferred_hash_methods.rb +7 -11
  414. data/lib/rubocop/cop/style/proc.rb +10 -2
  415. data/lib/rubocop/cop/style/raise_args.rb +22 -29
  416. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  417. data/lib/rubocop/cop/style/redundant_begin.rb +16 -5
  418. data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
  419. data/lib/rubocop/cop/style/redundant_exception.rb +4 -4
  420. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  421. data/lib/rubocop/cop/style/redundant_parentheses.rb +14 -12
  422. data/lib/rubocop/cop/style/redundant_return.rb +28 -15
  423. data/lib/rubocop/cop/style/redundant_self.rb +35 -27
  424. data/lib/rubocop/cop/style/regexp_literal.rb +88 -27
  425. data/lib/rubocop/cop/style/rescue_modifier.rb +12 -1
  426. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  427. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  428. data/lib/rubocop/cop/style/safe_navigation.rb +100 -48
  429. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  430. data/lib/rubocop/cop/style/semicolon.rb +19 -9
  431. data/lib/rubocop/cop/style/send.rb +10 -1
  432. data/lib/rubocop/cop/style/signal_exception.rb +104 -3
  433. data/lib/rubocop/cop/style/single_line_block_params.rb +16 -15
  434. data/lib/rubocop/cop/style/single_line_methods.rb +26 -18
  435. data/lib/rubocop/cop/style/special_global_vars.rb +19 -14
  436. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +23 -50
  437. data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
  438. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  439. data/lib/rubocop/cop/style/string_literals.rb +26 -3
  440. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +16 -1
  441. data/lib/rubocop/cop/style/string_methods.rb +19 -8
  442. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  443. data/lib/rubocop/cop/style/symbol_array.rb +7 -35
  444. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  445. data/lib/rubocop/cop/style/symbol_proc.rb +11 -25
  446. data/lib/rubocop/cop/style/ternary_parentheses.rb +46 -51
  447. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  448. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  449. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  450. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  451. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +70 -24
  452. data/lib/rubocop/cop/style/trivial_accessors.rb +72 -65
  453. data/lib/rubocop/cop/style/unless_else.rb +16 -1
  454. data/lib/rubocop/cop/style/unneeded_capital_w.rb +18 -8
  455. data/lib/rubocop/cop/style/unneeded_interpolation.rb +15 -19
  456. data/lib/rubocop/cop/style/unneeded_percent_q.rb +14 -13
  457. data/lib/rubocop/cop/style/variable_interpolation.rb +23 -9
  458. data/lib/rubocop/cop/style/when_then.rb +14 -1
  459. data/lib/rubocop/cop/style/while_until_do.rb +27 -4
  460. data/lib/rubocop/cop/style/while_until_modifier.rb +26 -6
  461. data/lib/rubocop/cop/style/word_array.rb +9 -30
  462. data/lib/rubocop/cop/style/yoda_condition.rb +51 -22
  463. data/lib/rubocop/cop/style/zero_length_predicate.rb +44 -29
  464. data/lib/rubocop/cop/team.rb +16 -8
  465. data/lib/rubocop/cop/util.rb +43 -34
  466. data/lib/rubocop/cop/variable_force.rb +1 -1
  467. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  468. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  469. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  470. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -4
  471. data/lib/rubocop/formatter/formatter_set.rb +3 -1
  472. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  473. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  474. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  475. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  476. data/lib/rubocop/formatter/simple_text_formatter.rb +3 -3
  477. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  478. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
  479. data/lib/rubocop/node_pattern.rb +46 -29
  480. data/lib/rubocop/options.rb +13 -8
  481. data/lib/rubocop/path_util.rb +15 -3
  482. data/lib/rubocop/processed_source.rb +8 -9
  483. data/lib/rubocop/rake_task.rb +16 -23
  484. data/lib/rubocop/remote_config.rb +13 -1
  485. data/lib/rubocop/result_cache.rb +1 -0
  486. data/lib/rubocop/rspec/cop_helper.rb +10 -10
  487. data/lib/rubocop/rspec/expect_offense.rb +6 -8
  488. data/lib/rubocop/rspec/shared_contexts.rb +4 -8
  489. data/lib/rubocop/rspec/shared_examples.rb +8 -8
  490. data/lib/rubocop/rspec/support.rb +5 -5
  491. data/lib/rubocop/runner.rb +1 -1
  492. data/lib/rubocop/string_util.rb +2 -0
  493. data/lib/rubocop/token.rb +74 -0
  494. data/lib/rubocop/version.rb +1 -1
  495. metadata +118 -48
  496. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  497. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -41
  498. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
  499. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
  500. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
  501. data/lib/rubocop/cop/style/accessor_method_name.rb +0 -45
  502. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -29
  503. data/lib/rubocop/cop/style/constant_name.rb +0 -29
  504. data/lib/rubocop/cop/style/method_name.rb +0 -34
  505. data/lib/rubocop/cop/style/predicate_name.rb +0 -67
  506. data/lib/rubocop/cop/style/variable_name.rb +0 -39
@@ -37,11 +37,7 @@ module RuboCop
37
37
  end
38
38
 
39
39
  def name
40
- # TODO: Add an else clause
41
- case @node.type
42
- when :def then @node.children[0]
43
- when :defs then @node.children[1]
44
- end
40
+ @node.method_name
45
41
  end
46
42
 
47
43
  def body_node
@@ -47,7 +47,7 @@ module RuboCop
47
47
  next if consumed_branches.include?(assignment.branch)
48
48
 
49
49
  unless assignment.run_exclusively_with?(reference)
50
- assignment.reference!
50
+ assignment.reference!(node)
51
51
  end
52
52
 
53
53
  break if !assignment.branch || assignment.branch == reference.branch
@@ -50,13 +50,11 @@ module RuboCop
50
50
  output.puts HEADING % command
51
51
 
52
52
  # Syntax isn't a real cop and it can't be disabled.
53
- @cops_with_offenses.delete('Syntax')
53
+ @cops_with_offenses.delete('Lint/Syntax')
54
54
 
55
55
  output_offenses
56
56
 
57
57
  puts "Created #{output.path}."
58
- puts "Run `rubocop --config #{output.path}`, or add `inherit_from: " \
59
- "#{output.path}` in a .rubocop.yml file."
60
58
  end
61
59
 
62
60
  private
@@ -107,7 +105,8 @@ module RuboCop
107
105
  end
108
106
 
109
107
  def output_cop_param_comments(params, default_cfg)
110
- output.puts "# Configuration parameters: #{params.join(', ')}."
108
+ config_params = params.reject { |p| p.start_with?('Supported') }
109
+ output.puts "# Configuration parameters: #{config_params.join(', ')}."
111
110
 
112
111
  params.each do |param|
113
112
  value = default_cfg[param]
@@ -19,7 +19,9 @@ module RuboCop
19
19
  'files' => FileListFormatter,
20
20
  'offenses' => OffenseCountFormatter,
21
21
  'disabled' => DisabledLinesFormatter,
22
- 'worst' => WorstOffendersFormatter
22
+ 'worst' => WorstOffendersFormatter,
23
+ 'tap' => TapFormatter,
24
+ 'quiet' => QuietFormatter
23
25
  }.freeze
24
26
 
25
27
  FORMATTER_APIS = %i[started finished].freeze
@@ -4,7 +4,7 @@ require 'cgi'
4
4
  require 'erb'
5
5
  require 'ostruct'
6
6
  require 'base64'
7
- require 'rubocop/formatter/text_util'
7
+ require_relative 'text_util'
8
8
 
9
9
  module RuboCop
10
10
  module Formatter
@@ -64,9 +64,15 @@ module RuboCop
64
64
  # TODO: Consider better solution for Offense#real_column.
65
65
  def hash_for_location(offense)
66
66
  {
67
- line: offense.line,
68
- column: offense.real_column,
69
- length: offense.location.length
67
+ start_line: offense.line,
68
+ start_column: offense.real_column,
69
+ last_line: offense.last_line,
70
+ last_column: offense.last_column,
71
+ length: offense.location.length,
72
+ # `line` and `column` exist for compatibility.
73
+ # Use `start_line` and `start_column` instead.
74
+ line: offense.line,
75
+ column: offense.real_column
70
76
  }
71
77
  end
72
78
  end
@@ -27,6 +27,7 @@ module RuboCop
27
27
  report_summary(@offense_counts)
28
28
  end
29
29
 
30
+ # rubocop:disable Metrics/AbcSize
30
31
  def report_summary(offense_counts)
31
32
  per_cop_counts = ordered_offense_counts(offense_counts)
32
33
  total_count = total_offense_count(offense_counts)
@@ -42,6 +43,7 @@ module RuboCop
42
43
 
43
44
  output.puts
44
45
  end
46
+ # rubocop:enable Metrics/AbcSize
45
47
 
46
48
  def ordered_offense_counts(offense_counts)
47
49
  Hash[offense_counts.sort_by { |k, v| [-v, k] }]
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Formatter
5
+ # If no offenses are found, no output is displayed.
6
+ # Otherwise, SimpleTextFormatter's output is displayed.
7
+ class QuietFormatter < SimpleTextFormatter
8
+ def report_summary(file_count, offense_count, correction_count)
9
+ super unless offense_count.zero?
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rubocop/formatter/colorizable'
4
- require 'rubocop/formatter/text_util'
3
+ require_relative 'colorizable'
4
+ require_relative 'text_util'
5
5
 
6
6
  module RuboCop
7
7
  module Formatter
@@ -70,7 +70,7 @@ module RuboCop
70
70
  end
71
71
 
72
72
  def annotate_message(msg)
73
- msg.gsub(/`(.*?)`/, yellow('\1'))
73
+ msg.gsub(/`(.*?)`/m, yellow('\1'))
74
74
  end
75
75
 
76
76
  def message(offense)
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Formatter
5
+ # This formatter formats report data using the Test Anything Protocol.
6
+ # TAP allows for to communicate tests results in a language agnostics way.
7
+ class TapFormatter < ClangStyleFormatter
8
+ def started(target_files)
9
+ super
10
+ @progress_count = 1
11
+ output.puts "1..#{target_files.size}"
12
+ end
13
+
14
+ def file_finished(file, offenses)
15
+ if offenses.empty?
16
+ output.puts "ok #{@progress_count} - #{smart_path(file)}"
17
+ else
18
+ output.puts "not ok #{@progress_count} - #{smart_path(file)}"
19
+
20
+ count_stats(offenses)
21
+ report_file(file, offenses)
22
+ end
23
+
24
+ @progress_count += 1
25
+ end
26
+
27
+ private
28
+
29
+ def report_line(location)
30
+ source_line = location.source_line
31
+
32
+ if location.first_line == location.last_line
33
+ output.puts("# #{source_line}")
34
+ else
35
+ output.puts("# #{source_line} #{yellow(ELLIPSES)}")
36
+ end
37
+ end
38
+
39
+ def report_highlighted_area(highlighted_area)
40
+ output.puts("# #{' ' * highlighted_area.begin_pos}" \
41
+ "#{'^' * highlighted_area.size}")
42
+ end
43
+
44
+ def report_offense(file, offense)
45
+ output.printf("# %s:%d:%d: %s: %s\n",
46
+ cyan(smart_path(file)), offense.line, offense.real_column,
47
+ colored_severity_code(offense), message(offense))
48
+
49
+ # rubocop:disable Lint/HandleExceptions
50
+ begin
51
+ return unless valid_line?(offense)
52
+
53
+ report_line(offense.location)
54
+ report_highlighted_area(offense.highlighted_area)
55
+ rescue IndexError
56
+ # range is not on a valid line; perhaps the source file is empty
57
+ end
58
+ # rubocop:enable Lint/HandleExceptions
59
+ end
60
+
61
+ def annotate_message(msg)
62
+ msg.gsub(/`(.*?)`/, '\1')
63
+ end
64
+
65
+ def message(offense)
66
+ message = offense.corrected? ? '[Corrected] ' : ''
67
+ "#{message}#{annotate_message(offense.message)}"
68
+ end
69
+ end
70
+ end
71
+ end
@@ -32,6 +32,7 @@ module RuboCop
32
32
  report_summary(@offense_counts)
33
33
  end
34
34
 
35
+ # rubocop:disable Metrics/AbcSize
35
36
  def report_summary(offense_counts)
36
37
  per_file_counts = ordered_offense_counts(offense_counts)
37
38
  total_count = total_offense_count(offense_counts)
@@ -47,6 +48,7 @@ module RuboCop
47
48
 
48
49
  output.puts
49
50
  end
51
+ # rubocop:enable Metrics/AbcSize
50
52
 
51
53
  def ordered_offense_counts(offense_counts)
52
54
  Hash[offense_counts.sort_by { |k, v| [-v, k] }]
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/ClassLength
4
- # rubocop:disable Metrics/CyclomaticComplexity
5
-
3
+ # rubocop:disable Metrics/ClassLength, Metrics/CyclomaticComplexity
6
4
  module RuboCop
7
5
  # This class performs a pattern-matching operation on an AST node.
8
6
  #
@@ -98,19 +96,26 @@ module RuboCop
98
96
  # @private
99
97
  # Builds Ruby code which implements a pattern
100
98
  class Compiler
101
- RSYM = %r{:(?:[\w+@*/?!<>=~|%^-]+|\[\]=?)}
102
- ID_CHAR = /[a-zA-Z_-]/
103
- META = /\(|\)|\{|\}|\[|\]|\$\.\.\.|\$|!|\^|\.\.\./
104
- NUMBER = /-?\d+(?:\.\d+)?/
105
- TOKEN =
106
- /\G(?:[\s,]+|#{META}|%\d*|#{NUMBER}|\#?#{ID_CHAR}+[\!\?]?\(?|#{RSYM}|.)/
107
-
108
- NODE = /\A#{ID_CHAR}+\Z/
109
- PREDICATE = /\A#{ID_CHAR}+\?\(?\Z/
110
- WILDCARD = /\A_#{ID_CHAR}*\Z/
111
- FUNCALL = /\A\##{ID_CHAR}+[\!\?]?\(?\Z/
112
- LITERAL = /\A(?:#{RSYM}|#{NUMBER}|nil)\Z/
113
- PARAM = /\A%\d*\Z/
99
+ SYMBOL = %r{:(?:[\w+@*/?!<>=~|%^-]+|\[\]=?)}
100
+ IDENTIFIER = /[a-zA-Z_-]/
101
+ META = /\(|\)|\{|\}|\[|\]|\$\.\.\.|\$|!|\^|\.\.\./
102
+ NUMBER = /-?\d+(?:\.\d+)?/
103
+ STRING = /".+?"/
104
+ METHOD_NAME = /\#?#{IDENTIFIER}+[\!\?]?\(?/
105
+ PARAM_NUMBER = /%\d*/
106
+
107
+ SEPARATORS = /[\s]+/
108
+ TOKENS = Regexp.union(META, PARAM_NUMBER, NUMBER,
109
+ METHOD_NAME, SYMBOL, STRING)
110
+
111
+ TOKEN = /\G(?:#{SEPARATORS}|#{TOKENS}|.)/
112
+
113
+ NODE = /\A#{IDENTIFIER}+\Z/
114
+ PREDICATE = /\A#{IDENTIFIER}+\?\(?\Z/
115
+ WILDCARD = /\A_#{IDENTIFIER}*\Z/
116
+ FUNCALL = /\A\##{METHOD_NAME}/
117
+ LITERAL = /\A(?:#{SYMBOL}|#{NUMBER}|#{STRING})\Z/
118
+ PARAM = /\A#{PARAM_NUMBER}\Z/
114
119
  CLOSING = /\A(?:\)|\}|\])\Z/
115
120
 
116
121
  attr_reader :match_code
@@ -128,9 +133,11 @@ module RuboCop
128
133
  end
129
134
 
130
135
  def run(node_var)
131
- tokens = @string.scan(TOKEN)
132
- tokens.reject! { |token| token =~ /\A[\s,]+\Z/ } # drop whitespace
136
+ tokens =
137
+ @string.scan(TOKEN).reject { |token| token =~ /\A#{SEPARATORS}\Z/ }
138
+
133
139
  @match_code = compile_expr(tokens, node_var, false)
140
+
134
141
  fail_due_to('unbalanced pattern') unless tokens.empty?
135
142
  end
136
143
 
@@ -158,7 +165,7 @@ module RuboCop
158
165
  when PARAM then compile_param(cur_node, token[1..-1], seq_head)
159
166
  when CLOSING then fail_due_to("#{token} in invalid position")
160
167
  when nil then fail_due_to('pattern ended prematurely')
161
- else fail_due_to("invalid token #{token.inspect}")
168
+ else fail_due_to("invalid token #{token.inspect}")
162
169
  end
163
170
  end
164
171
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
@@ -336,7 +343,8 @@ module RuboCop
336
343
  else
337
344
  n = @unify[name] = next_temp_value
338
345
  # double assign to temp#{n} to avoid "assigned but unused variable"
339
- "(temp#{n} = temp#{n} = #{cur_node}#{'.type' if seq_head}; true)"
346
+ "(temp#{n} = #{cur_node}#{'.type' if seq_head}; " \
347
+ "temp#{n} = temp#{n}; true)"
340
348
  end
341
349
  end
342
350
 
@@ -433,11 +441,17 @@ module RuboCop
433
441
  params.empty? ? '' : ",#{params}"
434
442
  end
435
443
 
444
+ def emit_guard_clause
445
+ <<-RUBY
446
+ return unless node.is_a?(RuboCop::AST::Node)
447
+ RUBY
448
+ end
449
+
436
450
  def emit_method_code
437
- <<-CODE
438
- return nil unless #{@match_code}
451
+ <<-RUBY
452
+ return unless #{@match_code}
439
453
  block_given? ? yield(#{emit_capture_list}) : (return #{emit_retval})
440
- CODE
454
+ RUBY
441
455
  end
442
456
 
443
457
  def fail_due_to(message)
@@ -447,7 +461,7 @@ module RuboCop
447
461
  def with_temp_node(cur_node)
448
462
  with_temp_variable do |temp_var|
449
463
  # double assign to temp#{n} to avoid "assigned but unused variable"
450
- yield "#{temp_var} = #{temp_var} = #{cur_node}", temp_var
464
+ yield "#{temp_var} = #{cur_node}; #{temp_var} = #{temp_var}", temp_var
451
465
  end
452
466
  end
453
467
 
@@ -459,6 +473,7 @@ module RuboCop
459
473
  @temps += 1
460
474
  end
461
475
  end
476
+ private_constant :Compiler
462
477
 
463
478
  # Helpers for defining methods based on a pattern string
464
479
  module Macros
@@ -470,9 +485,10 @@ module RuboCop
470
485
  # If the node matches, and no block is provided, the new method will
471
486
  # return the captures, or `true` if there were none.
472
487
  def def_node_matcher(method_name, pattern_str)
473
- compiler = RuboCop::NodePattern::Compiler.new(pattern_str, 'node')
474
- src = "def #{method_name}(node" \
488
+ compiler = Compiler.new(pattern_str, 'node')
489
+ src = "def #{method_name}(node = self" \
475
490
  "#{compiler.emit_trailing_params});" \
491
+ "#{compiler.emit_guard_clause}" \
476
492
  "#{compiler.emit_method_code};end"
477
493
 
478
494
  location = caller_locations(1, 1).first
@@ -486,7 +502,7 @@ module RuboCop
486
502
  # as soon as it finds a descendant which matches. Otherwise, it will
487
503
  # yield all descendants which match.
488
504
  def def_node_search(method_name, pattern_str)
489
- compiler = RuboCop::NodePattern::Compiler.new(pattern_str, 'node')
505
+ compiler = Compiler.new(pattern_str, 'node')
490
506
  called_from = caller(1..1).first.split(':')
491
507
 
492
508
  if method_name.to_s.end_with?('?')
@@ -519,7 +535,7 @@ module RuboCop
519
535
 
520
536
  def node_search_body(method_name, trailing_params, prelude, match_code,
521
537
  on_match)
522
- <<-END
538
+ <<-RUBY
523
539
  def #{method_name}(node0#{trailing_params})
524
540
  #{prelude}
525
541
  node0.each_node do |node|
@@ -529,7 +545,7 @@ module RuboCop
529
545
  end
530
546
  nil
531
547
  end
532
- END
548
+ RUBY
533
549
  end
534
550
  end
535
551
 
@@ -541,3 +557,4 @@ module RuboCop
541
557
  end
542
558
  end
543
559
  end
560
+ # rubocop:enable Metrics/ClassLength, Metrics/CyclomaticComplexity
@@ -17,9 +17,6 @@ module RuboCop
17
17
  def parse(command_line_args)
18
18
  args = args_from_file.concat(args_from_env).concat(command_line_args)
19
19
  define_options(args).parse!(args)
20
- # The --no-color CLI option sets `color: false` so we don't want the
21
- # `no_color` key, which is created automatically.
22
- @options.delete(:no_color)
23
20
 
24
21
  @validator.validate_compatibility
25
22
 
@@ -100,6 +97,7 @@ module RuboCop
100
97
  end
101
98
 
102
99
  option(opts, '--force-exclusion')
100
+ option(opts, '--ignore-parent-exclusion')
103
101
 
104
102
  option(opts, '--force-default-config')
105
103
 
@@ -142,7 +140,7 @@ module RuboCop
142
140
  option(opts, '-F', '--fail-fast')
143
141
  option(opts, '-C', '--cache FLAG')
144
142
  option(opts, '-d', '--debug')
145
- option(opts, '-D', '--display-cop-names')
143
+ option(opts, '-D', '--[no-]display-cop-names')
146
144
  option(opts, '-E', '--extra-details')
147
145
  option(opts, '-S', '--display-style-guide')
148
146
  option(opts, '-R', '--rails')
@@ -152,7 +150,7 @@ module RuboCop
152
150
  end
153
151
  option(opts, '-a', '--auto-correct')
154
152
 
155
- option(opts, '--[no-]color') { |c| @options[:color] = c }
153
+ option(opts, '--[no-]color')
156
154
 
157
155
  option(opts, '-v', '--version')
158
156
  option(opts, '-V', '--verbose-version')
@@ -178,7 +176,8 @@ module RuboCop
178
176
  # e.g. [..., '--auto-correct', ...] to :auto_correct.
179
177
  def long_opt_symbol(args)
180
178
  long_opt = args.find { |arg| arg.start_with?('--') }
181
- long_opt[2..-1].sub(/ .*/, '').tr('-', '_').gsub(/[\[\]]/, '').to_sym
179
+ long_opt[2..-1].sub('[no-]', '').sub(/ .*/, '')
180
+ .tr('-', '_').gsub(/[\[\]]/, '').to_sym
182
181
  end
183
182
  end
184
183
 
@@ -303,6 +302,9 @@ module RuboCop
303
302
  force_exclusion: ['Force excluding files specified in the',
304
303
  'configuration `Exclude` even if they are',
305
304
  'explicitly passed as arguments.'],
305
+ ignore_parent_exclusion:
306
+ ['Prevent from inheriting AllCops/Exclude from',
307
+ 'parent folders.'],
306
308
  force_default_config: ['Use default configuration even if configuration',
307
309
  'files are present in the directory tree.'],
308
310
  format: ['Choose an output formatter. This option',
@@ -319,6 +321,8 @@ module RuboCop
319
321
  ' [fi]les',
320
322
  ' [o]ffenses',
321
323
  ' [w]orst',
324
+ ' [t]ap',
325
+ ' [q]uiet',
322
326
  ' custom formatter class name'],
323
327
  out: ['Write output to a file instead of STDOUT.',
324
328
  'This option applies to the previously',
@@ -336,14 +340,15 @@ module RuboCop
336
340
  '(FLAG=false), default determined by',
337
341
  'configuration parameter AllCops: UseCache.'],
338
342
  debug: 'Display debug info.',
339
- display_cop_names: 'Display cop names in offense messages.',
343
+ display_cop_names: ['Display cop names in offense messages.',
344
+ 'Default is true.'],
340
345
  display_style_guide: 'Display style guide URLs in offense messages.',
341
346
  extra_details: 'Display extra details in offense messages.',
342
347
  rails: 'Run extra Rails cops.',
343
348
  lint: 'Run only lint cops.',
344
349
  list_target_files: 'List all files RuboCop will inspect.',
345
350
  auto_correct: 'Auto-correct offenses.',
346
- no_color: 'Force color output on or off.',
351
+ color: 'Force color output on or off.',
347
352
  version: 'Display version.',
348
353
  verbose_version: 'Display verbose version.',
349
354
  parallel: ['Use available CPUs to execute inspection in',