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
@@ -7,11 +7,11 @@ module RuboCop
7
7
  # (i.e. %i/%w).
8
8
  #
9
9
  # @example
10
- # @good
11
- # %i(foo bar baz)
12
10
  #
13
- # @bad
11
+ # # bad
14
12
  # %w(foo bar baz)
13
+ # # good
14
+ # %i(foo bar baz)
15
15
  class SpaceInsideArrayPercentLiteral < Cop
16
16
  include MatchRange
17
17
  include PercentLiteral
@@ -26,7 +26,7 @@ module RuboCop
26
26
 
27
27
  def on_percent_literal(node)
28
28
  each_unnecessary_space_match(node) do |range|
29
- add_offense(node, range, MSG)
29
+ add_offense(node, location: range)
30
30
  end
31
31
  end
32
32
 
@@ -7,6 +7,75 @@ module RuboCop
7
7
  # them on configuration. For blocks taking parameters, it checks that the
8
8
  # left brace has or doesn't have trailing space depending on
9
9
  # configuration.
10
+ #
11
+ # @example EnforcedStyle: space (default)
12
+ # # The `space` style enforces that block braces have
13
+ # # surrounding space.
14
+ #
15
+ # # bad
16
+ # some_array.each {puts e}
17
+ #
18
+ # # good
19
+ # some_array.each { puts e }
20
+ #
21
+ # @example EnforcedStyle: no_space
22
+ # # The `no_space` style enforces that block braces don't
23
+ # # have surrounding space.
24
+ #
25
+ # # bad
26
+ # some_array.each { puts e }
27
+ #
28
+ # # good
29
+ # some_array.each {puts e}
30
+ #
31
+ #
32
+ # @example EnforcedStyleForEmptyBraces: no_space (default)
33
+ # # The `no_space` EnforcedStyleForEmptyBraces style enforces that
34
+ # # block braces don't have a space in between when empty.
35
+ #
36
+ # # bad
37
+ # some_array.each { }
38
+ # some_array.each { }
39
+ # some_array.each { }
40
+ #
41
+ # # good
42
+ # some_array.each {}
43
+ #
44
+ # @example EnforcedStyleForEmptyBraces: space
45
+ # # The `space` EnforcedStyleForEmptyBraces style enforces that
46
+ # # block braces have at least a spece in between when empty.
47
+ #
48
+ # # bad
49
+ # some_array.each {}
50
+ #
51
+ # # good
52
+ # some_array.each { }
53
+ # some_array.each { }
54
+ # some_array.each { }
55
+ #
56
+ #
57
+ # @example SpaceBeforeBlockParameters: true (default)
58
+ # # The SpaceBeforeBlockParameters style set to `true` enforces that
59
+ # # there is a space between `{` and `|`. Overrides `EnforcedStyle`
60
+ # # if there is a conflict.
61
+ #
62
+ # # bad
63
+ # [1, 2, 3].each {|n| n * 2 }
64
+ #
65
+ # # good
66
+ # [1, 2, 3].each { |n| n * 2 }
67
+ #
68
+ # @example SpaceBeforeBlockParameters: true
69
+ # # The SpaceBeforeBlockParameters style set to `false` enforces that
70
+ # # there is no space between `{` and `|`. Overrides `EnforcedStyle`
71
+ # # if there is a conflict.
72
+ #
73
+ # # bad
74
+ # [1, 2, 3].each { |n| n * 2 }
75
+ #
76
+ # # good
77
+ # [1, 2, 3].each {|n| n * 2 }
78
+ #
10
79
  class SpaceInsideBlockBraces < Cop
11
80
  include ConfigurableEnforcedStyle
12
81
  include SurroundingSpace
@@ -20,6 +89,17 @@ module RuboCop
20
89
  check_inside(node, left_brace, right_brace)
21
90
  end
22
91
 
92
+ def autocorrect(range)
93
+ lambda do |corrector|
94
+ case range.source
95
+ when /\s/ then corrector.remove(range)
96
+ when '{}' then corrector.replace(range, '{ }')
97
+ when '{|' then corrector.replace(range, '{ |')
98
+ else corrector.insert_before(range, ' ')
99
+ end
100
+ end
101
+ end
102
+
23
103
  private
24
104
 
25
105
  def check_inside(node, left_brace, right_brace)
@@ -49,7 +129,7 @@ module RuboCop
49
129
  args_delimiter = node.arguments.loc.begin # Can be ( | or nil.
50
130
 
51
131
  check_left_brace(inner, node.loc.begin, args_delimiter)
52
- check_right_brace(inner, node.loc.end, block_length(node))
132
+ check_right_brace(inner, node.loc.end, node.single_line?)
53
133
  end
54
134
 
