rubocop 0.52.1 → 0.53.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 (292) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +118 -46
  5. data/config/disabled.yml +8 -8
  6. data/config/enabled.yml +84 -28
  7. data/lib/rubocop.rb +28 -8
  8. data/lib/rubocop/ast/builder.rb +35 -37
  9. data/lib/rubocop/ast/node.rb +16 -1
  10. data/lib/rubocop/ast/node/and_node.rb +0 -8
  11. data/lib/rubocop/ast/node/block_node.rb +1 -9
  12. data/lib/rubocop/ast/node/case_node.rb +0 -8
  13. data/lib/rubocop/ast/node/ensure_node.rb +0 -8
  14. data/lib/rubocop/ast/node/for_node.rb +0 -8
  15. data/lib/rubocop/ast/node/or_node.rb +0 -8
  16. data/lib/rubocop/ast/node/pair_node.rb +0 -8
  17. data/lib/rubocop/ast/node/resbody_node.rb +0 -8
  18. data/lib/rubocop/ast/node/send_node.rb +0 -8
  19. data/lib/rubocop/ast/node/symbol_node.rb +0 -8
  20. data/lib/rubocop/ast/node/until_node.rb +0 -8
  21. data/lib/rubocop/ast/node/when_node.rb +0 -8
  22. data/lib/rubocop/ast/node/while_node.rb +0 -8
  23. data/lib/rubocop/cli.rb +17 -7
  24. data/lib/rubocop/comment_config.rb +24 -3
  25. data/lib/rubocop/config.rb +75 -6
  26. data/lib/rubocop/config_loader.rb +18 -28
  27. data/lib/rubocop/config_loader_resolver.rb +61 -9
  28. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -1
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -2
  30. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  31. data/lib/rubocop/cop/commissioner.rb +2 -2
  32. data/lib/rubocop/cop/cop.rb +4 -0
  33. data/lib/rubocop/cop/corrector.rb +11 -1
  34. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
  35. data/lib/rubocop/cop/correctors/line_break_corrector.rb +59 -0
  36. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -1
  37. data/lib/rubocop/cop/correctors/space_corrector.rb +13 -0
  38. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +1 -1
  39. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -1
  40. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  41. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +3 -5
  42. data/lib/rubocop/cop/generator.rb +29 -8
  43. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +2 -0
  44. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -0
  45. data/lib/rubocop/cop/layout/align_hash.rb +106 -37
  46. data/lib/rubocop/cop/{lint → layout}/block_alignment.rb +8 -5
  47. data/lib/rubocop/cop/layout/block_end_newline.rb +7 -17
  48. data/lib/rubocop/cop/layout/case_indentation.rb +1 -0
  49. data/lib/rubocop/cop/layout/class_structure.rb +6 -7
  50. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  51. data/lib/rubocop/cop/{lint → layout}/condition_position.rb +3 -3
  52. data/lib/rubocop/cop/{lint → layout}/def_end_alignment.rb +2 -1
  53. data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
  54. data/lib/rubocop/cop/layout/empty_comment.rb +140 -0
  55. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -0
  56. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -0
  57. data/lib/rubocop/cop/layout/empty_lines.rb +3 -1
  58. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +7 -5
  59. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +20 -10
  60. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +20 -0
  61. data/lib/rubocop/cop/{lint → layout}/end_alignment.rb +37 -6
  62. data/lib/rubocop/cop/layout/end_of_line.rb +1 -0
  63. data/lib/rubocop/cop/layout/extra_spacing.rb +30 -37
  64. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -0
  65. data/lib/rubocop/cop/layout/indent_heredoc.rb +38 -2
  66. data/lib/rubocop/cop/layout/indentation_consistency.rb +105 -1
  67. data/lib/rubocop/cop/layout/indentation_width.rb +4 -3
  68. data/lib/rubocop/cop/layout/initial_indentation.rb +15 -1
  69. data/lib/rubocop/cop/layout/leading_comment_space.rb +4 -2
  70. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -0
  71. data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -0
  72. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +62 -29
  73. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  74. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +74 -33
  75. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +16 -2
  76. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -1
  77. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -0
  78. data/lib/rubocop/cop/layout/space_after_not.rb +2 -0
  79. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -0
  80. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +15 -2
  81. data/lib/rubocop/cop/layout/space_around_operators.rb +15 -13
  82. data/lib/rubocop/cop/layout/space_before_block_braces.rb +13 -1
  83. data/lib/rubocop/cop/layout/space_before_comment.rb +6 -4
  84. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -0
  85. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -0
  86. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +30 -45
  87. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +3 -2
  88. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +48 -18
  89. data/lib/rubocop/cop/layout/space_inside_parens.rb +8 -7
  90. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +57 -11
  91. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -0
  92. data/lib/rubocop/cop/layout/tab.rb +42 -16
  93. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +46 -13
  94. data/lib/rubocop/cop/layout/trailing_whitespace.rb +12 -0
  95. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +5 -3
  96. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  97. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
  98. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -2
  99. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  100. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +5 -4
  101. data/lib/rubocop/cop/lint/duplicate_methods.rb +20 -9
  102. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
  103. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +16 -10
  104. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +5 -4
  105. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  106. data/lib/rubocop/cop/lint/interpolation_check.rb +4 -3
  107. data/lib/rubocop/cop/lint/literal_as_condition.rb +2 -2
  108. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +2 -0
  109. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +7 -5
  110. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  111. data/lib/rubocop/cop/lint/number_conversion.rb +59 -0
  112. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  113. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2 -0
  114. data/lib/rubocop/cop/lint/percent_string_array.rb +0 -2
  115. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  116. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -0
  117. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -0
  118. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -0
  119. data/lib/rubocop/cop/lint/rescue_type.rb +6 -3
  120. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -2
  121. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -21
  122. data/lib/rubocop/cop/lint/script_permission.rb +30 -10
  123. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  124. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -0
  125. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -2
  126. data/lib/rubocop/cop/lint/unified_integer.rb +2 -2
  127. data/lib/rubocop/cop/lint/{unneeded_disable.rb → unneeded_cop_disable_directive.rb} +13 -7
  128. data/lib/rubocop/cop/lint/unneeded_cop_enable_directive.rb +97 -0
  129. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -0
  130. data/lib/rubocop/cop/lint/unreachable_code.rb +3 -3
  131. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +11 -10
  132. data/lib/rubocop/cop/lint/useless_access_modifier.rb +7 -5
  133. data/lib/rubocop/cop/lint/useless_assignment.rb +2 -2
  134. data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
  135. data/lib/rubocop/cop/lint/void.rb +49 -10
  136. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  137. data/lib/rubocop/cop/metrics/line_length.rb +5 -2
  138. data/lib/rubocop/cop/mixin/alignment.rb +4 -0
  139. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -1
  140. data/lib/rubocop/cop/mixin/def_node.rb +4 -0
  141. data/lib/rubocop/cop/mixin/documentation_comment.rb +11 -3
  142. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +12 -2
  143. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +20 -1
  144. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -0
  145. data/lib/rubocop/cop/mixin/hash_alignment.rb +2 -2
  146. data/lib/rubocop/cop/mixin/match_range.rb +2 -0
  147. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +6 -0
  148. data/lib/rubocop/cop/mixin/nil_methods.rb +19 -0
  149. data/lib/rubocop/cop/mixin/percent_literal.rb +57 -9
  150. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -5
  151. data/lib/rubocop/cop/mixin/range_help.rb +102 -0
  152. data/lib/rubocop/cop/mixin/rescue_node.rb +1 -1
  153. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -7
  154. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +11 -9
  155. data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -10
  156. data/lib/rubocop/cop/mixin/surrounding_space.rb +38 -8
  157. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  158. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  159. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +104 -0
  160. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -1
  161. data/lib/rubocop/cop/naming/file_name.rb +5 -10
  162. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +76 -0
  163. data/lib/rubocop/cop/naming/uncommunicative_block_param_name.rb +48 -0
  164. data/lib/rubocop/cop/naming/uncommunicative_method_param_name.rb +57 -0
  165. data/lib/rubocop/cop/offense.rb +3 -2
  166. data/lib/rubocop/cop/performance/case_when_splat.rb +1 -0
  167. data/lib/rubocop/cop/performance/casecmp.rb +17 -8
  168. data/lib/rubocop/cop/performance/compare_with_block.rb +2 -0
  169. data/lib/rubocop/cop/performance/count.rb +1 -0
  170. data/lib/rubocop/cop/performance/fixed_size.rb +41 -0
  171. data/lib/rubocop/cop/performance/flat_map.rb +2 -0
  172. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -0
  173. data/lib/rubocop/cop/performance/redundant_merge.rb +1 -1
  174. data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -0
  175. data/lib/rubocop/cop/performance/regexp_match.rb +4 -0
  176. data/lib/rubocop/cop/performance/reverse_each.rb +2 -0
  177. data/lib/rubocop/cop/performance/string_replacement.rb +2 -0
  178. data/lib/rubocop/cop/rails/active_record_aliases.rb +46 -0
  179. data/lib/rubocop/cop/rails/blank.rb +3 -3
  180. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +6 -0
  181. data/lib/rubocop/cop/rails/delegate.rb +6 -6
  182. data/lib/rubocop/cop/rails/file_path.rb +7 -1
  183. data/lib/rubocop/cop/rails/find_by.rb +2 -0
  184. data/lib/rubocop/cop/rails/http_positional_arguments.rb +17 -5
  185. data/lib/rubocop/cop/rails/inverse_of.rb +21 -2
  186. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +45 -9
  187. data/lib/rubocop/cop/rails/presence.rb +8 -2
  188. data/lib/rubocop/cop/rails/present.rb +5 -5
  189. data/lib/rubocop/cop/rails/read_write_attribute.rb +4 -3
  190. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -0
  191. data/lib/rubocop/cop/rails/relative_date_constant.rb +4 -3
  192. data/lib/rubocop/cop/rails/request_referer.rb +3 -2
  193. data/lib/rubocop/cop/rails/reversible_migration.rb +9 -8
  194. data/lib/rubocop/cop/rails/safe_navigation.rb +3 -2
  195. data/lib/rubocop/cop/rails/save_bang.rb +11 -12
  196. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
  197. data/lib/rubocop/cop/rails/time_zone.rb +38 -16
  198. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +26 -16
  199. data/lib/rubocop/cop/rails/validation.rb +30 -2
  200. data/lib/rubocop/cop/security/open.rb +48 -0
  201. data/lib/rubocop/cop/style/and_or.rb +1 -0
  202. data/lib/rubocop/cop/style/ascii_comments.rb +3 -1
  203. data/lib/rubocop/cop/style/attr.rb +2 -0
  204. data/lib/rubocop/cop/style/block_comments.rb +3 -1
  205. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +2 -5
  206. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -0
  207. data/lib/rubocop/cop/style/class_vars.rb +23 -0
  208. data/lib/rubocop/cop/style/colon_method_call.rb +1 -2
  209. data/lib/rubocop/cop/style/comment_annotation.rb +6 -4
  210. data/lib/rubocop/cop/style/commented_keyword.rb +3 -1
  211. data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
  212. data/lib/rubocop/cop/style/copyright.rb +3 -1
  213. data/lib/rubocop/cop/style/each_with_object.rb +15 -1
  214. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -0
  215. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -0
  216. data/lib/rubocop/cop/style/empty_else.rb +9 -5
  217. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -0
  218. data/lib/rubocop/cop/style/empty_line_after_guard_clause.rb +80 -0
  219. data/lib/rubocop/cop/style/empty_literal.rb +1 -0
  220. data/lib/rubocop/cop/style/encoding.rb +2 -0
  221. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  222. data/lib/rubocop/cop/style/for.rb +33 -0
  223. data/lib/rubocop/cop/style/format_string.rb +1 -1
  224. data/lib/rubocop/cop/style/format_string_token.rb +4 -5
  225. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
  226. data/lib/rubocop/cop/style/hash_syntax.rb +1 -0
  227. data/lib/rubocop/cop/style/if_unless_modifier.rb +1 -1
  228. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  229. data/lib/rubocop/cop/style/lambda.rb +1 -1
  230. data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -0
  231. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -0
  232. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -0
  233. data/lib/rubocop/cop/style/missing_else.rb +72 -7
  234. data/lib/rubocop/cop/style/mixin_usage.rb +3 -5
  235. data/lib/rubocop/cop/style/module_function.rb +10 -0
  236. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -0
  237. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -0
  238. data/lib/rubocop/cop/style/nested_modifier.rb +2 -0
  239. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -0
  240. data/lib/rubocop/cop/style/next.rb +1 -0
  241. data/lib/rubocop/cop/style/not.rb +2 -0
  242. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  243. data/lib/rubocop/cop/style/one_line_conditional.rb +2 -2
  244. data/lib/rubocop/cop/style/redundant_exception.rb +8 -3
  245. data/lib/rubocop/cop/style/redundant_return.rb +37 -3
  246. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  247. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -0
  248. data/lib/rubocop/cop/style/safe_navigation.rb +74 -32
  249. data/lib/rubocop/cop/style/semicolon.rb +3 -1
  250. data/lib/rubocop/cop/style/single_line_methods.rb +14 -23
  251. data/lib/rubocop/cop/style/stderr_puts.rb +2 -0
  252. data/lib/rubocop/cop/style/string_hash_keys.rb +12 -0
  253. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  254. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
  255. data/lib/rubocop/cop/style/symbol_array.rb +29 -0
  256. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  257. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  258. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +7 -54
  259. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  260. data/lib/rubocop/cop/style/{trailing_comma_in_literal.rb → trailing_comma_in_array_literal.rb} +2 -20
  261. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +56 -0
  262. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +17 -20
  263. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -0
  264. data/lib/rubocop/cop/style/unless_else.rb +2 -0
  265. data/lib/rubocop/cop/style/word_array.rb +0 -1
  266. data/lib/rubocop/cop/style/yoda_condition.rb +1 -0
  267. data/lib/rubocop/cop/team.rb +5 -5
  268. data/lib/rubocop/cop/util.rb +23 -188
  269. data/lib/rubocop/cop/variable_force.rb +1 -1
  270. data/lib/rubocop/file_finder.rb +45 -0
  271. data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -14
  272. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  273. data/lib/rubocop/formatter/html_formatter.rb +12 -5
  274. data/lib/rubocop/formatter/json_formatter.rb +1 -1
  275. data/lib/rubocop/node_pattern.rb +8 -5
  276. data/lib/rubocop/options.rb +40 -33
  277. data/lib/rubocop/path_util.rb +5 -8
  278. data/lib/rubocop/processed_source.rb +53 -0
  279. data/lib/rubocop/remote_config.rb +1 -1
  280. data/lib/rubocop/result_cache.rb +1 -1
  281. data/lib/rubocop/rspec/cop_helper.rb +0 -4
  282. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -4
  283. data/lib/rubocop/rspec/shared_contexts.rb +3 -1
  284. data/lib/rubocop/rspec/shared_examples.rb +23 -25
  285. data/lib/rubocop/rspec/support.rb +5 -0
  286. data/lib/rubocop/runner.rb +3 -2
  287. data/lib/rubocop/string_util.rb +10 -9
  288. data/lib/rubocop/target_finder.rb +4 -1
  289. data/lib/rubocop/token.rb +26 -16
  290. data/lib/rubocop/version.rb +6 -4
  291. metadata +31 -17
  292. data/lib/rubocop/cop/performance/hash_each_methods.rb +0 -129
