rubocop 1.26.0 → 1.36.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 +7 -5
- data/config/default.yml +254 -47
- data/config/obsoletion.yml +35 -2
- data/exe/rubocop +15 -7
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/{auto_genenerate_config.rb → auto_generate_config.rb} +20 -5
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +1 -1
- data/lib/rubocop/cli/command/suggest_extensions.rb +54 -16
- data/lib/rubocop/cli.rb +2 -0
- data/lib/rubocop/config.rb +6 -2
- data/lib/rubocop/config_finder.rb +68 -0
- data/lib/rubocop/config_loader.rb +15 -41
- data/lib/rubocop/config_loader_resolver.rb +2 -6
- data/lib/rubocop/config_obsoletion/changed_parameter.rb +5 -0
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +3 -1
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +4 -0
- data/lib/rubocop/config_obsoletion.rb +7 -2
- data/lib/rubocop/config_validator.rb +21 -4
- data/lib/rubocop/cop/autocorrect_logic.rb +8 -2
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +6 -2
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -7
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +5 -5
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
- data/lib/rubocop/cop/cop.rb +1 -1
- data/lib/rubocop/cop/corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +4 -2
- data/lib/rubocop/cop/correctors/if_then_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +7 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +59 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/dependency_version.rb +156 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +92 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +5 -12
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +21 -21
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +2 -2
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +96 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +80 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -5
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -1
- 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/single_line_comparison.rb +62 -0
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
- data/lib/rubocop/cop/internal_affairs.rb +5 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +22 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +17 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +36 -6
- data/lib/rubocop/cop/layout/case_indentation.rb +17 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/condition_position.rb +1 -1
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- 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 +5 -2
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +25 -4
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +7 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +10 -10
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +10 -10
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/end_of_line.rb +5 -5
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +34 -29
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +21 -14
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +52 -13
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -0
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +16 -10
- data/lib/rubocop/cop/layout/initial_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +112 -0
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +130 -0
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +11 -6
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +4 -2
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -2
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -5
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +45 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/redundant_line_break.rb +5 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -3
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -0
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +10 -10
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +33 -15
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +9 -9
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +3 -3
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +1 -1
- data/lib/rubocop/cop/legacy/corrector.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +28 -7
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +7 -7
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -5
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +1 -1
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +51 -0
- data/lib/rubocop/cop/lint/debugger.rb +27 -17
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +15 -9
- data/lib/rubocop/cop/lint/deprecated_constants.rb +1 -1
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_require.rb +11 -2
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +3 -3
- data/lib/rubocop/cop/lint/empty_block.rb +2 -2
- data/lib/rubocop/cop/lint/empty_class.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +99 -3
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
- data/lib/rubocop/cop/lint/empty_file.rb +1 -1
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +4 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/empty_when.rb +4 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +10 -10
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +11 -4
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +2 -2
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +10 -3
- data/lib/rubocop/cop/lint/literal_as_condition.rb +6 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +5 -1
- data/lib/rubocop/cop/lint/loop.rb +2 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +25 -6
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +157 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +17 -5
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +32 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2 -2
- 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/raise_exception.rb +2 -2
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +6 -6
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +16 -3
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +14 -11
- data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -12
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +51 -0
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +3 -3
- data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +6 -18
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +38 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +1 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +16 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +32 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +3 -3
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +4 -3
- data/lib/rubocop/cop/lint/syntax.rb +2 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/to_json.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +2 -2
- data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +3 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +13 -7
- data/lib/rubocop/cop/lint/unused_block_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +9 -7
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +2 -3
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +3 -1
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -2
- data/lib/rubocop/cop/metrics/block_length.rb +7 -7
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +9 -8
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +22 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +20 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +56 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +28 -2
- data/lib/rubocop/cop/mixin/def_node.rb +2 -7
- data/lib/rubocop/cop/mixin/duplication.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +83 -4
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -6
- data/lib/rubocop/cop/mixin/line_length_help.rb +17 -6
- data/lib/rubocop/cop/mixin/method_complexity.rb +8 -13
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +34 -12
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -3
- data/lib/rubocop/cop/mixin/percent_array.rb +60 -1
- data/lib/rubocop/cop/mixin/preferred_delimiters.rb +2 -2
- data/lib/rubocop/cop/mixin/range_help.rb +10 -7
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -1
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +4 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +3 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +6 -6
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +32 -3
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_name.rb +10 -1
- data/lib/rubocop/cop/naming/variable_number.rb +28 -18
- data/lib/rubocop/cop/offense.rb +1 -1
- data/lib/rubocop/cop/security/compound_hash.rb +105 -0
- data/lib/rubocop/cop/security/eval.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +1 -1
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -1
- data/lib/rubocop/cop/security/yaml_load.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +77 -1
- data/lib/rubocop/cop/style/accessor_grouping.rb +4 -4
- data/lib/rubocop/cop/style/alias.rb +4 -4
- data/lib/rubocop/cop/style/and_or.rb +12 -12
- data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -3
- data/lib/rubocop/cop/style/array_coercion.rb +1 -1
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +1 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
- data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor/macro.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 +35 -9
- data/lib/rubocop/cop/style/case_equality.rb +41 -11
- data/lib/rubocop/cop/style/case_like_if.rb +2 -2
- data/lib/rubocop/cop/style/character_literal.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +5 -5
- data/lib/rubocop/cop/style/class_check.rb +1 -1
- data/lib/rubocop/cop/style/class_equality_comparison.rb +51 -4
- data/lib/rubocop/cop/style/class_methods.rb +1 -1
- data/lib/rubocop/cop/style/class_methods_definitions.rb +3 -2
- data/lib/rubocop/cop/style/class_vars.rb +1 -1
- data/lib/rubocop/cop/style/collection_compact.rb +4 -4
- data/lib/rubocop/cop/style/collection_methods.rb +3 -1
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
- data/lib/rubocop/cop/style/colon_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +4 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +4 -4
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -1
- data/lib/rubocop/cop/style/constant_visibility.rb +1 -1
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +4 -1
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +62 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +42 -7
- data/lib/rubocop/cop/style/each_with_object.rb +40 -9
- data/lib/rubocop/cop/style/empty_block_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +3 -4
- data/lib/rubocop/cop/style/empty_else.rb +40 -3
- data/lib/rubocop/cop/style/empty_heredoc.rb +73 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +2 -2
- data/lib/rubocop/cop/style/empty_method.rb +17 -2
- data/lib/rubocop/cop/style/encoding.rb +2 -2
- data/lib/rubocop/cop/style/end_block.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +1 -1
- data/lib/rubocop/cop/style/env_home.rb +56 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +132 -0
- data/lib/rubocop/cop/style/file_write.rb +12 -0
- data/lib/rubocop/cop/style/float_division.rb +1 -1
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +73 -23
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +62 -4
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -2
- data/lib/rubocop/cop/style/hash_except.rb +85 -9
- data/lib/rubocop/cop/style/hash_like_case.rb +1 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +20 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -1
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +4 -4
- data/lib/rubocop/cop/style/if_unless_modifier.rb +6 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -2
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +3 -3
- data/lib/rubocop/cop/style/in_pattern_then.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -8
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +1 -1
- data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -2
- data/lib/rubocop/cop/style/magic_comment_format.rb +307 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +136 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +3 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +6 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +12 -12
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -3
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +5 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +24 -24
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
- data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +3 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +4 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -2
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +3 -5
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +37 -11
- data/lib/rubocop/cop/style/multiline_when_then.rb +2 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_file_dirname.rb +1 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +20 -8
- data/lib/rubocop/cop/style/next.rb +4 -6
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
- data/lib/rubocop/cop/style/nil_lambda.rb +3 -3
- data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
- data/lib/rubocop/cop/style/not.rb +2 -2
- data/lib/rubocop/cop/style/numbered_parameters.rb +1 -1
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +16 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +53 -11
- data/lib/rubocop/cop/style/object_then.rb +71 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +2 -2
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +2 -2
- data/lib/rubocop/cop/style/or_assignment.rb +1 -1
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +23 -2
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +5 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +10 -4
- data/lib/rubocop/cop/style/random_with_offset.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -2
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +19 -6
- data/lib/rubocop/cop/style/redundant_capital_w.rb +2 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +129 -13
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -2
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_initialize.rb +154 -0
- data/lib/rubocop/cop/style/redundant_interpolation.rb +22 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +22 -24
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +8 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -2
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +3 -4
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +1 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +22 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +25 -9
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/rescue_standard_error.rb +13 -13
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +21 -11
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/select_by_regexp.rb +7 -2
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +28 -4
- data/lib/rubocop/cop/style/send.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +2 -2
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -30
- data/lib/rubocop/cop/style/special_global_vars.rb +66 -8
- data/lib/rubocop/cop/style/static_class.rb +1 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +6 -7
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +4 -4
- data/lib/rubocop/cop/style/swap_values.rb +2 -2
- data/lib/rubocop/cop/style/symbol_array.rb +9 -6
- data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +70 -12
- data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -16
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +11 -9
- data/lib/rubocop/cop/style/unless_else.rb +5 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +5 -2
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/when_then.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +4 -5
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
- data/lib/rubocop/cop/team.rb +2 -2
- data/lib/rubocop/cop/util.rb +3 -3
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cops_documentation_generator.rb +19 -2
- data/lib/rubocop/ext/range.rb +15 -0
- data/lib/rubocop/feature_loader.rb +94 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +11 -8
- data/lib/rubocop/formatter/formatter_set.rb +20 -18
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +15 -2
- data/lib/rubocop/formatter/html_formatter.rb +5 -13
- data/lib/rubocop/formatter/markdown_formatter.rb +78 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +8 -2
- data/lib/rubocop/formatter/simple_text_formatter.rb +9 -8
- data/lib/rubocop/formatter/tap_formatter.rb +1 -1
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -2
- data/lib/rubocop/formatter.rb +31 -0
- data/lib/rubocop/magic_comment.rb +31 -5
- data/lib/rubocop/options.rb +103 -34
- data/lib/rubocop/rake_task.rb +34 -9
- data/lib/rubocop/result_cache.rb +24 -13
- data/lib/rubocop/rspec/cop_helper.rb +2 -2
- data/lib/rubocop/rspec/expect_offense.rb +3 -3
- data/lib/rubocop/rspec/parallel_formatter.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +31 -11
- data/lib/rubocop/rspec/support.rb +14 -0
- data/lib/rubocop/runner.rb +41 -7
- data/lib/rubocop/server/cache.rb +144 -0
- data/lib/rubocop/server/cli.rb +121 -0
- data/lib/rubocop/server/client_command/base.rb +44 -0
- data/lib/rubocop/server/client_command/exec.rb +59 -0
- data/lib/rubocop/server/client_command/restart.rb +25 -0
- data/lib/rubocop/server/client_command/start.rb +43 -0
- data/lib/rubocop/server/client_command/status.rb +28 -0
- data/lib/rubocop/server/client_command/stop.rb +31 -0
- data/lib/rubocop/server/client_command.rb +26 -0
- data/lib/rubocop/server/core.rb +79 -0
- data/lib/rubocop/server/errors.rb +23 -0
- data/lib/rubocop/server/helper.rb +34 -0
- data/lib/rubocop/server/server_command/base.rb +50 -0
- data/lib/rubocop/server/server_command/exec.rb +34 -0
- data/lib/rubocop/server/server_command/stop.rb +24 -0
- data/lib/rubocop/server/server_command.rb +21 -0
- data/lib/rubocop/server/socket_reader.rb +65 -0
- data/lib/rubocop/server.rb +53 -0
- data/lib/rubocop/string_interpreter.rb +4 -4
- data/lib/rubocop/target_ruby.rb +14 -6
- data/lib/rubocop/version.rb +17 -9
- data/lib/rubocop.rb +25 -30
- metadata +78 -14
- data/lib/rubocop/cop/gemspec/date_assignment.rb +0 -49
- data/lib/rubocop/cop/mixin/ignored_methods.rb +0 -52
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +0 -29
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for unnecessary conditional expressions.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
# # bad
|
@@ -44,9 +44,9 @@ module RuboCop
|
|
44
44
|
message = message(node)
|
45
45
|
|
46
46
|
add_offense(range_of_offense(node), message: message) do |corrector|
|
47
|
-
if node.ternary?
|
47
|
+
if node.ternary? && !branches_have_method?(node)
|
48
48
|
correct_ternary(corrector, node)
|
49
|
-
elsif
|
49
|
+
elsif redundant_condition?(node)
|
50
50
|
corrector.replace(node, node.if_branch.source)
|
51
51
|
else
|
52
52
|
corrected = make_ternary_form(node)
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
59
59
|
private
|
60
60
|
|
61
61
|
def message(node)
|
62
|
-
if
|
62
|
+
if redundant_condition?(node)
|
63
63
|
REDUNDANT_CONDITION
|
64
64
|
else
|
65
65
|
MSG
|
@@ -68,18 +68,22 @@ module RuboCop
|
|
68
68
|
|
69
69
|
def range_of_offense(node)
|
70
70
|
return node.loc.expression unless node.ternary?
|
71
|
+
return node.loc.expression if node.ternary? && branches_have_method?(node)
|
71
72
|
|
72
73
|
range_between(node.loc.question.begin_pos, node.loc.colon.end_pos)
|
73
74
|
end
|
74
75
|
|
75
76
|
def offense?(node)
|
76
|
-
|
77
|
+
_condition, _if_branch, else_branch = *node
|
77
78
|
|
78
79
|
return false if use_if_branch?(else_branch) || use_hash_key_assignment?(else_branch)
|
79
80
|
|
80
|
-
|
81
|
-
node.ternary? || !else_branch.instance_of?(AST::Node) || else_branch.single_line?
|
82
|
-
|
81
|
+
synonymous_condition_and_branch?(node) && !node.elsif? &&
|
82
|
+
(node.ternary? || !else_branch.instance_of?(AST::Node) || else_branch.single_line?)
|
83
|
+
end
|
84
|
+
|
85
|
+
def redundant_condition?(node)
|
86
|
+
node.modifier_form? || !node.else_branch
|
83
87
|
end
|
84
88
|
|
85
89
|
def use_if_branch?(else_branch)
|
@@ -90,19 +94,123 @@ module RuboCop
|
|
90
94
|
else_branch&.send_type? && else_branch&.method?(:[]=)
|
91
95
|
end
|
92
96
|
|
93
|
-
def
|
94
|
-
|
97
|
+
def use_hash_key_access?(node)
|
98
|
+
node.send_type? && node.method?(:[])
|
99
|
+
end
|
100
|
+
|
101
|
+
def synonymous_condition_and_branch?(node)
|
102
|
+
condition, if_branch, _else_branch = *node
|
103
|
+
# e.g.
|
104
|
+
# if var
|
105
|
+
# var
|
106
|
+
# else
|
107
|
+
# 'foo'
|
108
|
+
# end
|
109
|
+
return true if condition == if_branch
|
110
|
+
|
111
|
+
# e.g.
|
112
|
+
# if foo
|
113
|
+
# @value = foo
|
114
|
+
# else
|
115
|
+
# @value = another_value?
|
116
|
+
# end
|
117
|
+
return true if branches_have_assignment?(node) && condition == if_branch.expression
|
118
|
+
|
119
|
+
# e.g.
|
120
|
+
# if foo
|
121
|
+
# test.value = foo
|
122
|
+
# else
|
123
|
+
# test.value = another_value?
|
124
|
+
# end
|
125
|
+
branches_have_method?(node) && condition == if_branch.first_argument &&
|
126
|
+
!use_hash_key_access?(if_branch)
|
127
|
+
end
|
128
|
+
|
129
|
+
def branches_have_assignment?(node)
|
130
|
+
_condition, if_branch, else_branch = *node
|
131
|
+
|
132
|
+
return false unless if_branch && else_branch
|
133
|
+
|
134
|
+
asgn_type?(if_branch) && (if_branch_variable_name = if_branch.name) &&
|
135
|
+
asgn_type?(else_branch) && (else_branch_variable_name = else_branch.name) &&
|
136
|
+
if_branch_variable_name == else_branch_variable_name
|
137
|
+
end
|
138
|
+
|
139
|
+
def asgn_type?(node)
|
140
|
+
node.lvasgn_type? || node.ivasgn_type? || node.cvasgn_type? || node.gvasgn_type?
|
141
|
+
end
|
142
|
+
|
143
|
+
def branches_have_method?(node)
|
144
|
+
_condition, if_branch, else_branch = *node
|
145
|
+
|
146
|
+
return false unless if_branch && else_branch
|
147
|
+
|
148
|
+
if_branch.send_type? && if_branch.arguments.count == 1 &&
|
149
|
+
else_branch.send_type? && else_branch.arguments.count == 1 &&
|
150
|
+
same_method?(if_branch, else_branch)
|
151
|
+
end
|
152
|
+
|
153
|
+
def same_method?(if_branch, else_branch)
|
154
|
+
if_branch.method?(else_branch.method_name) && if_branch.receiver == else_branch.receiver
|
155
|
+
end
|
156
|
+
|
157
|
+
def if_source(if_branch, arithmetic_operation)
|
158
|
+
if branches_have_method?(if_branch.parent) && if_branch.parenthesized?
|
159
|
+
if_branch.source.delete_suffix(')')
|
160
|
+
elsif arithmetic_operation
|
161
|
+
argument_source = if_branch.first_argument.source
|
162
|
+
|
163
|
+
"#{if_branch.receiver.source} #{if_branch.method_name} (#{argument_source}"
|
164
|
+
else
|
165
|
+
if_branch.source
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def else_source(else_branch, arithmetic_operation) # rubocop:disable Metrics/AbcSize
|
170
|
+
if arithmetic_operation
|
171
|
+
"#{else_branch.first_argument.source})"
|
172
|
+
elsif branches_have_method?(else_branch.parent)
|
173
|
+
else_source_if_has_method(else_branch)
|
174
|
+
elsif require_parentheses?(else_branch)
|
95
175
|
"(#{else_branch.source})"
|
96
176
|
elsif without_argument_parentheses_method?(else_branch)
|
97
177
|
"#{else_branch.method_name}(#{else_branch.arguments.map(&:source).join(', ')})"
|
178
|
+
elsif branches_have_assignment?(else_branch.parent)
|
179
|
+
else_source_if_has_assignment(else_branch)
|
98
180
|
else
|
99
181
|
else_branch.source
|
100
182
|
end
|
101
183
|
end
|
102
184
|
|
185
|
+
def else_source_if_has_method(else_branch)
|
186
|
+
if require_parentheses?(else_branch.first_argument)
|
187
|
+
"(#{else_branch.first_argument.source})"
|
188
|
+
elsif require_braces?(else_branch.first_argument)
|
189
|
+
"{ #{else_branch.first_argument.source} }"
|
190
|
+
else
|
191
|
+
else_branch.first_argument.source
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def else_source_if_has_assignment(else_branch)
|
196
|
+
if require_parentheses?(else_branch.expression)
|
197
|
+
"(#{else_branch.expression.source})"
|
198
|
+
elsif require_braces?(else_branch.expression)
|
199
|
+
"{ #{else_branch.expression.source} }"
|
200
|
+
else
|
201
|
+
else_branch.expression.source
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
103
205
|
def make_ternary_form(node)
|
104
206
|
_condition, if_branch, else_branch = *node
|
105
|
-
|
207
|
+
arithmetic_operation = use_arithmetic_operation?(if_branch)
|
208
|
+
|
209
|
+
ternary_form = [
|
210
|
+
if_source(if_branch, arithmetic_operation),
|
211
|
+
else_source(else_branch, arithmetic_operation)
|
212
|
+
].join(' || ')
|
213
|
+
ternary_form += ')' if branches_have_method?(node) && if_branch.parenthesized?
|
106
214
|
|
107
215
|
if node.parent&.send_type?
|
108
216
|
"(#{ternary_form})"
|
@@ -126,9 +234,17 @@ module RuboCop
|
|
126
234
|
(node.respond_to?(:semantic_operator?) && node.semantic_operator?)
|
127
235
|
end
|
128
236
|
|
237
|
+
def require_braces?(node)
|
238
|
+
node.hash_type? && !node.braces?
|
239
|
+
end
|
240
|
+
|
241
|
+
def use_arithmetic_operation?(node)
|
242
|
+
node.respond_to?(:arithmetic_operation?) && node.arithmetic_operation?
|
243
|
+
end
|
244
|
+
|
129
245
|
def without_argument_parentheses_method?(node)
|
130
|
-
node.send_type? &&
|
131
|
-
!node.
|
246
|
+
node.send_type? && !node.arguments.empty? &&
|
247
|
+
!node.parenthesized? && !node.operator_method? && !node.assignment_method?
|
132
248
|
end
|
133
249
|
end
|
134
250
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Identifies places where `fetch(key) { value }`
|
7
7
|
# can be replaced by `fetch(key, value)`.
|
8
8
|
#
|
9
9
|
# In such cases `fetch(key, value)` method is faster
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
${nil? #basic_literal? #const_type?})
|
51
51
|
PATTERN
|
52
52
|
|
53
|
-
def on_block(node)
|
53
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
54
54
|
redundant_fetch_block_candidate?(node) do |send, body|
|
55
55
|
return if should_not_check?(send, body)
|
56
56
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for the presence of superfluous `.rb` extension in
|
7
7
|
# the filename provided to `require` and `require_relative`.
|
8
8
|
#
|
9
9
|
# Note: If the extension is omitted, Ruby tries adding '.rb', '.so',
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks for `initialize` methods that are redundant.
|
7
|
+
#
|
8
|
+
# An initializer is redundant if it does not do anything, or if it only
|
9
|
+
# calls `super` with the same arguments given to it. If the initializer takes
|
10
|
+
# an argument that accepts multiple values (`restarg`, `kwrestarg`, etc.) it
|
11
|
+
# will not register an offense, because it allows the initializer to take a different
|
12
|
+
# number of arguments as its superclass potentially does.
|
13
|
+
#
|
14
|
+
# NOTE: If an initializer argument has a default value, RuboCop assumes it
|
15
|
+
# to *not* be redundant.
|
16
|
+
#
|
17
|
+
# NOTE: Empty initializers are registered as offenses, but it is possible
|
18
|
+
# to purposely create an empty `initialize` method to override a superclass's
|
19
|
+
# initializer.
|
20
|
+
#
|
21
|
+
# @safety
|
22
|
+
# This cop is unsafe because if subclass overrides `initialize` method with
|
23
|
+
# a different arity than superclass.
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# # bad
|
27
|
+
# def initialize
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# # bad
|
31
|
+
# def initialize
|
32
|
+
# super
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# # bad
|
36
|
+
# def initialize(a, b)
|
37
|
+
# super
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# # bad
|
41
|
+
# def initialize(a, b)
|
42
|
+
# super(a, b)
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# # good
|
46
|
+
# def initialize
|
47
|
+
# do_something
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# # good
|
51
|
+
# def initialize
|
52
|
+
# do_something
|
53
|
+
# super
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# # good (different number of parameters)
|
57
|
+
# def initialize(a, b)
|
58
|
+
# super(a)
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# # good (default value)
|
62
|
+
# def initialize(a, b = 5)
|
63
|
+
# super
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# # good (default value)
|
67
|
+
# def initialize(a, b: 5)
|
68
|
+
# super
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# # good (changes the parameter requirements)
|
72
|
+
# def initialize(*)
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
# # good (changes the parameter requirements)
|
76
|
+
# def initialize(**)
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# # good (changes the parameter requirements)
|
80
|
+
# def initialize(...)
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# @example AllowComments: true (default)
|
84
|
+
#
|
85
|
+
# # good
|
86
|
+
# def initialize
|
87
|
+
# # Overriding to negate superclass `initialize` method.
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
# @example AllowComments: false
|
91
|
+
#
|
92
|
+
# # bad
|
93
|
+
# def initialize
|
94
|
+
# # Overriding to negate superclass `initialize` method.
|
95
|
+
# end
|
96
|
+
#
|
97
|
+
class RedundantInitialize < Base
|
98
|
+
include CommentsHelp
|
99
|
+
include RangeHelp
|
100
|
+
extend AutoCorrector
|
101
|
+
|
102
|
+
MSG = 'Remove unnecessary `initialize` method.'
|
103
|
+
MSG_EMPTY = 'Remove unnecessary empty `initialize` method.'
|
104
|
+
|
105
|
+
# @!method initialize_forwards?(node)
|
106
|
+
def_node_matcher :initialize_forwards?, <<~PATTERN
|
107
|
+
(def _ (args $arg*) $({super zsuper} ...))
|
108
|
+
PATTERN
|
109
|
+
|
110
|
+
def on_def(node)
|
111
|
+
return if acceptable?(node)
|
112
|
+
|
113
|
+
if node.body.nil?
|
114
|
+
register_offense(node, MSG_EMPTY)
|
115
|
+
else
|
116
|
+
return if node.body.begin_type?
|
117
|
+
|
118
|
+
if (args, super_node = initialize_forwards?(node))
|
119
|
+
return unless same_args?(super_node, args)
|
120
|
+
|
121
|
+
register_offense(node, MSG)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
private
|
127
|
+
|
128
|
+
def register_offense(node, message)
|
129
|
+
add_offense(node, message: message) do |corrector|
|
130
|
+
corrector.remove(range_by_whole_lines(node.source_range, include_final_newline: true))
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def acceptable?(node)
|
135
|
+
!node.method?(:initialize) || forwards?(node) || allow_comments?(node)
|
136
|
+
end
|
137
|
+
|
138
|
+
def forwards?(node)
|
139
|
+
node.arguments.each_child_node(:restarg, :kwrestarg, :forward_args, :forward_arg).any?
|
140
|
+
end
|
141
|
+
|
142
|
+
def allow_comments?(node)
|
143
|
+
cop_config['AllowComments'] && contains_comments?(node)
|
144
|
+
end
|
145
|
+
|
146
|
+
def same_args?(super_node, args)
|
147
|
+
return true if super_node.zsuper_type?
|
148
|
+
|
149
|
+
args.map(&:name) == super_node.arguments.map { |a| a.children[0] }
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -3,7 +3,28 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for strings that are just an interpolated expression.
|
7
|
+
#
|
8
|
+
# @safety
|
9
|
+
# Autocorrection is unsafe because when calling a destructive method to string,
|
10
|
+
# the resulting string may have different behavior or raise `FrozenError`.
|
11
|
+
#
|
12
|
+
# [source,ruby]
|
13
|
+
# ----
|
14
|
+
# x = 'a'
|
15
|
+
# y = "#{x}"
|
16
|
+
# y << 'b' # return 'ab'
|
17
|
+
# x # return 'a'
|
18
|
+
# y = x.to_s
|
19
|
+
# y << 'b' # return 'ab'
|
20
|
+
# x # return 'ab'
|
21
|
+
#
|
22
|
+
# x = 'a'.freeze
|
23
|
+
# y = "#{x}"
|
24
|
+
# y << 'b' # return 'ab'.
|
25
|
+
# y = x.to_s
|
26
|
+
# y << 'b' # raise `FrozenError`.
|
27
|
+
# ----
|
7
28
|
#
|
8
29
|
# @example
|
9
30
|
#
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for redundant parentheses.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
#
|
@@ -29,6 +29,9 @@ module RuboCop
|
|
29
29
|
# @!method rescue?(node)
|
30
30
|
def_node_matcher :rescue?, '{^resbody ^^resbody}'
|
31
31
|
|
32
|
+
# @!method allowed_pin_operator?(node)
|
33
|
+
def_node_matcher :allowed_pin_operator?, '^(pin (begin !{lvar ivar cvar gvar}))'
|
34
|
+
|
32
35
|
# @!method arg_in_call_with_block?(node)
|
33
36
|
def_node_matcher :arg_in_call_with_block?, '^^(block (send _ _ equal?(%0) ...) ...)'
|
34
37
|
|
@@ -44,6 +47,7 @@ module RuboCop
|
|
44
47
|
empty_parentheses?(node) ||
|
45
48
|
first_arg_begins_with_hash_literal?(node) ||
|
46
49
|
rescue?(node) ||
|
50
|
+
allowed_pin_operator?(node) ||
|
47
51
|
allowed_expression?(node)
|
48
52
|
end
|
49
53
|
|
@@ -57,8 +61,8 @@ module RuboCop
|
|
57
61
|
def allowed_expression?(node)
|
58
62
|
allowed_ancestor?(node) ||
|
59
63
|
allowed_method_call?(node) ||
|
60
|
-
|
61
|
-
|
64
|
+
allowed_multiple_expression?(node) ||
|
65
|
+
allowed_ternary?(node)
|
62
66
|
end
|
63
67
|
|
64
68
|
def allowed_ancestor?(node)
|
@@ -80,8 +84,22 @@ module RuboCop
|
|
80
84
|
!ancestor.begin_type? && !ancestor.def_type? && !ancestor.block_type?
|
81
85
|
end
|
82
86
|
|
87
|
+
def allowed_ternary?(node)
|
88
|
+
return unless node&.parent&.if_type?
|
89
|
+
|
90
|
+
node.parent.ternary? && ternary_parentheses_required?
|
91
|
+
end
|
92
|
+
|
93
|
+
def ternary_parentheses_required?
|
94
|
+
config = @config.for_cop('Style/TernaryParentheses')
|
95
|
+
allowed_styles = %w[require_parentheses require_parentheses_when_complex]
|
96
|
+
|
97
|
+
config.fetch('Enabled') && allowed_styles.include?(config['EnforcedStyle'])
|
98
|
+
end
|
99
|
+
|
83
100
|
def like_method_argument_parentheses?(node)
|
84
|
-
node.send_type? && node.arguments.
|
101
|
+
node.send_type? && node.arguments.one? &&
|
102
|
+
!node.arithmetic_operation? && node.first_argument.begin_type?
|
85
103
|
end
|
86
104
|
|
87
105
|
def empty_parentheses?(node)
|
@@ -152,26 +170,6 @@ module RuboCop
|
|
152
170
|
node.parent&.keyword?
|
153
171
|
end
|
154
172
|
|
155
|
-
def allowed_array_or_hash_element?(node)
|
156
|
-
# Don't flag
|
157
|
-
# ```
|
158
|
-
# { a: (1
|
159
|
-
# ), }
|
160
|
-
# ```
|
161
|
-
hash_or_array_element?(node) && only_closing_paren_before_comma?(node)
|
162
|
-
end
|
163
|
-
|
164
|
-
def hash_or_array_element?(node)
|
165
|
-
node.each_ancestor(:array, :hash).any?
|
166
|
-
end
|
167
|
-
|
168
|
-
def only_closing_paren_before_comma?(node)
|
169
|
-
source_buffer = node.source_range.source_buffer
|
170
|
-
line_range = source_buffer.line_range(node.loc.end.line)
|
171
|
-
|
172
|
-
/^\s*\)\s*,/.match?(line_range.source)
|
173
|
-
end
|
174
|
-
|
175
173
|
def disallowed_literal?(begin_node, node)
|
176
174
|
node.literal? && !node.range_type? && !raised_to_power_negative_numeric?(begin_node, node)
|
177
175
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for unnecessary single-element Regexp character classes.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
#
|
@@ -63,6 +63,7 @@ module RuboCop
|
|
63
63
|
next if expr.type != :set || expr.expressions.size != 1
|
64
64
|
next if expr.negative?
|
65
65
|
next if %i[set posixclass nonposixclass].include?(expr.expressions.first.type)
|
66
|
+
next if multiple_codepoins?(expr.expressions.first)
|
66
67
|
|
67
68
|
yield expr
|
68
69
|
end
|
@@ -79,10 +80,14 @@ module RuboCop
|
|
79
80
|
!non_redundant
|
80
81
|
end
|
81
82
|
|
83
|
+
def multiple_codepoins?(expression)
|
84
|
+
expression.respond_to?(:codepoints) && expression.codepoints.count >= 2
|
85
|
+
end
|
86
|
+
|
82
87
|
def without_character_class(loc)
|
83
88
|
without_character_class = loc.source[1..-2]
|
84
89
|
|
85
|
-
# Adds `\` to prevent
|
90
|
+
# Adds `\` to prevent autocorrection that changes to an interpolated string when `[#]`.
|
86
91
|
# e.g. From `/[#]{0}/` to `/#{0}/`
|
87
92
|
loc.source == '[#]' ? "\\#{without_character_class}" : without_character_class
|
88
93
|
end
|
@@ -94,7 +99,7 @@ module RuboCop
|
|
94
99
|
end
|
95
100
|
|
96
101
|
def backslash_b?(elem)
|
97
|
-
# \b's
|
102
|
+
# \b's behavior is different inside and outside of a character class, matching word
|
98
103
|
# boundaries outside but backspace (0x08) when inside.
|
99
104
|
elem == '\b'
|
100
105
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for redundant escapes inside Regexp literals.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
# # bad
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
59
59
|
def allowed_escape?(node, char, within_character_class)
|
60
60
|
# Strictly speaking a few single-letter metachars are currently
|
61
61
|
# unnecessary to "escape", e.g. i, E, F, but enumerating them is
|
62
|
-
# rather difficult, and their
|
62
|
+
# rather difficult, and their behavior could change over time with
|
63
63
|
# different versions of Ruby so that e.g. /\i/ != /i/
|
64
64
|
return true if /[[:alnum:]]/.match?(char)
|
65
65
|
return true if ALLOWED_ALWAYS_ESCAPES.include?(char) || delimiter?(node, char)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for redundant `return` expressions.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
# # These bad cases should be extended to handle methods whose body is
|
@@ -76,7 +76,7 @@ module RuboCop
|
|
76
76
|
corrector.replace(first_argument, first_argument.source.delete_prefix('*'))
|
77
77
|
end
|
78
78
|
|
79
|
-
keyword = range_with_surrounding_space(
|
79
|
+
keyword = range_with_surrounding_space(return_node.loc.keyword, side: :right)
|
80
80
|
corrector.remove(keyword)
|
81
81
|
end
|
82
82
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for redundant uses of `self`.
|
7
7
|
#
|
8
8
|
# The usage of `self` is only needed when:
|
9
9
|
#
|
@@ -120,6 +120,8 @@ module RuboCop
|
|
120
120
|
add_scope(node, @local_variables_scopes[node])
|
121
121
|
end
|
122
122
|
|
123
|
+
alias on_numblock on_block
|
124
|
+
|
123
125
|
def on_if(node)
|
124
126
|
# Allow conditional nodes to use `self` in the condition if that variable
|
125
127
|
# name is used in an `lvasgn` or `masgn` within the `if`.
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for places where redundant assignments are made for in place
|
7
7
|
# modification methods.
|
8
8
|
#
|
9
9
|
# @safety
|
@@ -32,7 +32,7 @@ module RuboCop
|
|
32
32
|
include RangeHelp
|
33
33
|
extend AutoCorrector
|
34
34
|
|
35
|
-
MSG = 'Redundant self assignment detected. '\
|
35
|
+
MSG = 'Redundant self assignment detected. ' \
|
36
36
|
'Method `%<method_name>s` modifies its receiver in place.'
|
37
37
|
|
38
38
|
METHODS_RETURNING_SELF = %i[
|
@@ -67,8 +67,7 @@ module RuboCop
|
|
67
67
|
alias on_gvasgn on_lvasgn
|
68
68
|
|
69
69
|
def on_send(node)
|
70
|
-
|
71
|
-
return unless node.method_name.to_s.end_with?('=')
|
70
|
+
return unless node.assignment_method?
|
72
71
|
return unless redundant_assignment?(node)
|
73
72
|
|
74
73
|
message = format(MSG, method_name: node.first_argument.method_name)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for places where conditional branch makes redundant self-assignment.
|
7
7
|
#
|
8
8
|
# It only detects local variable because it may replace state of instance variable,
|
9
9
|
# class variable, and global variable that have state across methods with `nil`.
|