55
135
  def check_left_brace(inner, left_brace, args_delimiter)
@@ -60,8 +140,8 @@ module RuboCop
60
140
  end
61
141
  end
62
142
 
63
- def check_right_brace(inner, right_brace, block_length)
64
- if inner =~ /\S$/ && block_length.zero?
143
+ def check_right_brace(inner, right_brace, single_line)
144
+ if single_line && inner =~ /\S$/
65
145
  no_space(right_brace.begin_pos, right_brace.end_pos,
66
146
  'Space missing inside }.')
67
147
  else
@@ -96,7 +176,8 @@ module RuboCop
96
176
  end
97
177
  end
98
178
  else
99
- brace_with_space = range_with_surrounding_space(left_brace, :right)
179
+ brace_with_space = range_with_surrounding_space(range: left_brace,
180
+ side: :right)
100
181
  space(brace_with_space.begin_pos + 1, brace_with_space.end_pos,
101
182
  'Space inside { detected.')
102
183
  end
@@ -107,7 +188,8 @@ module RuboCop
107
188
  end
108
189
 
109
190
  def space_inside_right_brace(right_brace)
110
- brace_with_space = range_with_surrounding_space(right_brace, :left)
191
+ brace_with_space = range_with_surrounding_space(range: right_brace,
192
+ side: :left)
111
193
  space(brace_with_space.begin_pos, brace_with_space.end_pos - 1,
112
194
  'Space inside } detected.')
113
195
  end
@@ -128,9 +210,9 @@ module RuboCop
128
210
  end
129
211
  end
130
212
 
131
- def offense(begin_pos, end_pos, msg)
213
+ def offense(begin_pos, end_pos, msg, &block)
132
214
  range = range_between(begin_pos, end_pos)
133
- add_offense(range, range, msg) { yield if block_given? }
215
+ add_offense(range, location: range, message: msg, &block)
134
216
  end
135
217
 
136
218
  def style_for_empty_braces
@@ -140,17 +222,6 @@ module RuboCop
140
222
  else raise 'Unknown EnforcedStyleForEmptyBraces selected!'
141
223
  end
142
224
  end
143
-
144
- def autocorrect(range)
145
- lambda do |corrector|
146
- case range.source
147
- when /\s/ then corrector.remove(range)
148
- when '{}' then corrector.replace(range, '{ }')
149
- when '{|' then corrector.replace(range, '{ |')
150
- else corrector.insert_before(range, ' ')
151
- end
152
- end
153
- end
154
225
  end
155
226
  end
156
227
  end
@@ -5,6 +5,37 @@ module RuboCop
5
5
  module Layout
6
6
  # Checks that braces used for hash literals have or don't have
7
7
  # surrounding space depending on configuration.
8
+ #
9
+ # @example EnforcedStyle: space
10
+ # # The `space` style enforces that hash literals have
11
+ # # surrounding space.
12
+ #
13
+ # # bad
14
+ # h = {a: 1, b: 2}
15
+ #
16
+ # # good
17
+ # h = { a: 1, b: 2 }
18
+ #
19
+ # @example EnforcedStyle: no_space
20
+ # # The `no_space` style enforces that hash literals have
21
+ # # no surrounding space.
22
+ #
23
+ # # bad
24
+ # h = { a: 1, b: 2 }
25
+ #
26
+ # # good
27
+ # h = {a: 1, b: 2}
28
+ #
29
+ # @example EnforcedStyle: compact
30
+ # # The `compact` style normally requires a space inside
31
+ # # hash braces, with the exception that successive left
32
+ # # braces or right braces are collapsed together in nested hashes.
33
+ #
34
+ # # bad
35
+ # h = { a: { b: 2 } }
36
+ #
37
+ # # good
38
+ # h = { a: { b: 2 }}
8
39
  class SpaceInsideHashLiteralBraces < Cop
9
40
  include SurroundingSpace
10
41
  include ConfigurableEnforcedStyle
@@ -22,36 +53,45 @@ module RuboCop
22
53
  end
23
54
  end
24
55
 
56
+ def autocorrect(range)
57
+ lambda do |corrector|
58
+ # It is possible that BracesAroundHashParameters will remove the
59
+ # braces while this cop inserts spaces. This can lead to unwanted
60
+ # changes to the inspected code. If we replace the brace with a
61
+ # brace plus space (rather than just inserting a space), then any
62
+ # removal of the same brace will give us a clobbering error. This
63
+ # in turn will make RuboCop fall back on cop-by-cop
64
+ # auto-correction. Problem solved.
65
+ case range.source
66
+ when /\s/ then corrector.remove(range)
67
+ when '{' then corrector.replace(range, '{ ')
68
+ else corrector.replace(range, ' }')
69
+ end
70
+ end
71
+ end
72
+
25
73
  private
