rubocop 1.44.1 → 1.78.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 +95 -88
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +660 -117
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +13 -3
- data/exe/rubocop +4 -3
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +33 -13
- data/lib/rubocop/cli/command/execute_runner.rb +11 -6
- data/lib/rubocop/cli/command/lsp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -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 +80 -11
- data/lib/rubocop/comment_config.rb +21 -2
- data/lib/rubocop/config.rb +99 -25
- data/lib/rubocop/config_finder.rb +14 -4
- data/lib/rubocop/config_loader.rb +68 -57
- data/lib/rubocop/config_loader_resolver.rb +48 -17
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -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 +58 -11
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +69 -21
- data/lib/rubocop/cop/base.rb +112 -29
- 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 +4 -4
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +6 -7
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +10 -2
- data/lib/rubocop/cop/commissioner.rb +8 -2
- data/lib/rubocop/cop/cop.rb +55 -9
- data/lib/rubocop/cop/corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -15
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -15
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +12 -2
- data/lib/rubocop/cop/documentation.rb +32 -5
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- 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 +6 -8
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +4 -5
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +10 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +37 -17
- 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 +3 -3
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +38 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +6 -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 +129 -35
- 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 +231 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -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/processed_source_buffer_name.rb +42 -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_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -22
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +75 -0
- 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 +2 -5
- data/lib/rubocop/cop/internal_affairs.rb +12 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
- data/lib/rubocop/cop/layout/array_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +8 -21
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +59 -28
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +2 -6
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +6 -4
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +46 -13
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -14
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +39 -7
- 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_exception_handling_keywords.rb +14 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +23 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -5
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +14 -14
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +25 -34
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +8 -20
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +50 -52
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +38 -55
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +13 -6
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +7 -4
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +16 -16
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +85 -3
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +29 -14
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +19 -9
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/line_length.rb +168 -28
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +8 -27
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +8 -27
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +20 -12
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +21 -6
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +7 -30
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +43 -48
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -10
- 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 +10 -2
- 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 +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +75 -38
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- 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_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +28 -13
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +3 -3
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +4 -4
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +6 -7
- 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/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
- 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 +4 -14
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +49 -30
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +6 -6
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -13
- 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 +2 -5
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +112 -34
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +48 -23
- 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 +1 -3
- data/lib/rubocop/cop/lint/empty_block.rb +2 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +31 -58
- 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_interpolation.rb +4 -6
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +27 -27
- data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -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/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -16
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +24 -13
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
- 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 +114 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +96 -17
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +63 -5
- data/lib/rubocop/cop/lint/mixed_case_range.rb +113 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +11 -18
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +22 -10
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +13 -4
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +3 -4
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +3 -2
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +11 -14
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -5
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +11 -5
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +9 -7
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -13
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +79 -10
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +10 -9
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +36 -20
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +10 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +6 -3
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +3 -2
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -10
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +31 -13
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +71 -10
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -13
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +26 -12
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +3 -3
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +9 -4
- data/lib/rubocop/cop/lint/syntax.rb +14 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +17 -7
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -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 +4 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +17 -11
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +46 -17
- data/lib/rubocop/cop/lint/useless_assignment.rb +104 -15
- 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 -4
- data/lib/rubocop/cop/lint/useless_method_definition.rb +11 -3
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +78 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +7 -3
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
- data/lib/rubocop/cop/lint/useless_times.rb +3 -3
- data/lib/rubocop/cop/lint/void.rb +140 -19
- 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 +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +23 -16
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +83 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +16 -7
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +40 -13
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/migration/department_name.rb +3 -3
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +10 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -3
- 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/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +26 -11
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- 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/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- 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 +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +16 -15
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +62 -43
- 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/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +0 -3
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +10 -11
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +2 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +2 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +71 -35
- data/lib/rubocop/cop/mixin/range_help.rb +16 -10
- 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 +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +13 -7
- 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/surrounding_space.rb +3 -3
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +24 -8
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +40 -9
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +8 -10
- data/lib/rubocop/cop/naming/file_name.rb +5 -7
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +33 -6
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +38 -24
- data/lib/rubocop/cop/naming/method_name.rb +146 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +303 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +26 -17
- data/lib/rubocop/cop/naming/variable_name.rb +56 -7
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +12 -7
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +177 -30
- data/lib/rubocop/cop/style/accessor_grouping.rb +69 -21
- data/lib/rubocop/cop/style/alias.rb +11 -9
- 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 +478 -62
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +54 -34
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +11 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/begin_block.rb +1 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +3 -3
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_comments.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +60 -19
- data/lib/rubocop/cop/style/case_like_if.rb +34 -20
- data/lib/rubocop/cop/style/class_and_module_children.rb +55 -14
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +59 -41
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +35 -12
- 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 +2 -2
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +44 -8
- data/lib/rubocop/cop/style/command_literal.rb +2 -2
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +32 -6
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +13 -4
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -42
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/copyright.rb +37 -24
- data/lib/rubocop/cop/style/data_inheritance.rb +82 -0
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/dir_empty.rb +54 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +3 -3
- data/lib/rubocop/cop/style/documentation.rb +36 -30
- data/lib/rubocop/cop/style/documentation_method.rb +30 -4
- data/lib/rubocop/cop/style/double_negation.rb +6 -6
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +4 -5
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +36 -23
- 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 +150 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +27 -35
- data/lib/rubocop/cop/style/exact_regexp_match.rb +69 -0
- 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 +5 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_empty.rb +71 -0
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_read.rb +5 -8
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +3 -6
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +4 -2
- data/lib/rubocop/cop/style/format_string.rb +33 -12
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -4
- data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +48 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +26 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +111 -34
- data/lib/rubocop/cop/style/hash_except.rb +38 -135
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +38 -7
- 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 +57 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +16 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +140 -17
- 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 +10 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +62 -8
- 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/inverse_methods.rb +21 -17
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +58 -12
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +119 -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 +5 -4
- data/lib/rubocop/cop/style/lambda_call.rb +14 -3
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +31 -7
- data/lib/rubocop/cop/style/map_to_set.rb +6 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +62 -31
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +65 -42
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/min_max.rb +3 -3
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
- data/lib/rubocop/cop/style/mixin_grouping.rb +5 -5
- 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 +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +17 -13
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -4
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +66 -59
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +18 -11
- 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 +2 -0
- data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +31 -6
- data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +33 -9
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +38 -40
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +3 -4
- data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- 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/redundant_argument.rb +35 -4
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +17 -4
- data/lib/rubocop/cop/style/redundant_condition.rb +114 -27
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +50 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +91 -7
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +33 -13
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +10 -16
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
- data/lib/rubocop/cop/style/redundant_format.rb +262 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +3 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +236 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +140 -40
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +107 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +8 -9
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +20 -28
- data/lib/rubocop/cop/style/redundant_return.rb +16 -5
- data/lib/rubocop/cop/style/redundant_self.rb +32 -20
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +12 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +14 -13
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +8 -7
- data/lib/rubocop/cop/style/regexp_literal.rb +12 -3
- data/lib/rubocop/cop/style/require_order.rb +13 -9
- data/lib/rubocop/cop/style/rescue_modifier.rb +19 -7
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/return_nil.rb +8 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +137 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +145 -63
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +33 -16
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +22 -6
- 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 +3 -4
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +78 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +10 -8
- data/lib/rubocop/cop/style/slicing_with_range.rb +106 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +50 -90
- data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
- 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 +10 -3
- data/lib/rubocop/cop/style/super_arguments.rb +221 -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 +78 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -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 +5 -5
- data/lib/rubocop/cop/style/trivial_accessors.rb +3 -3
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
- 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 +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
- data/lib/rubocop/cop/style/word_array.rb +18 -6
- data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +25 -12
- data/lib/rubocop/cop/style/yoda_expression.rb +20 -9
- data/lib/rubocop/cop/style/zero_length_predicate.rb +41 -29
- data/lib/rubocop/cop/team.rb +58 -26
- data/lib/rubocop/cop/util.rb +33 -11
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +66 -6
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +3 -3
- data/lib/rubocop/cop/variable_force/variable.rb +18 -5
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +19 -12
- data/lib/rubocop/cops_documentation_generator.rb +138 -55
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +57 -21
- data/lib/rubocop/ext/comment.rb +18 -0
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +7 -21
- data/lib/rubocop/file_finder.rb +11 -9
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +26 -10
- data/lib/rubocop/formatter/formatter_set.rb +8 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -15
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +74 -24
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +22 -0
- data/lib/rubocop/lsp/routes.rb +227 -0
- data/lib/rubocop/lsp/runtime.rb +69 -0
- data/lib/rubocop/lsp/server.rb +70 -0
- data/lib/rubocop/lsp/severity.rb +27 -0
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +24 -14
- data/lib/rubocop/options.rb +78 -23
- data/lib/rubocop/path_util.rb +21 -10
- 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 +5 -2
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +20 -23
- data/lib/rubocop/rspec/cop_helper.rb +21 -3
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +118 -21
- data/lib/rubocop/rspec/support.rb +8 -2
- data/lib/rubocop/runner.rb +80 -17
- data/lib/rubocop/server/cache.rb +66 -8
- data/lib/rubocop/server/cli.rb +39 -20
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +6 -5
- data/lib/rubocop/server/client_command/start.rb +17 -2
- data/lib/rubocop/server/core.rb +29 -9
- data/lib/rubocop/server/helper.rb +1 -1
- data/lib/rubocop/server/server_command/exec.rb +1 -2
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +97 -82
- data/lib/rubocop/target_ruby.rb +105 -79
- data/lib/rubocop/version.rb +74 -12
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +81 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +152 -63
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- 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
@@ -6,17 +6,28 @@ module RuboCop
|
|
6
6
|
# a cop or moving it to a new department.
|
7
7
|
# @api private
|
8
8
|
class RenamedCop < CopRule
|
9
|
-
attr_reader :new_name
|
9
|
+
attr_reader :new_name, :metadata
|
10
10
|
|
11
|
-
def initialize(config, old_name,
|
11
|
+
def initialize(config, old_name, name_or_hash)
|
12
12
|
super(config, old_name)
|
13
|
-
|
13
|
+
|
14
|
+
if name_or_hash.is_a?(Hash)
|
15
|
+
@metadata = name_or_hash
|
16
|
+
@new_name = name_or_hash['new_name']
|
17
|
+
else
|
18
|
+
@metadata = {}
|
19
|
+
@new_name = name_or_hash
|
20
|
+
end
|
14
21
|
end
|
15
22
|
|
16
23
|
def rule_message
|
17
24
|
"The `#{old_name}` cop has been #{verb} to `#{new_name}`."
|
18
25
|
end
|
19
26
|
|
27
|
+
def warning?
|
28
|
+
severity == 'warning'
|
29
|
+
end
|
30
|
+
|
20
31
|
private
|
21
32
|
|
22
33
|
def moved?
|
@@ -29,6 +40,10 @@ module RuboCop
|
|
29
40
|
def verb
|
30
41
|
moved? ? 'moved' : 'renamed'
|
31
42
|
end
|
43
|
+
|
44
|
+
def severity
|
45
|
+
metadata['severity']
|
46
|
+
end
|
32
47
|
end
|
33
48
|
end
|
34
49
|
end
|
@@ -15,15 +15,48 @@ module RuboCop
|
|
15
15
|
'changed_parameters' => ChangedParameter,
|
16
16
|
'changed_enforced_styles' => ChangedEnforcedStyles
|
17
17
|
}.freeze
|
18
|
+
LOAD_RULES_CACHE = {} # rubocop:disable Style/MutableConstant
|
19
|
+
private_constant :LOAD_RULES_CACHE
|
18
20
|
|
19
21
|
attr_reader :rules, :warnings
|
20
22
|
|
21
23
|
class << self
|
22
24
|
attr_accessor :files
|
23
25
|
|
26
|
+
def global
|
27
|
+
@global ||= new(Config.new)
|
28
|
+
end
|
29
|
+
|
30
|
+
def reset!
|
31
|
+
@global = nil
|
32
|
+
@deprecated_names = {}
|
33
|
+
LOAD_RULES_CACHE[rules_cache_key] = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def rules_cache_key
|
37
|
+
files.hash
|
38
|
+
end
|
39
|
+
|
24
40
|
def legacy_cop_names
|
25
41
|
# Used by DepartmentName#qualified_legacy_cop_name
|
26
|
-
|
42
|
+
global.legacy_cop_names
|
43
|
+
end
|
44
|
+
|
45
|
+
def deprecated_cop_name?(name)
|
46
|
+
global.deprecated_cop_name?(name)
|
47
|
+
end
|
48
|
+
|
49
|
+
def deprecated_names_for(cop)
|
50
|
+
@deprecated_names ||= {}
|
51
|
+
return @deprecated_names[cop] if @deprecated_names.key?(cop)
|
52
|
+
|
53
|
+
@deprecated_names[cop] = global.rules.filter_map do |rule|
|
54
|
+
next unless rule.cop_rule?
|
55
|
+
next unless rule.respond_to?(:new_name)
|
56
|
+
next unless rule.new_name == cop
|
57
|
+
|
58
|
+
rule.old_name
|
59
|
+
end
|
27
60
|
end
|
28
61
|
end
|
29
62
|
|
@@ -43,21 +76,31 @@ module RuboCop
|
|
43
76
|
raise ValidationError, messages.join("\n")
|
44
77
|
end
|
45
78
|
|
79
|
+
def legacy_cop_names
|
80
|
+
# Used by DepartmentName#qualified_legacy_cop_name
|
81
|
+
cop_rules.map(&:old_name)
|
82
|
+
end
|
83
|
+
|
84
|
+
def deprecated_cop_name?(name)
|
85
|
+
legacy_cop_names.include?(name)
|
86
|
+
end
|
87
|
+
|
46
88
|
private
|
47
89
|
|
48
90
|
# Default rules for obsoletions are in config/obsoletion.yml
|
49
91
|
# Additional rules files can be added with `RuboCop::ConfigObsoletion.files << filename`
|
50
92
|
def load_rules # rubocop:disable Metrics/AbcSize
|
51
|
-
rules = self.class.
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
93
|
+
rules = LOAD_RULES_CACHE[self.class.rules_cache_key] ||=
|
94
|
+
self.class.files.each_with_object({}) do |filename, hash|
|
95
|
+
hash.merge!(YAML.safe_load(File.read(filename)) || {}) do |_key, first, second|
|
96
|
+
case first
|
97
|
+
when Hash
|
98
|
+
first.merge(second)
|
99
|
+
when Array
|
100
|
+
first.concat(second)
|
101
|
+
end
|
58
102
|
end
|
59
103
|
end
|
60
|
-
end
|
61
104
|
|
62
105
|
cop_rules = rules.slice(*COP_RULE_CLASSES.keys)
|
63
106
|
parameter_rules = rules.slice(*PARAMETER_RULE_CLASSES.keys)
|
@@ -68,11 +111,11 @@ module RuboCop
|
|
68
111
|
# Cop rules are keyed by the name of the original cop
|
69
112
|
def load_cop_rules(rules)
|
70
113
|
rules.flat_map do |rule_type, data|
|
71
|
-
data.
|
114
|
+
data.filter_map do |cop_name, configuration|
|
72
115
|
next unless configuration # allow configurations to be disabled with `CopName: ~`
|
73
116
|
|
74
117
|
COP_RULE_CLASSES[rule_type].new(@config, cop_name, configuration)
|
75
|
-
end
|
118
|
+
end
|
76
119
|
end
|
77
120
|
end
|
78
121
|
|
@@ -104,5 +147,9 @@ module RuboCop
|
|
104
147
|
rule.message
|
105
148
|
end
|
106
149
|
end
|
150
|
+
|
151
|
+
def cop_rules
|
152
|
+
rules.select(&:cop_rule?)
|
153
|
+
end
|
107
154
|
end
|
108
155
|
end
|
@@ -1,25 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'pathname'
|
4
|
-
|
5
3
|
module RuboCop
|
6
4
|
# Handles validation of configuration, for example cop names, parameter
|
7
5
|
# names, and Ruby versions.
|
6
|
+
# rubocop:disable Metrics/ClassLength
|
8
7
|
class ConfigValidator
|
9
|
-
extend
|
8
|
+
extend SimpleForwardable
|
10
9
|
|
11
10
|
# @api private
|
12
|
-
COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
|
11
|
+
COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
|
12
|
+
Enabled Reference References].freeze
|
13
13
|
# @api private
|
14
14
|
INTERNAL_PARAMS = %w[Description StyleGuide
|
15
15
|
VersionAdded VersionChanged VersionRemoved
|
16
|
-
Reference Safe SafeAutoCorrect].freeze
|
16
|
+
Reference References Safe SafeAutoCorrect].freeze
|
17
17
|
# @api private
|
18
18
|
NEW_COPS_VALUES = %w[pending disable enable].freeze
|
19
19
|
|
20
20
|
# @api private
|
21
|
-
CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect].to_set.freeze
|
21
|
+
CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect References].to_set.freeze
|
22
22
|
CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze
|
23
|
+
CONFIG_CHECK_AUTOCORRECTS = %w[always contextual disabled].freeze
|
23
24
|
private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
|
24
25
|
|
25
26
|
def_delegators :@config, :smart_loaded_path, :for_all_cops
|
@@ -41,8 +42,9 @@ module RuboCop
|
|
41
42
|
ConfigLoader.default_configuration.key?(key)
|
42
43
|
end
|
43
44
|
|
44
|
-
|
45
|
+
validate_parameter_shape(valid_cop_names)
|
45
46
|
|
47
|
+
check_obsoletions
|
46
48
|
alert_about_unrecognized_cops(invalid_cop_names)
|
47
49
|
validate_new_cops_parameter
|
48
50
|
validate_parameter_names(valid_cop_names)
|
@@ -64,12 +66,6 @@ module RuboCop
|
|
64
66
|
target_ruby.version
|
65
67
|
end
|
66
68
|
|
67
|
-
def validate_section_presence(name)
|
68
|
-
return unless @config.key?(name) && @config[name].nil?
|
69
|
-
|
70
|
-
raise ValidationError, "empty section #{name} found in #{smart_loaded_path}"
|
71
|
-
end
|
72
|
-
|
73
69
|
private
|
74
70
|
|
75
71
|
attr_reader :target_ruby
|
@@ -122,6 +118,7 @@ module RuboCop
|
|
122
118
|
invalid_cop_names.each do |name|
|
123
119
|
# There could be a custom cop with this name. If so, don't warn
|
124
120
|
next if Cop::Registry.global.contains_cop_matching?([name])
|
121
|
+
next if ConfigObsoletion.deprecated_cop_name?(name)
|
125
122
|
|
126
123
|
# Special case for inherit_mode, which is a directive that we keep in
|
127
124
|
# the configuration (even though it's not a cop), because it's easier
|
@@ -177,9 +174,22 @@ module RuboCop
|
|
177
174
|
raise ValidationError, message
|
178
175
|
end
|
179
176
|
|
177
|
+
def validate_parameter_shape(valid_cop_names)
|
178
|
+
valid_cop_names.each do |name|
|
179
|
+
if @config[name].nil?
|
180
|
+
raise ValidationError, "empty section #{name.inspect} found in #{smart_loaded_path}"
|
181
|
+
elsif !@config[name].is_a?(Hash)
|
182
|
+
raise ValidationError, <<~MESSAGE
|
183
|
+
The configuration for #{name.inspect} in #{smart_loaded_path} is not a Hash.
|
184
|
+
|
185
|
+
Found: #{@config[name].inspect}
|
186
|
+
MESSAGE
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
180
191
|
def validate_parameter_names(valid_cop_names)
|
181
192
|
valid_cop_names.each do |name|
|
182
|
-
validate_section_presence(name)
|
183
193
|
each_invalid_parameter(name) do |param, supported_params|
|
184
194
|
warn Rainbow(<<~MESSAGE).yellow
|
185
195
|
Warning: #{name} does not support #{param} parameter.
|
@@ -250,23 +260,32 @@ module RuboCop
|
|
250
260
|
end
|
251
261
|
end
|
252
262
|
|
253
|
-
def check_cop_config_value(hash, parent = nil)
|
263
|
+
def check_cop_config_value(hash, parent = nil) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
254
264
|
hash.each do |key, value|
|
255
265
|
check_cop_config_value(value, key) if value.is_a?(Hash)
|
256
266
|
|
257
267
|
next unless CONFIG_CHECK_KEYS.include?(key) && value.is_a?(String)
|
258
268
|
|
259
|
-
|
269
|
+
if key == 'Enabled' && !CONFIG_CHECK_DEPARTMENTS.include?(value)
|
270
|
+
supposed_values = 'a boolean'
|
271
|
+
elsif key == 'AutoCorrect' && !CONFIG_CHECK_AUTOCORRECTS.include?(value)
|
272
|
+
supposed_values = '`always`, `contextual`, `disabled`, or a boolean'
|
273
|
+
elsif key == 'References'
|
274
|
+
supposed_values = 'an array of strings'
|
275
|
+
else
|
276
|
+
next
|
277
|
+
end
|
260
278
|
|
261
|
-
raise ValidationError,
|
279
|
+
raise ValidationError, param_error_message(parent, key, value, supposed_values)
|
262
280
|
end
|
263
281
|
end
|
264
282
|
|
265
283
|
# FIXME: Handling colors in exception messages like this is ugly.
|
266
|
-
def
|
284
|
+
def param_error_message(parent, key, value, supposed_values)
|
267
285
|
"#{Rainbow('').reset}" \
|
268
|
-
"Property #{Rainbow(key).yellow} of
|
269
|
-
"is supposed to be
|
286
|
+
"Property #{Rainbow(key).yellow} of #{Rainbow(parent).yellow} cop " \
|
287
|
+
"is supposed to be #{supposed_values} and #{Rainbow(value).yellow} is not."
|
270
288
|
end
|
271
289
|
end
|
290
|
+
# rubocop:enable Metrics/ClassLength
|
272
291
|
end
|
@@ -32,10 +32,15 @@ module RuboCop
|
|
32
32
|
# allow turning off autocorrect on a cop by cop basis
|
33
33
|
return true unless cop_config
|
34
34
|
|
35
|
-
|
35
|
+
# `false` is the same as `disabled` for backward compatibility.
|
36
|
+
return false if ['disabled', false].include?(cop_config['AutoCorrect'])
|
37
|
+
|
38
|
+
# When LSP is enabled, it is considered as editing source code,
|
39
|
+
# and autocorrection with `AutoCorrect: contextual` will not be performed.
|
40
|
+
return false if contextual_autocorrect? && LSP.enabled?
|
36
41
|
|
37
42
|
# :safe_autocorrect is a derived option based on several command-line
|
38
|
-
# arguments - see
|
43
|
+
# arguments - see RuboCop::Options#add_autocorrection_options
|
39
44
|
return safe_autocorrect? if @options.fetch(:safe_autocorrect, false)
|
40
45
|
|
41
46
|
true
|
@@ -43,30 +48,69 @@ module RuboCop
|
|
43
48
|
|
44
49
|
private
|
45
50
|
|
46
|
-
def disable_offense(
|
47
|
-
|
48
|
-
|
49
|
-
|
51
|
+
def disable_offense(offense_range)
|
52
|
+
unbreakable_range = multiline_ranges(offense_range)&.find do |range|
|
53
|
+
eol_comment_would_be_inside_literal?(offense_range, range)
|
54
|
+
end
|
55
|
+
|
56
|
+
if unbreakable_range
|
57
|
+
disable_offense_before_and_after(range_by_lines(unbreakable_range))
|
50
58
|
else
|
51
|
-
|
52
|
-
needed_line_length = (range.source_line + eol_comment).length
|
53
|
-
if needed_line_length <= max_line_length
|
54
|
-
disable_offense_at_end_of_line(range_of_first_line(range), eol_comment)
|
55
|
-
else
|
56
|
-
disable_offense_before_and_after(range_by_lines(range))
|
57
|
-
end
|
59
|
+
disable_offense_with_eol_or_surround_comment(offense_range)
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
61
|
-
def
|
62
|
-
|
63
|
-
return nil if offense_range.empty?
|
63
|
+
def multiline_ranges(offense_range)
|
64
|
+
return if offense_range.empty?
|
64
65
|
|
65
|
-
|
66
|
-
|
66
|
+
processed_source.ast.each_node.filter_map do |node|
|
67
|
+
if surrounding_heredoc?(node)
|
68
|
+
heredoc_range(node)
|
69
|
+
elsif string_continuation?(node)
|
70
|
+
range_by_lines(node.source_range)
|
71
|
+
elsif surrounding_percent_array?(node) || multiline_string?(node)
|
72
|
+
node.source_range
|
73
|
+
end
|
67
74
|
end
|
68
|
-
|
69
|
-
|
75
|
+
end
|
76
|
+
|
77
|
+
def disable_offense_with_eol_or_surround_comment(range)
|
78
|
+
if line_with_eol_comment_too_long?(range)
|
79
|
+
disable_offense_before_and_after(range_by_lines(range))
|
80
|
+
else
|
81
|
+
disable_offense_at_end_of_line(range_of_first_line(range))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def eol_comment_would_be_inside_literal?(offense_range, literal_range)
|
86
|
+
return true if line_with_eol_comment_too_long?(offense_range)
|
87
|
+
|
88
|
+
offense_line = offense_range.line
|
89
|
+
offense_line >= literal_range.first_line && offense_line < literal_range.last_line
|
90
|
+
end
|
91
|
+
|
92
|
+
def line_with_eol_comment_too_long?(range)
|
93
|
+
(range.source_line + eol_comment).length > max_line_length
|
94
|
+
end
|
95
|
+
|
96
|
+
def surrounding_heredoc?(node)
|
97
|
+
node.type?(:str, :dstr, :xstr) && node.heredoc?
|
98
|
+
end
|
99
|
+
|
100
|
+
def heredoc_range(node)
|
101
|
+
node.source_range.join(node.loc.heredoc_end)
|
102
|
+
end
|
103
|
+
|
104
|
+
def surrounding_percent_array?(node)
|
105
|
+
node.array_type? && node.percent_literal?
|
106
|
+
end
|
107
|
+
|
108
|
+
def string_continuation?(node)
|
109
|
+
node.type?(:str, :dstr, :xstr) && node.source.match?(/\\\s*$/)
|
110
|
+
end
|
111
|
+
|
112
|
+
def multiline_string?(node)
|
113
|
+
node.dstr_type? && node.multiline?
|
70
114
|
end
|
71
115
|
|
72
116
|
def range_of_first_line(range)
|
@@ -92,10 +136,14 @@ module RuboCop
|
|
92
136
|
config.for_cop('Layout/LineLength')['Max'] || 120
|
93
137
|
end
|
94
138
|
|
95
|
-
def disable_offense_at_end_of_line(range
|
139
|
+
def disable_offense_at_end_of_line(range)
|
96
140
|
Corrector.new(range).insert_after(range, eol_comment)
|
97
141
|
end
|
98
142
|
|
143
|
+
def eol_comment
|
144
|
+
" # rubocop:todo #{cop_name}"
|
145
|
+
end
|
146
|
+
|
99
147
|
def disable_offense_before_and_after(range_by_lines)
|
100
148
|
range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
|
101
149
|
leading_whitespace = range_by_lines.source_line[/^\s*/]
|
data/lib/rubocop/cop/base.rb
CHANGED
@@ -53,23 +53,27 @@ module RuboCop
|
|
53
53
|
# List of cops that should not try to autocorrect at the same
|
54
54
|
# time as this cop
|
55
55
|
#
|
56
|
-
# @return [Array<RuboCop::Cop::
|
56
|
+
# @return [Array<RuboCop::Cop::Base>]
|
57
57
|
#
|
58
58
|
# @api public
|
59
59
|
def self.autocorrect_incompatible_with
|
60
60
|
[]
|
61
61
|
end
|
62
62
|
|
63
|
-
#
|
63
|
+
# Returns a url to view this cops documentation online.
|
64
|
+
# Requires 'DocumentationBaseURL' to be set for your department.
|
65
|
+
# Will follow the convention of RuboCops own documentation structure,
|
66
|
+
# overwrite this method to accommodate your custom layout.
|
64
67
|
# @return [String, nil]
|
65
68
|
#
|
66
69
|
# @api public
|
67
|
-
def self.documentation_url
|
68
|
-
Documentation.url_for(self)
|
70
|
+
def self.documentation_url(config = nil)
|
71
|
+
Documentation.url_for(self, config)
|
69
72
|
end
|
70
73
|
|
71
74
|
def self.inherited(subclass)
|
72
75
|
super
|
76
|
+
subclass.instance_variable_set(:@gem_requirements, gem_requirements.dup)
|
73
77
|
Registry.global.enlist(subclass)
|
74
78
|
end
|
75
79
|
|
@@ -126,6 +130,29 @@ module RuboCop
|
|
126
130
|
false
|
127
131
|
end
|
128
132
|
|
133
|
+
## Gem requirements
|
134
|
+
|
135
|
+
@gem_requirements = {}
|
136
|
+
|
137
|
+
class << self
|
138
|
+
attr_reader :gem_requirements
|
139
|
+
|
140
|
+
# Register a version requirement for the given gem name.
|
141
|
+
# This cop will be skipped unless the target satisfies *all* requirements.
|
142
|
+
# @param [String] gem_name
|
143
|
+
# @param [Array<String>] version_requirements The version requirements,
|
144
|
+
# using the same syntax as a Gemfile, e.g. ">= 1.2.3"
|
145
|
+
#
|
146
|
+
# If omitted, any version of the gem will be accepted.
|
147
|
+
#
|
148
|
+
# https://guides.rubygems.org/patterns/#declaring-dependencies
|
149
|
+
#
|
150
|
+
# @api public
|
151
|
+
def requires_gem(gem_name, *version_requirements)
|
152
|
+
@gem_requirements[gem_name] = Gem::Requirement.new(version_requirements)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
129
156
|
def initialize(config = nil, options = nil)
|
130
157
|
@config = config || Config.new
|
131
158
|
@options = options || { debug: false }
|
@@ -162,7 +189,9 @@ module RuboCop
|
|
162
189
|
def add_global_offense(message = nil, severity: nil)
|
163
190
|
severity = find_severity(nil, severity)
|
164
191
|
message = find_message(nil, message)
|
165
|
-
|
192
|
+
range = Offense::NO_LOCATION
|
193
|
+
status = enabled_line?(range.line) ? :unsupported : :disabled
|
194
|
+
current_offenses << Offense.new(severity, range, message, name, status)
|
166
195
|
end
|
167
196
|
|
168
197
|
# Adds an offense on the specified range (or node with an expression)
|
@@ -180,6 +209,10 @@ module RuboCop
|
|
180
209
|
|
181
210
|
status, corrector = enabled_line?(range.line) ? correct(range, &block) : :disabled
|
182
211
|
|
212
|
+
# Since this range may be generated from Ruby code embedded in some
|
213
|
+
# template file, we convert it to location info in the original file.
|
214
|
+
range = range_for_original(range)
|
215
|
+
|
183
216
|
current_offenses << Offense.new(severity, range, message, name, status, corrector)
|
184
217
|
end
|
185
218
|
|
@@ -228,6 +261,16 @@ module RuboCop
|
|
228
261
|
@config.target_ruby_version
|
229
262
|
end
|
230
263
|
|
264
|
+
# Returns a gems locked versions (i.e. from Gemfile.lock or gems.locked)
|
265
|
+
# @returns [Gem::Version | nil] The locked gem version, or nil if the gem is not present.
|
266
|
+
def target_gem_version(gem_name)
|
267
|
+
@config.gem_versions_in_target && @config.gem_versions_in_target[gem_name]
|
268
|
+
end
|
269
|
+
|
270
|
+
def parser_engine
|
271
|
+
@config.parser_engine
|
272
|
+
end
|
273
|
+
|
231
274
|
def target_rails_version
|
232
275
|
@config.target_rails_version
|
233
276
|
end
|
@@ -236,7 +279,12 @@ module RuboCop
|
|
236
279
|
@config.active_support_extensions_enabled?
|
237
280
|
end
|
238
281
|
|
282
|
+
def string_literals_frozen_by_default?
|
283
|
+
@config.string_literals_frozen_by_default?
|
284
|
+
end
|
285
|
+
|
239
286
|
def relevant_file?(file)
|
287
|
+
return false unless target_satisfies_all_gem_version_requirements?
|
240
288
|
return true unless @config.clusivity_config_for_badge?(self.class.badge)
|
241
289
|
|
242
290
|
file == RuboCop::AST::ProcessedSource::STRING_SOURCE_NAME ||
|
@@ -250,7 +298,7 @@ module RuboCop
|
|
250
298
|
|
251
299
|
# There should be very limited reasons for a Cop to do it's own parsing
|
252
300
|
def parse(source, path = nil)
|
253
|
-
ProcessedSource.new(source, target_ruby_version, path)
|
301
|
+
ProcessedSource.new(source, target_ruby_version, path, parser_engine: parser_engine)
|
254
302
|
end
|
255
303
|
|
256
304
|
# @api private
|
@@ -280,12 +328,46 @@ module RuboCop
|
|
280
328
|
# @api private
|
281
329
|
def self.callbacks_needed
|
282
330
|
@callbacks_needed ||= public_instance_methods.select do |m|
|
283
|
-
|
284
|
-
|
331
|
+
# OPTIMIZE: Check method existence first to make fewer `start_with?` calls.
|
332
|
+
# At the time of writing this comment, this excludes 98 of ~104 methods.
|
333
|
+
# `start_with?` with two string arguments instead of a regex is faster
|
334
|
+
# in this specific case as well.
|
335
|
+
!Base.method_defined?(m) && # exclude standard "callbacks" like 'on_begin_investigation'
|
336
|
+
m.start_with?('on_', 'after_')
|
285
337
|
end
|
286
338
|
end
|
287
339
|
# rubocop:enable Layout/ClassStructure
|
288
340
|
|
341
|
+
# Called before any investigation
|
342
|
+
# @api private
|
343
|
+
def begin_investigation(processed_source, offset: 0, original: processed_source)
|
344
|
+
@current_offenses = nil
|
345
|
+
@current_offense_locations = nil
|
346
|
+
@currently_disabled_lines = nil
|
347
|
+
@processed_source = processed_source
|
348
|
+
@current_corrector = nil
|
349
|
+
|
350
|
+
# We need to keep track of the original source and offset,
|
351
|
+
# because `processed_source` here may be an embedded code in it.
|
352
|
+
@current_offset = offset
|
353
|
+
@current_original = original
|
354
|
+
end
|
355
|
+
|
356
|
+
# @api private
|
357
|
+
def always_autocorrect?
|
358
|
+
# `true` is the same as `'always'` for backward compatibility.
|
359
|
+
['always', true].include?(cop_config.fetch('AutoCorrect', 'always'))
|
360
|
+
end
|
361
|
+
|
362
|
+
# @api private
|
363
|
+
def contextual_autocorrect?
|
364
|
+
cop_config.fetch('AutoCorrect', 'always') == 'contextual'
|
365
|
+
end
|
366
|
+
|
367
|
+
def inspect # :nodoc:
|
368
|
+
"#<#{self.class.name}:#{object_id} @config=#{@config} @options=#{@options}>"
|
369
|
+
end
|
370
|
+
|
289
371
|
private
|
290
372
|
|
291
373
|
### Reserved for Cop::Cop
|
@@ -320,15 +402,6 @@ module RuboCop
|
|
320
402
|
@restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
|
321
403
|
end
|
322
404
|
|
323
|
-
# Called before any investigation
|
324
|
-
def begin_investigation(processed_source)
|
325
|
-
@current_offenses = nil
|
326
|
-
@current_offense_locations = nil
|
327
|
-
@currently_disabled_lines = nil
|
328
|
-
@processed_source = processed_source
|
329
|
-
@current_corrector = nil
|
330
|
-
end
|
331
|
-
|
332
405
|
EMPTY_OFFENSES = [].freeze
|
333
406
|
private_constant :EMPTY_OFFENSES
|
334
407
|
# Called to complete an investigation
|
@@ -342,16 +415,6 @@ module RuboCop
|
|
342
415
|
|
343
416
|
### Actually private methods
|
344
417
|
|
345
|
-
# rubocop:disable Layout/ClassStructure
|
346
|
-
def self.builtin?
|
347
|
-
return false unless (m = instance_methods(false).first) # any custom method will do
|
348
|
-
|
349
|
-
path, _line = instance_method(m).source_location
|
350
|
-
path.start_with?(__dir__)
|
351
|
-
end
|
352
|
-
private_class_method :builtin?
|
353
|
-
# rubocop:enable Layout/ClassStructure
|
354
|
-
|
355
418
|
def reset_investigation
|
356
419
|
@currently_disabled_lines = @current_offenses = @processed_source = @current_corrector = nil
|
357
420
|
end
|
@@ -375,7 +438,7 @@ module RuboCop
|
|
375
438
|
def use_corrector(range, corrector)
|
376
439
|
if autocorrect?
|
377
440
|
attempt_correction(range, corrector)
|
378
|
-
elsif corrector &&
|
441
|
+
elsif corrector && (always_autocorrect? || (contextual_autocorrect? && !LSP.enabled?))
|
379
442
|
:uncorrected
|
380
443
|
else
|
381
444
|
:unsupported
|
@@ -406,7 +469,7 @@ module RuboCop
|
|
406
469
|
|
407
470
|
def range_from_node_or_range(node_or_range)
|
408
471
|
if node_or_range.respond_to?(:loc)
|
409
|
-
node_or_range.
|
472
|
+
node_or_range.source_range
|
410
473
|
elsif node_or_range.is_a?(::Parser::Source::Range)
|
411
474
|
node_or_range
|
412
475
|
else
|
@@ -459,6 +522,26 @@ module RuboCop
|
|
459
522
|
warn(Rainbow(message).red)
|
460
523
|
end
|
461
524
|
end
|
525
|
+
|
526
|
+
def range_for_original(range)
|
527
|
+
::Parser::Source::Range.new(
|
528
|
+
@current_original.buffer,
|
529
|
+
range.begin_pos + @current_offset,
|
530
|
+
range.end_pos + @current_offset
|
531
|
+
)
|
532
|
+
end
|
533
|
+
|
534
|
+
def target_satisfies_all_gem_version_requirements?
|
535
|
+
self.class.gem_requirements.all? do |gem_name, version_req|
|
536
|
+
all_gem_versions_in_target = @config.gem_versions_in_target
|
537
|
+
next false unless all_gem_versions_in_target
|
538
|
+
|
539
|
+
gem_version_in_target = all_gem_versions_in_target[gem_name]
|
540
|
+
next false unless gem_version_in_target
|
541
|
+
|
542
|
+
version_req.satisfied_by?(gem_version_in_target)
|
543
|
+
end
|
544
|
+
end
|
462
545
|
end
|
463
546
|
end
|
464
547
|
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
|