rubocop 1.57.1 → 1.81.7
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 +92 -89
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +540 -86
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -7
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- 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 +28 -4
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +71 -58
- data/lib/rubocop/config_loader_resolver.rb +49 -17
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
- data/lib/rubocop/cop/base.rb +79 -18
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- 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 +3 -5
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator.rb +6 -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 +13 -8
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/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 +124 -30
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- 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 +0 -5
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +9 -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 +1 -1
- 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 +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/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 +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +4 -4
- 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 +36 -21
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
- data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_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 +10 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
- data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +177 -29
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +32 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -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 +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
- 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_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- 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 +1 -3
- 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 +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +30 -10
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -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 +0 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- 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 +0 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -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 +14 -5
- 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 +24 -23
- 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 +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 +23 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- 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/literal_as_condition.rb +126 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -12
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
- 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 +12 -3
- 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 +9 -5
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- 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 +29 -10
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
- data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +20 -9
- 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 +72 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- 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 +14 -8
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
- data/lib/rubocop/cop/lint/useless_assignment.rb +21 -16
- 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 +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +92 -18
- 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 +7 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +21 -15
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +15 -6
- 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 +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +8 -9
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- 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 +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 +23 -14
- 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/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- 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 +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
- data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
- data/lib/rubocop/cop/style/alias.rb +2 -1
- 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 +228 -36
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
- data/lib/rubocop/cop/style/case_like_if.rb +14 -17
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +25 -15
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +22 -8
- 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/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
- data/lib/rubocop/cop/style/constant_visibility.rb +16 -20
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
- 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/documentation.rb +25 -25
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +3 -4
- 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_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 +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
- data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -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 +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -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 +2 -5
- data/lib/rubocop/cop/style/float_division.rb +23 -5
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +20 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +110 -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_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +35 -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 +37 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
- 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 +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +48 -6
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +2 -1
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/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 +29 -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 +52 -25
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
- 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_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/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 +10 -9
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.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 +48 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +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 +29 -3
- 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 +41 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
- data/lib/rubocop/cop/style/redundant_return.rb +9 -3
- 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 +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -3
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
- 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 +20 -13
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +33 -9
- 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 +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +79 -87
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +9 -2
- 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 +1 -1
- 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_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- 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/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +28 -4
- data/lib/rubocop/cop/util.rb +19 -6
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +43 -20
- data/lib/rubocop/cops_documentation_generator.rb +135 -58
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +54 -18
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
- 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 +70 -23
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -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 +190 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +77 -40
- data/lib/rubocop/lsp/runtime.rb +20 -50
- data/lib/rubocop/lsp/server.rb +6 -4
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +12 -4
- data/lib/rubocop/options.rb +43 -22
- 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 +29 -34
- data/lib/rubocop/rspec/cop_helper.rb +20 -2
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +112 -18
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +3 -3
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/target_finder.rb +93 -82
- data/lib/rubocop/target_ruby.rb +111 -81
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +61 -3
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +103 -51
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- 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
|
@@ -27,7 +27,10 @@ module RuboCop
|
|
|
27
27
|
class VariableForce < Force # rubocop:disable Metrics/ClassLength
|
|
28
28
|
VARIABLE_ASSIGNMENT_TYPE = :lvasgn
|
|
29
29
|
REGEXP_NAMED_CAPTURE_TYPE = :match_with_lvasgn
|
|
30
|
-
|
|
30
|
+
PATTERN_MATCH_VARIABLE_TYPE = :match_var
|
|
31
|
+
VARIABLE_ASSIGNMENT_TYPES = [
|
|
32
|
+
VARIABLE_ASSIGNMENT_TYPE, REGEXP_NAMED_CAPTURE_TYPE, PATTERN_MATCH_VARIABLE_TYPE
|
|
33
|
+
].freeze
|
|
31
34
|
|
|
32
35
|
ARGUMENT_DECLARATION_TYPES = [
|
|
33
36
|
:arg, :optarg, :restarg,
|
|
@@ -51,7 +54,7 @@ module RuboCop
|
|
|
51
54
|
|
|
52
55
|
ZERO_ARITY_SUPER_TYPE = :zsuper
|
|
53
56
|
|
|
54
|
-
TWISTED_SCOPE_TYPES = %i[block numblock class sclass defs module].freeze
|
|
57
|
+
TWISTED_SCOPE_TYPES = %i[block numblock itblock class sclass defs module].freeze
|
|
55
58
|
SCOPE_TYPES = (TWISTED_SCOPE_TYPES + [:def]).freeze
|
|
56
59
|
|
|
57
60
|
SEND_TYPE = :send
|
|
@@ -68,6 +71,8 @@ module RuboCop
|
|
|
68
71
|
end
|
|
69
72
|
end
|
|
70
73
|
|
|
74
|
+
BRANCH_NODES = %i[if case case_match rescue].freeze
|
|
75
|
+
|
|
71
76
|
def variable_table
|
|
72
77
|
@variable_table ||= VariableTable.new(self)
|
|
73
78
|
end
|
|
@@ -112,6 +117,7 @@ module RuboCop
|
|
|
112
117
|
NODE_HANDLER_METHOD_NAMES = [
|
|
113
118
|
[VARIABLE_ASSIGNMENT_TYPE, :process_variable_assignment],
|
|
114
119
|
[REGEXP_NAMED_CAPTURE_TYPE, :process_regexp_named_captures],
|
|
120
|
+
[PATTERN_MATCH_VARIABLE_TYPE, :process_pattern_match_variable],
|
|
115
121
|
[MULTIPLE_ASSIGNMENT_TYPE, :process_variable_multiple_assignment],
|
|
116
122
|
[VARIABLE_REFERENCE_TYPE, :process_variable_referencing],
|
|
117
123
|
[RESCUE_TYPE, :process_rescue],
|
|
@@ -175,6 +181,14 @@ module RuboCop
|
|
|
175
181
|
skip_children!
|
|
176
182
|
end
|
|
177
183
|
|
|
184
|
+
def process_pattern_match_variable(node)
|
|
185
|
+
name = node.children.first
|
|
186
|
+
|
|
187
|
+
variable_table.declare_variable(name, node) unless variable_table.variable_exist?(name)
|
|
188
|
+
|
|
189
|
+
skip_children!
|
|
190
|
+
end
|
|
191
|
+
|
|
178
192
|
def regexp_captured_names(node)
|
|
179
193
|
regexp = node.to_regexp
|
|
180
194
|
|
|
@@ -182,15 +196,10 @@ module RuboCop
|
|
|
182
196
|
end
|
|
183
197
|
|
|
184
198
|
def process_variable_operator_assignment(node)
|
|
185
|
-
|
|
186
|
-
asgn_node, rhs_node = *node
|
|
187
|
-
else
|
|
188
|
-
asgn_node, _operator, rhs_node = *node
|
|
189
|
-
end
|
|
190
|
-
|
|
199
|
+
asgn_node = node.lhs
|
|
191
200
|
return unless asgn_node.lvasgn_type?
|
|
192
201
|
|
|
193
|
-
name = asgn_node.
|
|
202
|
+
name = asgn_node.name
|
|
194
203
|
|
|
195
204
|
variable_table.declare_variable(name, asgn_node) unless variable_table.variable_exist?(name)
|
|
196
205
|
|
|
@@ -210,7 +219,7 @@ module RuboCop
|
|
|
210
219
|
# before processing rhs nodes.
|
|
211
220
|
|
|
212
221
|
variable_table.reference_variable(name, node)
|
|
213
|
-
process_node(
|
|
222
|
+
process_node(node.rhs)
|
|
214
223
|
variable_table.assign_to_variable(name, asgn_node)
|
|
215
224
|
|
|
216
225
|
skip_children!
|
|
@@ -229,11 +238,16 @@ module RuboCop
|
|
|
229
238
|
end
|
|
230
239
|
|
|
231
240
|
def process_loop(node)
|
|
232
|
-
if
|
|
241
|
+
if node.post_condition_loop?
|
|
233
242
|
# See the comment at the end of file for this behavior.
|
|
234
243
|
condition_node, body_node = *node
|
|
235
244
|
process_node(body_node)
|
|
236
245
|
process_node(condition_node)
|
|
246
|
+
elsif node.for_type?
|
|
247
|
+
# In `for item in items` the rightmost expression is evaluated first.
|
|
248
|
+
process_node(node.collection)
|
|
249
|
+
process_node(node.variable)
|
|
250
|
+
process_node(node.body) if node.body
|
|
237
251
|
else
|
|
238
252
|
process_children(node)
|
|
239
253
|
end
|
|
@@ -289,7 +303,7 @@ module RuboCop
|
|
|
289
303
|
variable_table.accessible_variables.each { |variable| variable.reference!(node) }
|
|
290
304
|
end
|
|
291
305
|
|
|
292
|
-
# Mark
|
|
306
|
+
# Mark last assignments which are referenced in the same loop
|
|
293
307
|
# as referenced by ignoring AST order since they would be referenced
|
|
294
308
|
# in next iteration.
|
|
295
309
|
def mark_assignments_as_referenced_in_loop(node)
|
|
@@ -301,13 +315,12 @@ module RuboCop
|
|
|
301
315
|
# would be skipped here.
|
|
302
316
|
next unless variable
|
|
303
317
|
|
|
304
|
-
variable.assignments.
|
|
305
|
-
|
|
306
|
-
assignment_node.equal?(assignment.node)
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
assignment.reference!(node)
|
|
318
|
+
loop_assignments = variable.assignments.select do |assignment|
|
|
319
|
+
assignment_nodes_in_loop.include?(assignment.node)
|
|
310
320
|
end
|
|
321
|
+
next unless loop_assignments.any?
|
|
322
|
+
|
|
323
|
+
reference_assignments(loop_assignments, node)
|
|
311
324
|
end
|
|
312
325
|
end
|
|
313
326
|
|
|
@@ -343,9 +356,19 @@ module RuboCop
|
|
|
343
356
|
when :lvasgn
|
|
344
357
|
AssignmentReference.new(node)
|
|
345
358
|
when *OPERATOR_ASSIGNMENT_TYPES
|
|
346
|
-
|
|
347
|
-
|
|
359
|
+
VariableReference.new(node.lhs.name) if node.lhs.lvasgn_type?
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def reference_assignments(loop_assignments, loop_node)
|
|
364
|
+
# If inside a branching statement, mark all as referenced.
|
|
365
|
+
# Otherwise, mark only the last assignment as referenced.
|
|
366
|
+
# Note that `rescue` must be considered as branching because of
|
|
367
|
+
# the `retry` keyword.
|
|
368
|
+
loop_assignments.each do |assignment|
|
|
369
|
+
assignment.reference!(loop_node) if assignment.node.each_ancestor(*BRANCH_NODES).any?
|
|
348
370
|
end
|
|
371
|
+
loop_assignments.last&.reference!(loop_node)
|
|
349
372
|
end
|
|
350
373
|
|
|
351
374
|
def scanned_node?(node)
|
|
@@ -1,23 +1,61 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'fileutils'
|
|
4
|
+
require 'yard'
|
|
4
5
|
|
|
5
6
|
# Class for generating documentation of all cops departments
|
|
6
7
|
# @api private
|
|
7
8
|
class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
8
9
|
include ::RuboCop::Cop::Documentation
|
|
10
|
+
|
|
11
|
+
CopData = Struct.new(
|
|
12
|
+
:cop, :description, :example_objects, :safety_objects, :see_objects, :config, keyword_init: true
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
STRUCTURE = {
|
|
16
|
+
name: ->(data) { cop_header(data.cop) },
|
|
17
|
+
required_ruby_version: ->(data) { required_ruby_version(data.cop) },
|
|
18
|
+
properties: ->(data) { properties(data.cop) },
|
|
19
|
+
description: ->(data) { "#{data.description}\n" },
|
|
20
|
+
safety: ->(data) { safety_object(data.safety_objects, data.cop) },
|
|
21
|
+
examples: ->(data) { examples(data.example_objects, data.cop) },
|
|
22
|
+
configuration: ->(data) { configurations(data.cop.department, data.cop, data.config) },
|
|
23
|
+
references: ->(data) { references(data.cop, data.see_objects) }
|
|
24
|
+
}.freeze
|
|
25
|
+
|
|
9
26
|
# This class will only generate documentation for cops that belong to one of
|
|
10
27
|
# the departments given in the `departments` array. E.g. if we only wanted
|
|
11
28
|
# documentation for Lint cops:
|
|
12
29
|
#
|
|
13
30
|
# CopsDocumentationGenerator.new(departments: ['Lint']).call
|
|
14
31
|
#
|
|
15
|
-
|
|
32
|
+
# For plugin extensions, specify `:plugin_name` keyword as follows:
|
|
33
|
+
#
|
|
34
|
+
# CopsDocumentationGenerator.new(
|
|
35
|
+
# departments: ['Performance'], plugin_name: 'rubocop-performance'
|
|
36
|
+
# ).call
|
|
37
|
+
#
|
|
38
|
+
# You can append additional information:
|
|
39
|
+
#
|
|
40
|
+
# callback = ->(data) { required_rails_version(data.cop) }
|
|
41
|
+
# CopsDocumentationGenerator.new(extra_info: { ruby_version: callback }).call
|
|
42
|
+
#
|
|
43
|
+
# This will insert the string returned from the lambda _after_ the section from RuboCop itself.
|
|
44
|
+
# See `CopsDocumentationGenerator::STRUCTURE` for available sections.
|
|
45
|
+
#
|
|
46
|
+
def initialize(departments: [], extra_info: {}, base_dir: Dir.pwd, plugin_name: nil)
|
|
16
47
|
@departments = departments.map(&:to_sym).sort!
|
|
48
|
+
@extra_info = extra_info
|
|
17
49
|
@cops = RuboCop::Cop::Registry.global
|
|
18
50
|
@config = RuboCop::ConfigLoader.default_configuration
|
|
19
|
-
|
|
20
|
-
|
|
51
|
+
# NOTE: For example, this prevents excessive plugin loading before another task executes,
|
|
52
|
+
# in cases where plugins are already loaded by `internal_investigation`.
|
|
53
|
+
if plugin_name && @config.loaded_plugins.none? { |plugin| plugin.about.name == plugin_name }
|
|
54
|
+
RuboCop::Plugin.integrate_plugins(RuboCop::Config.new, [plugin_name])
|
|
55
|
+
end
|
|
56
|
+
@base_dir = base_dir
|
|
57
|
+
@docs_path = "#{base_dir}/docs/modules/ROOT"
|
|
58
|
+
FileUtils.mkdir_p("#{@docs_path}/pages")
|
|
21
59
|
end
|
|
22
60
|
|
|
23
61
|
def call
|
|
@@ -37,24 +75,21 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
37
75
|
cops.with_department(department).sort!
|
|
38
76
|
end
|
|
39
77
|
|
|
40
|
-
def cops_body(
|
|
41
|
-
check_examples_to_have_the_default_enforced_style!(
|
|
42
|
-
|
|
43
|
-
content =
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
content << examples(examples_objects) if examples_objects.any?
|
|
49
|
-
content << configurations(cop.department, pars)
|
|
50
|
-
content << references(cop, see_objects)
|
|
78
|
+
def cops_body(data)
|
|
79
|
+
check_examples_to_have_the_default_enforced_style!(data.example_objects, data.cop)
|
|
80
|
+
|
|
81
|
+
content = +''
|
|
82
|
+
STRUCTURE.each do |section, block|
|
|
83
|
+
content << instance_exec(data, &block)
|
|
84
|
+
content << @extra_info[section].call(data) if @extra_info[section]
|
|
85
|
+
end
|
|
51
86
|
content
|
|
52
87
|
end
|
|
53
88
|
|
|
54
|
-
def check_examples_to_have_the_default_enforced_style!(
|
|
55
|
-
return if
|
|
89
|
+
def check_examples_to_have_the_default_enforced_style!(example_objects, cop)
|
|
90
|
+
return if example_objects.none?
|
|
56
91
|
|
|
57
|
-
examples_describing_enforced_style =
|
|
92
|
+
examples_describing_enforced_style = example_objects.map(&:name).grep(/EnforcedStyle:/)
|
|
58
93
|
return if examples_describing_enforced_style.none?
|
|
59
94
|
|
|
60
95
|
if examples_describing_enforced_style.index { |name| name.match?('default') }.nonzero?
|
|
@@ -66,16 +101,20 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
66
101
|
raise "Specify the default EnforcedStyle for #{cop.cop_name}"
|
|
67
102
|
end
|
|
68
103
|
|
|
69
|
-
def examples(
|
|
70
|
-
|
|
104
|
+
def examples(example_objects, cop)
|
|
105
|
+
return '' if example_objects.none?
|
|
106
|
+
|
|
107
|
+
example_objects.each_with_object(cop_subsection('Examples', cop).dup) do |example, content|
|
|
71
108
|
content << "\n" unless content.end_with?("\n\n")
|
|
72
|
-
content <<
|
|
109
|
+
content << example_header(example.name, cop) unless example.name == ''
|
|
73
110
|
content << code_example(example)
|
|
74
111
|
end
|
|
75
112
|
end
|
|
76
113
|
|
|
77
|
-
def safety_object(
|
|
78
|
-
|
|
114
|
+
def safety_object(safety_objects, cop)
|
|
115
|
+
return '' if safety_objects.all? { |s| s.text.blank? }
|
|
116
|
+
|
|
117
|
+
safety_objects.each_with_object(cop_subsection('Safety', cop).dup) do |safety_object, content|
|
|
79
118
|
next if safety_object.text.blank?
|
|
80
119
|
|
|
81
120
|
content << "\n" unless content.end_with?("\n\n")
|
|
@@ -87,7 +126,15 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
87
126
|
def required_ruby_version(cop)
|
|
88
127
|
return '' unless cop.respond_to?(:required_minimum_ruby_version)
|
|
89
128
|
|
|
90
|
-
|
|
129
|
+
if cop.required_minimum_ruby_version
|
|
130
|
+
requirement = cop.required_minimum_ruby_version
|
|
131
|
+
elsif cop.required_maximum_ruby_version
|
|
132
|
+
requirement = "<= #{cop.required_maximum_ruby_version}"
|
|
133
|
+
else
|
|
134
|
+
return ''
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
"NOTE: Requires Ruby version #{requirement}\n\n"
|
|
91
138
|
end
|
|
92
139
|
|
|
93
140
|
# rubocop:disable Metrics/MethodLength
|
|
@@ -97,7 +144,9 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
97
144
|
'Version Changed'
|
|
98
145
|
]
|
|
99
146
|
autocorrect = if cop.support_autocorrect?
|
|
100
|
-
|
|
147
|
+
context = cop.new.always_autocorrect? ? 'Always' : 'Command-line only'
|
|
148
|
+
|
|
149
|
+
"#{context}#{' (Unsafe)' unless cop.new(config).safe_autocorrect?}"
|
|
101
150
|
else
|
|
102
151
|
'No'
|
|
103
152
|
end
|
|
@@ -113,22 +162,25 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
113
162
|
end
|
|
114
163
|
# rubocop:enable Metrics/MethodLength
|
|
115
164
|
|
|
116
|
-
def
|
|
165
|
+
def cop_header(cop)
|
|
117
166
|
content = +"\n"
|
|
118
|
-
content << "
|
|
167
|
+
content << "[##{to_anchor(cop.cop_name)}]\n"
|
|
168
|
+
content << "== #{cop.cop_name}\n"
|
|
119
169
|
content << "\n"
|
|
120
170
|
content
|
|
121
171
|
end
|
|
122
172
|
|
|
123
|
-
def
|
|
173
|
+
def cop_subsection(title, cop)
|
|
124
174
|
content = +"\n"
|
|
175
|
+
content << "[##{to_anchor(title)}-#{to_anchor(cop.cop_name)}]\n"
|
|
125
176
|
content << "=== #{title}\n"
|
|
126
177
|
content << "\n"
|
|
127
178
|
content
|
|
128
179
|
end
|
|
129
180
|
|
|
130
|
-
def
|
|
131
|
-
content = +"
|
|
181
|
+
def example_header(title, cop)
|
|
182
|
+
content = +"[##{to_anchor(title)}-#{to_anchor(cop.cop_name)}]\n"
|
|
183
|
+
content << "==== #{title}\n"
|
|
132
184
|
content << "\n"
|
|
133
185
|
content
|
|
134
186
|
end
|
|
@@ -140,22 +192,22 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
140
192
|
content
|
|
141
193
|
end
|
|
142
194
|
|
|
143
|
-
def configurations(department,
|
|
144
|
-
return '' if pars.empty?
|
|
145
|
-
|
|
195
|
+
def configurations(department, cop, cop_config)
|
|
146
196
|
header = ['Name', 'Default value', 'Configurable values']
|
|
147
|
-
configs =
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
197
|
+
configs = cop_config.each_key.reject do |key|
|
|
198
|
+
key == 'AllowMultipleStyles' ||
|
|
199
|
+
(key != 'SupportedTypes' && key.start_with?('Supported'))
|
|
200
|
+
end
|
|
201
|
+
return '' if configs.empty?
|
|
202
|
+
|
|
151
203
|
content = configs.map do |name|
|
|
152
|
-
configurable = configurable_values(
|
|
153
|
-
default = format_table_value(
|
|
204
|
+
configurable = configurable_values(cop_config, name)
|
|
205
|
+
default = format_table_value(cop_config[name])
|
|
154
206
|
|
|
155
207
|
[configuration_name(department, name), default, configurable]
|
|
156
208
|
end
|
|
157
209
|
|
|
158
|
-
|
|
210
|
+
cop_subsection('Configurable attributes', cop) + to_table(header, content)
|
|
159
211
|
end
|
|
160
212
|
|
|
161
213
|
def configuration_name(department, name)
|
|
@@ -166,17 +218,17 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
166
218
|
end
|
|
167
219
|
|
|
168
220
|
# rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
|
|
169
|
-
def configurable_values(
|
|
221
|
+
def configurable_values(cop_config, name)
|
|
170
222
|
case name
|
|
171
223
|
when /^Enforced/
|
|
172
224
|
supported_style_name = RuboCop::Cop::Util.to_supported_styles(name)
|
|
173
|
-
format_table_value(
|
|
225
|
+
format_table_value(cop_config[supported_style_name])
|
|
174
226
|
when 'IndentationWidth'
|
|
175
227
|
'Integer'
|
|
176
228
|
when 'Database'
|
|
177
|
-
format_table_value(
|
|
229
|
+
format_table_value(cop_config['SupportedDatabases'])
|
|
178
230
|
else
|
|
179
|
-
case
|
|
231
|
+
case cop_config[name]
|
|
180
232
|
when String
|
|
181
233
|
'String'
|
|
182
234
|
when Integer
|
|
@@ -216,7 +268,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
216
268
|
else
|
|
217
269
|
wrap_backtick(val.nil? ? '<none>' : val)
|
|
218
270
|
end
|
|
219
|
-
value.gsub("#{
|
|
271
|
+
value.gsub("#{@base_dir}/", '').rstrip
|
|
220
272
|
end
|
|
221
273
|
|
|
222
274
|
def wrap_backtick(value)
|
|
@@ -233,7 +285,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
233
285
|
urls = RuboCop::Cop::MessageAnnotator.new(config, cop.name, cop_config, {}).urls
|
|
234
286
|
return '' if urls.empty? && see_objects.empty?
|
|
235
287
|
|
|
236
|
-
content =
|
|
288
|
+
content = cop_subsection('References', cop)
|
|
237
289
|
content << urls.map { |url| "* #{url}" }.join("\n")
|
|
238
290
|
content << "\n" unless urls.empty?
|
|
239
291
|
content << see_objects.map { |see| "* #{see.name}" }.join("\n")
|
|
@@ -245,40 +297,56 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
245
297
|
return '' unless department == :Layout
|
|
246
298
|
|
|
247
299
|
filename = "#{department_to_basename(department)}_footer.adoc"
|
|
248
|
-
file = "#{
|
|
300
|
+
file = "#{docs_path}/partials/#{filename}"
|
|
249
301
|
return '' unless File.exist?(file)
|
|
250
302
|
|
|
251
303
|
"\ninclude::../partials/#{filename}[]\n"
|
|
252
304
|
end
|
|
253
305
|
|
|
306
|
+
# rubocop:disable Metrics/MethodLength
|
|
254
307
|
def print_cops_of_department(department)
|
|
255
308
|
selected_cops = cops_of_department(department)
|
|
256
|
-
content =
|
|
309
|
+
content = +<<~HEADER
|
|
310
|
+
////
|
|
311
|
+
Do NOT edit this file by hand directly, as it is automatically generated.
|
|
312
|
+
|
|
313
|
+
Please make any necessary changes to the cop documentation within the source files themselves.
|
|
314
|
+
////
|
|
315
|
+
|
|
316
|
+
= #{department}
|
|
317
|
+
HEADER
|
|
257
318
|
selected_cops.each { |cop| content << print_cop_with_doc(cop) }
|
|
258
319
|
content << footer_for_department(department)
|
|
259
|
-
file_name = "#{docs_path}/#{department_to_basename(department)}.adoc"
|
|
320
|
+
file_name = "#{docs_path}/pages/#{department_to_basename(department)}.adoc"
|
|
260
321
|
File.open(file_name, 'w') do |file|
|
|
261
322
|
puts "* generated #{file_name}"
|
|
262
323
|
file.write("#{content.strip}\n")
|
|
263
324
|
end
|
|
264
325
|
end
|
|
326
|
+
# rubocop:enable Metrics/MethodLength
|
|
265
327
|
|
|
266
328
|
def print_cop_with_doc(cop) # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
|
|
267
329
|
cop_config = config.for_cop(cop)
|
|
268
330
|
non_display_keys = %w[
|
|
269
|
-
|
|
270
|
-
|
|
331
|
+
Enabled
|
|
332
|
+
Description
|
|
333
|
+
StyleGuide
|
|
334
|
+
Reference References
|
|
335
|
+
Safe SafeAutoCorrect AutoCorrect
|
|
336
|
+
VersionAdded VersionChanged
|
|
271
337
|
]
|
|
272
|
-
|
|
338
|
+
parameters = cop_config.reject { |k| non_display_keys.include? k }
|
|
273
339
|
description = 'No documentation'
|
|
274
|
-
|
|
340
|
+
example_objects = safety_objects = see_objects = []
|
|
275
341
|
cop_code(cop) do |code_object|
|
|
276
342
|
description = code_object.docstring unless code_object.docstring.blank?
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
343
|
+
example_objects = code_object.tags('example')
|
|
344
|
+
safety_objects = code_object.tags('safety')
|
|
345
|
+
see_objects = code_object.tags('see')
|
|
280
346
|
end
|
|
281
|
-
|
|
347
|
+
data = CopData.new(cop: cop, description: description, example_objects: example_objects,
|
|
348
|
+
safety_objects: safety_objects, see_objects: see_objects, config: parameters)
|
|
349
|
+
cops_body(data)
|
|
282
350
|
end
|
|
283
351
|
|
|
284
352
|
def cop_code(cop)
|
|
@@ -294,7 +362,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
294
362
|
filename = "#{department_to_basename(department)}.adoc"
|
|
295
363
|
content = +"=== Department xref:#{filename}[#{type_title}]\n\n"
|
|
296
364
|
cops_of_department(department).each do |cop|
|
|
297
|
-
anchor = cop.cop_name
|
|
365
|
+
anchor = to_anchor(cop.cop_name)
|
|
298
366
|
content << "* xref:#{filename}##{anchor}[#{cop.cop_name}]\n"
|
|
299
367
|
end
|
|
300
368
|
|
|
@@ -302,7 +370,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
302
370
|
end
|
|
303
371
|
|
|
304
372
|
def print_table_of_contents
|
|
305
|
-
path = "#{docs_path}/cops.adoc"
|
|
373
|
+
path = "#{docs_path}/pages/cops.adoc"
|
|
306
374
|
|
|
307
375
|
File.write(path, table_contents) and return unless File.exist?(path)
|
|
308
376
|
|
|
@@ -326,4 +394,13 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
326
394
|
|
|
327
395
|
status == 'pending' ? 'Pending' : 'Enabled'
|
|
328
396
|
end
|
|
397
|
+
|
|
398
|
+
# HTML anchor are somewhat limited in what characters they can contain, just
|
|
399
|
+
# accept a known-good subset. As long as it's consistent it doesn't matter.
|
|
400
|
+
#
|
|
401
|
+
# Style/AccessModifierDeclarations => styleaccessmodifierdeclarations
|
|
402
|
+
# OnlyFor: [] (default) => onlyfor_-__-_default_
|
|
403
|
+
def to_anchor(title)
|
|
404
|
+
title.delete('/').tr(' ', '-').gsub(/[^a-zA-Z0-9-]/, '_').downcase
|
|
405
|
+
end
|
|
329
406
|
end
|
|
@@ -9,12 +9,8 @@ class String
|
|
|
9
9
|
# @return [Boolean] true is the string is blank, false otherwise
|
|
10
10
|
#
|
|
11
11
|
# @example
|
|
12
|
-
# ''.blank?
|
|
13
|
-
#
|
|
14
|
-
# @example
|
|
15
|
-
# ' '.blank? #=> true
|
|
16
|
-
#
|
|
17
|
-
# @example
|
|
12
|
+
# ''.blank? #=> true
|
|
13
|
+
# ' '.blank? #=> true
|
|
18
14
|
# ' test'.blank? #=> false
|
|
19
15
|
def blank?
|
|
20
16
|
empty? || lstrip.empty?
|
|
@@ -6,20 +6,36 @@ module RuboCop
|
|
|
6
6
|
# cops it contains.
|
|
7
7
|
class DirectiveComment
|
|
8
8
|
# @api private
|
|
9
|
-
|
|
9
|
+
LINT_DEPARTMENT = 'Lint'
|
|
10
10
|
# @api private
|
|
11
|
-
|
|
11
|
+
LINT_REDUNDANT_DIRECTIVE_COP = "#{LINT_DEPARTMENT}/RedundantCopDisableDirective"
|
|
12
12
|
# @api private
|
|
13
|
-
|
|
13
|
+
LINT_SYNTAX_COP = "#{LINT_DEPARTMENT}/Syntax"
|
|
14
|
+
# @api private
|
|
15
|
+
COP_NAME_PATTERN = '([A-Za-z]\w+/)*(?:[A-Za-z]\w+)'
|
|
14
16
|
# @api private
|
|
15
17
|
COP_NAMES_PATTERN = "(?:#{COP_NAME_PATTERN} , )*#{COP_NAME_PATTERN}"
|
|
16
18
|
# @api private
|
|
17
19
|
COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
|
|
18
20
|
# @api private
|
|
21
|
+
AVAILABLE_MODES = %w[disable enable todo].freeze
|
|
22
|
+
# @api private
|
|
23
|
+
DIRECTIVE_MARKER_PATTERN = '# rubocop : '
|
|
24
|
+
# @api private
|
|
25
|
+
DIRECTIVE_MARKER_REGEXP = Regexp.new(DIRECTIVE_MARKER_PATTERN.gsub(' ', '\s*'))
|
|
26
|
+
# @api private
|
|
27
|
+
DIRECTIVE_HEADER_PATTERN = "#{DIRECTIVE_MARKER_PATTERN}((?:#{AVAILABLE_MODES.join('|')}))\\b"
|
|
28
|
+
# @api private
|
|
19
29
|
DIRECTIVE_COMMENT_REGEXP = Regexp.new(
|
|
20
|
-
"#
|
|
30
|
+
"#{DIRECTIVE_HEADER_PATTERN} #{COPS_PATTERN}"
|
|
21
31
|
.gsub(' ', '\s*')
|
|
22
32
|
)
|
|
33
|
+
# @api private
|
|
34
|
+
TRAILING_COMMENT_MARKER = '--'
|
|
35
|
+
# @api private
|
|
36
|
+
MALFORMED_DIRECTIVE_WITHOUT_COP_NAME_REGEXP = Regexp.new(
|
|
37
|
+
"\\A#{DIRECTIVE_HEADER_PATTERN}\\s*\\z".gsub(' ', '\s*')
|
|
38
|
+
)
|
|
23
39
|
|
|
24
40
|
def self.before_comment(line)
|
|
25
41
|
line.split(DIRECTIVE_COMMENT_REGEXP).first
|
|
@@ -30,9 +46,28 @@ module RuboCop
|
|
|
30
46
|
def initialize(comment, cop_registry = Cop::Registry.global)
|
|
31
47
|
@comment = comment
|
|
32
48
|
@cop_registry = cop_registry
|
|
49
|
+
@match_data = comment.text.match(DIRECTIVE_COMMENT_REGEXP)
|
|
33
50
|
@mode, @cops = match_captures
|
|
34
51
|
end
|
|
35
52
|
|
|
53
|
+
# Checks if the comment starts with `# rubocop:` marker
|
|
54
|
+
def start_with_marker?
|
|
55
|
+
comment.text.start_with?(DIRECTIVE_MARKER_REGEXP)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Checks if the comment is malformed as a `# rubocop:` directive
|
|
59
|
+
def malformed?
|
|
60
|
+
return true if !start_with_marker? || @match_data.nil?
|
|
61
|
+
|
|
62
|
+
tail = @match_data.post_match.lstrip
|
|
63
|
+
!(tail.empty? || tail.start_with?(TRAILING_COMMENT_MARKER))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Checks if the directive comment is missing a cop name
|
|
67
|
+
def missing_cop_name?
|
|
68
|
+
MALFORMED_DIRECTIVE_WITHOUT_COP_NAME_REGEXP.match?(comment.text)
|
|
69
|
+
end
|
|
70
|
+
|
|
36
71
|
# Checks if this directive relates to single line
|
|
37
72
|
def single_line?
|
|
38
73
|
!comment.text.start_with?(DIRECTIVE_COMMENT_REGEXP)
|
|
@@ -53,7 +88,7 @@ module RuboCop
|
|
|
53
88
|
|
|
54
89
|
# Returns match captures to directive comment pattern
|
|
55
90
|
def match_captures
|
|
56
|
-
@match_captures ||=
|
|
91
|
+
@match_captures ||= @match_data&.captures
|
|
57
92
|
end
|
|
58
93
|
|
|
59
94
|
# Checks if this directive disables cops
|
|
@@ -86,10 +121,15 @@ module RuboCop
|
|
|
86
121
|
@cop_names ||= all_cops? ? all_cop_names : parsed_cop_names
|
|
87
122
|
end
|
|
88
123
|
|
|
124
|
+
# Returns an array of cops for this directive comment, without resolving departments
|
|
125
|
+
def raw_cop_names
|
|
126
|
+
@raw_cop_names ||= (cops || '').split(/,\s*/)
|
|
127
|
+
end
|
|
128
|
+
|
|
89
129
|
# Returns array of specified in this directive department names
|
|
90
130
|
# when all department disabled
|
|
91
131
|
def department_names
|
|
92
|
-
|
|
132
|
+
raw_cop_names.select { |cop| department?(cop) }
|
|
93
133
|
end
|
|
94
134
|
|
|
95
135
|
# Checks if directive departments include cop
|
|
@@ -99,11 +139,11 @@ module RuboCop
|
|
|
99
139
|
|
|
100
140
|
# Checks if cop department has already used in directive comment
|
|
101
141
|
def overridden_by_department?(cop)
|
|
102
|
-
in_directive_department?(cop) &&
|
|
142
|
+
in_directive_department?(cop) && raw_cop_names.include?(cop)
|
|
103
143
|
end
|
|
104
144
|
|
|
105
145
|
def directive_count
|
|
106
|
-
|
|
146
|
+
raw_cop_names.count
|
|
107
147
|
end
|
|
108
148
|
|
|
109
149
|
# Returns line number for directive
|
|
@@ -113,14 +153,11 @@ module RuboCop
|
|
|
113
153
|
|
|
114
154
|
private
|
|
115
155
|
|
|
116
|
-
def splitted_cops_string
|
|
117
|
-
(cops || '').split(/,\s*/)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
156
|
def parsed_cop_names
|
|
121
|
-
|
|
157
|
+
cops = raw_cop_names.map do |name|
|
|
122
158
|
department?(name) ? cop_names_for_department(name) : name
|
|
123
159
|
end.flatten
|
|
160
|
+
cops - [LINT_SYNTAX_COP]
|
|
124
161
|
end
|
|
125
162
|
|
|
126
163
|
def department?(name)
|
|
@@ -128,17 +165,16 @@ module RuboCop
|
|
|
128
165
|
end
|
|
129
166
|
|
|
130
167
|
def all_cop_names
|
|
131
|
-
|
|
168
|
+
exclude_lint_department_cops(cop_registry.names)
|
|
132
169
|
end
|
|
133
170
|
|
|
134
171
|
def cop_names_for_department(department)
|
|
135
172
|
names = cop_registry.names_for_department(department)
|
|
136
|
-
|
|
137
|
-
has_redundant_directive_cop ? exclude_redundant_directive_cop(names) : names
|
|
173
|
+
department == LINT_DEPARTMENT ? exclude_lint_department_cops(names) : names
|
|
138
174
|
end
|
|
139
175
|
|
|
140
|
-
def
|
|
141
|
-
cops - [
|
|
176
|
+
def exclude_lint_department_cops(cops)
|
|
177
|
+
cops - [LINT_REDUNDANT_DIRECTIVE_COP, LINT_SYNTAX_COP]
|
|
142
178
|
end
|
|
143
179
|
end
|
|
144
180
|
end
|