rubocop 1.50.2 → 1.59.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/README.md +5 -3
- data/config/default.yml +153 -16
- data/config/obsoletion.yml +5 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +10 -5
- data/lib/rubocop/cli/command/lsp.rb +19 -0
- data/lib/rubocop/cli.rb +4 -1
- data/lib/rubocop/config.rb +4 -0
- data/lib/rubocop/config_finder.rb +2 -2
- data/lib/rubocop/config_loader_resolver.rb +4 -3
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +13 -10
- data/lib/rubocop/cop/autocorrect_logic.rb +3 -1
- data/lib/rubocop/cop/base.rb +6 -2
- 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 +3 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +2 -2
- data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/gemspec/dependency_version.rb +2 -2
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- 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/cop_description.rb +32 -8
- 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 +7 -7
- 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/class_structure.rb +7 -0
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -2
- 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 +27 -4
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +7 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -10
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +6 -6
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -4
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +3 -3
- 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 +16 -5
- 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_block_braces.rb +2 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
- 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 +19 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +46 -19
- data/lib/rubocop/cop/lint/empty_block.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +6 -7
- 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/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
- data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +78 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +34 -5
- data/lib/rubocop/cop/lint/mixed_case_range.rb +111 -0
- 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 +14 -4
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +12 -3
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +63 -4
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- 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/send_with_mixin_argument.rb +1 -2
- data/lib/rubocop/cop/lint/shadowed_exception.rb +5 -11
- 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 +2 -2
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +5 -3
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- 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 +94 -10
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +92 -11
- 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/abc_size_calculator.rb +1 -2
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +32 -4
- data/lib/rubocop/cop/migration/department_name.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +19 -11
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.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/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -8
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- 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 +3 -3
- data/lib/rubocop/cop/naming/constant_name.rb +2 -3
- 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 +26 -11
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -3
- data/lib/rubocop/cop/naming/variable_name.rb +6 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +6 -2
- data/lib/rubocop/cop/style/alias.rb +9 -8
- data/lib/rubocop/cop/style/arguments_forwarding.rb +342 -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/attr.rb +11 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/begin_block.rb +1 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +5 -4
- data/lib/rubocop/cop/style/case_like_if.rb +4 -4
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +24 -39
- data/lib/rubocop/cop/style/collection_compact.rb +22 -11
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
- data/lib/rubocop/cop/style/combinable_loops.rb +36 -8
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
- data/lib/rubocop/cop/style/copyright.rb +5 -2
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/dir_empty.rb +8 -14
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- 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 +8 -8
- data/lib/rubocop/cop/style/exact_regexp_match.rb +69 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/file_read.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 +28 -0
- data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +84 -32
- data/lib/rubocop/cop/style/hash_except.rb +21 -9
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +31 -5
- data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -0
- 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 +10 -6
- 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 +10 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +12 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
- 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_literals.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/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +9 -3
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +10 -2
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +38 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +93 -5
- 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 +118 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +9 -3
- data/lib/rubocop/cop/style/redundant_parentheses.rb +54 -21
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +100 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -1
- 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 +8 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -1
- data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
- data/lib/rubocop/cop/style/require_order.rb +11 -5
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
- data/lib/rubocop/cop/style/return_nil.rb +6 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +95 -0
- data/lib/rubocop/cop/style/sample.rb +2 -1
- data/lib/rubocop/cop/style/select_by_regexp.rb +22 -11
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +20 -4
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- 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/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +6 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +3 -4
- 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/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -2
- data/lib/rubocop/cop/style/yoda_expression.rb +8 -7
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/regexp_ranges.rb +113 -0
- data/lib/rubocop/cop/variable_force/assignment.rb +45 -4
- data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
- data/lib/rubocop/cop/variable_force.rb +1 -0
- data/lib/rubocop/cops_documentation_generator.rb +1 -1
- data/lib/rubocop/ext/regexp_parser.rb +4 -1
- data/lib/rubocop/file_finder.rb +4 -7
- data/lib/rubocop/formatter/html_formatter.rb +5 -4
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/lsp/logger.rb +22 -0
- data/lib/rubocop/lsp/routes.rb +246 -0
- data/lib/rubocop/lsp/runtime.rb +99 -0
- data/lib/rubocop/lsp/server.rb +68 -0
- data/lib/rubocop/lsp/severity.rb +27 -0
- data/lib/rubocop/magic_comment.rb +12 -10
- data/lib/rubocop/options.rb +11 -1
- data/lib/rubocop/result_cache.rb +5 -2
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +2 -3
- data/lib/rubocop/runner.rb +6 -4
- data/lib/rubocop/server/cache.rb +1 -0
- data/lib/rubocop/server/client_command/exec.rb +3 -2
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +7 -3
- data/lib/rubocop/target_ruby.rb +12 -7
- data/lib/rubocop/version.rb +10 -6
- data/lib/rubocop.rb +19 -0
- metadata +54 -15
@@ -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
|
#
|
@@ -74,6 +74,7 @@ module RuboCop
|
|
74
74
|
extend AutoCorrector
|
75
75
|
include AllowedMethods
|
76
76
|
include AllowedPattern
|
77
|
+
include IgnoredNode
|
77
78
|
|
78
79
|
CONVERSION_METHOD_CLASS_MAPPING = {
|
79
80
|
to_i: "#{Integer.name}(%<number_object>s, 10)",
|
@@ -90,19 +91,24 @@ module RuboCop
|
|
90
91
|
|
91
92
|
# @!method to_method(node)
|
92
93
|
def_node_matcher :to_method, <<~PATTERN
|
93
|
-
(
|
94
|
+
(call $_ ${#{METHODS}})
|
94
95
|
PATTERN
|
95
96
|
|
96
97
|
# @!method to_method_symbol(node)
|
97
98
|
def_node_matcher :to_method_symbol, <<~PATTERN
|
98
|
-
|
99
|
-
|
99
|
+
(call _ $_ ${
|
100
|
+
{
|
101
|
+
(sym ${#{METHODS}})
|
102
|
+
(block_pass (sym ${#{METHODS}}))
|
103
|
+
}
|
104
|
+
} ...)
|
100
105
|
PATTERN
|
101
106
|
|
102
107
|
def on_send(node)
|
103
108
|
handle_conversion_method(node)
|
104
109
|
handle_as_symbol(node)
|
105
110
|
end
|
111
|
+
alias on_csend on_send
|
106
112
|
|
107
113
|
private
|
108
114
|
|
@@ -116,7 +122,11 @@ module RuboCop
|
|
116
122
|
corrected_method: correct_method(node, receiver)
|
117
123
|
)
|
118
124
|
add_offense(node, message: message) do |corrector|
|
125
|
+
next if part_of_ignored_node?(node)
|
126
|
+
|
119
127
|
corrector.replace(node, correct_method(node, node.receiver))
|
128
|
+
|
129
|
+
ignore_node(node)
|
120
130
|
end
|
121
131
|
end
|
122
132
|
end
|
@@ -6,13 +6,13 @@ module RuboCop
|
|
6
6
|
# Checks for uses of numbered parameter assignment.
|
7
7
|
# It emulates the following warning in Ruby 2.7:
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# $ ruby -ve '_1 = :value'
|
10
10
|
# ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin19]
|
11
11
|
# -e:1: warning: `_1' is reserved for numbered parameter; consider another name
|
12
12
|
#
|
13
13
|
# Assigning to a numbered parameter (from `_1` to `_9`) causes an error in Ruby 3.0.
|
14
14
|
#
|
15
|
-
#
|
15
|
+
# $ ruby -ve '_1 = :value'
|
16
16
|
# ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin19]
|
17
17
|
# -e:1: _1 is reserved for numbered parameter
|
18
18
|
#
|
@@ -65,13 +65,13 @@ module RuboCop
|
|
65
65
|
def on_when(node)
|
66
66
|
regexp_conditions = node.conditions.select(&:regexp_type?)
|
67
67
|
|
68
|
-
@valid_ref = regexp_conditions.
|
68
|
+
@valid_ref = regexp_conditions.filter_map { |condition| check_regexp(condition) }.max
|
69
69
|
end
|
70
70
|
|
71
71
|
def on_in_pattern(node)
|
72
72
|
regexp_patterns = regexp_patterns(node)
|
73
73
|
|
74
|
-
@valid_ref = regexp_patterns.
|
74
|
+
@valid_ref = regexp_patterns.filter_map { |pattern| check_regexp(pattern) }.max
|
75
75
|
end
|
76
76
|
|
77
77
|
def on_nth_ref(node)
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Checks for redundant quantifiers inside Regexp literals.
|
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
|
+
#
|
16
|
+
# @example
|
17
|
+
# # bad
|
18
|
+
# /(?:x+)+/
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# /(?:x)+/
|
22
|
+
#
|
23
|
+
# # good
|
24
|
+
# /(?:x+)/
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# /(?:x+)?/
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# /(?:x)*/
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# /(?:x*)/
|
34
|
+
class RedundantRegexpQuantifiers < Base
|
35
|
+
include RangeHelp
|
36
|
+
extend AutoCorrector
|
37
|
+
|
38
|
+
MSG_REDUNDANT_QUANTIFIER = 'Replace redundant quantifiers ' \
|
39
|
+
'`%<inner_quantifier>s` and `%<outer_quantifier>s` ' \
|
40
|
+
'with a single `%<replacement>s`.'
|
41
|
+
|
42
|
+
def on_regexp(node)
|
43
|
+
return if node.interpolation?
|
44
|
+
|
45
|
+
each_redundantly_quantified_pair(node) do |group, child|
|
46
|
+
replacement = merged_quantifier(group, child)
|
47
|
+
add_offense(
|
48
|
+
quantifier_range(group, child),
|
49
|
+
message: message(group, child, replacement)
|
50
|
+
) do |corrector|
|
51
|
+
# drop outer quantifier
|
52
|
+
corrector.replace(group.loc.quantifier, '')
|
53
|
+
# replace inner quantifier
|
54
|
+
corrector.replace(child.loc.quantifier, replacement)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def each_redundantly_quantified_pair(node)
|
62
|
+
seen = Set.new
|
63
|
+
node.parsed_tree&.each_expression do |(expr)|
|
64
|
+
next if seen.include?(expr) || !redundant_group?(expr) || !mergeable_quantifier(expr)
|
65
|
+
|
66
|
+
expr.each_expression do |(subexp)|
|
67
|
+
seen << subexp
|
68
|
+
break unless redundantly_quantifiable?(subexp)
|
69
|
+
|
70
|
+
yield(expr, subexp) if mergeable_quantifier(subexp)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def redundant_group?(expr)
|
76
|
+
expr.is?(:passive, :group) && expr.count { |child| child.type != :free_space } == 1
|
77
|
+
end
|
78
|
+
|
79
|
+
def redundantly_quantifiable?(node)
|
80
|
+
redundant_group?(node) || character_set?(node) || node.terminal?
|
81
|
+
end
|
82
|
+
|
83
|
+
def character_set?(expr)
|
84
|
+
expr.is?(:character, :set)
|
85
|
+
end
|
86
|
+
|
87
|
+
def mergeable_quantifier(expr)
|
88
|
+
# Merging reluctant or possessive quantifiers would be more complex,
|
89
|
+
# and Ruby does not emit warnings for these cases.
|
90
|
+
return unless expr.quantifier&.greedy?
|
91
|
+
|
92
|
+
# normalize quantifiers, e.g. "{1,}" => "+"
|
93
|
+
case expr.quantity
|
94
|
+
when [0, -1]
|
95
|
+
'*'
|
96
|
+
when [0, 1]
|
97
|
+
'?'
|
98
|
+
when [1, -1]
|
99
|
+
'+'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def merged_quantifier(exp1, exp2)
|
104
|
+
quantifier1 = mergeable_quantifier(exp1)
|
105
|
+
quantifier2 = mergeable_quantifier(exp2)
|
106
|
+
if quantifier1 == quantifier2
|
107
|
+
# (?:a+)+ equals (?:a+) ; (?:a*)* equals (?:a*) ; # (?:a?)? equals (?:a?)
|
108
|
+
quantifier1
|
109
|
+
else
|
110
|
+
# (?:a+)*, (?:a+)?, (?:a*)+, (?:a*)?, (?:a?)+, (?:a?)* - all equal (?:a*)
|
111
|
+
'*'
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def quantifier_range(group, child)
|
116
|
+
range_between(child.loc.quantifier.begin_pos, group.loc.quantifier.end_pos)
|
117
|
+
end
|
118
|
+
|
119
|
+
def message(group, child, replacement)
|
120
|
+
format(
|
121
|
+
MSG_REDUNDANT_QUANTIFIER,
|
122
|
+
inner_quantifier: child.quantifier.to_s,
|
123
|
+
outer_quantifier: group.quantifier.to_s,
|
124
|
+
replacement: replacement
|
125
|
+
)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -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'
|
@@ -49,6 +53,11 @@ module RuboCop
|
|
49
53
|
(str #redundant_feature?))
|
50
54
|
PATTERN
|
51
55
|
|
56
|
+
# @!method pp_const?(node)
|
57
|
+
def_node_matcher :pp_const?, <<~PATTERN
|
58
|
+
(const {nil? cbase} :PP)
|
59
|
+
PATTERN
|
60
|
+
|
52
61
|
def on_send(node)
|
53
62
|
return unless redundant_require_statement?(node)
|
54
63
|
|
@@ -72,16 +81,16 @@ module RuboCop
|
|
72
81
|
feature_name == 'enumerator' ||
|
73
82
|
(target_ruby_version >= 2.1 && feature_name == 'thread') ||
|
74
83
|
(target_ruby_version >= 2.2 && RUBY_22_LOADED_FEATURES.include?(feature_name)) ||
|
75
|
-
(target_ruby_version >= 2.5 && feature_name == 'pp' && !
|
84
|
+
(target_ruby_version >= 2.5 && feature_name == 'pp' && !need_to_require_pp?) ||
|
76
85
|
(target_ruby_version >= 2.7 && feature_name == 'ruby2_keywords') ||
|
77
86
|
(target_ruby_version >= 3.1 && feature_name == 'fiber') ||
|
78
87
|
(target_ruby_version >= 3.2 && feature_name == 'set')
|
79
88
|
end
|
80
89
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
81
90
|
|
82
|
-
def
|
91
|
+
def need_to_require_pp?
|
83
92
|
processed_source.ast.each_descendant(:send).any? do |node|
|
84
|
-
PRETTY_PRINT_METHODS.include?(node.method_name)
|
93
|
+
pp_const?(node.receiver) || PRETTY_PRINT_METHODS.include?(node.method_name)
|
85
94
|
end
|
86
95
|
end
|
87
96
|
end
|
@@ -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
|
|
@@ -45,10 +45,9 @@ module RuboCop
|
|
45
45
|
bad_method?(node) do |safe_nav, method|
|
46
46
|
return if nil_methods.include?(method) || PLUS_MINUS_METHODS.include?(node.method_name)
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
node.source_range.end_pos)
|
48
|
+
begin_range = node.loc.dot || safe_nav.source_range.end
|
49
|
+
location = begin_range.join(node.source_range.end)
|
50
|
+
|
52
51
|
add_offense(location) do |corrector|
|
53
52
|
autocorrect(corrector, offense_range: location, send_node: node)
|
54
53
|
end
|
@@ -82,16 +81,23 @@ module RuboCop
|
|
82
81
|
def autocorrect(corrector, offense_range:, send_node:)
|
83
82
|
corrector.replace(
|
84
83
|
offense_range,
|
85
|
-
add_safe_navigation_operator(
|
86
|
-
offense_range: offense_range,
|
87
|
-
send_node: send_node
|
88
|
-
)
|
84
|
+
add_safe_navigation_operator(offense_range: offense_range, send_node: send_node)
|
89
85
|
)
|
86
|
+
|
87
|
+
corrector.wrap(send_node, '(', ')') if require_parentheses?(send_node)
|
90
88
|
end
|
91
89
|
|
92
90
|
def brackets?(send_node)
|
93
91
|
send_node.method?(:[]) || send_node.method?(:[]=)
|
94
92
|
end
|
93
|
+
|
94
|
+
def require_parentheses?(send_node)
|
95
|
+
return false unless send_node.comparison_method?
|
96
|
+
return false unless (node = send_node.parent)
|
97
|
+
|
98
|
+
(node.respond_to?(:logical_operator?) && node.logical_operator?) ||
|
99
|
+
(node.respond_to?(:comparison_method?) && node.comparison_method?)
|
100
|
+
end
|
95
101
|
end
|
96
102
|
end
|
97
103
|
end
|
@@ -10,11 +10,18 @@ module RuboCop
|
|
10
10
|
# foo = foo
|
11
11
|
# foo, bar = foo, bar
|
12
12
|
# Foo = Foo
|
13
|
+
# hash['foo'] = hash['foo']
|
14
|
+
# obj.attr = obj.attr
|
13
15
|
#
|
14
16
|
# # good
|
15
17
|
# foo = bar
|
16
18
|
# foo, bar = bar, foo
|
17
19
|
# Foo = Bar
|
20
|
+
# hash['foo'] = hash['bar']
|
21
|
+
# obj.attr = obj.attr2
|
22
|
+
#
|
23
|
+
# # good (method calls possibly can return different results)
|
24
|
+
# hash[foo] = hash[foo]
|
18
25
|
#
|
19
26
|
class SelfAssignment < Base
|
20
27
|
MSG = 'Self-assignment detected.'
|
@@ -26,6 +33,15 @@ module RuboCop
|
|
26
33
|
gvasgn: :gvar
|
27
34
|
}.freeze
|
28
35
|
|
36
|
+
def on_send(node)
|
37
|
+
if node.method?(:[]=)
|
38
|
+
handle_key_assignment(node) if node.arguments.size == 2
|
39
|
+
elsif node.assignment_method?
|
40
|
+
handle_attribute_assignment(node) if node.arguments.size == 1
|
41
|
+
end
|
42
|
+
end
|
43
|
+
alias on_csend on_send
|
44
|
+
|
29
45
|
def on_lvasgn(node)
|
30
46
|
lhs, rhs = *node
|
31
47
|
return unless rhs
|
@@ -72,6 +88,28 @@ module RuboCop
|
|
72
88
|
rhs.type == ASSIGNMENT_TYPE_TO_RHS_TYPE[lhs.type] &&
|
73
89
|
rhs.children.first == lhs.children.first
|
74
90
|
end
|
91
|
+
|
92
|
+
def handle_key_assignment(node)
|
93
|
+
value_node = node.arguments[1]
|
94
|
+
|
95
|
+
if value_node.send_type? && value_node.method?(:[]) &&
|
96
|
+
node.receiver == value_node.receiver &&
|
97
|
+
!node.first_argument.call_type? &&
|
98
|
+
node.first_argument == value_node.first_argument
|
99
|
+
add_offense(node)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def handle_attribute_assignment(node)
|
104
|
+
first_argument = node.first_argument
|
105
|
+
return unless first_argument.respond_to?(:arguments) && first_argument.arguments.empty?
|
106
|
+
|
107
|
+
if first_argument.call_type? &&
|
108
|
+
node.receiver == first_argument.receiver &&
|
109
|
+
first_argument.method_name.to_s == node.method_name.to_s.delete_suffix('=')
|
110
|
+
add_offense(node)
|
111
|
+
end
|
112
|
+
end
|
75
113
|
end
|
76
114
|
end
|
77
115
|
end
|
@@ -3,8 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
|
-
#
|
7
|
-
# This cop checks for `send`, `public_send`, and `__send__` methods
|
6
|
+
# Checks for `send`, `public_send`, and `__send__` methods
|
8
7
|
# when using mix-in.
|
9
8
|
#
|
10
9
|
# `include` and `prepend` methods were private methods until Ruby 2.0,
|
@@ -121,18 +121,12 @@ module RuboCop
|
|
121
121
|
|
122
122
|
if rescued_exceptions.any?
|
123
123
|
rescued_exceptions.each_with_object([]) do |exception, converted|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
begin
|
128
|
-
RuboCop::Util.silence_warnings do
|
129
|
-
# Avoid printing deprecation warnings about constants
|
130
|
-
converted << Kernel.const_get(exception.source)
|
131
|
-
end
|
132
|
-
rescue NameError
|
133
|
-
converted << nil
|
124
|
+
RuboCop::Util.silence_warnings do
|
125
|
+
# Avoid printing deprecation warnings about constants
|
126
|
+
converted << Kernel.const_get(exception.source)
|
134
127
|
end
|
135
|
-
|
128
|
+
rescue NameError
|
129
|
+
converted << nil
|
136
130
|
end
|
137
131
|
else
|
138
132
|
# treat an empty `rescue` as `rescue StandardError`
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
68
68
|
|
69
69
|
def same_conditions_node_different_branch?(variable, outer_local_variable)
|
70
70
|
variable_node = variable_node(variable)
|
71
|
-
return false unless variable_node
|
71
|
+
return false unless node_or_its_ascendant_conditional?(variable_node)
|
72
72
|
|
73
73
|
outer_local_variable_node =
|
74
74
|
find_conditional_node_from_ascendant(outer_local_variable.declaration_node)
|
@@ -96,6 +96,12 @@ module RuboCop
|
|
96
96
|
|
97
97
|
find_conditional_node_from_ascendant(parent)
|
98
98
|
end
|
99
|
+
|
100
|
+
def node_or_its_ascendant_conditional?(node)
|
101
|
+
return true if node.conditional?
|
102
|
+
|
103
|
+
!!find_conditional_node_from_ascendant(node)
|
104
|
+
end
|
99
105
|
end
|
100
106
|
end
|
101
107
|
end
|