rubocop 1.45.1 → 1.50.1

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 (223) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +46 -15
  4. data/lib/rubocop/cli/command/auto_generate_config.rb +7 -0
  5. data/lib/rubocop/cli/command/execute_runner.rb +7 -2
  6. data/lib/rubocop/cli.rb +6 -6
  7. data/lib/rubocop/comment_config.rb +19 -0
  8. data/lib/rubocop/config.rb +3 -3
  9. data/lib/rubocop/config_loader.rb +8 -8
  10. data/lib/rubocop/cop/autocorrect_logic.rb +29 -13
  11. data/lib/rubocop/cop/base.rb +1 -1
  12. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  13. data/lib/rubocop/cop/cop.rb +2 -2
  14. data/lib/rubocop/cop/corrector.rb +1 -1
  15. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
  16. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +3 -3
  17. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +3 -3
  18. data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
  19. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  20. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
  21. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
  22. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  23. data/lib/rubocop/cop/gemspec/dependency_version.rb +1 -1
  24. data/lib/rubocop/cop/internal_affairs/cop_description.rb +5 -5
  25. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +3 -3
  26. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
  27. data/lib/rubocop/cop/internal_affairs/location_expression.rb +37 -0
  28. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  29. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  30. data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
  31. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  32. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  33. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +66 -0
  34. data/lib/rubocop/cop/internal_affairs.rb +3 -0
  35. data/lib/rubocop/cop/layout/block_end_newline.rb +7 -21
  36. data/lib/rubocop/cop/layout/class_structure.rb +6 -3
  37. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -1
  38. data/lib/rubocop/cop/layout/empty_comment.rb +3 -3
  39. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
  40. data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
  41. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -0
  42. data/lib/rubocop/cop/layout/end_alignment.rb +9 -1
  43. data/lib/rubocop/cop/layout/extra_spacing.rb +6 -1
  44. data/lib/rubocop/cop/layout/first_argument_indentation.rb +7 -2
  45. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +8 -2
  46. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  47. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
  48. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  49. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +1 -3
  50. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +11 -7
  51. data/lib/rubocop/cop/layout/redundant_line_break.rb +6 -7
  52. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
  53. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  54. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
  55. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  56. data/lib/rubocop/cop/layout/space_inside_parens.rb +2 -2
  57. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  58. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  59. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  60. data/lib/rubocop/cop/lint/debugger.rb +3 -0
  61. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
  62. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
  63. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
  64. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -2
  65. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -3
  66. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  67. data/lib/rubocop/cop/lint/empty_block.rb +1 -1
  68. data/lib/rubocop/cop/lint/empty_conditional_body.rb +4 -2
  69. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  70. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  71. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +46 -4
  72. data/lib/rubocop/cop/lint/missing_super.rb +31 -2
  73. data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -11
  74. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -0
  75. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +6 -10
  76. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
  77. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  78. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +11 -5
  79. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +5 -5
  80. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -1
  81. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  82. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
  83. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  84. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  85. data/lib/rubocop/cop/lint/refinement_import_methods.rb +2 -1
  86. data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
  87. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
  88. data/lib/rubocop/cop/lint/script_permission.rb +1 -1
  89. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  90. data/lib/rubocop/cop/lint/syntax.rb +4 -0
  91. data/lib/rubocop/cop/lint/to_enum_arguments.rb +13 -3
  92. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -3
  93. data/lib/rubocop/cop/lint/useless_access_modifier.rb +10 -10
  94. data/lib/rubocop/cop/lint/useless_method_definition.rb +10 -2
  95. data/lib/rubocop/cop/lint/useless_rescue.rb +6 -2
  96. data/lib/rubocop/cop/lint/useless_times.rb +1 -1
  97. data/lib/rubocop/cop/lint/void.rb +7 -3
  98. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  99. data/lib/rubocop/cop/metrics/class_length.rb +1 -0
  100. data/lib/rubocop/cop/metrics/collection_literal_length.rb +76 -0
  101. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -3
  102. data/lib/rubocop/cop/migration/department_name.rb +1 -1
  103. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
  104. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  105. data/lib/rubocop/cop/mixin/comments_help.rb +3 -3
  106. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  107. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +1 -1
  108. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +10 -5
  109. data/lib/rubocop/cop/mixin/hash_transform_method.rb +3 -3
  110. data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
  111. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +0 -3
  112. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  113. data/lib/rubocop/cop/mixin/range_help.rb +1 -6
  114. data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -3
  115. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
  116. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
  117. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
  118. data/lib/rubocop/cop/naming/inclusive_language.rb +23 -4
  119. data/lib/rubocop/cop/naming/method_name.rb +3 -3
  120. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  121. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  122. data/lib/rubocop/cop/registry.rb +3 -1
  123. data/lib/rubocop/cop/style/accessor_grouping.rb +39 -17
  124. data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -3
  125. data/lib/rubocop/cop/style/array_intersect.rb +1 -1
  126. data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
  127. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
  128. data/lib/rubocop/cop/style/block_comments.rb +1 -1
  129. data/lib/rubocop/cop/style/block_delimiters.rb +11 -2
  130. data/lib/rubocop/cop/style/case_like_if.rb +20 -3
  131. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  132. data/lib/rubocop/cop/style/class_equality_comparison.rb +42 -9
  133. data/lib/rubocop/cop/style/collection_compact.rb +1 -1
  134. data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
  135. data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
  136. data/lib/rubocop/cop/style/concat_array_literals.rb +10 -2
  137. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -6
  138. data/lib/rubocop/cop/style/copyright.rb +1 -1
  139. data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
  140. data/lib/rubocop/cop/style/dir_empty.rb +60 -0
  141. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  142. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +2 -2
  143. data/lib/rubocop/cop/style/documentation.rb +10 -4
  144. data/lib/rubocop/cop/style/documentation_method.rb +4 -4
  145. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  146. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  147. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  148. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  149. data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
  150. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
  151. data/lib/rubocop/cop/style/file_empty.rb +71 -0
  152. data/lib/rubocop/cop/style/file_read.rb +1 -1
  153. data/lib/rubocop/cop/style/file_write.rb +1 -1
  154. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  155. data/lib/rubocop/cop/style/guard_clause.rb +1 -1
  156. data/lib/rubocop/cop/style/hash_except.rb +4 -4
  157. data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
  158. data/lib/rubocop/cop/style/hash_syntax.rb +5 -2
  159. data/lib/rubocop/cop/style/if_unless_modifier.rb +108 -15
  160. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
  161. data/lib/rubocop/cop/style/inverse_methods.rb +5 -5
  162. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +2 -2
  163. data/lib/rubocop/cop/style/map_to_hash.rb +4 -1
  164. data/lib/rubocop/cop/style/map_to_set.rb +4 -1
  165. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +3 -7
  166. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +44 -37
  167. data/lib/rubocop/cop/style/min_max.rb +3 -3
  168. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -4
  169. data/lib/rubocop/cop/style/multiline_method_signature.rb +7 -4
  170. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  171. data/lib/rubocop/cop/style/negated_if_else_condition.rb +12 -7
  172. data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
  173. data/lib/rubocop/cop/style/parallel_assignment.rb +26 -18
  174. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
  175. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  176. data/lib/rubocop/cop/style/redundant_condition.rb +2 -2
  177. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +2 -2
  178. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  179. data/lib/rubocop/cop/style/redundant_line_continuation.rb +179 -0
  180. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -2
  181. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  182. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +7 -8
  183. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +11 -4
  184. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  185. data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -4
  186. data/lib/rubocop/cop/style/require_order.rb +1 -3
  187. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  188. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  189. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
  190. data/lib/rubocop/cop/style/sole_nested_conditional.rb +3 -3
  191. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  192. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  193. data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
  194. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
  195. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  196. data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
  197. data/lib/rubocop/cop/style/unpack_first.rb +3 -3
  198. data/lib/rubocop/cop/style/word_array.rb +17 -5
  199. data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
  200. data/lib/rubocop/cop/style/zero_length_predicate.rb +9 -5
  201. data/lib/rubocop/cop/team.rb +11 -8
  202. data/lib/rubocop/cop/util.rb +13 -4
  203. data/lib/rubocop/cop/variable_force/variable.rb +5 -3
  204. data/lib/rubocop/cops_documentation_generator.rb +10 -3
  205. data/lib/rubocop/directive_comment.rb +3 -3
  206. data/lib/rubocop/ext/comment.rb +18 -0
  207. data/lib/rubocop/ext/regexp_node.rb +1 -1
  208. data/lib/rubocop/ext/regexp_parser.rb +1 -1
  209. data/lib/rubocop/formatter/junit_formatter.rb +4 -1
  210. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  211. data/lib/rubocop/options.rb +4 -1
  212. data/lib/rubocop/result_cache.rb +1 -1
  213. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  214. data/lib/rubocop/rspec/shared_contexts.rb +4 -0
  215. data/lib/rubocop/rspec/support.rb +1 -0
  216. data/lib/rubocop/server/cache.rb +1 -1
  217. data/lib/rubocop/server/core.rb +1 -1
  218. data/lib/rubocop/server/helper.rb +1 -1
  219. data/lib/rubocop/server/server_command/exec.rb +1 -1
  220. data/lib/rubocop/target_ruby.rb +1 -1
  221. data/lib/rubocop/version.rb +1 -1
  222. data/lib/rubocop.rb +8 -0
  223. metadata +20 -9
