rubocop 1.67.0 → 1.81.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +384 -72
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +19 -4
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +56 -48
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +53 -28
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +7 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- 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 +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -20
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +158 -10
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +31 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -3
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +125 -10
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +113 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +39 -15
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +34 -8
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +23 -12
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -3
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +27 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +2 -4
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +2 -3
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +57 -44
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
- data/lib/rubocop/cop/style/case_like_if.rb +9 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +49 -31
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +17 -4
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +17 -3
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
- 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 +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +1 -0
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +11 -3
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -4
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +18 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +42 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +41 -38
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- 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/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +55 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -36
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +15 -18
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +75 -16
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +21 -6
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +68 -102
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +30 -19
- data/lib/rubocop/cops_documentation_generator.rb +54 -28
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +20 -6
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +66 -26
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +2 -4
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/magic_comment.rb +11 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/rake_task.rb +4 -1
- data/lib/rubocop/result_cache.rb +27 -25
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +15 -5
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +31 -18
- data/lib/rubocop/server/cache.rb +51 -13
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +14 -9
- data/lib/rubocop/target_ruby.rb +27 -3
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +44 -2
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +91 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
|
@@ -72,7 +72,7 @@ module RuboCop
|
|
|
72
72
|
def_node_matcher :method_definition, <<~PATTERN
|
|
73
73
|
{
|
|
74
74
|
(def %1 ...)
|
|
75
|
-
(
|
|
75
|
+
(any_block (send _ :define_method (sym %1)) ...)
|
|
76
76
|
}
|
|
77
77
|
PATTERN
|
|
78
78
|
|
|
@@ -89,7 +89,7 @@ module RuboCop
|
|
|
89
89
|
private
|
|
90
90
|
|
|
91
91
|
def inspect_def(node, def_node)
|
|
92
|
-
return if allowed_arguments(def_node.arguments)
|
|
92
|
+
return if allowed_arguments?(def_node.arguments)
|
|
93
93
|
|
|
94
94
|
add_offense(node.loc.selector, message: format(MSG, method_name: def_node.method_name))
|
|
95
95
|
end
|
|
@@ -101,21 +101,21 @@ module RuboCop
|
|
|
101
101
|
definition = find_method_definition(node, method_name)
|
|
102
102
|
|
|
103
103
|
return unless definition
|
|
104
|
-
return if allowed_arguments(definition.arguments)
|
|
104
|
+
return if allowed_arguments?(definition.arguments)
|
|
105
105
|
|
|
106
106
|
add_offense(node, message: format(MSG, method_name: method_name))
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
def find_method_definition(node, method_name)
|
|
110
110
|
node.each_ancestor.lazy.map do |ancestor|
|
|
111
|
-
ancestor.each_child_node(:def, :
|
|
111
|
+
ancestor.each_child_node(:def, :any_block).find do |child|
|
|
112
112
|
method_definition(child, method_name)
|
|
113
113
|
end
|
|
114
114
|
end.find(&:itself)
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
# `ruby2_keywords` is only allowed if there's a `restarg` and no keyword arguments
|
|
118
|
-
def allowed_arguments(arguments)
|
|
118
|
+
def allowed_arguments?(arguments)
|
|
119
119
|
return false if arguments.empty?
|
|
120
120
|
|
|
121
121
|
arguments.each_child_node(:restarg).any? &&
|
|
@@ -102,24 +102,18 @@ module RuboCop
|
|
|
102
102
|
when :op_asgn
|
|
103
103
|
process_binary_operator_assignment(node)
|
|
104
104
|
when *ASSIGNMENT_TYPES
|
|
105
|
-
|
|
106
|
-
process_assignment(node, rhs_node) if rhs_node
|
|
105
|
+
process_assignment(node, node.rhs) if node.rhs
|
|
107
106
|
end
|
|
108
107
|
end
|
|
109
108
|
|
|
110
109
|
def process_multiple_assignment(masgn_node)
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
mlhs_node.children.each_with_index do |lhs_node, index|
|
|
110
|
+
masgn_node.assignments.each_with_index do |lhs_node, index|
|
|
114
111
|
next unless ASSIGNMENT_TYPES.include?(lhs_node.type)
|
|
115
112
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if mrhs_node.array_type? && rhs_node
|
|
120
|
-
process_assignment(lhs_variable_name, rhs_node)
|
|
113
|
+
if masgn_node.rhs.array_type? && (rhs_node = masgn_node.rhs.children[index])
|
|
114
|
+
process_assignment(lhs_node, rhs_node)
|
|
121
115
|
else
|
|
122
|
-
@local[
|
|
116
|
+
@local[lhs_node.name] = true
|
|
123
117
|
end
|
|
124
118
|
end
|
|
125
119
|
|
|
@@ -127,33 +121,28 @@ module RuboCop
|
|
|
127
121
|
end
|
|
128
122
|
|
|
129
123
|
def process_logical_operator_assignment(asgn_node)
|
|
130
|
-
|
|
131
|
-
return unless ASSIGNMENT_TYPES.include?(lhs_node.type)
|
|
124
|
+
return unless ASSIGNMENT_TYPES.include?(asgn_node.lhs.type)
|
|
132
125
|
|
|
133
|
-
process_assignment(
|
|
126
|
+
process_assignment(asgn_node.lhs, asgn_node.rhs)
|
|
134
127
|
|
|
135
128
|
throw :skip_children
|
|
136
129
|
end
|
|
137
130
|
|
|
138
131
|
def process_binary_operator_assignment(op_asgn_node)
|
|
139
|
-
lhs_node
|
|
132
|
+
lhs_node = op_asgn_node.lhs
|
|
140
133
|
return unless ASSIGNMENT_TYPES.include?(lhs_node.type)
|
|
141
134
|
|
|
142
|
-
|
|
143
|
-
@local[lhs_variable_name] = true
|
|
135
|
+
@local[lhs_node.name] = true
|
|
144
136
|
|
|
145
137
|
throw :skip_children
|
|
146
138
|
end
|
|
147
139
|
|
|
148
140
|
def process_assignment(asgn_node, rhs_node)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
else
|
|
155
|
-
constructor?(rhs_node)
|
|
156
|
-
end
|
|
141
|
+
@local[asgn_node.name] = if rhs_node.variable?
|
|
142
|
+
@local[rhs_node.name]
|
|
143
|
+
else
|
|
144
|
+
constructor?(rhs_node)
|
|
145
|
+
end
|
|
157
146
|
end
|
|
158
147
|
|
|
159
148
|
def constructor?(node)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Lint
|
|
6
|
+
module Utils
|
|
7
|
+
# Utility class that checks if the receiver can't be nil.
|
|
8
|
+
class NilReceiverChecker
|
|
9
|
+
NIL_METHODS = (nil.methods + %i[!]).to_set.freeze
|
|
10
|
+
|
|
11
|
+
def initialize(receiver, additional_nil_methods)
|
|
12
|
+
@receiver = receiver
|
|
13
|
+
@additional_nil_methods = additional_nil_methods
|
|
14
|
+
@checked_nodes = {}.compare_by_identity
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def cant_be_nil?
|
|
18
|
+
sole_condition_of_parent_if?(@receiver) || _cant_be_nil?(@receiver.parent, @receiver)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
# rubocop:disable Metrics
|
|
24
|
+
def _cant_be_nil?(node, receiver)
|
|
25
|
+
return false unless node
|
|
26
|
+
|
|
27
|
+
# For some nodes, we check their parent and then some children for these parents.
|
|
28
|
+
# This is added to avoid infinite loops.
|
|
29
|
+
return false if @checked_nodes.key?(node)
|
|
30
|
+
|
|
31
|
+
@checked_nodes[node] = true
|
|
32
|
+
|
|
33
|
+
case node.type
|
|
34
|
+
when :def, :class, :module, :sclass
|
|
35
|
+
return false
|
|
36
|
+
when :send
|
|
37
|
+
return non_nil_method?(node.method_name) if node.receiver == receiver
|
|
38
|
+
|
|
39
|
+
node.arguments.each do |argument|
|
|
40
|
+
return true if _cant_be_nil?(argument, receiver)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
return true if _cant_be_nil?(node.receiver, receiver)
|
|
44
|
+
when :begin
|
|
45
|
+
return true if _cant_be_nil?(node.children.first, receiver)
|
|
46
|
+
when :if, :case
|
|
47
|
+
return true if _cant_be_nil?(node.condition, receiver)
|
|
48
|
+
when :and, :or
|
|
49
|
+
return true if _cant_be_nil?(node.lhs, receiver)
|
|
50
|
+
when :pair
|
|
51
|
+
if _cant_be_nil?(node.key, receiver) ||
|
|
52
|
+
_cant_be_nil?(node.value, receiver)
|
|
53
|
+
return true
|
|
54
|
+
end
|
|
55
|
+
when :when
|
|
56
|
+
node.each_condition do |condition|
|
|
57
|
+
return true if _cant_be_nil?(condition, receiver)
|
|
58
|
+
end
|
|
59
|
+
when :lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn
|
|
60
|
+
return true if _cant_be_nil?(node.expression, receiver)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Due to how `if/else` are implemented (`elsif` is a child of `if` or another `elsif`),
|
|
64
|
+
# using left_siblings will not work correctly for them.
|
|
65
|
+
if !else_branch?(node) || (node.if_type? && !node.elsif?)
|
|
66
|
+
node.left_siblings.reverse_each do |sibling|
|
|
67
|
+
next unless sibling.is_a?(AST::Node)
|
|
68
|
+
|
|
69
|
+
return true if _cant_be_nil?(sibling, receiver)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
if node.parent
|
|
74
|
+
_cant_be_nil?(node.parent, receiver)
|
|
75
|
+
else
|
|
76
|
+
false
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
# rubocop:enable Metrics
|
|
80
|
+
|
|
81
|
+
def non_nil_method?(method_name)
|
|
82
|
+
!NIL_METHODS.include?(method_name) && !@additional_nil_methods.include?(method_name)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
86
|
+
def sole_condition_of_parent_if?(node)
|
|
87
|
+
parent = node.parent
|
|
88
|
+
|
|
89
|
+
while parent
|
|
90
|
+
if parent.if_type?
|
|
91
|
+
if parent.condition == node
|
|
92
|
+
return true
|
|
93
|
+
elsif parent.elsif?
|
|
94
|
+
parent = find_top_if(parent)
|
|
95
|
+
end
|
|
96
|
+
elsif else_branch?(parent)
|
|
97
|
+
# Find the top `if` for `else`.
|
|
98
|
+
parent = parent.parent
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
parent = parent&.parent
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
false
|
|
105
|
+
end
|
|
106
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
107
|
+
|
|
108
|
+
def else_branch?(node)
|
|
109
|
+
node.parent&.if_type? && node.parent.else_branch == node
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def find_top_if(node)
|
|
113
|
+
node = node.parent while node.elsif?
|
|
114
|
+
|
|
115
|
+
node
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -16,6 +16,12 @@ module RuboCop
|
|
|
16
16
|
# enumerator.each { |item| item >= 2 } #=> [2, 3]
|
|
17
17
|
# ----
|
|
18
18
|
#
|
|
19
|
+
# NOTE: Return values in assignment method definitions such as `def foo=(arg)` are
|
|
20
|
+
# detected because they are in a void context. However, autocorrection does not remove
|
|
21
|
+
# the return value, as that would change behavior. In such cases, whether to remove
|
|
22
|
+
# the return value or rename the method to something more appropriate should be left to
|
|
23
|
+
# the user.
|
|
24
|
+
#
|
|
19
25
|
# @example CheckForMethodsWithNoSideEffects: false (default)
|
|
20
26
|
# # bad
|
|
21
27
|
# def some_method
|
|
@@ -86,6 +92,7 @@ module RuboCop
|
|
|
86
92
|
check_expression(node.body)
|
|
87
93
|
end
|
|
88
94
|
alias on_numblock on_block
|
|
95
|
+
alias on_itblock on_block
|
|
89
96
|
|
|
90
97
|
def on_begin(node)
|
|
91
98
|
check_begin(node)
|
|
@@ -103,7 +110,7 @@ module RuboCop
|
|
|
103
110
|
expressions.pop unless in_void_context?(node)
|
|
104
111
|
expressions.each do |expr|
|
|
105
112
|
check_void_op(expr) do
|
|
106
|
-
block_node = node.each_ancestor(:
|
|
113
|
+
block_node = node.each_ancestor(:any_block).first
|
|
107
114
|
|
|
108
115
|
block_node&.method?(:each)
|
|
109
116
|
end
|
|
@@ -113,7 +120,8 @@ module RuboCop
|
|
|
113
120
|
end
|
|
114
121
|
|
|
115
122
|
def check_expression(expr)
|
|
116
|
-
expr = expr.body if expr.if_type?
|
|
123
|
+
expr = expr.body if expr.if_type?
|
|
124
|
+
return unless expr
|
|
117
125
|
|
|
118
126
|
check_literal(expr)
|
|
119
127
|
check_var(expr)
|
|
@@ -124,9 +132,14 @@ module RuboCop
|
|
|
124
132
|
check_nonmutating(expr)
|
|
125
133
|
end
|
|
126
134
|
|
|
135
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
127
136
|
def check_void_op(node, &block)
|
|
128
|
-
node = node.children.first while node
|
|
129
|
-
return unless node
|
|
137
|
+
node = node.children.first while node&.begin_type?
|
|
138
|
+
return unless node&.call_type? && OPERATORS.include?(node.method_name)
|
|
139
|
+
if !UNARY_OPERATORS.include?(node.method_name) && node.loc.dot && node.arguments.none?
|
|
140
|
+
return
|
|
141
|
+
end
|
|
142
|
+
|
|
130
143
|
return if block && yield(node)
|
|
131
144
|
|
|
132
145
|
add_offense(node.loc.selector,
|
|
@@ -134,6 +147,7 @@ module RuboCop
|
|
|
134
147
|
autocorrect_void_op(corrector, node)
|
|
135
148
|
end
|
|
136
149
|
end
|
|
150
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
137
151
|
|
|
138
152
|
def check_var(node)
|
|
139
153
|
return unless node.variable? || node.const_type?
|
|
@@ -178,7 +192,7 @@ module RuboCop
|
|
|
178
192
|
end
|
|
179
193
|
|
|
180
194
|
def check_nonmutating(node)
|
|
181
|
-
return
|
|
195
|
+
return unless node.type?(:send, :any_block)
|
|
182
196
|
|
|
183
197
|
method_name = node.method_name
|
|
184
198
|
return unless NONMUTATING_METHODS.include?(method_name)
|
|
@@ -196,15 +210,10 @@ module RuboCop
|
|
|
196
210
|
end
|
|
197
211
|
|
|
198
212
|
def check_ensure(node)
|
|
199
|
-
return unless (body = node.
|
|
213
|
+
return unless (body = node.branch)
|
|
200
214
|
# NOTE: the `begin` node case is already handled via `on_begin`
|
|
201
215
|
return if body.begin_type?
|
|
202
216
|
|
|
203
|
-
check_void_op(body) do
|
|
204
|
-
block_node = node.each_ancestor(:block).first
|
|
205
|
-
block_node&.method?(:each)
|
|
206
|
-
end
|
|
207
|
-
|
|
208
217
|
check_expression(body)
|
|
209
218
|
end
|
|
210
219
|
|
|
@@ -219,6 +228,7 @@ module RuboCop
|
|
|
219
228
|
if node.arguments.empty?
|
|
220
229
|
corrector.replace(node, node.receiver.source)
|
|
221
230
|
else
|
|
231
|
+
corrector.remove(node.loc.dot) if node.loc.dot
|
|
222
232
|
corrector.replace(
|
|
223
233
|
range_with_surrounding_space(range: node.loc.selector, side: :both,
|
|
224
234
|
newlines: false),
|
|
@@ -228,7 +238,8 @@ module RuboCop
|
|
|
228
238
|
end
|
|
229
239
|
|
|
230
240
|
def autocorrect_void_expression(corrector, node)
|
|
231
|
-
return if node.parent.if_type?
|
|
241
|
+
return if node.parent.if_type?
|
|
242
|
+
return if (def_node = node.each_ancestor(:any_def).first) && def_node.assignment_method?
|
|
232
243
|
|
|
233
244
|
corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
|
|
234
245
|
end
|
|
@@ -32,7 +32,7 @@ module RuboCop
|
|
|
32
32
|
# @param [String] cop_name for specific cop name
|
|
33
33
|
# @param [Hash] cop_config configs for specific cop, from config#for_cop
|
|
34
34
|
# @option cop_config [String] :StyleGuide Extension of base styleguide URL
|
|
35
|
-
# @option cop_config [String] :
|
|
35
|
+
# @option cop_config [String] :References Full reference URLs
|
|
36
36
|
# @option cop_config [String] :Details
|
|
37
37
|
#
|
|
38
38
|
# @param [Hash, nil] options optional
|
|
@@ -100,8 +100,12 @@ module RuboCop
|
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
def reference_urls
|
|
103
|
-
urls =
|
|
104
|
-
|
|
103
|
+
urls = cop_config
|
|
104
|
+
.values_at('References', 'Reference') # Support legacy Reference key
|
|
105
|
+
.flat_map { |url| Array(url) }
|
|
106
|
+
.reject(&:empty?)
|
|
107
|
+
|
|
108
|
+
urls unless urls.empty?
|
|
105
109
|
end
|
|
106
110
|
|
|
107
111
|
def extra_details?
|
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
|
39
39
|
class AbcSize < Base
|
|
40
40
|
include MethodComplexity
|
|
41
41
|
|
|
42
|
-
MSG = 'Assignment Branch Condition size for
|
|
42
|
+
MSG = 'Assignment Branch Condition size for `%<method>s` is too high. ' \
|
|
43
43
|
'[%<abc_vector>s %<complexity>.4g/%<max>.4g]'
|
|
44
44
|
|
|
45
45
|
private
|
|
@@ -51,15 +51,7 @@ module RuboCop
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def on_casgn(node)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if parent&.assignment?
|
|
57
|
-
block_node = parent.children[1]
|
|
58
|
-
elsif parent&.parent&.masgn_type?
|
|
59
|
-
block_node = parent.parent.children[1]
|
|
60
|
-
else
|
|
61
|
-
_scope, _name, block_node = *node
|
|
62
|
-
end
|
|
54
|
+
block_node = node.expression || find_expression_within_parent(node.parent)
|
|
63
55
|
|
|
64
56
|
return unless block_node.respond_to?(:class_definition?) && block_node.class_definition?
|
|
65
57
|
|
|
@@ -71,6 +63,14 @@ module RuboCop
|
|
|
71
63
|
def message(length, max_length)
|
|
72
64
|
format('Class has too many lines. [%<length>d/%<max>d]', length: length, max: max_length)
|
|
73
65
|
end
|
|
66
|
+
|
|
67
|
+
def find_expression_within_parent(parent)
|
|
68
|
+
if parent&.assignment?
|
|
69
|
+
parent.expression
|
|
70
|
+
elsif parent&.parent&.masgn_type?
|
|
71
|
+
parent.parent.expression
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
74
|
end
|
|
75
75
|
end
|
|
76
76
|
end
|
|
@@ -52,12 +52,19 @@ module RuboCop
|
|
|
52
52
|
'Prefer reading the data from an external source.'
|
|
53
53
|
RESTRICT_ON_SEND = [:[]].freeze
|
|
54
54
|
|
|
55
|
+
# @!method set_const?(node)
|
|
56
|
+
def_node_matcher :set_const?, <<~PATTERN
|
|
57
|
+
(const {cbase nil?} :Set)
|
|
58
|
+
PATTERN
|
|
59
|
+
|
|
55
60
|
def on_array(node)
|
|
56
61
|
add_offense(node) if node.children.length >= collection_threshold
|
|
57
62
|
end
|
|
58
63
|
alias on_hash on_array
|
|
59
64
|
|
|
60
65
|
def on_index(node)
|
|
66
|
+
return unless set_const?(node.receiver)
|
|
67
|
+
|
|
61
68
|
add_offense(node) if node.arguments.length >= collection_threshold
|
|
62
69
|
end
|
|
63
70
|
|
|
@@ -14,11 +14,14 @@ module RuboCop
|
|
|
14
14
|
# and ||/or is shorthand for a sequence of ifs, so they also add one.
|
|
15
15
|
# Loops can be said to have an exit condition, so they add one.
|
|
16
16
|
# Blocks that are calls to builtin iteration methods
|
|
17
|
-
# (e.g. `ary.map{...}) also add one, others are ignored.
|
|
17
|
+
# (e.g. `ary.map{...}`) also add one, others are ignored.
|
|
18
|
+
#
|
|
19
|
+
# @example
|
|
18
20
|
#
|
|
19
21
|
# def each_child_node(*types) # count begins: 1
|
|
20
22
|
# unless block_given? # unless: +1
|
|
21
23
|
# return to_enum(__method__, *types)
|
|
24
|
+
# end
|
|
22
25
|
#
|
|
23
26
|
# children.each do |child| # each{}: +1
|
|
24
27
|
# next unless child.is_a?(Node) # unless: +1
|
|
@@ -33,7 +36,7 @@ module RuboCop
|
|
|
33
36
|
include MethodComplexity
|
|
34
37
|
include Utils::IteratingBlock
|
|
35
38
|
|
|
36
|
-
MSG = 'Cyclomatic complexity for
|
|
39
|
+
MSG = 'Cyclomatic complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
|
|
37
40
|
COUNTED_NODES = %i[if while until for csend block block_pass
|
|
38
41
|
rescue when in_pattern and or or_asgn and_asgn].freeze
|
|
39
42
|
|
|
@@ -48,7 +48,7 @@ module RuboCop
|
|
|
48
48
|
LABEL = 'Method'
|
|
49
49
|
|
|
50
50
|
def on_def(node)
|
|
51
|
-
return if
|
|
51
|
+
return if allowed?(node.method_name)
|
|
52
52
|
|
|
53
53
|
check_code_length(node)
|
|
54
54
|
end
|
|
@@ -57,15 +57,23 @@ module RuboCop
|
|
|
57
57
|
def on_block(node)
|
|
58
58
|
return unless node.method?(:define_method)
|
|
59
59
|
|
|
60
|
+
method_name = node.send_node.first_argument
|
|
61
|
+
return if method_name.basic_literal? && allowed?(method_name.value)
|
|
62
|
+
|
|
60
63
|
check_code_length(node)
|
|
61
64
|
end
|
|
62
65
|
alias on_numblock on_block
|
|
66
|
+
alias on_itblock on_block
|
|
63
67
|
|
|
64
68
|
private
|
|
65
69
|
|
|
66
70
|
def cop_label
|
|
67
71
|
LABEL
|
|
68
72
|
end
|
|
73
|
+
|
|
74
|
+
def allowed?(method_name)
|
|
75
|
+
allowed_method?(method_name) || matches_allowed_pattern?(method_name)
|
|
76
|
+
end
|
|
69
77
|
end
|
|
70
78
|
end
|
|
71
79
|
end
|
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
|
50
50
|
|
|
51
51
|
# @!method module_definition?(node)
|
|
52
52
|
def_node_matcher :module_definition?, <<~PATTERN
|
|
53
|
-
(casgn nil? _ (
|
|
53
|
+
(casgn nil? _ (any_block (send (const {nil? cbase} :Module) :new) ...))
|
|
54
54
|
PATTERN
|
|
55
55
|
|
|
56
56
|
def message(length, max_length)
|
|
@@ -27,7 +27,7 @@ module RuboCop
|
|
|
27
27
|
# end # ===
|
|
28
28
|
# end # 7 complexity points
|
|
29
29
|
class PerceivedComplexity < CyclomaticComplexity
|
|
30
|
-
MSG = 'Perceived complexity for
|
|
30
|
+
MSG = 'Perceived complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
|
|
31
31
|
|
|
32
32
|
COUNTED_NODES = (CyclomaticComplexity::COUNTED_NODES - [:when] + [:case]).freeze
|
|
33
33
|
|
|
@@ -95,7 +95,7 @@ module RuboCop
|
|
|
95
95
|
def compound_assignment(node)
|
|
96
96
|
# Methods setter cannot be detected for multiple assignments
|
|
97
97
|
# and shorthand assigns, so we'll count them here instead
|
|
98
|
-
children = node.masgn_type? ? node.
|
|
98
|
+
children = node.masgn_type? ? node.assignments : node.children
|
|
99
99
|
|
|
100
100
|
will_be_miscounted = children.count do |child|
|
|
101
101
|
child.respond_to?(:setter_method?) && !child.setter_method?
|
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
|
9
9
|
extend NodePattern::Macros
|
|
10
10
|
include Util
|
|
11
11
|
|
|
12
|
-
FOLDABLE_TYPES = %i[array hash heredoc
|
|
12
|
+
FOLDABLE_TYPES = %i[array hash heredoc method_call].freeze
|
|
13
13
|
CLASSLIKE_TYPES = %i[class module].freeze
|
|
14
14
|
private_constant :FOLDABLE_TYPES, :CLASSLIKE_TYPES
|
|
15
15
|
|
|
@@ -145,11 +145,10 @@ module RuboCop
|
|
|
145
145
|
|
|
146
146
|
def extract_body(node)
|
|
147
147
|
case node.type
|
|
148
|
-
when :class, :module, :sclass, :block, :numblock, :def, :defs
|
|
148
|
+
when :class, :module, :sclass, :block, :numblock, :itblock, :def, :defs
|
|
149
149
|
node.body
|
|
150
150
|
when :casgn
|
|
151
|
-
|
|
152
|
-
extract_body(value)
|
|
151
|
+
extract_body(node.expression)
|
|
153
152
|
else
|
|
154
153
|
node
|
|
155
154
|
end
|
|
@@ -26,6 +26,13 @@ module RuboCop
|
|
|
26
26
|
extend NodePattern::Macros
|
|
27
27
|
include RuboCop::AST::Sexp
|
|
28
28
|
|
|
29
|
+
VAR_SETTER_TO_GETTER = {
|
|
30
|
+
lvasgn: :lvar,
|
|
31
|
+
ivasgn: :ivar,
|
|
32
|
+
cvasgn: :cvar,
|
|
33
|
+
gvasgn: :gvar
|
|
34
|
+
}.freeze
|
|
35
|
+
|
|
29
36
|
# Plug into the calculator
|
|
30
37
|
def initialize(node, discount_repeated_attributes: false)
|
|
31
38
|
super(node)
|
|
@@ -114,13 +121,6 @@ module RuboCop
|
|
|
114
121
|
calls.fetch(value) { yield [calls, value] }
|
|
115
122
|
end
|
|
116
123
|
|
|
117
|
-
VAR_SETTER_TO_GETTER = {
|
|
118
|
-
lvasgn: :lvar,
|
|
119
|
-
ivasgn: :ivar,
|
|
120
|
-
cvasgn: :cvar,
|
|
121
|
-
gvasgn: :gvar
|
|
122
|
-
}.freeze
|
|
123
|
-
|
|
124
124
|
# @returns `[receiver, method | nil]` for the given setter `node`
|
|
125
125
|
# or `nil` if it is not a setter.
|
|
126
126
|
def setter_to_getter(node)
|
|
@@ -5,10 +5,10 @@ module RuboCop
|
|
|
5
5
|
# This module checks for nodes that should be aligned to the left or right.
|
|
6
6
|
# This amount is determined by the instance variable @column_delta.
|
|
7
7
|
module Alignment
|
|
8
|
-
private
|
|
9
|
-
|
|
10
8
|
SPACE = ' '
|
|
11
9
|
|
|
10
|
+
private
|
|
11
|
+
|
|
12
12
|
attr_reader :column_delta
|
|
13
13
|
|
|
14
14
|
def configured_indentation_width
|
|
@@ -66,7 +66,7 @@ module RuboCop
|
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
# @deprecated Use processed_source.line_with_comment?(line)
|
|
69
|
-
def end_of_line_comment(line)
|
|
69
|
+
def end_of_line_comment(line) # rubocop:disable Naming/PredicateMethod
|
|
70
70
|
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
71
71
|
`end_of_line_comment` is deprecated. Use `processed_source.line_with_comment?` instead.
|
|
72
72
|
WARNING
|
|
@@ -18,12 +18,12 @@ module RuboCop
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
# @deprecated Use allowed_line? instead
|
|
21
|
-
def ignored_line?
|
|
21
|
+
def ignored_line?(line)
|
|
22
22
|
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
23
23
|
`ignored_line?` is deprecated. Use `allowed_line?` instead.
|
|
24
24
|
WARNING
|
|
25
25
|
|
|
26
|
-
allowed_line?
|
|
26
|
+
allowed_line?(line)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def matches_allowed_pattern?(line)
|
|
@@ -31,12 +31,12 @@ module RuboCop
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
# @deprecated Use matches_allowed_pattern? instead
|
|
34
|
-
def matches_ignored_pattern?
|
|
34
|
+
def matches_ignored_pattern?(line)
|
|
35
35
|
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
36
36
|
`matches_ignored_pattern?` is deprecated. Use `matches_allowed_pattern?` instead.
|
|
37
37
|
WARNING
|
|
38
38
|
|
|
39
|
-
matches_allowed_pattern?
|
|
39
|
+
matches_allowed_pattern?(line)
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
def allowed_patterns
|
|
@@ -17,9 +17,7 @@ module RuboCop
|
|
|
17
17
|
alias on_and_asgn on_lvasgn
|
|
18
18
|
|
|
19
19
|
def on_send(node)
|
|
20
|
-
rhs = extract_rhs(node)
|
|
21
|
-
|
|
22
|
-
return unless rhs
|
|
20
|
+
return unless (rhs = extract_rhs(node))
|
|
23
21
|
|
|
24
22
|
check_assignment(node, rhs)
|
|
25
23
|
end
|
|
@@ -27,17 +25,11 @@ module RuboCop
|
|
|
27
25
|
module_function
|
|
28
26
|
|
|
29
27
|
def extract_rhs(node)
|
|
30
|
-
if node.
|
|
31
|
-
|
|
32
|
-
elsif node.op_asgn_type?
|
|
33
|
-
_lhs, _op, rhs = *node
|
|
34
|
-
elsif node.call_type?
|
|
35
|
-
rhs = node.last_argument
|
|
28
|
+
if node.call_type?
|
|
29
|
+
node.last_argument
|
|
36
30
|
elsif node.assignment?
|
|
37
|
-
|
|
31
|
+
node.expression
|
|
38
32
|
end
|
|
39
|
-
|
|
40
|
-
rhs
|
|
41
33
|
end
|
|
42
34
|
end
|
|
43
35
|
end
|