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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/default.yml +46 -15
- data/lib/rubocop/cli/command/auto_generate_config.rb +7 -0
- data/lib/rubocop/cli/command/execute_runner.rb +7 -2
- data/lib/rubocop/cli.rb +6 -6
- data/lib/rubocop/comment_config.rb +19 -0
- data/lib/rubocop/config.rb +3 -3
- data/lib/rubocop/config_loader.rb +8 -8
- data/lib/rubocop/cop/autocorrect_logic.rb +29 -13
- data/lib/rubocop/cop/base.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/cop.rb +2 -2
- data/lib/rubocop/cop/corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/dependency_version.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +5 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +37 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +66 -0
- data/lib/rubocop/cop/internal_affairs.rb +3 -0
- data/lib/rubocop/cop/layout/block_end_newline.rb +7 -21
- data/lib/rubocop/cop/layout/class_structure.rb +6 -3
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +9 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +6 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +7 -2
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +8 -2
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +1 -3
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +11 -7
- data/lib/rubocop/cop/layout/redundant_line_break.rb +6 -7
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +3 -0
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -2
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -3
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_block.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +4 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +46 -4
- data/lib/rubocop/cop/lint/missing_super.rb +31 -2
- data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -11
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -0
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +6 -10
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +11 -5
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +5 -5
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
- data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +2 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -0
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +13 -3
- data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -3
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +10 -10
- data/lib/rubocop/cop/lint/useless_method_definition.rb +10 -2
- data/lib/rubocop/cop/lint/useless_rescue.rb +6 -2
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +7 -3
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +1 -0
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +76 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -3
- data/lib/rubocop/cop/migration/department_name.rb +1 -1
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +3 -3
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +10 -5
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +3 -3
- data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +0 -3
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +1 -6
- data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -3
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +23 -4
- data/lib/rubocop/cop/naming/method_name.rb +3 -3
- data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +3 -1
- data/lib/rubocop/cop/style/accessor_grouping.rb +39 -17
- data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -3
- data/lib/rubocop/cop/style/array_intersect.rb +1 -1
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +11 -2
- data/lib/rubocop/cop/style/case_like_if.rb +20 -3
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_equality_comparison.rb +42 -9
- data/lib/rubocop/cop/style/collection_compact.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
- data/lib/rubocop/cop/style/concat_array_literals.rb +10 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -6
- data/lib/rubocop/cop/style/copyright.rb +1 -1
- data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
- data/lib/rubocop/cop/style/dir_empty.rb +60 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +10 -4
- data/lib/rubocop/cop/style/documentation_method.rb +4 -4
- data/lib/rubocop/cop/style/double_negation.rb +2 -2
- data/lib/rubocop/cop/style/each_with_object.rb +1 -1
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/file_empty.rb +71 -0
- data/lib/rubocop/cop/style/file_read.rb +1 -1
- data/lib/rubocop/cop/style/file_write.rb +1 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +1 -1
- data/lib/rubocop/cop/style/hash_except.rb +4 -4
- data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
- data/lib/rubocop/cop/style/hash_syntax.rb +5 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +108 -15
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
- data/lib/rubocop/cop/style/inverse_methods.rb +5 -5
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +2 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +4 -1
- data/lib/rubocop/cop/style/map_to_set.rb +4 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +3 -7
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +44 -37
- data/lib/rubocop/cop/style/min_max.rb +3 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +4 -4
- data/lib/rubocop/cop/style/multiline_method_signature.rb +7 -4
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +12 -7
- data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +26 -18
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -2
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +2 -2
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +179 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +7 -8
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +11 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -4
- data/lib/rubocop/cop/style/require_order.rb +1 -3
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +3 -3
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
- data/lib/rubocop/cop/style/unpack_first.rb +3 -3
- data/lib/rubocop/cop/style/word_array.rb +17 -5
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +9 -5
- data/lib/rubocop/cop/team.rb +11 -8
- data/lib/rubocop/cop/util.rb +13 -4
- data/lib/rubocop/cop/variable_force/variable.rb +5 -3
- data/lib/rubocop/cops_documentation_generator.rb +10 -3
- data/lib/rubocop/directive_comment.rb +3 -3
- data/lib/rubocop/ext/comment.rb +18 -0
- data/lib/rubocop/ext/regexp_node.rb +1 -1
- data/lib/rubocop/ext/regexp_parser.rb +1 -1
- data/lib/rubocop/formatter/junit_formatter.rb +4 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/options.rb +4 -1
- data/lib/rubocop/result_cache.rb +1 -1
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +4 -0
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/server/cache.rb +1 -1
- data/lib/rubocop/server/core.rb +1 -1
- data/lib/rubocop/server/helper.rb +1 -1
- data/lib/rubocop/server/server_command/exec.rb +1 -1
- data/lib/rubocop/target_ruby.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +8 -0
- metadata +20 -9
@@ -100,8 +100,10 @@ module RuboCop
|
|
100
100
|
last_pair = node.parent.pairs.last
|
101
101
|
return unless last_pair.key.source == last_pair.value.source
|
102
102
|
return unless (dispatch_node = find_ancestor_method_dispatch_node(node))
|
103
|
-
return if
|
104
|
-
return
|
103
|
+
return if dispatch_node.assignment_method?
|
104
|
+
return if dispatch_node.parenthesized?
|
105
|
+
return if dispatch_node.parent && parentheses?(dispatch_node.parent)
|
106
|
+
return if last_expression?(dispatch_node) && !method_dispatch_as_argument?(dispatch_node)
|
105
107
|
|
106
108
|
def_node = node.each_ancestor(:send, :csend, :super, :yield).first
|
107
109
|
|
@@ -132,9 +134,12 @@ module RuboCop
|
|
132
134
|
ancestor.ancestors.any? { |node| node.respond_to?(:modifier_form?) && node.modifier_form? }
|
133
135
|
end
|
134
136
|
|
135
|
-
def last_expression?(
|
136
|
-
|
137
|
-
|
137
|
+
def last_expression?(node)
|
138
|
+
return false if node.right_sibling
|
139
|
+
return true unless (assignment_node = node.each_ancestor.find(&:assignment?))
|
140
|
+
return last_expression?(assignment_node.parent) if assignment_node.parent&.assignment?
|
141
|
+
|
142
|
+
!assignment_node.right_sibling
|
138
143
|
end
|
139
144
|
|
140
145
|
def method_dispatch_as_argument?(method_dispatch_node)
|
@@ -159,7 +159,7 @@ module RuboCop
|
|
159
159
|
end
|
160
160
|
|
161
161
|
def strip_prefix_and_suffix(node, corrector)
|
162
|
-
expression = node.
|
162
|
+
expression = node.source_range
|
163
163
|
corrector.remove_leading(expression, leading)
|
164
164
|
corrector.remove_trailing(expression, trailing)
|
165
165
|
end
|
@@ -175,11 +175,11 @@ module RuboCop
|
|
175
175
|
end
|
176
176
|
|
177
177
|
def set_new_arg_name(transformed_argname, corrector)
|
178
|
-
corrector.replace(block_node.arguments
|
178
|
+
corrector.replace(block_node.arguments, "|#{transformed_argname}|")
|
179
179
|
end
|
180
180
|
|
181
181
|
def set_new_body_expression(transforming_body_expr, corrector)
|
182
|
-
body_source = transforming_body_expr.
|
182
|
+
body_source = transforming_body_expr.source
|
183
183
|
if transforming_body_expr.hash_type? && !transforming_body_expr.braces?
|
184
184
|
body_source = "{ #{body_source} }"
|
185
185
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for checking minimum branches count.
|
6
|
+
module MinBranchesCount
|
7
|
+
private
|
8
|
+
|
9
|
+
def min_branches_count?(node)
|
10
|
+
branches =
|
11
|
+
if node.case_type?
|
12
|
+
node.when_branches
|
13
|
+
elsif node.if_type?
|
14
|
+
if_conditional_branches(node)
|
15
|
+
else
|
16
|
+
raise ArgumentError, "Unsupported #{node.type.inspect} node type"
|
17
|
+
end
|
18
|
+
|
19
|
+
branches.size >= min_branches_count
|
20
|
+
end
|
21
|
+
|
22
|
+
def min_branches_count
|
23
|
+
length = cop_config['MinBranchesCount'] || 3
|
24
|
+
return length if length.is_a?(Integer) && length.positive?
|
25
|
+
|
26
|
+
raise 'MinBranchesCount needs to be a positive integer!'
|
27
|
+
end
|
28
|
+
|
29
|
+
def if_conditional_branches(node, branches = [])
|
30
|
+
return [] if node.nil? || !node.if_type?
|
31
|
+
|
32
|
+
branches << node.if_branch
|
33
|
+
|
34
|
+
else_branch = node.else_branch
|
35
|
+
if_conditional_branches(else_branch, branches) if else_branch&.if_type?
|
36
|
+
branches
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
def get_source_range(node, comments_as_separators)
|
11
11
|
unless comments_as_separators
|
12
12
|
first_comment = processed_source.ast_with_comments[node].first
|
13
|
-
return first_comment.
|
13
|
+
return first_comment.source_range unless first_comment.nil?
|
14
14
|
end
|
15
15
|
node.source_range
|
16
16
|
end
|
@@ -132,12 +132,7 @@ module RuboCop
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def range_with_comments(node)
|
135
|
-
ranges = [
|
136
|
-
node,
|
137
|
-
*@processed_source.ast_with_comments[node]
|
138
|
-
].map do |element|
|
139
|
-
element.location.expression
|
140
|
-
end
|
135
|
+
ranges = [node, *@processed_source.ast_with_comments[node]].map(&:source_range)
|
141
136
|
ranges.reduce do |result, range|
|
142
137
|
add_range(result, range)
|
143
138
|
end
|
@@ -65,14 +65,14 @@ module RuboCop
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def method_source(if_body)
|
68
|
-
range_between(if_body.
|
68
|
+
range_between(if_body.source_range.begin_pos, if_body.loc.selector.end_pos).source
|
69
69
|
end
|
70
70
|
|
71
71
|
def first_line_comment(node)
|
72
|
-
comment = processed_source.
|
72
|
+
comment = processed_source.comments.find { |c| same_line?(c, node) }
|
73
73
|
return unless comment
|
74
74
|
|
75
|
-
comment_source = comment.
|
75
|
+
comment_source = comment.source
|
76
76
|
comment_source unless comment_disables_cop?(comment_source)
|
77
77
|
end
|
78
78
|
|
@@ -75,7 +75,7 @@ module RuboCop
|
|
75
75
|
|
76
76
|
def inside_comment?(range, comma_offset)
|
77
77
|
comment = processed_source.comment_at_line(range.line)
|
78
|
-
comment && comment.
|
78
|
+
comment && comment.source_range.begin_pos < range.begin_pos + comma_offset
|
79
79
|
end
|
80
80
|
|
81
81
|
# Returns true if the node has round/square/curly brackets.
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
57
57
|
CONSTANT_MSG = 'Use only ascii symbols in constants.'
|
58
58
|
|
59
59
|
def on_new_investigation
|
60
|
-
processed_source.
|
60
|
+
processed_source.tokens.each do |token|
|
61
61
|
next if !should_check?(token) || token.text.ascii_only?
|
62
62
|
|
63
63
|
message = token.type == :tIDENTIFIER ? IDENTIFIER_MSG : CONSTANT_MSG
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
38
38
|
return if correct_case_delimiters?(node)
|
39
39
|
|
40
40
|
add_offense(node.loc.heredoc_end) do |corrector|
|
41
|
-
expr = node.
|
41
|
+
expr = node.source_range
|
42
42
|
|
43
43
|
corrector.replace(expr, correct_delimiters(expr.source))
|
44
44
|
corrector.replace(node.loc.heredoc_end, correct_delimiters(delimiter_string(expr)))
|
@@ -5,6 +5,7 @@ module RuboCop
|
|
5
5
|
module Naming
|
6
6
|
# Recommends the use of inclusive language instead of problematic terms.
|
7
7
|
# The cop can check the following locations for offenses:
|
8
|
+
#
|
8
9
|
# - identifiers
|
9
10
|
# - constants
|
10
11
|
# - variables
|
@@ -12,6 +13,7 @@ module RuboCop
|
|
12
13
|
# - symbols
|
13
14
|
# - comments
|
14
15
|
# - file paths
|
16
|
+
#
|
15
17
|
# Each of these locations can be individually enabled/disabled via configuration,
|
16
18
|
# for example CheckIdentifiers = true/false.
|
17
19
|
#
|
@@ -22,6 +24,9 @@ module RuboCop
|
|
22
24
|
# `WholeWord: true` can be set on a flagged term to indicate the cop should only match when
|
23
25
|
# a term matches the whole word (partial matches will not be offenses).
|
24
26
|
#
|
27
|
+
# The cop supports autocorrection when there is only one suggestion. When there are multiple
|
28
|
+
# suggestions, the best suggestion cannot be identified and will not be autocorrected.
|
29
|
+
#
|
25
30
|
# @example FlaggedTerms: { whitelist: { Suggestions: ['allowlist'] } }
|
26
31
|
# # Suggest replacing identifier whitelist with allowlist
|
27
32
|
#
|
@@ -68,6 +73,7 @@ module RuboCop
|
|
68
73
|
# TeslaVehicle
|
69
74
|
class InclusiveLanguage < Base
|
70
75
|
include RangeHelp
|
76
|
+
extend AutoCorrector
|
71
77
|
|
72
78
|
EMPTY_ARRAY = [].freeze
|
73
79
|
MSG = "Consider replacing '%<term>s'%<suffix>s."
|
@@ -92,7 +98,7 @@ module RuboCop
|
|
92
98
|
private
|
93
99
|
|
94
100
|
def investigate_tokens
|
95
|
-
processed_source.
|
101
|
+
processed_source.tokens.each do |token|
|
96
102
|
next unless check_token?(token.type)
|
97
103
|
|
98
104
|
word_locations = scan_for_words(token.text)
|
@@ -104,9 +110,16 @@ module RuboCop
|
|
104
110
|
|
105
111
|
def add_offenses_for_token(token, word_locations)
|
106
112
|
word_locations.each do |word_location|
|
107
|
-
|
108
|
-
range =
|
109
|
-
|
113
|
+
word = word_location.word
|
114
|
+
range = offense_range(token, word)
|
115
|
+
|
116
|
+
add_offense(range, message: create_message(word)) do |corrector|
|
117
|
+
suggestions = find_flagged_term(word)['Suggestions']
|
118
|
+
|
119
|
+
next unless suggestions.is_a?(String)
|
120
|
+
|
121
|
+
corrector.replace(range, suggestions)
|
122
|
+
end
|
110
123
|
end
|
111
124
|
end
|
112
125
|
|
@@ -264,6 +277,12 @@ module RuboCop
|
|
264
277
|
end
|
265
278
|
" with #{suggestion_str}"
|
266
279
|
end
|
280
|
+
|
281
|
+
def offense_range(token, word)
|
282
|
+
start_position = token.pos.begin_pos + token.pos.source.index(word)
|
283
|
+
|
284
|
+
range_between(start_position, start_position + word.length)
|
285
|
+
end
|
267
286
|
end
|
268
287
|
end
|
269
288
|
end
|
@@ -10,8 +10,8 @@ module RuboCop
|
|
10
10
|
#
|
11
11
|
# Naming/MethodName:
|
12
12
|
# AllowedPatterns:
|
13
|
-
# - '\
|
14
|
-
# - '\
|
13
|
+
# - '\AonSelectionBulkChange\z'
|
14
|
+
# - '\AonSelectionCleared\z'
|
15
15
|
#
|
16
16
|
# Method names matching patterns are always allowed.
|
17
17
|
#
|
@@ -67,7 +67,7 @@ module RuboCop
|
|
67
67
|
|
68
68
|
def range_position(node)
|
69
69
|
selector_end_pos = node.loc.selector.end_pos + 1
|
70
|
-
expr_end_pos = node.
|
70
|
+
expr_end_pos = node.source_range.end_pos
|
71
71
|
|
72
72
|
range_between(selector_end_pos, expr_end_pos)
|
73
73
|
end
|
data/lib/rubocop/cop/registry.rb
CHANGED
@@ -197,7 +197,9 @@ module RuboCop
|
|
197
197
|
def enabled?(cop, config)
|
198
198
|
return true if options[:only]&.include?(cop.cop_name)
|
199
199
|
|
200
|
-
|
200
|
+
# We need to use `cop_name` in this case, because `for_cop` uses caching
|
201
|
+
# which expects cop names or cop classes as keys.
|
202
|
+
cfg = config.for_cop(cop.cop_name)
|
201
203
|
|
202
204
|
cop_enabled = cfg.fetch('Enabled') == true || enabled_pending_cop?(cfg, config)
|
203
205
|
|
@@ -7,19 +7,32 @@ module RuboCop
|
|
7
7
|
# By default it enforces accessors to be placed in grouped declarations,
|
8
8
|
# but it can be configured to enforce separating them in multiple declarations.
|
9
9
|
#
|
10
|
-
# NOTE:
|
11
|
-
#
|
10
|
+
# NOTE: If there is a method call before the accessor method it is always allowed
|
11
|
+
# as it might be intended like Sorbet.
|
12
12
|
#
|
13
13
|
# @example EnforcedStyle: grouped (default)
|
14
14
|
# # bad
|
15
15
|
# class Foo
|
16
16
|
# attr_reader :bar
|
17
|
+
# attr_reader :bax
|
17
18
|
# attr_reader :baz
|
18
19
|
# end
|
19
20
|
#
|
20
21
|
# # good
|
21
22
|
# class Foo
|
22
|
-
# attr_reader :bar, :baz
|
23
|
+
# attr_reader :bar, :bax, :baz
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# class Foo
|
28
|
+
# # may be intended comment for bar.
|
29
|
+
# attr_reader :bar
|
30
|
+
#
|
31
|
+
# sig { returns(String) }
|
32
|
+
# attr_reader :bax
|
33
|
+
#
|
34
|
+
# may_be_intended_annotation :baz
|
35
|
+
# attr_reader :baz
|
23
36
|
# end
|
24
37
|
#
|
25
38
|
# @example EnforcedStyle: separated
|
@@ -43,11 +56,9 @@ module RuboCop
|
|
43
56
|
GROUPED_MSG = 'Group together all `%<accessor>s` attributes.'
|
44
57
|
SEPARATED_MSG = 'Use one attribute per `%<accessor>s`.'
|
45
58
|
|
46
|
-
ACCESSOR_METHODS = %i[attr_reader attr_writer attr_accessor attr].freeze
|
47
|
-
|
48
59
|
def on_class(node)
|
49
60
|
class_send_elements(node).each do |macro|
|
50
|
-
next unless
|
61
|
+
next unless macro.attribute_accessor?
|
51
62
|
|
52
63
|
check(macro)
|
53
64
|
end
|
@@ -58,8 +69,8 @@ module RuboCop
|
|
58
69
|
private
|
59
70
|
|
60
71
|
def check(send_node)
|
61
|
-
return if previous_line_comment?(send_node)
|
62
|
-
return unless (grouped_style? &&
|
72
|
+
return if previous_line_comment?(send_node) || !groupable_accessor?(send_node)
|
73
|
+
return unless (grouped_style? && groupable_sibling_accessors(send_node).size > 1) ||
|
63
74
|
(separated_style? && send_node.arguments.size > 1)
|
64
75
|
|
65
76
|
message = message(send_node)
|
@@ -72,7 +83,7 @@ module RuboCop
|
|
72
83
|
if (preferred_accessors = preferred_accessors(node))
|
73
84
|
corrector.replace(node, preferred_accessors)
|
74
85
|
else
|
75
|
-
range = range_with_surrounding_space(node.
|
86
|
+
range = range_with_surrounding_space(node.source_range, side: :left)
|
76
87
|
corrector.remove(range)
|
77
88
|
end
|
78
89
|
end
|
@@ -81,6 +92,21 @@ module RuboCop
|
|
81
92
|
comment_line?(processed_source[node.first_line - 2])
|
82
93
|
end
|
83
94
|
|
95
|
+
def groupable_accessor?(node)
|
96
|
+
return true unless (previous_expression = node.left_siblings.last)
|
97
|
+
|
98
|
+
# Accessors with Sorbet `sig { ... }` blocks shouldn't be groupable.
|
99
|
+
if previous_expression.block_type?
|
100
|
+
previous_expression.child_nodes.each do |child_node|
|
101
|
+
break previous_expression = child_node if child_node.send_type?
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
return true unless previous_expression.send_type?
|
106
|
+
|
107
|
+
previous_expression.attribute_accessor? || previous_expression.access_modifier?
|
108
|
+
end
|
109
|
+
|
84
110
|
def class_send_elements(class_node)
|
85
111
|
class_def = class_node.body
|
86
112
|
|
@@ -93,10 +119,6 @@ module RuboCop
|
|
93
119
|
end
|
94
120
|
end
|
95
121
|
|
96
|
-
def accessor?(send_node)
|
97
|
-
send_node.macro? && ACCESSOR_METHODS.include?(send_node.method_name)
|
98
|
-
end
|
99
|
-
|
100
122
|
def grouped_style?
|
101
123
|
style == :grouped
|
102
124
|
end
|
@@ -105,12 +127,12 @@ module RuboCop
|
|
105
127
|
style == :separated
|
106
128
|
end
|
107
129
|
|
108
|
-
def
|
130
|
+
def groupable_sibling_accessors(send_node)
|
109
131
|
send_node.parent.each_child_node(:send).select do |sibling|
|
110
|
-
|
132
|
+
sibling.attribute_accessor? &&
|
111
133
|
sibling.method?(send_node.method_name) &&
|
112
134
|
node_visibility(sibling) == node_visibility(send_node) &&
|
113
|
-
!previous_line_comment?(sibling)
|
135
|
+
groupable_accessor?(sibling) && !previous_line_comment?(sibling)
|
114
136
|
end
|
115
137
|
end
|
116
138
|
|
@@ -121,7 +143,7 @@ module RuboCop
|
|
121
143
|
|
122
144
|
def preferred_accessors(node)
|
123
145
|
if grouped_style?
|
124
|
-
accessors =
|
146
|
+
accessors = groupable_sibling_accessors(node)
|
125
147
|
group_accessors(node, accessors) if node.loc == accessors.first.loc
|
126
148
|
else
|
127
149
|
separate_accessors(node)
|
@@ -124,9 +124,9 @@ module RuboCop
|
|
124
124
|
|
125
125
|
def register_offense_to_forwarding_method_arguments(forwarding_method)
|
126
126
|
add_offense(arguments_range(forwarding_method)) do |corrector|
|
127
|
-
|
128
|
-
|
129
|
-
|
127
|
+
begin_pos = forwarding_method.loc.selector&.end_pos || forwarding_method.loc.dot.end_pos
|
128
|
+
range = range_between(begin_pos, forwarding_method.source_range.end_pos)
|
129
|
+
|
130
130
|
corrector.replace(range, '(...)')
|
131
131
|
end
|
132
132
|
end
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
# `(array1 & array2).any?` and is more readable.
|
13
13
|
#
|
14
14
|
# @safety
|
15
|
-
# This cop cannot guarantee that array1 and array2 are
|
15
|
+
# This cop cannot guarantee that `array1` and `array2` are
|
16
16
|
# actually arrays while method `intersect?` is for arrays only.
|
17
17
|
#
|
18
18
|
# @example
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
private
|
31
31
|
|
32
32
|
def first_offense_range(comment)
|
33
|
-
expression = comment.
|
33
|
+
expression = comment.source_range
|
34
34
|
first_offense = first_non_ascii_chars(comment.text)
|
35
35
|
|
36
36
|
start_position = expression.begin_pos + comment.text.index(first_offense)
|
@@ -55,7 +55,7 @@ module RuboCop
|
|
55
55
|
def after_class(class_node)
|
56
56
|
@macros_to_rewrite[class_node].each do |macro|
|
57
57
|
node = macro.node
|
58
|
-
range = range_by_whole_lines(node.
|
58
|
+
range = range_by_whole_lines(node.source_range, include_final_newline: true)
|
59
59
|
|
60
60
|
correct(range) do |corrector|
|
61
61
|
if macro.writer?
|
@@ -299,7 +299,7 @@ module RuboCop
|
|
299
299
|
|
300
300
|
def move_comment_before_block(corrector, comment, block_node, closing_brace)
|
301
301
|
range = block_node.chained? ? end_of_chain(block_node.parent).source_range : closing_brace
|
302
|
-
corrector.remove(range_with_surrounding_space(comment.
|
302
|
+
corrector.remove(range_with_surrounding_space(comment.source_range, side: :right))
|
303
303
|
remove_trailing_whitespace(corrector, range, comment)
|
304
304
|
corrector.insert_after(range, "\n")
|
305
305
|
|
@@ -314,7 +314,7 @@ module RuboCop
|
|
314
314
|
end
|
315
315
|
|
316
316
|
def remove_trailing_whitespace(corrector, range, comment)
|
317
|
-
range_of_trailing = range.end.join(comment.
|
317
|
+
range_of_trailing = range.end.join(comment.source_range.begin)
|
318
318
|
|
319
319
|
corrector.remove(range_of_trailing) if range_of_trailing.source.match?(/\A\s+\z/)
|
320
320
|
end
|
@@ -342,6 +342,7 @@ module RuboCop
|
|
342
342
|
end
|
343
343
|
|
344
344
|
def proper_block_style?(node)
|
345
|
+
return true if require_braces?(node)
|
345
346
|
return special_method_proper_block_style?(node) if special_method?(node.method_name)
|
346
347
|
|
347
348
|
case style
|
@@ -352,6 +353,14 @@ module RuboCop
|
|
352
353
|
end
|
353
354
|
end
|
354
355
|
|
356
|
+
def require_braces?(node)
|
357
|
+
return false unless node.braces?
|
358
|
+
|
359
|
+
node.each_ancestor(:send).any? do |send|
|
360
|
+
send.arithmetic_operation? && node.source_range.end_pos < send.loc.selector.begin_pos
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
355
364
|
def special_method?(method_name)
|
356
365
|
allowed_method?(method_name) ||
|
357
366
|
matches_allowed_pattern?(method_name) ||
|
@@ -11,12 +11,14 @@ module RuboCop
|
|
11
11
|
# so if the original conditional used a different equality operator, the
|
12
12
|
# behavior may be different.
|
13
13
|
#
|
14
|
-
# @example
|
14
|
+
# @example MinBranchesCount: 3 (default)
|
15
15
|
# # bad
|
16
16
|
# if status == :active
|
17
17
|
# perform_action
|
18
18
|
# elsif status == :inactive || status == :hibernating
|
19
19
|
# check_timeout
|
20
|
+
# elsif status == :invalid
|
21
|
+
# report_invalid
|
20
22
|
# else
|
21
23
|
# final_action
|
22
24
|
# end
|
@@ -27,12 +29,27 @@ module RuboCop
|
|
27
29
|
# perform_action
|
28
30
|
# when :inactive, :hibernating
|
29
31
|
# check_timeout
|
32
|
+
# when :invalid
|
33
|
+
# report_invalid
|
34
|
+
# else
|
35
|
+
# final_action
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# @example MinBranchesCount: 4
|
39
|
+
# # good
|
40
|
+
# if status == :active
|
41
|
+
# perform_action
|
42
|
+
# elsif status == :inactive || status == :hibernating
|
43
|
+
# check_timeout
|
44
|
+
# elsif status == :invalid
|
45
|
+
# report_invalid
|
30
46
|
# else
|
31
47
|
# final_action
|
32
48
|
# end
|
33
49
|
#
|
34
50
|
class CaseLikeIf < Base
|
35
51
|
include RangeHelp
|
52
|
+
include MinBranchesCount
|
36
53
|
extend AutoCorrector
|
37
54
|
|
38
55
|
MSG = 'Convert `if-elsif` to `case-when`.'
|
@@ -78,7 +95,7 @@ module RuboCop
|
|
78
95
|
|
79
96
|
def should_check?(node)
|
80
97
|
!node.unless? && !node.elsif? && !node.modifier_form? && !node.ternary? &&
|
81
|
-
node.elsif_conditional?
|
98
|
+
node.elsif_conditional? && min_branches_count?(node)
|
82
99
|
end
|
83
100
|
|
84
101
|
# rubocop:disable Metrics/MethodLength
|
@@ -239,7 +256,7 @@ module RuboCop
|
|
239
256
|
end
|
240
257
|
|
241
258
|
def correction_range(node)
|
242
|
-
range_between(node.parent.loc.keyword.begin_pos, node.
|
259
|
+
range_between(node.parent.loc.keyword.begin_pos, node.source_range.end_pos)
|
243
260
|
end
|
244
261
|
|
245
262
|
# Named captures work with `=~` (if regexp is on lhs) and with `match` (both sides)
|
@@ -11,7 +11,7 @@ module RuboCop
|
|
11
11
|
#
|
12
12
|
# Moving from compact to nested children requires knowledge of whether the
|
13
13
|
# outer parent is a module or a class. Moving from nested to compact requires
|
14
|
-
# verification that the outer parent is defined elsewhere.
|
14
|
+
# verification that the outer parent is defined elsewhere. RuboCop does not
|
15
15
|
# have the knowledge to perform either operation safely and thus requires
|
16
16
|
# manual oversight.
|
17
17
|
#
|