@@ -45,7 +45,7 @@ module RuboCop
45
45
 
46
46
  def aligned_with_line?(line_nos, range, indent = nil)
47
47
  line_nos.each do |lineno|
48
- next if comment_lines.include?(lineno + 1)
48
+ next if aligned_comment_lines.include?(lineno + 1)
49
49
  line = processed_source.lines[lineno]
50
50
  index = line =~ /\S/
51
51
  next unless index
@@ -55,10 +55,11 @@ module RuboCop
55
55
  false
56
56
  end
57
57
 
58
- def comment_lines
59
- @comment_lines ||= processed_source.comments.map(&:loc).select do |r|
60
- begins_its_line?(r.expression)
61
- end.map(&:line)
58
+ def aligned_comment_lines
59
+ @aligned_comment_lines ||=
60
+ processed_source.comments.map(&:loc).select do |r|
61
+ begins_its_line?(r.expression)
62
+ end.map(&:line)
62
63
  end
63
64
 
64
65
  def aligned_token?(range, line)
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Methods that calculate and return Parser::Source::Ranges
6
+ module RangeHelp
7
+ private
8
+
9
+ def source_range(source_buffer, line_number, column, length = 1)
10
+ if column.is_a?(Range)
11
+ column_index = column.begin
12
+ length = column.size
13
+ else
14
+ column_index = column
15
+ end
16
+
17
+ line_begin_pos = if line_number.zero?
18
+ 0
19
+ else
20
+ source_buffer.line_range(line_number).begin_pos
21
+ end
22
+ begin_pos = line_begin_pos + column_index
23
+ end_pos = begin_pos + length
24
+
25
+ Parser::Source::Range.new(source_buffer, begin_pos, end_pos)
26
+ end
27
+
28
+ def range_between(start_pos, end_pos)
29
+ Parser::Source::Range.new(processed_source.buffer, start_pos, end_pos)
30
+ end
31
+
32
+ def range_with_surrounding_comma(range, side = :both)
33
+ buffer = @processed_source.buffer
34
+ src = buffer.source
35
+
36
+ go_left, go_right = directions(side)
37
+
38
+ begin_pos = range.begin_pos
39
+ end_pos = range.end_pos
40
+ begin_pos = move_pos(src, begin_pos, -1, go_left, /,/)
41
+ end_pos = move_pos(src, end_pos, 1, go_right, /,/)
42
+
43
+ Parser::Source::Range.new(buffer, begin_pos, end_pos)
44
+ end
45
+
46
+ def range_with_surrounding_space(range:, side: :both,
47
+ newlines: true, whitespace: false)
48
+ buffer = @processed_source.buffer
49
+ src = buffer.source
50
+
51
+ go_left, go_right = directions(side)
52
+
53
+ begin_pos = range.begin_pos
54
+ if go_left
55
+ begin_pos =
56
+ final_pos(src, begin_pos, -1, newlines, whitespace)
57
+ end
58
+ end_pos = range.end_pos
59
+ end_pos = final_pos(src, end_pos, 1, newlines, whitespace) if go_right
60
+ Parser::Source::Range.new(buffer, begin_pos, end_pos)
61
+ end
62
+
63
+ def range_by_whole_lines(range, include_final_newline: false)
64
+ buffer = @processed_source.buffer
65
+
66
+ begin_pos = range.begin_pos
67
+ begin_offset = range.column
68
+ begin_of_first_line = begin_pos - begin_offset
69
+
70
+ last_line = buffer.source_line(range.last_line)
71
+ end_pos = range.end_pos
72
+ end_offset = last_line.length - range.last_column
73
+ end_offset += 1 if include_final_newline
74
+ end_of_last_line = end_pos + end_offset
75
+
76
+ Parser::Source::Range.new(buffer, begin_of_first_line, end_of_last_line)
77
+ end
78
+
79
+ ## Helpers for above range methods. Do not use inside Cops.
80
+
81
+ def directions(side)
82
+ if side == :both
83
+ [true, true]
84
+ else
85
+ [side == :left, side == :right]
86
+ end
87
+ end
88
+
89
+ def final_pos(src, pos, increment, newlines, whitespace)
90
+ pos = move_pos(src, pos, increment, true, /[ \t]/)
91
+ pos = move_pos(src, pos, increment, newlines, /\n/)
92
+ move_pos(src, pos, increment, whitespace, /\s/)
93
+ end
94
+
95
+ def move_pos(src, pos, step, condition, regexp)
96
+ offset = step == -1 ? -1 : 0
97
+ pos += step while condition && src[pos + offset] =~ regexp
98
+ pos < 0 ? 0 : pos
99
+ end
100
+ end
101
+ end
102
+ end
@@ -7,7 +7,7 @@ module RuboCop
7
7
  def investigate(processed_source)