26
74
 
27
75
  def hash_literal_with_braces(node)
28
76
  tokens = processed_source.tokens
29
77
  begin_index = index_of_first_token(node)
30
- return unless left_brace?(tokens[begin_index])
78
+ return unless tokens[begin_index].left_brace?
31
79
 
32
80
  end_index = index_of_last_token(node)
33
- return unless right_brace?(tokens[end_index])
81
+ return unless tokens[end_index].right_curly_brace?
34
82
 
35
83
  yield begin_index, end_index
36
84
  end
37
85
 
38
- def left_brace?(token)
39
- token.type == :tLBRACE
40
- end
41
-
42
- def right_brace?(token)
43
- token.type == :tRCURLY
44
- end
45
-
46
86
  def check(t1, t2)
47
87
  # No offense if line break inside.
48
- return if t1.pos.line < t2.pos.line
49
- return if t2.type == :tCOMMENT # Also indicates there's a line break.
88
+ return if t1.line < t2.line
89
+ return if t2.comment? # Also indicates there's a line break.
50
90
 
51
- is_empty_braces = left_brace?(t1) && right_brace?(t2)
91
+ is_empty_braces = t1.left_brace? && t2.right_curly_brace?
52
92
  expect_space = expect_space?(t1, t2)
53
93
 
54
- if offense?(t1, t2, expect_space)
94
+ if offense?(t1, expect_space)
55
95
  incorrect_style_detected(t1, t2, expect_space, is_empty_braces)
56
96
  else
57
97
  correct_style_detected
@@ -60,7 +100,7 @@ module RuboCop
60
100
 
61
101
  def expect_space?(t1, t2)
62
102
  is_same_braces = t1.type == t2.type
63
- is_empty_braces = left_brace?(t1) && right_brace?(t2)
103
+ is_empty_braces = t1.left_brace? && t2.right_curly_brace?
64
104
 
65
105
  if is_same_braces && style == :compact
66
106
  false
@@ -74,8 +114,11 @@ module RuboCop
74
114
  def incorrect_style_detected(t1, t2, expect_space, is_empty_braces)
75
115
  brace = (t1.text == '{' ? t1 : t2).pos
76
116
  range = expect_space ? brace : space_range(brace)
77
- add_offense(range, range,
78
- message(brace, is_empty_braces, expect_space)) do
117
+ add_offense(
118
+ range,
119
+ location: range,
120
+ message: message(brace, is_empty_braces, expect_space)
121
+ ) do
79
122
  style = expect_space ? :no_space : :space
80
123
  ambiguous_or_unexpected_style_detected(style, t1.text == t2.text)
81
124
  end
@@ -89,8 +132,8 @@ module RuboCop
89
132
  end
90
133
  end
91
134
 
92
- def offense?(t1, t2, expect_space)
93
- has_space = space_between?(t1, t2)
135
+ def offense?(t1, expect_space)
136
+ has_space = t1.space_after?
94
137
  expect_space ? !has_space : has_space
95
138
  end
96
139
 
@@ -104,23 +147,6 @@ module RuboCop
104
147
  format(MSG, "#{inside_what} #{problem}")
105
148
  end
106
149
 
107
- def autocorrect(range)
108
- lambda do |corrector|
109
- # It is possible that BracesAroundHashParameters will remove the
110
- # braces while this cop inserts spaces. This can lead to unwanted
111
- # changes to the inspected code. If we replace the brace with a
112
- # brace plus space (rather than just inserting a space), then any
113
- # removal of the same brace will give us a clobbering error. This
114
- # in turn will make RuboCop fall back on cop-by-cop
115
- # auto-correction. Problem solved.
116
- case range.source
117
- when /\s/ then corrector.remove(range)
118
- when '{' then corrector.replace(range, '{ ')
119
- else corrector.replace(range, ' }')
120
- end
121
- end
122
- end
123
-
124
150
  def space_range(token_range)
125
151
  if token_range.source == '{'
126
152
  range_of_space_to_the_right(token_range)
@@ -4,11 +4,48 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # Checks for spaces inside ordinary round parentheses.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # f( 3)
11
+ # g = (a + 3 )
12
+ #
13
+ # # good
14
+ # f(3)
15
+ # g = (a + 3)
7
16
  class SpaceInsideParens < Cop
8
- include SpaceInside
17
+ include SurroundingSpace
9
18
 
