rubocop 1.53.1 → 1.90.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +93 -88
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +949 -185
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +43 -4
- data/exe/rubocop +2 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +28 -7
- data/lib/rubocop/cli/command/auto_generate_config.rb +63 -18
- data/lib/rubocop/cli/command/execute_runner.rb +35 -4
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +26 -4
- data/lib/rubocop/cli/command/show_docs_url.rb +5 -9
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +60 -16
- data/lib/rubocop/comment_config/directive_range.rb +32 -0
- data/lib/rubocop/comment_config/disable_next.rb +97 -0
- data/lib/rubocop/comment_config.rb +123 -49
- data/lib/rubocop/config.rb +180 -35
- data/lib/rubocop/config_finder.rb +15 -5
- data/lib/rubocop/config_loader.rb +83 -59
- data/lib/rubocop/config_loader_resolver.rb +65 -25
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +76 -21
- data/lib/rubocop/cop/autocorrect_logic.rb +70 -25
- data/lib/rubocop/cop/badge.rb +8 -0
- data/lib/rubocop/cop/base.rb +151 -30
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -2
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +6 -4
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +32 -33
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +11 -4
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +80 -22
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +5 -9
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +14 -5
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +37 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +31 -5
- data/lib/rubocop/cop/exclude_limit.rb +32 -6
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +51 -19
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +11 -4
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +15 -10
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +10 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +51 -25
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +7 -5
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +132 -39
- 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 +130 -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_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- 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 +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +6 -9
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +10 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +4 -11
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +89 -17
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/class_structure.rb +171 -43
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +10 -3
- data/lib/rubocop/cop/layout/condition_position.rb +13 -7
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +3 -7
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +11 -11
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +66 -15
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +75 -10
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +71 -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_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +24 -6
- data/lib/rubocop/cop/layout/extra_spacing.rb +110 -14
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +59 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +20 -11
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +22 -22
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +26 -26
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +11 -12
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +6 -5
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +38 -5
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +168 -22
- data/lib/rubocop/cop/layout/leading_comment_space.rb +111 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +28 -11
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +9 -4
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/line_length.rb +271 -37
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- 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 +3 -2
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +252 -32
- 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 +117 -42
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +17 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +12 -2
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -4
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +94 -38
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +8 -41
- 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_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +48 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +73 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/ambiguous_range.rb +8 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/argument_mismatch.rb +89 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +20 -10
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +49 -17
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +227 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +166 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +53 -9
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +5 -5
- data/lib/rubocop/cop/lint/duplicate_methods.rb +504 -49
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +19 -2
- data/lib/rubocop/cop/lint/empty_block.rb +5 -5
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +33 -57
- data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
- 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_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -5
- data/lib/rubocop/cop/lint/empty_when.rb +9 -4
- data/lib/rubocop/cop/lint/ensure_return.rb +20 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +28 -25
- data/lib/rubocop/cop/lint/float_comparison.rb +59 -15
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- 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 +22 -12
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -9
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +30 -6
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +133 -12
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +95 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +61 -30
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +44 -22
- data/lib/rubocop/cop/lint/missing_super.rb +33 -3
- data/lib/rubocop/cop/lint/mixed_case_range.rb +16 -12
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +8 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +22 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +22 -10
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +10 -10
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +28 -15
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -3
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +104 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +18 -6
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +9 -24
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -5
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +126 -30
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +57 -21
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +206 -15
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +20 -10
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +10 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +9 -2
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -2
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -8
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
- data/lib/rubocop/cop/lint/rescue_type.rb +6 -12
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +55 -13
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +113 -41
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +7 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +103 -10
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +40 -12
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +78 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +29 -13
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +25 -3
- data/lib/rubocop/cop/lint/syntax.rb +35 -5
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +77 -9
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +114 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +68 -15
- data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +28 -2
- data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +37 -12
- data/lib/rubocop/cop/lint/useless_assignment.rb +92 -34
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +3 -4
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +14 -8
- data/lib/rubocop/cop/lint/useless_setter_call.rb +17 -29
- data/lib/rubocop/cop/lint/useless_times.rb +24 -3
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +127 -29
- data/lib/rubocop/cop/lint.rb +178 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
- data/lib/rubocop/cop/metrics/block_length.rb +9 -7
- data/lib/rubocop/cop/metrics/block_nesting.rb +43 -8
- data/lib/rubocop/cop/metrics/class_length.rb +23 -17
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +8 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +17 -8
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +38 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +5 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +39 -12
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/metrics.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +12 -6
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +20 -4
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +46 -18
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +47 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +22 -14
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +11 -6
- 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 +32 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +33 -15
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +49 -40
- data/lib/rubocop/cop/mixin/hash_subset.rb +210 -0
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +61 -14
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -12
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +120 -39
- data/lib/rubocop/cop/mixin/project_index_help.rb +188 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -6
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +57 -15
- data/lib/rubocop/cop/mixin/string_help.rb +5 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +27 -10
- data/lib/rubocop/cop/mixin.rb +91 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +35 -6
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +9 -10
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +21 -7
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +25 -19
- data/lib/rubocop/cop/naming/method_name.rb +190 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +232 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +23 -17
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +5 -4
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +56 -14
- data/lib/rubocop/cop/registry.rb +225 -64
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +184 -33
- data/lib/rubocop/cop/style/accessor_grouping.rb +56 -11
- data/lib/rubocop/cop/style/alias.rb +26 -12
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +3 -2
- data/lib/rubocop/cop/style/arguments_forwarding.rb +487 -63
- data/lib/rubocop/cop/style/array_first_last.rb +90 -0
- data/lib/rubocop/cop/style/array_intersect.rb +148 -41
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +5 -2
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +106 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +89 -53
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +16 -21
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +139 -22
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +29 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +53 -23
- data/lib/rubocop/cop/style/collection_methods.rb +4 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +29 -9
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +11 -5
- data/lib/rubocop/cop/style/conditional_assignment.rb +85 -56
- data/lib/rubocop/cop/style/constant_visibility.rb +21 -23
- data/lib/rubocop/cop/style/copyright.rb +49 -24
- data/lib/rubocop/cop/style/data_inheritance.rb +12 -1
- data/lib/rubocop/cop/style/date_time.rb +8 -7
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -7
- data/lib/rubocop/cop/style/dig_chain.rb +94 -0
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +171 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +77 -13
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +76 -29
- data/lib/rubocop/cop/style/documentation_method.rb +24 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +12 -16
- data/lib/rubocop/cop/style/each_with_object.rb +5 -4
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +16 -2
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +5 -14
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +43 -25
- data/lib/rubocop/cop/style/empty_method.rb +0 -6
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +164 -24
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +13 -5
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +35 -8
- data/lib/rubocop/cop/style/file_null.rb +91 -0
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +23 -21
- data/lib/rubocop/cop/style/float_division.rb +23 -5
- data/lib/rubocop/cop/style/for.rb +7 -2
- data/lib/rubocop/cop/style/format_string.rb +47 -13
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +6 -5
- data/lib/rubocop/cop/style/guard_clause.rb +67 -21
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +38 -13
- data/lib/rubocop/cop/style/hash_each_methods.rb +109 -12
- data/lib/rubocop/cop/style/hash_except.rb +38 -146
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +102 -0
- data/lib/rubocop/cop/style/hash_slice.rb +96 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +36 -7
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +62 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +26 -22
- data/lib/rubocop/cop/style/if_unless_modifier.rb +72 -47
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +15 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +12 -9
- data/lib/rubocop/cop/style/if_with_semicolon.rb +75 -11
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +71 -9
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- 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 +71 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +16 -5
- data/lib/rubocop/cop/style/lambda_call.rb +33 -11
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +93 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +28 -10
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +77 -28
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +38 -9
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +37 -15
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +8 -6
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +75 -12
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- 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_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +9 -3
- data/lib/rubocop/cop/style/multiline_method_signature.rb +18 -13
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +6 -4
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +63 -59
- data/lib/rubocop/cop/style/mutable_constant.rb +117 -19
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +6 -5
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +8 -15
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +12 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +3 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +13 -5
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +50 -16
- data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +40 -8
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +69 -48
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +5 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +5 -4
- data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
- data/lib/rubocop/cop/style/raise_args.rb +19 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +37 -4
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +21 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +53 -6
- data/lib/rubocop/cop/style/redundant_condition.rb +98 -25
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -9
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +31 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +88 -5
- data/lib/rubocop/cop/style/redundant_each.rb +11 -9
- data/lib/rubocop/cop/style/redundant_exception.rb +39 -13
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +5 -13
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +10 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +23 -6
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- 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_interpolation_unfreeze.rb +62 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +92 -72
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +203 -84
- data/lib/rubocop/cop/style/redundant_percent_q.rb +6 -4
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +20 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +20 -24
- data/lib/rubocop/cop/style/redundant_return.rb +20 -8
- data/lib/rubocop/cop/style/redundant_self.rb +43 -22
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +19 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +9 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +17 -16
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +4 -5
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +20 -7
- data/lib/rubocop/cop/style/return_nil.rb +8 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +67 -11
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +176 -66
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +14 -10
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +62 -26
- data/lib/rubocop/cop/style/self_assignment.rb +13 -19
- data/lib/rubocop/cop/style/semicolon.rb +53 -17
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +3 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +90 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +16 -12
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +103 -91
- data/lib/rubocop/cop/style/special_global_vars.rb +8 -4
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -1
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +34 -17
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +25 -3
- data/lib/rubocop/cop/style/super_arguments.rb +220 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +86 -14
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +37 -5
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +4 -3
- 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 +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +21 -22
- data/lib/rubocop/cop/style/trivial_accessors.rb +3 -3
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_do.rb +7 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -2
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +12 -7
- data/lib/rubocop/cop/style/yoda_expression.rb +11 -9
- data/lib/rubocop/cop/style/zero_length_predicate.rb +38 -27
- data/lib/rubocop/cop/style.rb +312 -0
- data/lib/rubocop/cop/team.rb +188 -46
- data/lib/rubocop/cop/util.rb +23 -13
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +35 -7
- data/lib/rubocop/cop/variable_force/branch.rb +31 -7
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +32 -10
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +43 -20
- data/lib/rubocop/cops_documentation_generator.rb +137 -63
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +135 -19
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_finder.rb +11 -9
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +8 -9
- data/lib/rubocop/formatter/disabled_config_formatter.rb +62 -22
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +10 -4
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -17
- data/lib/rubocop/formatter/json_formatter.rb +11 -7
- data/lib/rubocop/formatter/junit_formatter.rb +94 -30
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +14 -5
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +11 -10
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -3
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lockfile.rb +76 -7
- data/lib/rubocop/lsp/diagnostic.rb +170 -0
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +163 -56
- data/lib/rubocop/lsp/runtime.rb +47 -44
- data/lib/rubocop/lsp/server.rb +18 -6
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +96 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +44 -14
- data/lib/rubocop/mcp/server.rb +199 -0
- data/lib/rubocop/options.rb +88 -32
- data/lib/rubocop/path_util.rb +33 -11
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +146 -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/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +7 -5
- data/lib/rubocop/remote_config.rb +15 -9
- data/lib/rubocop/result_cache.rb +85 -61
- data/lib/rubocop/rspec/cop_helper.rb +28 -2
- data/lib/rubocop/rspec/expect_offense.rb +29 -12
- data/lib/rubocop/rspec/shared_contexts.rb +165 -24
- data/lib/rubocop/rspec/support.rb +8 -2
- data/lib/rubocop/runner.rb +273 -99
- data/lib/rubocop/server/cache.rb +76 -42
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +4 -4
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +13 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +111 -86
- data/lib/rubocop/target_ruby.rb +131 -89
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/version.rb +84 -10
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +33 -648
- data/lib/ruby_lsp/rubocop/addon.rb +89 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +169 -50
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -100
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -12,6 +12,14 @@ module RuboCop
|
|
|
12
12
|
autocorrect_requested? && disable_uncorrectable? && autocorrect_enabled?
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
# Whether a correction exists but is skipped because it is unsafe in a
|
|
16
|
+
# safe autocorrect run, while `--disable-uncorrectable` asks for a todo
|
|
17
|
+
# comment on everything this run cannot correct.
|
|
18
|
+
def skipped_unsafe_correction_with_disable_uncorrectable?
|
|
19
|
+
autocorrect_requested? && disable_uncorrectable? &&
|
|
20
|
+
@options.fetch(:safe_autocorrect, false) && !safe_autocorrect?
|
|
21
|
+
end
|
|
22
|
+
|
|
15
23
|
def autocorrect_requested?
|
|
16
24
|
@options.fetch(:autocorrect, false)
|
|
17
25
|
end
|
|
@@ -32,7 +40,12 @@ module RuboCop
|
|
|
32
40
|
# allow turning off autocorrect on a cop by cop basis
|
|
33
41
|
return true unless cop_config
|
|
34
42
|
|
|
35
|
-
|
|
43
|
+
# `false` is the same as `disabled` for backward compatibility.
|
|
44
|
+
return false if ['disabled', false].include?(cop_config['AutoCorrect'])
|
|
45
|
+
|
|
46
|
+
# When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
|
|
47
|
+
# source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
48
|
+
return false if contextual_autocorrect? && LSP.enabled?
|
|
36
49
|
|
|
37
50
|
# :safe_autocorrect is a derived option based on several command-line
|
|
38
51
|
# arguments - see RuboCop::Options#add_autocorrection_options
|
|
@@ -44,45 +57,71 @@ module RuboCop
|
|
|
44
57
|
private
|
|
45
58
|
|
|
46
59
|
def disable_offense(offense_range)
|
|
47
|
-
|
|
60
|
+
unbreakable_range = multiline_ranges(offense_range)&.find do |range|
|
|
61
|
+
offense_range.overlaps?(range) &&
|
|
62
|
+
eol_comment_would_be_inside_literal?(offense_range, range)
|
|
63
|
+
end
|
|
48
64
|
|
|
49
|
-
if
|
|
50
|
-
disable_offense_before_and_after(range_by_lines(
|
|
65
|
+
if unbreakable_range
|
|
66
|
+
disable_offense_before_and_after(range_by_lines(unbreakable_range))
|
|
51
67
|
else
|
|
52
68
|
disable_offense_with_eol_or_surround_comment(offense_range)
|
|
53
69
|
end
|
|
54
70
|
end
|
|
55
71
|
|
|
56
|
-
def
|
|
57
|
-
|
|
58
|
-
needed_line_length = (range.source_line + eol_comment).length
|
|
72
|
+
def multiline_ranges(offense_range)
|
|
73
|
+
return if offense_range.empty?
|
|
59
74
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
75
|
+
processed_source.ast.each_node.filter_map do |node|
|
|
76
|
+
if surrounding_heredoc?(node)
|
|
77
|
+
heredoc_range(node)
|
|
78
|
+
elsif string_continuation?(node)
|
|
79
|
+
range_by_lines(node.source_range)
|
|
80
|
+
elsif surrounding_percent_array?(node) || multiline_string?(node)
|
|
81
|
+
node.source_range
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def disable_offense_with_eol_or_surround_comment(range)
|
|
87
|
+
if line_with_eol_comment_too_long?(range)
|
|
63
88
|
disable_offense_before_and_after(range_by_lines(range))
|
|
89
|
+
else
|
|
90
|
+
disable_offense_at_end_of_line(range_of_first_line(range))
|
|
64
91
|
end
|
|
65
92
|
end
|
|
66
93
|
|
|
67
|
-
def
|
|
68
|
-
|
|
69
|
-
return nil if offense_range.empty?
|
|
94
|
+
def eol_comment_would_be_inside_literal?(offense_range, literal_range)
|
|
95
|
+
return true if line_with_eol_comment_too_long?(offense_range)
|
|
70
96
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
end
|
|
74
|
-
heredoc_nodes.map { |node| node.source_range.join(node.loc.heredoc_end) }
|
|
75
|
-
.find { |range| range.contains?(offense_range) }
|
|
97
|
+
offense_line = offense_range.line
|
|
98
|
+
offense_line >= literal_range.first_line && offense_line < literal_range.last_line
|
|
76
99
|
end
|
|
77
100
|
|
|
78
|
-
def
|
|
79
|
-
return
|
|
101
|
+
def line_with_eol_comment_too_long?(range)
|
|
102
|
+
return false unless max_line_length
|
|
80
103
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
104
|
+
(range.source_line + eol_comment).length > max_line_length
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def surrounding_heredoc?(node)
|
|
108
|
+
node.any_str_type? && node.heredoc?
|
|
109
|
+
end
|
|
84
110
|
|
|
85
|
-
|
|
111
|
+
def heredoc_range(node)
|
|
112
|
+
node.source_range.join(node.loc.heredoc_end)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def surrounding_percent_array?(node)
|
|
116
|
+
node.array_type? && node.percent_literal?
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def string_continuation?(node)
|
|
120
|
+
node.any_str_type? && node.source.match?(/\\\s*$/)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def multiline_string?(node)
|
|
124
|
+
node.dstr_type? && node.multiline?
|
|
86
125
|
end
|
|
87
126
|
|
|
88
127
|
def range_of_first_line(range)
|
|
@@ -105,13 +144,19 @@ module RuboCop
|
|
|
105
144
|
end
|
|
106
145
|
|
|
107
146
|
def max_line_length
|
|
147
|
+
return unless config.cop_enabled?('Layout/LineLength')
|
|
148
|
+
|
|
108
149
|
config.for_cop('Layout/LineLength')['Max'] || 120
|
|
109
150
|
end
|
|
110
151
|
|
|
111
|
-
def disable_offense_at_end_of_line(range
|
|
152
|
+
def disable_offense_at_end_of_line(range)
|
|
112
153
|
Corrector.new(range).insert_after(range, eol_comment)
|
|
113
154
|
end
|
|
114
155
|
|
|
156
|
+
def eol_comment
|
|
157
|
+
" # rubocop:todo #{cop_name}"
|
|
158
|
+
end
|
|
159
|
+
|
|
115
160
|
def disable_offense_before_and_after(range_by_lines)
|
|
116
161
|
range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
|
|
117
162
|
leading_whitespace = range_by_lines.source_line[/^\s*/]
|
data/lib/rubocop/cop/badge.rb
CHANGED
|
@@ -52,6 +52,14 @@ module RuboCop
|
|
|
52
52
|
cop_name == other.cop_name && (!qualified? || department == other.department)
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
+
# Returns true if the badge's qualified name or the badge's department
|
|
56
|
+
# matches any of the given names.
|
|
57
|
+
def match_name?(given_names)
|
|
58
|
+
return false unless given_names
|
|
59
|
+
|
|
60
|
+
given_names.include?(to_s) || given_names.include?(department_name)
|
|
61
|
+
end
|
|
62
|
+
|
|
55
63
|
def to_s
|
|
56
64
|
@to_s ||= qualified? ? "#{department}/#{cop_name}" : cop_name
|
|
57
65
|
end
|
data/lib/rubocop/cop/base.rb
CHANGED
|
@@ -41,6 +41,7 @@ module RuboCop
|
|
|
41
41
|
include AutocorrectLogic
|
|
42
42
|
|
|
43
43
|
attr_reader :config, :processed_source
|
|
44
|
+
attr_accessor :project_index
|
|
44
45
|
|
|
45
46
|
# Reports of an investigation.
|
|
46
47
|
# Immutable
|
|
@@ -53,23 +54,27 @@ module RuboCop
|
|
|
53
54
|
# List of cops that should not try to autocorrect at the same
|
|
54
55
|
# time as this cop
|
|
55
56
|
#
|
|
56
|
-
# @return [Array<RuboCop::Cop::
|
|
57
|
+
# @return [Array<RuboCop::Cop::Base>]
|
|
57
58
|
#
|
|
58
59
|
# @api public
|
|
59
60
|
def self.autocorrect_incompatible_with
|
|
60
61
|
[]
|
|
61
62
|
end
|
|
62
63
|
|
|
63
|
-
#
|
|
64
|
+
# Returns a url to view this cops documentation online.
|
|
65
|
+
# Requires 'DocumentationBaseURL' to be set for your department.
|
|
66
|
+
# Will follow the convention of RuboCops own documentation structure,
|
|
67
|
+
# overwrite this method to accommodate your custom layout.
|
|
64
68
|
# @return [String, nil]
|
|
65
69
|
#
|
|
66
70
|
# @api public
|
|
67
|
-
def self.documentation_url
|
|
68
|
-
Documentation.url_for(self)
|
|
71
|
+
def self.documentation_url(config = nil)
|
|
72
|
+
Documentation.url_for(self, config)
|
|
69
73
|
end
|
|
70
74
|
|
|
71
75
|
def self.inherited(subclass)
|
|
72
76
|
super
|
|
77
|
+
subclass.instance_variable_set(:@gem_requirements, gem_requirements.dup)
|
|
73
78
|
Registry.global.enlist(subclass)
|
|
74
79
|
end
|
|
75
80
|
|
|
@@ -122,10 +127,35 @@ module RuboCop
|
|
|
122
127
|
# in the `on_new_investigation` callback.
|
|
123
128
|
# If your cop does autocorrections, be aware that your instance may be called
|
|
124
129
|
# multiple times with the same `processed_source.path` but different content.
|
|
130
|
+
# Note that under `--parallel` each worker process has its own cop
|
|
131
|
+
# instances, so state persists only within a worker's share of the files.
|
|
125
132
|
def self.support_multiple_source?
|
|
126
133
|
false
|
|
127
134
|
end
|
|
128
135
|
|
|
136
|
+
## Gem requirements
|
|
137
|
+
|
|
138
|
+
@gem_requirements = {}
|
|
139
|
+
|
|
140
|
+
class << self
|
|
141
|
+
attr_reader :gem_requirements
|
|
142
|
+
|
|
143
|
+
# Register a version requirement for the given gem name.
|
|
144
|
+
# This cop will be skipped unless the target satisfies *all* requirements.
|
|
145
|
+
# @param [String] gem_name
|
|
146
|
+
# @param [Array<String>] version_requirements The version requirements,
|
|
147
|
+
# using the same syntax as a Gemfile, e.g. ">= 1.2.3"
|
|
148
|
+
#
|
|
149
|
+
# If omitted, any version of the gem will be accepted.
|
|
150
|
+
#
|
|
151
|
+
# https://guides.rubygems.org/patterns/#declaring-dependencies
|
|
152
|
+
#
|
|
153
|
+
# @api public
|
|
154
|
+
def requires_gem(gem_name, *version_requirements)
|
|
155
|
+
@gem_requirements[gem_name] = Gem::Requirement.new(version_requirements)
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
129
159
|
def initialize(config = nil, options = nil)
|
|
130
160
|
@config = config || Config.new
|
|
131
161
|
@options = options || { debug: false }
|
|
@@ -162,7 +192,9 @@ module RuboCop
|
|
|
162
192
|
def add_global_offense(message = nil, severity: nil)
|
|
163
193
|
severity = find_severity(nil, severity)
|
|
164
194
|
message = find_message(nil, message)
|
|
165
|
-
|
|
195
|
+
range = Offense::NO_LOCATION
|
|
196
|
+
status = enabled_line?(range.line) ? :unsupported : :disabled
|
|
197
|
+
current_offenses << Offense.new(severity, range, message, name, status)
|
|
166
198
|
end
|
|
167
199
|
|
|
168
200
|
# Adds an offense on the specified range (or node with an expression)
|
|
@@ -178,13 +210,15 @@ module RuboCop
|
|
|
178
210
|
severity = find_severity(range_to_pass, severity)
|
|
179
211
|
message = find_message(range_to_pass, message)
|
|
180
212
|
|
|
181
|
-
status, corrector =
|
|
213
|
+
status, corrector = enabled_lines?(range) ? correct(range, &block) : :disabled
|
|
214
|
+
justification = suppression_reason(range) if status == :disabled
|
|
182
215
|
|
|
183
216
|
# Since this range may be generated from Ruby code embedded in some
|
|
184
217
|
# template file, we convert it to location info in the original file.
|
|
185
218
|
range = range_for_original(range)
|
|
186
219
|
|
|
187
|
-
current_offenses << Offense.new(severity, range, message, name, status, corrector
|
|
220
|
+
current_offenses << Offense.new(severity, range, message, name, status, corrector,
|
|
221
|
+
justification: justification)
|
|
188
222
|
end
|
|
189
223
|
|
|
190
224
|
# This method should be overridden when a cop's behavior depends
|
|
@@ -232,6 +266,16 @@ module RuboCop
|
|
|
232
266
|
@config.target_ruby_version
|
|
233
267
|
end
|
|
234
268
|
|
|
269
|
+
# Returns a gems locked versions (i.e. from Gemfile.lock or gems.locked)
|
|
270
|
+
# @returns [Gem::Version | nil] The locked gem version, or nil if the gem is not present.
|
|
271
|
+
def target_gem_version(gem_name)
|
|
272
|
+
@config.gem_versions_in_target && @config.gem_versions_in_target[gem_name]
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def parser_engine
|
|
276
|
+
@config.parser_engine
|
|
277
|
+
end
|
|
278
|
+
|
|
235
279
|
def target_rails_version
|
|
236
280
|
@config.target_rails_version
|
|
237
281
|
end
|
|
@@ -240,7 +284,12 @@ module RuboCop
|
|
|
240
284
|
@config.active_support_extensions_enabled?
|
|
241
285
|
end
|
|
242
286
|
|
|
287
|
+
def string_literals_frozen_by_default?
|
|
288
|
+
@config.string_literals_frozen_by_default?
|
|
289
|
+
end
|
|
290
|
+
|
|
243
291
|
def relevant_file?(file)
|
|
292
|
+
return false unless target_satisfies_all_gem_version_requirements?
|
|
244
293
|
return true unless @config.clusivity_config_for_badge?(self.class.badge)
|
|
245
294
|
|
|
246
295
|
file == RuboCop::AST::ProcessedSource::STRING_SOURCE_NAME ||
|
|
@@ -254,7 +303,7 @@ module RuboCop
|
|
|
254
303
|
|
|
255
304
|
# There should be very limited reasons for a Cop to do it's own parsing
|
|
256
305
|
def parse(source, path = nil)
|
|
257
|
-
ProcessedSource.new(source, target_ruby_version, path)
|
|
306
|
+
ProcessedSource.new(source, target_ruby_version, path, parser_engine: parser_engine)
|
|
258
307
|
end
|
|
259
308
|
|
|
260
309
|
# @api private
|
|
@@ -262,7 +311,9 @@ module RuboCop
|
|
|
262
311
|
def ready
|
|
263
312
|
return self if self.class.support_multiple_source?
|
|
264
313
|
|
|
265
|
-
self.class.new(@config, @options)
|
|
314
|
+
self.class.new(@config, @options).tap do |fresh|
|
|
315
|
+
fresh.project_index = @project_index
|
|
316
|
+
end
|
|
266
317
|
end
|
|
267
318
|
|
|
268
319
|
### Reserved for Cop::Cop
|
|
@@ -284,8 +335,11 @@ module RuboCop
|
|
|
284
335
|
# @api private
|
|
285
336
|
def self.callbacks_needed
|
|
286
337
|
@callbacks_needed ||= public_instance_methods.select do |m|
|
|
287
|
-
|
|
288
|
-
|
|
338
|
+
# OPTIMIZE: `start_with?` with two string arguments instead of a regex
|
|
339
|
+
# is faster in this specific case.
|
|
340
|
+
m.start_with?('on_', 'after_') &&
|
|
341
|
+
# exclude standard "callbacks" like 'on_new_investigation' unless refined
|
|
342
|
+
instance_method(m).owner != Base
|
|
289
343
|
end
|
|
290
344
|
end
|
|
291
345
|
# rubocop:enable Layout/ClassStructure
|
|
@@ -305,12 +359,29 @@ module RuboCop
|
|
|
305
359
|
@current_original = original
|
|
306
360
|
end
|
|
307
361
|
|
|
362
|
+
# @api private
|
|
363
|
+
def always_autocorrect?
|
|
364
|
+
# `true` is the same as `'always'` for backward compatibility.
|
|
365
|
+
['always', true].include?(cop_config.fetch('AutoCorrect', 'always'))
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
# @api private
|
|
369
|
+
def contextual_autocorrect?
|
|
370
|
+
cop_config.fetch('AutoCorrect', 'always') == 'contextual'
|
|
371
|
+
end
|
|
372
|
+
|
|
308
373
|
def inspect # :nodoc:
|
|
309
374
|
"#<#{self.class.name}:#{object_id} @config=#{@config} @options=#{@options}>"
|
|
310
375
|
end
|
|
311
376
|
|
|
312
377
|
private
|
|
313
378
|
|
|
379
|
+
### Reserved for Commissioner
|
|
380
|
+
|
|
381
|
+
private_class_method def self.restrict_on_send
|
|
382
|
+
@restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
|
|
383
|
+
end
|
|
384
|
+
|
|
314
385
|
### Reserved for Cop::Cop
|
|
315
386
|
|
|
316
387
|
def callback_argument(range)
|
|
@@ -339,10 +410,6 @@ module RuboCop
|
|
|
339
410
|
@current_offenses ||= []
|
|
340
411
|
end
|
|
341
412
|
|
|
342
|
-
private_class_method def self.restrict_on_send
|
|
343
|
-
@restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
|
|
344
|
-
end
|
|
345
|
-
|
|
346
413
|
EMPTY_OFFENSES = [].freeze
|
|
347
414
|
private_constant :EMPTY_OFFENSES
|
|
348
415
|
# Called to complete an investigation
|
|
@@ -356,18 +423,11 @@ module RuboCop
|
|
|
356
423
|
|
|
357
424
|
### Actually private methods
|
|
358
425
|
|
|
359
|
-
# rubocop:disable Layout/ClassStructure
|
|
360
|
-
def self.builtin?
|
|
361
|
-
return false unless (m = instance_methods(false).first) # any custom method will do
|
|
362
|
-
|
|
363
|
-
path, _line = instance_method(m).source_location
|
|
364
|
-
path.start_with?(__dir__)
|
|
365
|
-
end
|
|
366
|
-
private_class_method :builtin?
|
|
367
|
-
# rubocop:enable Layout/ClassStructure
|
|
368
|
-
|
|
369
426
|
def reset_investigation
|
|
370
|
-
@currently_disabled_lines =
|
|
427
|
+
@currently_disabled_lines = nil
|
|
428
|
+
@current_offenses = nil
|
|
429
|
+
@processed_source = nil
|
|
430
|
+
@current_corrector = nil
|
|
371
431
|
end
|
|
372
432
|
|
|
373
433
|
# @return [Symbol, Corrector] offense status
|
|
@@ -389,7 +449,11 @@ module RuboCop
|
|
|
389
449
|
def use_corrector(range, corrector)
|
|
390
450
|
if autocorrect?
|
|
391
451
|
attempt_correction(range, corrector)
|
|
392
|
-
elsif
|
|
452
|
+
elsif skipped_unsafe_correction_with_disable_uncorrectable?
|
|
453
|
+
# The unsafe correction will not run, so the offense is
|
|
454
|
+
# uncorrectable for this run and gets a todo comment.
|
|
455
|
+
attempt_correction(range, nil)
|
|
456
|
+
elsif corrector && (always_autocorrect? || (contextual_autocorrect? && !LSP.enabled?))
|
|
393
457
|
:uncorrected
|
|
394
458
|
else
|
|
395
459
|
:unsupported
|
|
@@ -443,8 +507,23 @@ module RuboCop
|
|
|
443
507
|
patterns = cop_config[parameter]
|
|
444
508
|
return default_result unless patterns
|
|
445
509
|
|
|
446
|
-
|
|
447
|
-
|
|
510
|
+
file_patterns = FilePatterns.from(patterns)
|
|
511
|
+
relative_file_path = config.path_relative_to_config(file)
|
|
512
|
+
return true if file_patterns.match?(relative_file_path)
|
|
513
|
+
|
|
514
|
+
if parameter == 'Include' && !relative_file_path.start_with?('..')
|
|
515
|
+
matches_absolute_include_pattern?(patterns, file)
|
|
516
|
+
else
|
|
517
|
+
file_patterns.match?(file)
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
def matches_absolute_include_pattern?(patterns, file)
|
|
522
|
+
absolute_file_path = absolute?(file) ? file : File.expand_path(file)
|
|
523
|
+
patterns.any? do |pattern|
|
|
524
|
+
(absolute?(pattern.to_s) || pattern.to_s.start_with?('..')) &&
|
|
525
|
+
match_path?(pattern, absolute_file_path)
|
|
526
|
+
end
|
|
448
527
|
end
|
|
449
528
|
|
|
450
529
|
def enabled_line?(line_number)
|
|
@@ -453,6 +532,30 @@ module RuboCop
|
|
|
453
532
|
@processed_source.comment_config.cop_enabled_at_line?(self, line_number)
|
|
454
533
|
end
|
|
455
534
|
|
|
535
|
+
# A multi-line offense is suppressed by a directive on any line of its
|
|
536
|
+
# range, not only its first line, matching the intuition that the
|
|
537
|
+
# directive is attached to the offending code.
|
|
538
|
+
def enabled_lines?(range)
|
|
539
|
+
return true if @options[:ignore_disable_comments] || !@processed_source
|
|
540
|
+
|
|
541
|
+
comment_config = @processed_source.comment_config
|
|
542
|
+
comment_config.cop_enabled_at_lines?(self, range.first_line, range.last_line)
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
# The `--` reason on the directive that suppresses offenses on this
|
|
546
|
+
# range, or `nil` when the directive carries none.
|
|
547
|
+
def suppression_reason(range)
|
|
548
|
+
covering = covering_disabled_range(range)
|
|
549
|
+
covering.directive.reason if covering.respond_to?(:directive)
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
def covering_disabled_range(range)
|
|
553
|
+
disabled_ranges = @processed_source.comment_config.cop_disabled_line_ranges[cop_name]
|
|
554
|
+
disabled_ranges&.find do |disabled_range|
|
|
555
|
+
disabled_range.end >= range.first_line && disabled_range.begin <= range.last_line
|
|
556
|
+
end
|
|
557
|
+
end
|
|
558
|
+
|
|
456
559
|
def find_severity(_range, severity)
|
|
457
560
|
custom_severity || severity || default_severity
|
|
458
561
|
end
|
|
@@ -475,12 +578,30 @@ module RuboCop
|
|
|
475
578
|
end
|
|
476
579
|
|
|
477
580
|
def range_for_original(range)
|
|
581
|
+
buffer = @current_original.buffer
|
|
582
|
+
return range if @current_offset.zero? && range.source_buffer.equal?(buffer)
|
|
583
|
+
|
|
478
584
|
::Parser::Source::Range.new(
|
|
479
|
-
|
|
585
|
+
buffer,
|
|
480
586
|
range.begin_pos + @current_offset,
|
|
481
587
|
range.end_pos + @current_offset
|
|
482
588
|
)
|
|
483
589
|
end
|
|
590
|
+
|
|
591
|
+
def target_satisfies_all_gem_version_requirements?
|
|
592
|
+
gem_requirements = self.class.gem_requirements
|
|
593
|
+
return true if gem_requirements.empty?
|
|
594
|
+
|
|
595
|
+
gem_requirements.all? do |gem_name, version_req|
|
|
596
|
+
all_gem_versions_in_target = @config.gem_versions_in_target
|
|
597
|
+
next false unless all_gem_versions_in_target
|
|
598
|
+
|
|
599
|
+
gem_version_in_target = all_gem_versions_in_target[gem_name]
|
|
600
|
+
next false unless gem_version_in_target
|
|
601
|
+
|
|
602
|
+
version_req.satisfied_by?(gem_version_in_target)
|
|
603
|
+
end
|
|
604
|
+
end
|
|
484
605
|
end
|
|
485
606
|
end
|
|
486
607
|
end
|
|
@@ -4,6 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Bundler
|
|
6
6
|
# A Gem's requirements should be listed only once in a Gemfile.
|
|
7
|
+
#
|
|
7
8
|
# @example
|
|
8
9
|
# # bad
|
|
9
10
|
# gem 'rubocop'
|
|
@@ -65,14 +66,14 @@ module RuboCop
|
|
|
65
66
|
|
|
66
67
|
def conditional_declaration?(nodes)
|
|
67
68
|
parent = nodes[0].each_ancestor.find { |ancestor| !ancestor.begin_type? }
|
|
68
|
-
return false unless parent&.
|
|
69
|
+
return false unless parent&.type?(:if, :when)
|
|
69
70
|
|
|
70
71
|
root_conditional_node = parent.if_type? ? parent : parent.parent
|
|
71
72
|
nodes.all? { |node| within_conditional?(node, root_conditional_node) }
|
|
72
73
|
end
|
|
73
74
|
|
|
74
75
|
def within_conditional?(node, conditional_node)
|
|
75
|
-
conditional_node.branches.any? do |branch|
|
|
76
|
+
conditional_node.branches.compact.any? do |branch|
|
|
76
77
|
branch == node || branch.child_nodes.include?(node)
|
|
77
78
|
end
|
|
78
79
|
end
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Bundler
|
|
6
|
+
# A Gem group, or a set of groups, should be listed only once in a Gemfile.
|
|
7
|
+
#
|
|
8
|
+
# For example, if the values of `source`, `git`, `platforms`, or `path`
|
|
9
|
+
# surrounding `group` are different, no offense will be registered:
|
|
10
|
+
#
|
|
11
|
+
# [source,ruby]
|
|
12
|
+
# -----
|
|
13
|
+
# platforms :ruby do
|
|
14
|
+
# group :default do
|
|
15
|
+
# gem 'openssl'
|
|
16
|
+
# end
|
|
17
|
+
# end
|
|
18
|
+
#
|
|
19
|
+
# platforms :jruby do
|
|
20
|
+
# group :default do
|
|
21
|
+
# gem 'jruby-openssl'
|
|
22
|
+
# end
|
|
23
|
+
# end
|
|
24
|
+
# -----
|
|
25
|
+
#
|
|
26
|
+
# @example
|
|
27
|
+
# # bad
|
|
28
|
+
# group :development do
|
|
29
|
+
# gem 'rubocop'
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# group :development do
|
|
33
|
+
# gem 'rubocop-rails'
|
|
34
|
+
# end
|
|
35
|
+
#
|
|
36
|
+
# # bad (same set of groups declared twice)
|
|
37
|
+
# group :development, :test do
|
|
38
|
+
# gem 'rubocop'
|
|
39
|
+
# end
|
|
40
|
+
#
|
|
41
|
+
# group :test, :development do
|
|
42
|
+
# gem 'rspec'
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
# # good
|
|
46
|
+
# group :development do
|
|
47
|
+
# gem 'rubocop'
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
50
|
+
# group :development, :test do
|
|
51
|
+
# gem 'rspec'
|
|
52
|
+
# end
|
|
53
|
+
#
|
|
54
|
+
# # good
|
|
55
|
+
# gem 'rubocop', groups: [:development, :test]
|
|
56
|
+
# gem 'rspec', groups: [:development, :test]
|
|
57
|
+
#
|
|
58
|
+
class DuplicatedGroup < Base
|
|
59
|
+
include RangeHelp
|
|
60
|
+
|
|
61
|
+
MSG = 'Gem group `%<group_name>s` already defined on line ' \
|
|
62
|
+
'%<line_of_first_occurrence>d of the Gemfile.'
|
|
63
|
+
SOURCE_BLOCK_NAMES = %i[source git platforms path].freeze
|
|
64
|
+
|
|
65
|
+
# @!method group_declarations(node)
|
|
66
|
+
def_node_search :group_declarations, '(send nil? :group ...)'
|
|
67
|
+
|
|
68
|
+
def on_new_investigation
|
|
69
|
+
return if processed_source.blank?
|
|
70
|
+
|
|
71
|
+
duplicated_group_nodes.each do |nodes|
|
|
72
|
+
nodes[1..].each do |node|
|
|
73
|
+
group_name = node.arguments.map(&:source).join(', ')
|
|
74
|
+
|
|
75
|
+
register_offense(node, group_name, nodes.first.first_line)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
|
|
82
|
+
def duplicated_group_nodes
|
|
83
|
+
group_declarations = group_declarations(processed_source.ast)
|
|
84
|
+
group_keys = group_declarations.group_by do |node|
|
|
85
|
+
source_key = find_source_key(node)
|
|
86
|
+
group_attributes = group_attributes(node).sort.join
|
|
87
|
+
|
|
88
|
+
"#{source_key}#{group_attributes}"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
group_keys.values.select { |nodes| nodes.size > 1 }
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def register_offense(node, group_name, line_of_first_occurrence)
|
|
95
|
+
line_range = node.loc.column...node.loc.last_column
|
|
96
|
+
offense_location = source_range(processed_source.buffer, node.first_line, line_range)
|
|
97
|
+
message = format(
|
|
98
|
+
MSG,
|
|
99
|
+
group_name: group_name,
|
|
100
|
+
line_of_first_occurrence: line_of_first_occurrence
|
|
101
|
+
)
|
|
102
|
+
add_offense(offense_location, message: message)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def find_source_key(node)
|
|
106
|
+
source_block = node.each_ancestor(:block).find do |block_node|
|
|
107
|
+
SOURCE_BLOCK_NAMES.include?(block_node.method_name)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
return unless source_block
|
|
111
|
+
|
|
112
|
+
"#{source_block.method_name}#{source_block.send_node.first_argument&.source}"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def group_attributes(node)
|
|
116
|
+
node.arguments.map do |argument|
|
|
117
|
+
if argument.hash_type?
|
|
118
|
+
argument.pairs.map(&:source).sort.join(', ')
|
|
119
|
+
else
|
|
120
|
+
argument.respond_to?(:value) ? argument.value.to_s : argument.source
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -128,8 +128,8 @@ module RuboCop
|
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
def ignored_gem?(node)
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
allowed_gems = Array(cop_config['AllowedGems'])
|
|
132
|
+
allowed_gems.include?(node.first_argument.value)
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
def checked_options_present?(node)
|
|
@@ -161,9 +161,11 @@ module RuboCop
|
|
|
161
161
|
end
|
|
162
162
|
|
|
163
163
|
def gem_options(node)
|
|
164
|
-
return [] unless node.
|
|
164
|
+
return [] unless node.last_argument&.hash_type?
|
|
165
165
|
|
|
166
|
-
|
|
166
|
+
# Only literal keys carry an option name to check; a non-literal key
|
|
167
|
+
# (e.g. a variable or method call) has no `value` and must be skipped.
|
|
168
|
+
node.last_argument.keys.filter_map { |key| key.value if key.type?(:sym, :str) }
|
|
167
169
|
end
|
|
168
170
|
end
|
|
169
171
|
end
|
|
@@ -27,7 +27,6 @@ module RuboCop
|
|
|
27
27
|
# Project contains gems.rb and gems.locked files
|
|
28
28
|
class GemFilename < Base
|
|
29
29
|
include ConfigurableEnforcedStyle
|
|
30
|
-
include RangeHelp
|
|
31
30
|
|
|
32
31
|
MSG_GEMFILE_REQUIRED = '`gems.rb` file was found but `Gemfile` is required ' \
|
|
33
32
|
'(file path: %<file_path>s).'
|