8
8
  @modifier_locations = processed_source
9
9
  .tokens
10
- .select { |t| t.type == :kRESCUE_MOD }
10
+ .select(&:rescue_modifier?)
11
11
  .map(&:pos)
12
12
  end
13
13
 
@@ -17,17 +17,18 @@ module RuboCop
17
17
  private
18
18
 
19
19
  def each_missing_space(tokens)
20
- tokens.each_cons(2) do |t1, t2|
21
- next unless kind(t1)
22
- next unless space_missing?(t1, t2)
23
- next unless space_required_before?(t2)
20
+ tokens.each_cons(2) do |token1, token2|
21
+ next unless kind(token1)
22
+ next unless space_missing?(token1, token2)
23
+ next unless space_required_before?(token2)
24
24
 
25
- yield t1
25
+ yield token1
26
26
  end
27
27
  end
28
28
 
29
- def space_missing?(t1, t2)
30
- t1.line == t2.line && t2.column == t1.column + offset
29
+ def space_missing?(token1, token2)
30
+ token1.line == token2.line &&
31
+ token2.column == token1.column + offset
31
32
  end
32
33
 
33
34
  def space_required_before?(token)
@@ -5,6 +5,8 @@ module RuboCop
5
5
  # Common functionality for cops checking for space before
6
6
  # punctuation.