10
- def specifics
11
- [%i[tLPAREN tLPAREN2], :tRPAREN, 'parentheses']
19
+ MSG = 'Space inside parentheses detected.'.freeze
20
+
21
+ def investigate(processed_source)
22
+ @processed_source = processed_source
23
+ each_extraneous_space(processed_source.tokens) do |range|
24
+ add_offense(range, location: range)
25
+ end
26
+ end
27
+
28
+ def autocorrect(range)
29
+ ->(corrector) { corrector.remove(range) }
30
+ end
31
+
32
+ private
33
+
34
+ def each_extraneous_space(tokens)
35
+ tokens.each_cons(2) do |t1, t2|
36
+ next unless parens?(t1, t2)
37
+
38
+ # If the second token is a comment, that means that a line break
39
+ # follows, and that the rules for space inside don't apply.
40
+ next if t2.comment?
41
+ next unless t2.line == t1.line && t1.space_after?
42
+
43
+ yield range_between(t1.end_pos, t2.begin_pos)
44
+ end
45
+ end
46
+
47
+ def parens?(t1, t2)
48
+ t1.left_parens? || t2.right_parens?
12
49
  end
13
50
  end
14
51
  end
@@ -50,7 +50,7 @@ module RuboCop
50
50
  return unless node.single_line?
51
51
 
52
52
  regex_matches(node) do |match_range|
53
- add_offense(node, match_range, MSG)
53
+ add_offense(node, location: match_range)
54
54
  end
55
55
  end
56
56
 
@@ -28,21 +28,6 @@ module RuboCop
28
28
  check(node)
29
29
  end
30
30
 
31
- private
32
-
33
- def check(node)
34
- expression = node.source
35
- op = node.loc.operator.source
36
- escaped_op = op.gsub(/\./, '\.')
37
-
38
- # account for multiline range literals
39
- expression.sub!(/#{escaped_op}\n\s*/, op)
40
-
41
- return unless expression =~ /(\s#{escaped_op})|(#{escaped_op}\s)/
42
-
43
- add_offense(node, :expression)
44
- end
45
-
46
31
  def autocorrect(node)
47
32
  expression = node.source
48
33
  operator = node.loc.operator.source
@@ -57,6 +42,21 @@ module RuboCop
57
42
  )
58
43
  end
59
44
  end
45
+
46
+ private
47
+
48
+ def check(node)
49
+ expression = node.source
50
+ op = node.loc.operator.source
51
+ escaped_op = op.gsub(/\./, '\.')
52
+
53
+ # account for multiline range literals
54
+ expression.sub!(/#{escaped_op}\n\s*/, op)
55
+
56
+ return unless expression =~ /(\s#{escaped_op})|(#{escaped_op}\s)/
57
+
58
+ add_offense(node)
59
+ end
60
60
  end
61
61
  end
62
62
  end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # Checks that reference brackets have or don't have
7
+ # surrounding space depending on configuration.
8
+ #
9
+ # @example EnforcedStyle: no_space (default)
10
+ # # The `no_space` style enforces that reference brackets have
11
+ # # no surrounding space.
12
+ #
13
+ # # bad
14
+ # hash[ :key ]
15
+ # array[ index ]
16
+ #
17
+ # # good
18
+ # hash[:key]
19
+ # array[index]
20
+ #
21
+ # @example EnforcedStyle: space
22
+ # # The `space` style enforces that reference brackets have
23
+ # # surrounding space.
24
+ #
25
+ # # bad
26
+ # hash[:key]
27
+ # array[index]
28
+ #
29
+ # # good
30
+ # hash[ :key ]
31
+ # array[ index ]
32
+ class SpaceInsideReferenceBrackets < Cop
33
+ include SurroundingSpace
34
+ include ConfigurableEnforcedStyle
35
+
36
+ MSG = '%<command>s space inside reference brackets.'.freeze
37
+
38
+ def on_send(node)
39
+ return if node.multiline?
40
+ return unless left_ref_bracket(node)
41
+ left_token = left_ref_bracket(node)
42
+ right_token = right_ref_bracket(node, left_token)
43
+
44
+ if style == :no_space
45
+ no_space_offenses(node, left_token, right_token, MSG)
46
+ else
47
+ space_offenses(node, left_token, right_token, MSG)
48
+ end
49
+ end
50
+
51
+ def autocorrect(node)
52
+ lambda do |corrector|
53
+ left, right = reference_brackets(node)
54
+
55
+ if style == :no_space
56
+ no_space_corrector(corrector, left, right)
57
+ else
58
+ space_corrector(corrector, left, right)
59
+ end
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def reference_brackets(node)
66
+ left = left_ref_bracket(node)
67
+ [left, right_ref_bracket(node, left)]
68
+ end
69
+
70
+ def left_ref_bracket(node)
71
+ tokens(node).reverse.find(&:left_ref_bracket?)
72
+ end
73
+
74
+ def right_ref_bracket(node, token)
75
+ i = tokens(node).index(token)
76
+ tokens(node).slice(i..-1).find(&:right_bracket?)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end