rubocop 1.53.0 → 1.60.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.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +5 -3
- data/config/default.yml +80 -11
- data/config/obsoletion.yml +5 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +10 -5
- data/lib/rubocop/cli.rb +1 -1
- data/lib/rubocop/config.rb +0 -2
- data/lib/rubocop/config_finder.rb +2 -2
- data/lib/rubocop/config_loader.rb +0 -1
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +11 -8
- data/lib/rubocop/config_validator.rb +0 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +3 -1
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -0
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +42 -21
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +53 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -5
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +42 -9
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +26 -3
- data/lib/rubocop/cop/layout/end_alignment.rb +12 -2
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -10
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +22 -7
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +17 -9
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -3
- data/lib/rubocop/cop/layout/redundant_line_break.rb +15 -4
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -4
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +53 -21
- data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +4 -4
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -2
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +18 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/empty_block.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -3
- data/lib/rubocop/cop/lint/float_comparison.rb +10 -0
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -21
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -5
- data/lib/rubocop/cop/lint/number_conversion.rb +9 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +10 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +63 -4
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +14 -8
- data/lib/rubocop/cop/lint/self_assignment.rb +38 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +6 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +5 -3
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
- data/lib/rubocop/cop/lint/useless_assignment.rb +38 -12
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +46 -21
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -3
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +8 -3
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +32 -4
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +16 -12
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +14 -11
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -8
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/string_help.rb +4 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +12 -4
- data/lib/rubocop/cop/naming/constant_name.rb +1 -2
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +4 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +1 -1
- data/lib/rubocop/cop/style/alias.rb +9 -8
- data/lib/rubocop/cop/style/arguments_forwarding.rb +355 -63
- data/lib/rubocop/cop/style/array_first_last.rb +64 -0
- data/lib/rubocop/cop/style/array_intersect.rb +13 -5
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/case_like_if.rb +4 -4
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +7 -0
- data/lib/rubocop/cop/style/collection_compact.rb +7 -6
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +17 -9
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -14
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +1 -1
- data/lib/rubocop/cop/style/format_string.rb +24 -3
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -1
- data/lib/rubocop/cop/style/guard_clause.rb +26 -0
- data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +83 -10
- data/lib/rubocop/cop/style/hash_except.rb +2 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +28 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -5
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +39 -2
- data/lib/rubocop/cop/style/lambda.rb +3 -3
- data/lib/rubocop/cop/style/lambda_call.rb +5 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +3 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +17 -7
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +22 -6
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +2 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +2 -4
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
- data/lib/rubocop/cop/style/next.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +8 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +9 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +9 -1
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -9
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +1 -1
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +93 -5
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -3
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +22 -5
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +10 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +63 -21
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +18 -4
- data/lib/rubocop/cop/style/redundant_return.rb +8 -3
- data/lib/rubocop/cop/style/redundant_self.rb +17 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +5 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +9 -8
- data/lib/rubocop/cop/style/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -1
- data/lib/rubocop/cop/style/return_nil.rb +6 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +23 -9
- data/lib/rubocop/cop/style/sample.rb +2 -1
- data/lib/rubocop/cop/style/select_by_regexp.rb +7 -6
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +8 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +7 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +67 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +76 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +3 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +36 -0
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -2
- data/lib/rubocop/cop/style/yoda_expression.rb +8 -7
- data/lib/rubocop/cop/utils/regexp_ranges.rb +26 -13
- data/lib/rubocop/cop/variable_force/assignment.rb +14 -5
- data/lib/rubocop/cops_documentation_generator.rb +11 -1
- data/lib/rubocop/ext/regexp_node.rb +9 -4
- data/lib/rubocop/file_finder.rb +4 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +17 -6
- data/lib/rubocop/formatter/html_formatter.rb +5 -4
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lsp/routes.rb +42 -19
- data/lib/rubocop/lsp/runtime.rb +22 -2
- data/lib/rubocop/lsp/server.rb +10 -4
- data/lib/rubocop/magic_comment.rb +12 -10
- data/lib/rubocop/options.rb +0 -8
- data/lib/rubocop/result_cache.rb +4 -1
- data/lib/rubocop/rspec/shared_contexts.rb +8 -3
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/runner.rb +6 -4
- data/lib/rubocop/server/client_command/exec.rb +1 -1
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +7 -3
- data/lib/rubocop/target_ruby.rb +9 -5
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +6 -0
- metadata +20 -13
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -6,10 +6,10 @@ module RuboCop
|
|
|
6
6
|
# Checks for places where binary operator has identical operands.
|
|
7
7
|
#
|
|
8
8
|
# It covers arithmetic operators: `-`, `/`, `%`;
|
|
9
|
-
# comparison operators: `==`, `===`, `=~`, `>`, `>=`, `<`,
|
|
9
|
+
# comparison operators: `==`, `===`, `=~`, `>`, `>=`, `<`, ``<=``;
|
|
10
10
|
# bitwise operators: `|`, `^`, `&`;
|
|
11
11
|
# boolean operators: `&&`, `||`
|
|
12
|
-
# and "spaceship" operator -
|
|
12
|
+
# and "spaceship" operator - ``<=>``.
|
|
13
13
|
#
|
|
14
14
|
# Simple arithmetic operations are allowed by this cop: `+`, `*`, `**`, `<<` and `>>`.
|
|
15
15
|
# Although these can be rewritten in a different way, it should not be necessary to
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Lint
|
|
6
|
-
# Checks for overwriting an exception with an exception result by use
|
|
6
|
+
# Checks for overwriting an exception with an exception result by use ``rescue =>``.
|
|
7
7
|
#
|
|
8
8
|
# You intended to write as `rescue StandardError`.
|
|
9
9
|
# However, you have written `rescue => StandardError`.
|
|
@@ -66,12 +66,10 @@ module RuboCop
|
|
|
66
66
|
# end
|
|
67
67
|
class Debugger < Base
|
|
68
68
|
MSG = 'Remove debugger entry point `%<source>s`.'
|
|
69
|
+
BLOCK_TYPES = %i[block numblock kwbegin].freeze
|
|
69
70
|
|
|
70
71
|
def on_send(node)
|
|
71
|
-
return
|
|
72
|
-
|
|
73
|
-
# Basically, debugger methods are not used as a method argument without arguments.
|
|
74
|
-
return if node.arguments.empty? && node.each_ancestor(:send, :csend).any?
|
|
72
|
+
return if !debugger_method?(node) || assumed_usage_context?(node)
|
|
75
73
|
|
|
76
74
|
add_offense(node)
|
|
77
75
|
end
|
|
@@ -95,6 +93,16 @@ module RuboCop
|
|
|
95
93
|
debugger_methods.include?(chained_method_name(send_node))
|
|
96
94
|
end
|
|
97
95
|
|
|
96
|
+
def assumed_usage_context?(node)
|
|
97
|
+
# Basically, debugger methods are not used as a method argument without arguments.
|
|
98
|
+
return false unless node.arguments.empty? && node.each_ancestor(:send, :csend).any?
|
|
99
|
+
return true if assumed_argument?(node)
|
|
100
|
+
|
|
101
|
+
node.each_ancestor.none? do |ancestor|
|
|
102
|
+
BLOCK_TYPES.include?(ancestor.type) || ancestor.lambda_or_proc?
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
98
106
|
def chained_method_name(send_node)
|
|
99
107
|
chained_method_name = send_node.method_name.to_s
|
|
100
108
|
receiver = send_node.receiver
|
|
@@ -105,6 +113,12 @@ module RuboCop
|
|
|
105
113
|
end
|
|
106
114
|
chained_method_name
|
|
107
115
|
end
|
|
116
|
+
|
|
117
|
+
def assumed_argument?(node)
|
|
118
|
+
parent = node.parent
|
|
119
|
+
|
|
120
|
+
parent.call_type? || parent.literal? || parent.pair_type?
|
|
121
|
+
end
|
|
108
122
|
end
|
|
109
123
|
end
|
|
110
124
|
end
|
|
@@ -253,7 +253,7 @@ module RuboCop
|
|
|
253
253
|
# Assume that if a method definition is inside any block call which
|
|
254
254
|
# we can't identify, it could be a DSL
|
|
255
255
|
node.each_ancestor(:block).any? do |ancestor|
|
|
256
|
-
ancestor.
|
|
256
|
+
!ancestor.method?(:class_eval) && !ancestor.class_constructor?
|
|
257
257
|
end
|
|
258
258
|
end
|
|
259
259
|
|
|
@@ -5,7 +5,7 @@ module RuboCop
|
|
|
5
5
|
module Lint
|
|
6
6
|
# Checks for blocks without a body.
|
|
7
7
|
# Such empty blocks are typically an oversight or we should provide a comment
|
|
8
|
-
#
|
|
8
|
+
# to clarify what we're aiming for.
|
|
9
9
|
#
|
|
10
10
|
# Empty lambdas and procs are ignored by default.
|
|
11
11
|
#
|
|
@@ -106,7 +106,7 @@ module RuboCop
|
|
|
106
106
|
private
|
|
107
107
|
|
|
108
108
|
def autocorrect(corrector, node)
|
|
109
|
-
str_arg = node.
|
|
109
|
+
str_arg = node.first_argument.source
|
|
110
110
|
|
|
111
111
|
kwargs = build_kwargs(node)
|
|
112
112
|
overridden_kwargs = override_by_legacy_args(kwargs, node)
|
|
@@ -121,11 +121,11 @@ module RuboCop
|
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
def build_kwargs(node)
|
|
124
|
-
return [nil, nil] unless node.
|
|
124
|
+
return [nil, nil] unless node.last_argument.hash_type?
|
|
125
125
|
|
|
126
126
|
trim_mode_arg, eoutvar_arg = nil
|
|
127
127
|
|
|
128
|
-
node.
|
|
128
|
+
node.last_argument.pairs.each do |pair|
|
|
129
129
|
case pair.key.source
|
|
130
130
|
when 'trim_mode'
|
|
131
131
|
trim_mode_arg = "trim_mode: #{pair.value.source}"
|
|
@@ -18,6 +18,10 @@ module RuboCop
|
|
|
18
18
|
# # good - using BigDecimal
|
|
19
19
|
# x.to_d == 0.1.to_d
|
|
20
20
|
#
|
|
21
|
+
# # good - comparing against zero
|
|
22
|
+
# x == 0.0
|
|
23
|
+
# x != 0.0
|
|
24
|
+
#
|
|
21
25
|
# # good
|
|
22
26
|
# (x - 0.1).abs < Float::EPSILON
|
|
23
27
|
#
|
|
@@ -39,6 +43,8 @@ module RuboCop
|
|
|
39
43
|
|
|
40
44
|
def on_send(node)
|
|
41
45
|
lhs, _method, rhs = *node
|
|
46
|
+
return if literal_zero?(lhs) || literal_zero?(rhs)
|
|
47
|
+
|
|
42
48
|
add_offense(node) if float?(lhs) || float?(rhs)
|
|
43
49
|
end
|
|
44
50
|
|
|
@@ -59,6 +65,10 @@ module RuboCop
|
|
|
59
65
|
end
|
|
60
66
|
end
|
|
61
67
|
|
|
68
|
+
def literal_zero?(node)
|
|
69
|
+
node&.numeric_type? && node.value.zero?
|
|
70
|
+
end
|
|
71
|
+
|
|
62
72
|
# rubocop:disable Metrics/PerceivedComplexity
|
|
63
73
|
def check_send(node)
|
|
64
74
|
if node.arithmetic_operation?
|
|
@@ -35,12 +35,13 @@ module RuboCop
|
|
|
35
35
|
|
|
36
36
|
# @!method id_as_hash_key?(node)
|
|
37
37
|
def_node_matcher :id_as_hash_key?, <<~PATTERN
|
|
38
|
-
(
|
|
38
|
+
(call _ {:key? :has_key? :fetch :[] :[]=} (send _ :object_id) ...)
|
|
39
39
|
PATTERN
|
|
40
40
|
|
|
41
41
|
def on_send(node)
|
|
42
42
|
add_offense(node) if id_as_hash_key?(node)
|
|
43
43
|
end
|
|
44
|
+
alias on_csend on_send
|
|
44
45
|
end
|
|
45
46
|
end
|
|
46
47
|
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Lint
|
|
6
|
+
# Emulates the following Ruby warning in Ruby 3.3.
|
|
7
|
+
#
|
|
8
|
+
# [source,ruby]
|
|
9
|
+
# ----
|
|
10
|
+
# $ ruby -e '0.times { it }'
|
|
11
|
+
# -e:1: warning: `it` calls without arguments will refer to the first block param in Ruby 3.4;
|
|
12
|
+
# use it() or self.it
|
|
13
|
+
# ----
|
|
14
|
+
#
|
|
15
|
+
# `it` calls without arguments will refer to the first block param in Ruby 3.4.
|
|
16
|
+
# So use `it()` or `self.it` to ensure compatibility.
|
|
17
|
+
#
|
|
18
|
+
# @example
|
|
19
|
+
#
|
|
20
|
+
# # bad
|
|
21
|
+
# do_something { it }
|
|
22
|
+
#
|
|
23
|
+
# # good
|
|
24
|
+
# do_something { it() }
|
|
25
|
+
# do_something { self.it }
|
|
26
|
+
#
|
|
27
|
+
class ItWithoutArgumentsInBlock < Base
|
|
28
|
+
include NodePattern::Macros
|
|
29
|
+
|
|
30
|
+
MSG = '`it` calls without arguments will refer to the first block param in Ruby 3.4; ' \
|
|
31
|
+
'use `it()` or `self.it`.'
|
|
32
|
+
|
|
33
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
34
|
+
return unless (body = node.body)
|
|
35
|
+
return unless node.arguments.empty_and_without_delimiters?
|
|
36
|
+
|
|
37
|
+
if body.send_type? && deprecated_it_method?(body)
|
|
38
|
+
add_offense(body)
|
|
39
|
+
else
|
|
40
|
+
body.each_descendant(:send).each do |send_node|
|
|
41
|
+
next unless deprecated_it_method?(send_node)
|
|
42
|
+
|
|
43
|
+
add_offense(send_node)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def deprecated_it_method?(node)
|
|
49
|
+
return false unless node.method?(:it)
|
|
50
|
+
|
|
51
|
+
!node.receiver && node.arguments.empty? && !node.parenthesized? && !node.block_literal?
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Lint
|
|
6
|
+
# Checks for literal assignments in the conditions of `if`, `while`, and `until`.
|
|
7
|
+
# It emulates the following Ruby warning:
|
|
8
|
+
#
|
|
9
|
+
# [source,console]
|
|
10
|
+
# ----
|
|
11
|
+
# $ ruby -we 'if x = true; end'
|
|
12
|
+
# -e:1: warning: found `= literal' in conditional, should be ==
|
|
13
|
+
# ----
|
|
14
|
+
#
|
|
15
|
+
# As a lint cop, it cannot be determined if `==` is appropriate as intended,
|
|
16
|
+
# therefore this cop does not provide autocorrection.
|
|
17
|
+
#
|
|
18
|
+
# @example
|
|
19
|
+
#
|
|
20
|
+
# # bad
|
|
21
|
+
# if x = 42
|
|
22
|
+
# do_something
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# # good
|
|
26
|
+
# if x == 42
|
|
27
|
+
# do_something
|
|
28
|
+
# end
|
|
29
|
+
#
|
|
30
|
+
# # good
|
|
31
|
+
# if x = y
|
|
32
|
+
# do_something
|
|
33
|
+
# end
|
|
34
|
+
#
|
|
35
|
+
class LiteralAssignmentInCondition < Base
|
|
36
|
+
MSG = "Don't use literal assignment `= %<literal>s` in conditional, " \
|
|
37
|
+
'should be `==` or non-literal operand.'
|
|
38
|
+
|
|
39
|
+
def on_if(node)
|
|
40
|
+
traverse_node(node.condition) do |asgn_node|
|
|
41
|
+
next unless asgn_node.loc.operator
|
|
42
|
+
|
|
43
|
+
rhs = asgn_node.to_a.last
|
|
44
|
+
next if !all_literals?(rhs) || parallel_assignment_with_splat_operator?(rhs)
|
|
45
|
+
|
|
46
|
+
range = offense_range(asgn_node, rhs)
|
|
47
|
+
|
|
48
|
+
add_offense(range, message: format(MSG, literal: rhs.source))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
alias on_while on_if
|
|
52
|
+
alias on_until on_if
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def traverse_node(node, &block)
|
|
57
|
+
yield node if AST::Node::EQUALS_ASSIGNMENTS.include?(node.type)
|
|
58
|
+
|
|
59
|
+
node.each_child_node { |child| traverse_node(child, &block) }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def all_literals?(node)
|
|
63
|
+
case node.type
|
|
64
|
+
when :dstr, :xstr
|
|
65
|
+
false
|
|
66
|
+
when :array
|
|
67
|
+
node.values.all? { |value| all_literals?(value) }
|
|
68
|
+
when :hash
|
|
69
|
+
(node.values + node.keys).all? { |item| all_literals?(item) }
|
|
70
|
+
else
|
|
71
|
+
node.respond_to?(:literal?) && node.literal?
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def parallel_assignment_with_splat_operator?(node)
|
|
76
|
+
node.array_type? && node.values.first&.splat_type?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def offense_range(asgn_node, rhs)
|
|
80
|
+
asgn_node.loc.operator.join(rhs.source_range.end)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
|
34
34
|
# interpolation should not be removed if the expanded value
|
|
35
35
|
# contains a space character.
|
|
36
36
|
expanded_value = autocorrected_value(final_node)
|
|
37
|
-
return if in_array_percent_literal?(begin_node) && /\s/.match?(expanded_value)
|
|
37
|
+
return if in_array_percent_literal?(begin_node) && /\s|\A\z/.match?(expanded_value)
|
|
38
38
|
|
|
39
39
|
add_offense(final_node) do |corrector|
|
|
40
40
|
return if final_node.dstr_type? # nested, fixed in next iteration
|
|
@@ -84,6 +84,8 @@ module RuboCop
|
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
def unsafe_range?(range_start, range_end)
|
|
87
|
+
return false if range_start.length != 1 || range_end.length != 1
|
|
88
|
+
|
|
87
89
|
range_for(range_start) != range_for(range_end)
|
|
88
90
|
end
|
|
89
91
|
|
|
@@ -93,7 +95,7 @@ module RuboCop
|
|
|
93
95
|
|
|
94
96
|
def skip_range?(range_start, range_end)
|
|
95
97
|
[range_start, range_end].any? do |bound|
|
|
96
|
-
bound.type
|
|
98
|
+
bound.type != :literal
|
|
97
99
|
end
|
|
98
100
|
end
|
|
99
101
|
|
|
@@ -34,35 +34,20 @@ module RuboCop
|
|
|
34
34
|
add_offense(void_next) if void_next
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
|
-
|
|
38
|
-
def on_numblock(node)
|
|
39
|
-
on_numblock_body_of_reduce(node) do |body|
|
|
40
|
-
void_next = body.each_node(:next).find do |n|
|
|
41
|
-
n.children.empty? && parent_numblock_node(n) == node
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
add_offense(void_next) if void_next
|
|
45
|
-
end
|
|
46
|
-
end
|
|
37
|
+
alias on_numblock on_block
|
|
47
38
|
|
|
48
39
|
private
|
|
49
40
|
|
|
50
41
|
# @!method on_block_body_of_reduce(node)
|
|
51
42
|
def_node_matcher :on_block_body_of_reduce, <<~PATTERN
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def_node_matcher :on_numblock_body_of_reduce, <<~PATTERN
|
|
57
|
-
(numblock (send _recv {:reduce :inject} !sym) _argscount $(begin ...))
|
|
43
|
+
{
|
|
44
|
+
(block (call _recv {:reduce :inject} !sym) _blockargs $(begin ...))
|
|
45
|
+
(numblock (call _recv {:reduce :inject} !sym) _argscount $(begin ...))
|
|
46
|
+
}
|
|
58
47
|
PATTERN
|
|
59
48
|
|
|
60
49
|
def parent_block_node(node)
|
|
61
|
-
node.each_ancestor(:block).first
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def parent_numblock_node(node)
|
|
65
|
-
node.each_ancestor(:numblock).first
|
|
50
|
+
node.each_ancestor(:block, :numblock).first
|
|
66
51
|
end
|
|
67
52
|
end
|
|
68
53
|
end
|
|
@@ -43,7 +43,6 @@ module RuboCop
|
|
|
43
43
|
#
|
|
44
44
|
class NonAtomicFileOperation < Base
|
|
45
45
|
extend AutoCorrector
|
|
46
|
-
include Alignment
|
|
47
46
|
|
|
48
47
|
MSG_REMOVE_FILE_EXIST_CHECK = 'Remove unnecessary existence check ' \
|
|
49
48
|
'`%<receiver>s.%<method_name>s`.'
|
|
@@ -51,18 +50,20 @@ module RuboCop
|
|
|
51
50
|
MAKE_FORCE_METHODS = %i[makedirs mkdir_p mkpath].freeze
|
|
52
51
|
MAKE_METHODS = %i[mkdir].freeze
|
|
53
52
|
REMOVE_FORCE_METHODS = %i[rm_f rm_rf].freeze
|
|
54
|
-
REMOVE_METHODS = %i[remove
|
|
55
|
-
|
|
56
|
-
RESTRICT_ON_SEND = (
|
|
57
|
-
|
|
53
|
+
REMOVE_METHODS = %i[remove delete unlink remove_file rm rmdir safe_unlink].freeze
|
|
54
|
+
RECURSIVE_REMOVE_METHODS = %i[remove_dir remove_entry remove_entry_secure].freeze
|
|
55
|
+
RESTRICT_ON_SEND = (
|
|
56
|
+
MAKE_METHODS + MAKE_FORCE_METHODS + REMOVE_METHODS + RECURSIVE_REMOVE_METHODS +
|
|
57
|
+
REMOVE_FORCE_METHODS
|
|
58
|
+
).freeze
|
|
58
59
|
|
|
59
60
|
# @!method send_exist_node(node)
|
|
60
|
-
def_node_search :send_exist_node,
|
|
61
|
+
def_node_search :send_exist_node, <<~PATTERN
|
|
61
62
|
$(send (const nil? {:FileTest :File :Dir :Shell}) {:exist? :exists?} ...)
|
|
62
63
|
PATTERN
|
|
63
64
|
|
|
64
65
|
# @!method receiver_and_method_name(node)
|
|
65
|
-
def_node_matcher :receiver_and_method_name,
|
|
66
|
+
def_node_matcher :receiver_and_method_name, <<~PATTERN
|
|
66
67
|
(send (const nil? $_) $_ ...)
|
|
67
68
|
PATTERN
|
|
68
69
|
|
|
@@ -140,6 +141,8 @@ module RuboCop
|
|
|
140
141
|
'mkdir_p'
|
|
141
142
|
elsif REMOVE_METHODS.include?(node.method_name)
|
|
142
143
|
'rm_f'
|
|
144
|
+
elsif RECURSIVE_REMOVE_METHODS.include?(node.method_name)
|
|
145
|
+
'rm_rf'
|
|
143
146
|
else
|
|
144
147
|
node.method_name
|
|
145
148
|
end
|
|
@@ -94,7 +94,7 @@ module RuboCop
|
|
|
94
94
|
parent_node = node.parent
|
|
95
95
|
|
|
96
96
|
add_offense(parent_node) do |corrector|
|
|
97
|
-
if parent_node.
|
|
97
|
+
if parent_node.last_argument&.block_pass_type?
|
|
98
98
|
correct_block_pass(corrector, parent_node)
|
|
99
99
|
else
|
|
100
100
|
correct_block(corrector, parent_node)
|
|
@@ -116,7 +116,7 @@ module RuboCop
|
|
|
116
116
|
|
|
117
117
|
def correct_block_pass(corrector, node)
|
|
118
118
|
if unsorted_dir_glob_pass?(node)
|
|
119
|
-
block_arg = node.
|
|
119
|
+
block_arg = node.last_argument
|
|
120
120
|
|
|
121
121
|
corrector.remove(last_arg_range(node))
|
|
122
122
|
corrector.insert_after(node, ".sort.each(#{block_arg.source})")
|
|
@@ -130,9 +130,7 @@ module RuboCop
|
|
|
130
130
|
# @return [Parser::Source::Range]
|
|
131
131
|
#
|
|
132
132
|
def last_arg_range(node)
|
|
133
|
-
node.
|
|
134
|
-
begin_pos: node.arguments[-2].source_range.end_pos
|
|
135
|
-
)
|
|
133
|
+
node.last_argument.source_range.with(begin_pos: node.arguments[-2].source_range.end_pos)
|
|
136
134
|
end
|
|
137
135
|
|
|
138
136
|
def unsorted_dir_loop?(node)
|
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
|
9
9
|
#
|
|
10
10
|
# Conversion with `Integer`, `Float`, etc. will raise an `ArgumentError`
|
|
11
11
|
# if given input that is not numeric (eg. an empty string), whereas
|
|
12
|
-
# `to_i`, etc. will try to convert regardless of input (
|
|
12
|
+
# `to_i`, etc. will try to convert regardless of input (``''.to_i => 0``).
|
|
13
13
|
# As such, this cop is disabled by default because it's not necessarily
|
|
14
14
|
# always correct to raise if a value is not numeric.
|
|
15
15
|
#
|
|
@@ -91,19 +91,24 @@ module RuboCop
|
|
|
91
91
|
|
|
92
92
|
# @!method to_method(node)
|
|
93
93
|
def_node_matcher :to_method, <<~PATTERN
|
|
94
|
-
(
|
|
94
|
+
(call $_ ${#{METHODS}})
|
|
95
95
|
PATTERN
|
|
96
96
|
|
|
97
97
|
# @!method to_method_symbol(node)
|
|
98
98
|
def_node_matcher :to_method_symbol, <<~PATTERN
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
(call _ $_ ${
|
|
100
|
+
{
|
|
101
|
+
(sym ${#{METHODS}})
|
|
102
|
+
(block_pass (sym ${#{METHODS}}))
|
|
103
|
+
}
|
|
104
|
+
} ...)
|
|
101
105
|
PATTERN
|
|
102
106
|
|
|
103
107
|
def on_send(node)
|
|
104
108
|
handle_conversion_method(node)
|
|
105
109
|
handle_as_symbol(node)
|
|
106
110
|
end
|
|
111
|
+
alias on_csend on_send
|
|
107
112
|
|
|
108
113
|
private
|
|
109
114
|
|
|
@@ -5,6 +5,14 @@ module RuboCop
|
|
|
5
5
|
module Lint
|
|
6
6
|
# Checks for redundant quantifiers inside Regexp literals.
|
|
7
7
|
#
|
|
8
|
+
# It is always allowed when interpolation is used in a regexp literal,
|
|
9
|
+
# because it's unknown what kind of string will be expanded as a result:
|
|
10
|
+
#
|
|
11
|
+
# [source,ruby]
|
|
12
|
+
# ----
|
|
13
|
+
# /(?:a*#{interpolation})?/x
|
|
14
|
+
# ----
|
|
15
|
+
#
|
|
8
16
|
# @example
|
|
9
17
|
# # bad
|
|
10
18
|
# /(?:x+)+/
|
|
@@ -32,6 +40,8 @@ module RuboCop
|
|
|
32
40
|
'with a single `%<replacement>s`.'
|
|
33
41
|
|
|
34
42
|
def on_regexp(node)
|
|
43
|
+
return if node.interpolation?
|
|
44
|
+
|
|
35
45
|
each_redundantly_quantified_pair(node) do |group, child|
|
|
36
46
|
replacement = merged_quantifier(group, child)
|
|
37
47
|
add_offense(
|
|
@@ -24,6 +24,10 @@ module RuboCop
|
|
|
24
24
|
#
|
|
25
25
|
# This cop target those features.
|
|
26
26
|
#
|
|
27
|
+
# @safety
|
|
28
|
+
# This cop's autocorrection is unsafe because if `require 'pp'` is removed from one file,
|
|
29
|
+
# `NameError` can be encountered when another file uses `PP.pp`.
|
|
30
|
+
#
|
|
27
31
|
# @example
|
|
28
32
|
# # bad
|
|
29
33
|
# require 'unloaded_feature'
|
|
@@ -4,8 +4,12 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Lint
|
|
6
6
|
# Checks for redundant safe navigation calls.
|
|
7
|
-
#
|
|
8
|
-
#
|
|
7
|
+
# Use cases where a constant, named in camel case for classes and modules is `nil` are rare,
|
|
8
|
+
# and an offense is not detected when the receiver is a snake case constant.
|
|
9
|
+
#
|
|
10
|
+
# For all receivers, the `instance_of?`, `kind_of?`, `is_a?`, `eql?`, `respond_to?`,
|
|
11
|
+
# and `equal?` methods are checked by default.
|
|
12
|
+
# These are customizable with `AllowedMethods` option.
|
|
9
13
|
#
|
|
10
14
|
# The `AllowedMethods` option specifies nil-safe methods,
|
|
11
15
|
# in other words, it is a method that is allowed to skip safe navigation.
|
|
@@ -22,6 +26,9 @@ module RuboCop
|
|
|
22
26
|
#
|
|
23
27
|
# @example
|
|
24
28
|
# # bad
|
|
29
|
+
# CamelCaseConst&.do_something
|
|
30
|
+
#
|
|
31
|
+
# # bad
|
|
25
32
|
# do_something if attrs&.respond_to?(:[])
|
|
26
33
|
#
|
|
27
34
|
# # good
|
|
@@ -33,6 +40,9 @@ module RuboCop
|
|
|
33
40
|
# end
|
|
34
41
|
#
|
|
35
42
|
# # good
|
|
43
|
+
# CamelCaseConst.do_something
|
|
44
|
+
#
|
|
45
|
+
# # good
|
|
36
46
|
# while node.is_a?(BeginNode)
|
|
37
47
|
# node = node.parent
|
|
38
48
|
# end
|
|
@@ -40,6 +50,22 @@ module RuboCop
|
|
|
40
50
|
# # good - without `&.` this will always return `true`
|
|
41
51
|
# foo&.respond_to?(:to_a)
|
|
42
52
|
#
|
|
53
|
+
# # bad - for `nil`s conversion methods return default values for the type
|
|
54
|
+
# foo&.to_h || {}
|
|
55
|
+
# foo&.to_h { |k, v| [k, v] } || {}
|
|
56
|
+
# foo&.to_a || []
|
|
57
|
+
# foo&.to_i || 0
|
|
58
|
+
# foo&.to_f || 0.0
|
|
59
|
+
# foo&.to_s || ''
|
|
60
|
+
#
|
|
61
|
+
# # good
|
|
62
|
+
# foo.to_h
|
|
63
|
+
# foo.to_h { |k, v| [k, v] }
|
|
64
|
+
# foo.to_a
|
|
65
|
+
# foo.to_i
|
|
66
|
+
# foo.to_f
|
|
67
|
+
# foo.to_s
|
|
68
|
+
#
|
|
43
69
|
# @example AllowedMethods: [nil_safe_method]
|
|
44
70
|
# # bad
|
|
45
71
|
# do_something if attrs&.nil_safe_method(:[])
|
|
@@ -54,22 +80,55 @@ module RuboCop
|
|
|
54
80
|
extend AutoCorrector
|
|
55
81
|
|
|
56
82
|
MSG = 'Redundant safe navigation detected.'
|
|
83
|
+
MSG_LITERAL = 'Redundant safe navigation with default literal detected.'
|
|
57
84
|
|
|
58
85
|
NIL_SPECIFIC_METHODS = (nil.methods - Object.new.methods).to_set.freeze
|
|
59
86
|
|
|
87
|
+
SNAKE_CASE = /\A[[:digit:][:upper:]_]+\z/.freeze
|
|
88
|
+
|
|
60
89
|
# @!method respond_to_nil_specific_method?(node)
|
|
61
90
|
def_node_matcher :respond_to_nil_specific_method?, <<~PATTERN
|
|
62
91
|
(csend _ :respond_to? (sym %NIL_SPECIFIC_METHODS))
|
|
63
92
|
PATTERN
|
|
64
93
|
|
|
94
|
+
# @!method conversion_with_default?(node)
|
|
95
|
+
def_node_matcher :conversion_with_default?, <<~PATTERN
|
|
96
|
+
{
|
|
97
|
+
(or $(csend _ :to_h) (hash))
|
|
98
|
+
(or (block $(csend _ :to_h) ...) (hash))
|
|
99
|
+
(or $(csend _ :to_a) (array))
|
|
100
|
+
(or $(csend _ :to_i) (int 0))
|
|
101
|
+
(or $(csend _ :to_f) (float 0.0))
|
|
102
|
+
(or $(csend _ :to_s) (str empty?))
|
|
103
|
+
}
|
|
104
|
+
PATTERN
|
|
105
|
+
|
|
106
|
+
# rubocop:disable Metrics/AbcSize
|
|
65
107
|
def on_csend(node)
|
|
66
|
-
|
|
67
|
-
|
|
108
|
+
unless node.receiver.const_type? && !node.receiver.source.match?(SNAKE_CASE)
|
|
109
|
+
return unless check?(node) && allowed_method?(node.method_name)
|
|
110
|
+
return if respond_to_nil_specific_method?(node)
|
|
111
|
+
end
|
|
68
112
|
|
|
69
113
|
range = range_between(node.loc.dot.begin_pos, node.source_range.end_pos)
|
|
70
114
|
add_offense(range) { |corrector| corrector.replace(node.loc.dot, '.') }
|
|
71
115
|
end
|
|
72
116
|
|
|
117
|
+
def on_or(node)
|
|
118
|
+
conversion_with_default?(node) do |send_node|
|
|
119
|
+
range = range_between(send_node.loc.dot.begin_pos, node.source_range.end_pos)
|
|
120
|
+
|
|
121
|
+
add_offense(range, message: MSG_LITERAL) do |corrector|
|
|
122
|
+
corrector.replace(send_node.loc.dot, '.')
|
|
123
|
+
|
|
124
|
+
range_with_default = range_between(node.lhs.source_range.end.begin_pos,
|
|
125
|
+
node.source_range.end.end_pos)
|
|
126
|
+
corrector.remove(range_with_default)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
# rubocop:enable Metrics/AbcSize
|
|
131
|
+
|
|
73
132
|
private
|
|
74
133
|
|
|
75
134
|
def check?(node)
|
|
@@ -56,10 +56,10 @@ module RuboCop
|
|
|
56
56
|
def_node_matcher :redundant_with_index?, <<~PATTERN
|
|
57
57
|
{
|
|
58
58
|
(block
|
|
59
|
-
$(
|
|
59
|
+
$(call _ {:each_with_index :with_index} ...)
|
|
60
60
|
(args (arg _)) ...)
|
|
61
61
|
(numblock
|
|
62
|
-
$(
|
|
62
|
+
$(call _ {:each_with_index :with_index} ...) 1 ...)
|
|
63
63
|
}
|
|
64
64
|
PATTERN
|
|
65
65
|
|
|
@@ -56,9 +56,9 @@ module RuboCop
|
|
|
56
56
|
def_node_matcher :redundant_with_object?, <<~PATTERN
|
|
57
57
|
{
|
|
58
58
|
(block
|
|
59
|
-
$(
|
|
59
|
+
$(call _ {:each_with_object :with_object} _) (args (arg _)) ...)
|
|
60
60
|
(numblock
|
|
61
|
-
$(
|
|
61
|
+
$(call _ {:each_with_object :with_object} _) 1 ...)
|
|
62
62
|
}
|
|
63
63
|
PATTERN
|
|
64
64
|
|