7
7
  module SpaceBeforePunctuation
8
+ include RangeHelp
9
+
8
10
  MSG = 'Space found before %<token>s.'.freeze
9
11
 
10
12
  def investigate(processed_source)
@@ -17,20 +19,20 @@ module RuboCop
17
19
  private
18
20
 
19
21
  def each_missing_space(tokens)
20
- tokens.each_cons(2) do |t1, t2|
21
- next unless kind(t2)
22
- next unless space_missing?(t1, t2)
23
- next if space_required_after?(t1)
22
+ tokens.each_cons(2) do |token1, token2|
23
+ next unless kind(token2)
24
+ next unless space_missing?(token1, token2)
25
+ next if space_required_after?(token1)
24
26
 
25
- pos_before_punctuation = range_between(t1.end_pos,
26
- t2.begin_pos)
27
+ pos_before_punctuation = range_between(token1.end_pos,
28
+ token2.begin_pos)
27
29
 
28
- yield t2, pos_before_punctuation
30
+ yield token2, pos_before_punctuation
29
31
  end
30
32
  end
31
33
 
32
- def space_missing?(t1, t2)
33
- t1.line == t2.line && t2.begin_pos > t1.end_pos
34
+ def space_missing?(token1, token2)
35
+ token1.line == token2.line && token2.begin_pos > token1.end_pos
34
36
  end