@@ -52,7 +52,7 @@ module RuboCop
52
52
  # @return [void]
53
53
  def autocorrect(corrector, node)
54
54
  [
55
- heredoc_openning_delimiter_range_from(node),
55
+ heredoc_opening_delimiter_range_from(node),
56
56
  heredoc_closing_delimiter_range_from(node)
57
57
  ].each do |range|
58
58
  corrector.replace(range, EXPECTED_HEREDOC_DELIMITER)
@@ -90,9 +90,9 @@ module RuboCop
90
90
 
91
91
  # @param node [RuboCop::AST::StrNode]
92
92
  # @return [Parser::Source::Range]
93
- def heredoc_openning_delimiter_range_from(node)
93
+ def heredoc_opening_delimiter_range_from(node)
94
94
  match_data = node.source.match(Heredoc::OPENING_DELIMITER)
95
- node.location.expression.begin.adjust(
95
+ node.source_range.begin.adjust(
96
96
  begin_pos: match_data.begin(2),
97
97
  end_pos: match_data.end(2)
98
98
  )
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module InternalAffairs
6
- # `RuboCop::Cop::Cop` is deprecated and will be removed in Rubocop 2.0.
6
+ # `RuboCop::Cop::Cop` is deprecated and will be removed in RuboCop 2.0.
7
7
  # Your custom cop class should inherit from `RuboCop::Cop::Base` instead of
8
8
  # `RuboCop::Cop::Cop`.
9
9
  #
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Enforces the use of `node.source_range` instead of `node.location.expression`.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # node.location.expression
12
+ # node.loc.expression
13
+ #
14
+ # # good
15
+ # node.source_range
16
+ #
17
+ class LocationExpression < Base
18
+ extend AutoCorrector
19
+
20
+ MSG = 'Use `source_range` instead.'
21
+ RESTRICT_ON_SEND = %i[loc location].freeze
22
+
23
+ def on_send(node)
24
+ return unless (parent = node.parent)
25
+ return unless parent.send_type? && parent.method?(:expression)
26
+ return unless parent.receiver.receiver
27
+
28
+ offense = node.loc.selector.join(parent.source_range.end)
29
+
30
+ add_offense(offense) do |corrector|
31
+ corrector.replace(offense, 'source_range')
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -99,7 +99,7 @@ module RuboCop
99
99
  # If the pattern matcher uses arguments (`%1`, `%2`, etc.), include them in the directive
100
100
  arguments = pattern_arguments(node.arguments[1].source)
101
101
 
102
- range = range_with_surrounding_space(node.loc.expression, side: :left, newlines: false)
102
+ range = range_with_surrounding_space(node.source_range, side: :left, newlines: false)
103
103
  indentation = range.source.match(/^\s*/)[0]
104
104
  directive = "#{indentation}# @!method #{actual_name}(#{arguments.join(', ')})\n"
105
105
  directive = "\n#{directive}" if add_newline?(node)
@@ -30,7 +30,7 @@ module RuboCop
30
30
 
31
31
  message = format(MSG, type: node_type)
32
32
  add_offense(node, message: message) do |corrector|
33
- range = node.loc.expression.with(begin_pos: receiver.loc.expression.end_pos + 1)
33
+ range = node.source_range.with(begin_pos: receiver.source_range.end_pos + 1)
34
34
  corrector.replace(range, "#{node_type}_type?")
35
35
  end
36
36
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Enforces the use of `processed_source.file_path` instead of `processed_source.buffer.name`.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # processed_source.buffer.name
12
+ #
13
+ # # good
14
+ # processed_source.file_path
15
+ #
16
+ class ProcessedSourceBufferName < Base
17
+ extend AutoCorrector
18
+
19
+ MSG = 'Use `file_path` instead.'
20
+
21
+ RESTRICT_ON_SEND = %i[name].freeze
22
+
23
+ # @!method processed_source_buffer_name?(node)
24
+ def_node_matcher :processed_source_buffer_name?, <<~PATTERN
25
+ (send
26
+ (send
27
+ {(lvar :processed_source) (send nil? :processed_source)} :buffer) :name)
28
+ PATTERN
29
+
30
+ def on_send(node)
31
+ return unless processed_source_buffer_name?(node)
32
+
33
+ offense_range = node.children.first.loc.selector.begin.join(node.source_range.end)
34
+
35
+ add_offense(offense_range) do |corrector|
36
+ corrector.replace(offense_range, 'file_path')
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -43,7 +43,7 @@ module RuboCop
43
43
  private
44
44
 
45
45
  def offending_range(node)
46
- with_space = range_with_surrounding_space(node.loc.expression)
46
+ with_space = range_with_surrounding_space(node.source_range)
47
47
 
48
48
  range_with_surrounding_comma(with_space, :left)
49
49
  end
@@ -56,7 +56,7 @@ module RuboCop
56
56
  private
57
57
 
58
58
  def offending_range(node)
59
- with_space = range_with_surrounding_space(node.loc.expression)
59
+ with_space = range_with_surrounding_space(node.source_range)
60
60
 
61
61
  range_with_surrounding_comma(with_space, :left)
62
62
  end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Checks for redundant `source_range`.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # node.source_range.source
12
+ #
13
+ # # good
14
+ # node.source
15
+ #
16
+ # # bad
17
+ # add_offense(node) { |corrector| corrector.replace(node.source_range, prefer) }
18
+ # add_offense(node) { |corrector| corrector.insert_before(node.source_range, prefer) }
19
+ # add_offense(node) { |corrector| corrector.insert_before_multi(node.source_range, prefer) }
20
+ # add_offense(node) { |corrector| corrector.insert_after(node.source_range, prefer) }
21
+ # add_offense(node) { |corrector| corrector.insert_after_multi(node.source_range, prefer) }
22
+ # add_offense(node) { |corrector| corrector.swap(node.source_range, before, after) }
23
+ #
24
+ # # good
25
+ # add_offense(node) { |corrector| corrector.replace(node, prefer) }
26
+ # add_offense(node) { |corrector| corrector.insert_before(node, prefer) }
27
+ # add_offense(node) { |corrector| corrector.insert_before_multi(node, prefer) }
28
+ # add_offense(node) { |corrector| corrector.insert_after(node, prefer) }
29
+ # add_offense(node) { |corrector| corrector.insert_after_multi(node, prefer) }
30
+ # add_offense(node) { |corrector| corrector.swap(node, before, after) }
31
+ #
32
+ class RedundantSourceRange < Base
33
+ extend AutoCorrector
34
+
35
+ MSG = 'Remove the redundant `source_range`.'
36
+ RESTRICT_ON_SEND = %i[
37
+ source
38
+ replace remove insert_before insert_before_multi insert_after insert_after_multi swap
39
+ ].freeze
40
+
41
+ # @!method redundant_source_range(node)
42
+ def_node_matcher :redundant_source_range, <<~PATTERN
43
+ {
44
+ (send $(send _ :source_range) :source)
45
+ (send _ {
46
+ :replace :insert_before :insert_before_multi :insert_after :insert_after_multi
47
+ } $(send _ :source_range) _)
48
+ (send _ :remove $(send _ :source_range))
49
+ (send _ :swap $(send _ :source_range) _ _)
50
+ }
51
+ PATTERN
52
+
53
+ def on_send(node)
54
+ return unless (source_range = redundant_source_range(node))
55
+ return if source_range.receiver.send_type? && source_range.receiver.method?(:buffer)
56
+
57
+ selector = source_range.loc.selector
58
+
59
+ add_offense(selector) do |corrector|
60
+ corrector.remove(source_range.loc.dot.join(selector))
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -7,6 +7,7 @@ require_relative 'internal_affairs/example_description'
7
7
  require_relative 'internal_affairs/example_heredoc_delimiter'
8
8
  require_relative 'internal_affairs/inherit_deprecated_cop_class'
9
9
  require_relative 'internal_affairs/lambda_or_proc'
10
+ require_relative 'internal_affairs/location_expression'
10
11
  require_relative 'internal_affairs/location_line_equality_comparison'
11
12
  require_relative 'internal_affairs/method_name_end_with'
12
13
  require_relative 'internal_affairs/method_name_equal'
@@ -15,12 +16,14 @@ require_relative 'internal_affairs/node_matcher_directive'
15
16
  require_relative 'internal_affairs/node_type_predicate'
16
17
  require_relative 'internal_affairs/numblock_handler'
17
18
  require_relative 'internal_affairs/offense_location_keyword'
19
+ require_relative 'internal_affairs/processed_source_buffer_name'
18
20
  require_relative 'internal_affairs/redundant_context_config_parameter'
19
21
  require_relative 'internal_affairs/redundant_described_class_as_subject'
20
22
  require_relative 'internal_affairs/redundant_let_rubocop_config_new'
21
23
  require_relative 'internal_affairs/redundant_location_argument'
22
24
  require_relative 'internal_affairs/redundant_message_argument'
23
25
  require_relative 'internal_affairs/redundant_method_dispatch_node'
26
+ require_relative 'internal_affairs/redundant_source_range'
24
27
  require_relative 'internal_affairs/single_line_comparison'
25
28
  require_relative 'internal_affairs/style_detected_api_use'
26
29
  require_relative 'internal_affairs/undefined_config'
@@ -36,17 +36,19 @@ module RuboCop
36
36
  # If the end is on its own line, there is no offense
37
37
  return if begins_its_line?(node.loc.end)
38
38
 
39
- register_offense(node)
39
+ offense_range = offense_range(node)
40
+ return if offense_range.source.lstrip.start_with?(';')
41
+
42
+ register_offense(node, offense_range)
40
43
  end
41
44
 
42
45
  alias on_numblock on_block
43
46
 
44
47
  private
45
48
 
46
- def register_offense(node)
49
+ def register_offense(node, offense_range)
47
50
  add_offense(node.loc.end, message: message(node)) do |corrector|
48
- offense_range = offense_range(node)
49
- replacement = replacement(node)
51
+ replacement = "\n#{offense_range.source.lstrip}"
50
52
 
51
53
  if (heredoc = last_heredoc_argument(node.body))
52
54
  corrector.remove(offense_range)
@@ -72,23 +74,7 @@ module RuboCop
72
74
  end
73
75
 
74
76
  def offense_range(node)
75
- Parser::Source::Range.new(
76
- node.loc.expression.source_buffer,
77
- node.children.compact.last.loc.expression.end_pos,
78
- end_of_method_chain(node).loc.expression.end_pos
79
- )
80
- end
81
-
82
- def replacement(node)
83
- end_with_method_chain = node.loc.end.join(end_of_method_chain(node).loc.expression.end)
84
-
85
- "\n#{end_with_method_chain.source.strip}"
86
- end
87
-
88
- def end_of_method_chain(node)
89
- return node unless node.parent&.call_type?
90
-
91
- end_of_method_chain(node.parent)
77
+ node.children.compact.last.source_range.end.join(node.loc.end)
92
78
  end
93
79
  end
94
80
  end
@@ -159,6 +159,7 @@ module RuboCop
159
159
  previous = index
160
160
  end
161
161
  end
162
+ alias on_sclass on_class
162
163
 
163
164
  private
164
165
 
@@ -285,10 +286,12 @@ module RuboCop
285
286
  end
286
287
 
287
288
  def end_position_for(node)
288
- heredoc = find_heredoc(node)
289
- return heredoc.location.heredoc_end.end_pos + 1 if heredoc
289
+ if node.casgn_type?
290
+ heredoc = find_heredoc(node)
291
+ return heredoc.location.heredoc_end.end_pos + 1 if heredoc
292
+ end
290
293
 
291
- end_line = buffer.line_for_position(node.loc.expression.end_pos)
294
+ end_line = buffer.line_for_position(node.source_range.end_pos)
292
295
  buffer.line_range(end_line).end_pos
293
296
  end
294
297
 
@@ -85,7 +85,7 @@ module RuboCop
85
85
  end
86
86
 
87
87
  def heredoc_opening(node)
88
- node.loc.expression.source_line
88
+ node.source_range.source_line
89
89
  end
90
90
 
91
91
  def heredoc_closing(node)
@@ -97,9 +97,9 @@ module RuboCop
97
97
  def autocorrect(corrector, node)
98
98
  previous_token = previous_token(node)
99
99
  range = if previous_token && same_line?(node, previous_token)
100
- range_with_surrounding_space(node.loc.expression, newlines: false)
100
+ range_with_surrounding_space(node.source_range, newlines: false)
101
101
  else
102
- range_by_whole_lines(node.loc.expression, include_final_newline: true)
102
+ range_by_whole_lines(node.source_range, include_final_newline: true)
103
103
  end
104
104
 
105
105
  corrector.remove(range)
@@ -137,7 +137,7 @@ module RuboCop
137
137
  end
138
138
 
139
139
  def current_token(comment)
140
- processed_source.find_token { |token| token.pos == comment.loc.expression }
140
+ processed_source.tokens.find { |token| token.pos == comment.source_range }
141
141
  end
142
142
 
143
143
  def previous_token(node)
@@ -235,7 +235,7 @@ module RuboCop
235
235
 
236
236
  def end_loc(node)
237
237
  if (node.def_type? || node.defs_type?) && node.endless?
238
- node.loc.expression.end
238
+ node.source_range.end
239
239
  else
240
240
  node.loc.end
241
241
  end
@@ -31,7 +31,7 @@ module RuboCop
31
31
  return unless processed_source.raw_source.include?("\n\n\n")
32
32
 
33
33
  lines = Set.new
34
- processed_source.each_token { |token| lines << token.line }
34
+ processed_source.tokens.each { |token| lines << token.line }
35
35
 
36
36
  each_extra_empty_line(lines.sort) do |range|
37
37
  add_offense(range) do |corrector|
@@ -51,6 +51,8 @@ module RuboCop
51
51
  MSG_BEFORE_FOR_ONLY_BEFORE = 'Keep a blank line before `%<modifier>s`.'
52
52
  MSG_AFTER_FOR_ONLY_BEFORE = 'Remove a blank line after `%<modifier>s`.'
53
53
 
54
+ RESTRICT_ON_SEND = %i[public protected private module_function].freeze
55
+
54
56
  def initialize(config = nil, options = nil)
55
57
  super
56
58
 
@@ -82,6 +82,10 @@ module RuboCop
82
82
  check_other_alignment(node)
83
83
  end
84
84
 
85
+ def on_sclass(node)
86
+ check_other_alignment(node)
87
+ end
88
+
85
89
  def on_module(node)
86
90
  check_other_alignment(node)
87
91
  end
@@ -105,6 +109,7 @@ module RuboCop
105
109
  check_other_alignment(node)
106
110
  end
107
111
  end
112
+ alias on_case_match on_case
108
113
 
109
114
  private
110
115
 
@@ -165,7 +170,10 @@ module RuboCop
165
170
  end
166
171
 
167
172
  def alignment_node_for_variable_style(node)
168
- return node.parent if node.case_type? && node.argument? && same_line?(node, node.parent)
173
+ if (node.case_type? || node.case_match_type?) && node.argument? &&
174
+ same_line?(node, node.parent)
175
+ return node.parent
176
+ end
169
177
 
170
178
  assignment = assignment_or_operator_method(node)
171
179
 
@@ -49,7 +49,7 @@ module RuboCop
49
49
 
50
50
  private
51
51
 
52
- def aligned_locations(locs)
52
+ def aligned_locations(locs) # rubocop:disable Metrics/AbcSize
53
53
  return [] if locs.empty?
54
54
 
55
55
  aligned = Set[locs.first.line, locs.last.line]
@@ -57,6 +57,11 @@ module RuboCop
57
57
  col = loc.column
58
58
  aligned << loc.line if col == before.column || col == after.column
59
59
  end
60
+
61
+ # if locs.size > 2 and the size of variable `aligned`
62
+ # has not increased from its initial value, there are not aligned lines.
63
+ return [] if locs.size > 2 && aligned.size == 2
64
+
60
65
  aligned
61
66
  end
62
67
 
@@ -153,9 +153,10 @@ module RuboCop
153
153
  MSG = 'Indent the first argument one step more than %<base>s.'
154
154
 
155
155
  def on_send(node)
156
+ return unless should_check?(node)
157
+ return if same_line?(node, node.first_argument)
156
158
  return if style != :consistent && enforce_first_argument_with_fixed_indentation? &&
157
159
  !enable_layout_first_method_argument_line_break?
158
- return if !node.arguments? || bare_operator?(node) || node.setter_method?
159
160
 
160
161
  indent = base_indentation(node) + configured_indentation_width
161
162
 
@@ -166,6 +167,10 @@ module RuboCop
166
167
 
167
168
  private
168
169
 
170
+ def should_check?(node)
171
+ node.arguments? && !bare_operator?(node) && !node.setter_method?
172
+ end
173
+
169
174
  def autocorrect(corrector, node)
170
175
  AlignmentCorrector.correct(corrector, processed_source, node, column_delta)
171
176
  end
@@ -255,7 +260,7 @@ module RuboCop
255
260
  @comment_lines ||=
256
261
  processed_source
257
262
  .comments
258
- .select { |c| begins_its_line?(c.loc.expression) }
263
+ .select { |c| begins_its_line?(c.source_range) }
259
264
  .map { |c| c.loc.line }
260
265
  end
261
266
 
@@ -67,8 +67,7 @@ module RuboCop
67
67
 
68
68
  outermost_send = outermost_send_on_same_line(heredoc_arg)
69
69
  return unless outermost_send
70
- return unless outermost_send.loc.end
71
- return unless heredoc_arg.first_line != outermost_send.loc.end.line
70
+ return if end_keyword_before_closing_parenthesis?(node)
72
71
  return if subsequent_closing_parentheses_in_same_line?(outermost_send)
73
72
  return if exist_argument_between_heredoc_end_and_closing_parentheses?(node)
74
73
 
@@ -160,6 +159,12 @@ module RuboCop
160
159
 
161
160
  # Closing parenthesis helpers.
162
161
 
162
+ def end_keyword_before_closing_parenthesis?(parenthesized_send_node)
163
+ parenthesized_send_node.ancestors.any? do |ancestor|
164
+ ancestor.loc.respond_to?(:end) && ancestor.loc.end&.source == 'end'
165
+ end
166
+ end
167
+
163
168
  def subsequent_closing_parentheses_in_same_line?(outermost_send)
164
169
  last_arg_of_outer_send = outermost_send.last_argument
165
170
  return false unless last_arg_of_outer_send&.loc.respond_to?(:end) &&
@@ -215,6 +220,7 @@ module RuboCop
215
220
  end
216
221
 
217
222
  def exist_argument_between_heredoc_end_and_closing_parentheses?(node)
223
+ return true unless node.loc.end
218
224
  return false unless (heredoc_end = find_most_bottom_of_heredoc_end(node.arguments))
219
225
 
220
226
  heredoc_end < node.loc.end.begin_pos &&
@@ -115,7 +115,7 @@ module RuboCop
115
115
  end
116
116
 
117
117
  def adjust_minus(corrector, node)
118
- heredoc_beginning = node.loc.expression.source
118
+ heredoc_beginning = node.source
119
119
  corrected = heredoc_beginning.sub(/<<-?/, '<<~')
120
120
  corrector.replace(node, corrected)
121
121
  end
@@ -139,7 +139,7 @@ module RuboCop
139
139
  end
140
140
 
141
141
  def base_indent_level(node)
142
- base_line_num = node.loc.expression.line
142
+ base_line_num = node.source_range.line
143
143
  base_line = processed_source.lines[base_line_num - 1]
144
144
  indent_level(base_line)
145
145
  end
@@ -34,7 +34,7 @@ module RuboCop
34
34
  private
35
35
 
36
36
  def first_token
37
- processed_source.find_token { |t| !t.text.start_with?('#') }
37
+ processed_source.tokens.find { |t| !t.text.start_with?('#') }
38
38
  end
39
39
 
40
40
  def space_before(token)
@@ -63,7 +63,7 @@ module RuboCop
63
63
  next if gemfile_ruby_comment?(comment)
64
64
 
65
65
  add_offense(comment) do |corrector|
66
- expr = comment.loc.expression
66
+ expr = comment.source_range
67
67
 
68
68
  corrector.insert_after(hash_mark(expr), ' ')
69
69
  end
@@ -51,12 +51,11 @@ module RuboCop
51
51
  private_constant :LINE_1_ENDING, :LINE_2_BEGINNING,
52
52
  :LEADING_STYLE_OFFENSE, :TRAILING_STYLE_OFFENSE
53
53
 
54
- # rubocop:disable Metrics/AbcSize
55
54
  def on_dstr(node)
56
55
  # Quick check if we possibly have line continuations.
57
56
  return unless node.source.include?('\\')
58
57
 
59
- end_of_first_line = node.loc.expression.begin_pos - node.loc.expression.column
58
+ end_of_first_line = node.source_range.begin_pos - node.source_range.column
60
59
 
61
60
  raw_lines(node).each_cons(2) do |raw_line_one, raw_line_two|
62
61
  end_of_first_line += raw_line_one.length
@@ -70,7 +69,6 @@ module RuboCop
70
69
  end
71
70
  end
72
71
  end
73
- # rubocop:enable Metrics/AbcSize
74
72
 
75
73
  private
76
74
 
@@ -87,22 +87,26 @@ module RuboCop
87
87
  corrector.replace(range, correction)
88
88
  end
89
89
 
90
- def string_literal_ranges(ast)
90
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
91
+ def ignored_literal_ranges(ast)
91
92
  # which lines start inside a string literal?
92
93
  return [] if ast.nil?
93
94
 
94
- ranges = Set.new
95
- ast.each_node(:str, :dstr) do |str|
96
- loc = str.location
95
+ ast.each_node(:str, :dstr, :array).with_object(Set.new) do |literal, ranges|
96
+ loc = literal.location
97
97
 
98
- if str.heredoc?
98
+ if literal.array_type?
99
+ next unless literal.percent_literal?
100
+
101
+ ranges << loc.expression
102
+ elsif literal.heredoc?
99
103
  ranges << loc.heredoc_body
100
104
  elsif loc.respond_to?(:begin) && loc.begin
101
105
  ranges << loc.expression
102
106
  end
103
107
  end
104
- ranges
105
108
  end
109
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
106
110
 
107
111
  def comment_ranges(comments)
108
112
  comments.map(&:loc).map(&:expression)
@@ -119,7 +123,7 @@ module RuboCop
119
123
  end
120
124
 
121
125
  def ignored_ranges
122
- @ignored_ranges ||= string_literal_ranges(processed_source.ast) +
126
+ @ignored_ranges ||= ignored_literal_ranges(processed_source.ast) +
123
127
  comment_ranges(processed_source.comments)
124
128
  end
125
129
 
@@ -50,9 +50,9 @@ module RuboCop
50
50
 
51
51
  def on_send(node)
52
52
  # Include "the whole expression".
53
- node = node.parent while convertible_block?(node) ||
54
- node.parent.is_a?(RuboCop::AST::BinaryOperatorNode) ||
55
- node.parent&.send_type?
53
+ node = node.parent while node.parent&.send_type? ||
54
+ convertible_block?(node) ||
55
+ node.parent.is_a?(RuboCop::AST::BinaryOperatorNode)
56
56
 
57
57
  return unless offense?(node) && !part_of_ignored_node?(node)
58
58
 
@@ -69,15 +69,14 @@ module RuboCop
69
69
 
70
70
  def register_offense(node)
71
71
  add_offense(node) do |corrector|
72
- corrector.replace(node.source_range, to_single_line(node.source).strip)
72
+ corrector.replace(node, to_single_line(node.source).strip)
73
73
  end
74
74
  ignore_node(node)
75
75
  end
76
76
 
77
77
  def offense?(node)
78
- return false if configured_to_not_be_inspected?(node)
79
-
80
- node.multiline? && !too_long?(node) && suitable_as_single_line?(node)
78
+ node.multiline? && !too_long?(node) && suitable_as_single_line?(node) &&
79
+ !configured_to_not_be_inspected?(node)
81
80
  end
82
81
 
83
82
  def configured_to_not_be_inspected?(node)
@@ -102,7 +102,7 @@ module RuboCop
102
102
  node.loc.name
103
103
  when :masgn
104
104
  mlhs_node, = *node
105
- mlhs_node.loc.expression
105
+ mlhs_node.source_range
106
106
  else
107
107
  # It is a wrapper with access modifier.
108
108
  node.child_nodes.first.loc.name
@@ -196,7 +196,7 @@ module RuboCop
196
196
  if begin_end_alignment_style == 'start_of_line'
197
197
  start_line_range(alignment_node)
198
198
  else
199
- alignment_node.loc.expression
199
+ alignment_node.source_range
200
200
  end
201
201
  end
202
202