35
37
 
36
38
  def space_required_after?(token)
@@ -16,14 +16,15 @@ module RuboCop
16
16
 
17
17
  def non_eligible_node?(node)
18
18
  node.nonempty_line_count > 3 ||
19
- !node.modifier_form? && commented?(node.loc.end)
19
+ !node.modifier_form? &&
20
+ processed_source.commented?(node.loc.end)
20
21
  end
21
22
 
22
23
  def non_eligible_body?(body)
23
24
  body.nil? ||
24
25
  body.empty_source? ||
25
26
  body.begin_type? ||
26
- commented?(body.source_range)
27
+ processed_source.commented?(body.source_range)
27
28
  end
28
29
 
29
30
  def non_eligible_condition?(condition)
@@ -48,14 +49,6 @@ module RuboCop
48
49
  def max_line_length
49
50
  config.for_cop('Metrics/LineLength')['Max']
50
51
  end
51
-
52
- def commented?(source)
53
- comment_lines.include?(source.line)
54
- end
55
-
56
- def comment_lines
57
- @comment_lines ||= processed_source.comments.map { |c| c.location.line }
58
- end
59
52
  end
60
53
  end
61
54
  end
@@ -4,6 +4,8 @@ module RuboCop
4
4
  module Cop
5
5
  # Common functionality for checking and correcting surrounding whitespace.
6
6
  module SurroundingSpace
7
+ include RangeHelp
8
+
7
9
  NO_SPACE_COMMAND = 'Do not use'.freeze
8
10
  SPACE_COMMAND = 'Use'.freeze
9
11
 
@@ -51,14 +53,6 @@ module RuboCop
51
53
  end
52
54
  end
53
55
 
54
- def tokens(node)
55
- @tokens ||= {}
56
- @tokens[node.object_id] ||= processed_source.tokens.select do |token|
57
- token.end_pos <= node.source_range.end_pos &&
58
- token.begin_pos >= node.source_range.begin_pos
59
- end
60
- end
61
-
62
56
  def no_space_offenses(node, # rubocop:disable Metrics/ParameterLists
63
57
  left_token,
64
58
  right_token,
@@ -105,6 +99,42 @@ module RuboCop
105
99
  add_offense(node, location: range,
106
100
  message: format(message, command: command))
107
101
  end
102
+
103
+ def empty_offenses(node, left, right, message)
104
+ range = range_between(left.begin_pos, right.end_pos)
105
+ if offending_empty_space?(empty_config, left, right)
106
+ empty_offense(node, range, message, 'Use one')
107
+ end
108
+ return unless offending_empty_no_space?(empty_config, left, right)
109
+ empty_offense(node, range, message, 'Do not use')
110
+ end
111
+
112
+ def empty_offense(node, range, message, command)
113
+ add_offense(node, location: range,
114
+ message: format(message, command: command))
115
+ end
116
+
117
+ def empty_brackets?(left_bracket_token, right_bracket_token)
118
+ left_index = processed_source.tokens.index(left_bracket_token)
119
+ right_index = processed_source.tokens.index(right_bracket_token)
120
+ right_index && left_index == right_index - 1
121
+ end
122
+
123
+ def offending_empty_space?(config, left_token, right_token)
124
+ config == 'space' && !space_between?(left_token, right_token)
125
+ end
126
+
127
+ def offending_empty_no_space?(config, left_token, right_token)
128
+ config == 'no_space' && !no_space_between?(left_token, right_token)
129
+ end
130
+
131
+ def space_between?(left_bracket_token, right_bracket_token)
132
+ left_bracket_token.end_pos + 1 == right_bracket_token.begin_pos
133
+ end
134
+
135
+ def no_space_between?(left_bracket_token, right_bracket_token)
136
+ left_bracket_token.end_pos == right_bracket_token.begin_pos
137
+ end
108
138
  end
109
139
  end
110
140
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Common methods shared by TrailingBody cops
6
+ module TrailingBody
7
+ def trailing_body?(node)
8
+ body = node.to_a.reverse[0]
9
+ body && node.multiline? &&
10
+ body_on_first_line?(node, body)
11
+ end
12
+
13
+ def body_on_first_line?(node, body)
14
+ node.source_range.first_line == body.source_range.first_line
15
+ end
16
+
17
+ def first_part_of(body)
18
+ if body.begin_type?
19
+ body.children.first.source_range
20
+ else
21
+ body.source_range
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -6,6 +6,7 @@ module RuboCop
6
6
  # Style/TrailingCommaInLiteral
7
7
  module TrailingComma
8
8
  include ConfigurableEnforcedStyle
9
+ include RangeHelp
9
10
 
10
11
  MSG = '%<command>s comma after the last %<unit>s.'.freeze
11
12
 
@@ -35,6 +36,17 @@ module RuboCop
35
36
  avoid_comma(kind, comma_pos, extra_avoid_comma_info)
36
37
  end
37
38
 
39
+ def check_literal(node, kind)
40
+ return if node.children.empty?
41
+ # A braceless hash is the last parameter of a method call and will be
42
+ # checked as such.
43
+ return unless brackets?(node)
44
+
45
+ check(node, node.children, kind,
46
+ node.children.last.source_range.end_pos,
47
+ node.loc.end.begin_pos)
48
+ end
49
+
38
50
  def extra_avoid_comma_info
39
51
  case style
40
52
  when :comma
@@ -111,8 +123,8 @@ module RuboCop
111
123
  items.each_cons(2).none? { |a, b| on_same_line?(a, b) }
112
124
  end
113
125
 
114
- def on_same_line?(a, b)
115
- a.last_line == b.line
126
+ def on_same_line?(range1, range2)
127
+ range1.last_line == range2.line
116
128
  end
117
129
 
118
130
  def avoid_comma(kind, comma_begin_pos, extra_info)
@@ -152,7 +164,7 @@ module RuboCop
152
164
  end
153
165
 
154
166
  # By default, there's no reason to avoid auto-correct.
155
- def avoid_autocorrect?(_)
167
+ def avoid_autocorrect?(_nodes)
156
168
  false
157
169
  end
158
170
  end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Common functionality shared by Uncommunicative cops
6
+ module UncommunicativeName
7
+ CASE_MSG = 'Only use lowercase characters for %<name_type>s.'.freeze
8
+ NUM_MSG = 'Do not end %<name_type>s with a number.'.freeze
9
+ LENGTH_MSG = '%<name_type>s must be longer than %<min>s ' \
10
+ 'characters.'.freeze
11
+ FORBIDDEN_MSG = 'Do not use %<name>s as a name for a ' \
12
+ '%<name_type>s.'.freeze
13
+
14
+ def check(node, args)
15
+ args.each do |arg|
16
+ name = arg.children.first.to_s
17
+ next if arg.restarg_type? && name.empty?
18
+ next if allowed_names.include?(name)
19
+ range = arg_range(arg, name.size)
20
+ issue_offenses(node, range, name)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def issue_offenses(node, range, name)
27
+ forbidden_offense(node, range, name) if forbidden_names.include?(name)
28
+ case_offense(node, range) if uppercase?(name)
29
+ length_offense(node, range) unless long_enough?(name)
30
+ return if allow_nums
31
+ num_offense(node, range) if ends_with_num?(name)
32
+ end
33
+
34
+ def case_offense(node, range)
35
+ add_offense(node, location: range,
36
+ message: format(CASE_MSG, name_type: name_type(node)))
37
+ end
38
+
39
+ def uppercase?(name)
40
+ name =~ /[[:upper:]]/
41
+ end
42
+
43
+ def name_type(node)
44
+ @name_type ||= begin
45
+ case node.type
46
+ when :block then 'block parameter'
47
+ when :def, :defs then 'method parameter'
48
+ end
49
+ end
50
+ end
51
+
52
+ def num_offense(node, range)
53
+ add_offense(node, location: range,
54
+ message: format(NUM_MSG, name_type: name_type(node)))
55
+ end
56
+
57
+ def ends_with_num?(name)
58
+ name[-1] =~ /\d/
59
+ end
60
+
61
+ def length_offense(node, range)
62
+ add_offense(node, location: range,
63
+ message: format(LENGTH_MSG,
64
+ name_type: name_type(node).capitalize,
65
+ min: min_length))
66
+ end
67
+
68
+ def long_enough?(name)
69
+ name.size >= min_length
70
+ end
71
+
72
+ def arg_range(arg, length)
73
+ begin_pos = arg.source_range.begin_pos
74
+ Parser::Source::Range.new(processed_source.buffer,
75
+ begin_pos,
76
+ begin_pos + length)
77
+ end
78
+
79
+ def forbidden_offense(node, range, name)
80
+ add_offense(
81
+ node,
82
+ location: range,
83
+ message: format(FORBIDDEN_MSG, name: name, name_type: name_type(node))
84
+ )
85
+ end
86
+
87
+ def allowed_names
88
+ cop_config['AllowedNames']
89
+ end
90
+
91
+ def forbidden_names
92
+ cop_config['ForbiddenNames']
93
+ end
94
+
95
+ def allow_nums
96
+ cop_config['AllowNamesEndingInNumbers']
97
+ end
98
+
99
+ def min_length
100
+ cop_config['MinNameLength']
101
+ end
102
+ end
103
+ end
104
+ end