rubocop 1.52.1 → 1.79.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +93 -88
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +596 -91
- 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 +28 -15
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- 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 +26 -3
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +14 -4
- data/lib/rubocop/config_loader.rb +68 -57
- data/lib/rubocop/config_loader_resolver.rb +52 -20
- 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 +56 -9
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -25
- data/lib/rubocop/cop/base.rb +80 -19
- 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 +3 -3
- 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/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +6 -14
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- 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 +5 -7
- 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 +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 +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +51 -25
- data/lib/rubocop/cop/internal_affairs/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 +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 +127 -33
- 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 +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_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -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 +51 -9
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -1
- 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 +3 -1
- 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 +33 -13
- 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 +14 -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 +8 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +5 -2
- 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/leading_comment_space.rb +84 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +28 -11
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +8 -2
- 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_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 +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 +1 -0
- 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 +40 -44
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +8 -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 +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 +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +83 -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_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_parens.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- 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 +1 -1
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +45 -10
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -12
- 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 +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +47 -20
- 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_block.rb +1 -1
- 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 +3 -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/heredoc_method_call_position.rb +1 -1
- 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 +50 -13
- 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 +33 -7
- 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 +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 +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 +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 +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -12
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +178 -10
- 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 +1 -5
- 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 +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/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- 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 +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +7 -7
- 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_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
- data/lib/rubocop/cop/lint/useless_assignment.rb +51 -20
- 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 +88 -27
- 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 +8 -6
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +23 -17
- 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 +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 +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +39 -12
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/migration/department_name.rb +2 -2
- 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 +24 -15
- 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 -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 +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/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/multiline_expression_indentation.rb +10 -11
- 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 +2 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +71 -35
- 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 +5 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -6
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +40 -9
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +5 -7
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +16 -17
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +306 -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/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 +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 +472 -63
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +94 -44
- 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 +100 -0
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +56 -24
- 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 +8 -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 +4 -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 +25 -9
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +3 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +53 -38
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- 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/document_dynamic_eval_definition.rb +1 -1
- 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 +4 -4
- 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_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_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 +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 +18 -5
- 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 +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 +6 -3
- 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 +46 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +26 -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 +57 -9
- 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 +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 +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +49 -7
- 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 +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 +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 +59 -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/mixin_grouping.rb +1 -1
- 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 +6 -4
- 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 +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/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 +31 -6
- data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +32 -8
- 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/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_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 +97 -25
- 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 +89 -5
- 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 +4 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +23 -6
- data/lib/rubocop/cop/style/redundant_format.rb +262 -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 +1 -1
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +73 -20
- data/lib/rubocop/cop/style/redundant_parentheses.rb +155 -40
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +107 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +10 -25
- 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 +11 -10
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +5 -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 +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 -61
- 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 +10 -5
- 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 +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +75 -88
- 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 +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 +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 +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_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 +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- 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/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +12 -6
- data/lib/rubocop/cop/style/yoda_expression.rb +10 -8
- 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 +20 -7
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +35 -7
- 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 +40 -19
- data/lib/rubocop/cops_documentation_generator.rb +133 -56
- 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 +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 +71 -24
- 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 +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 +54 -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 +29 -30
- 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 +114 -21
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -10
- 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 +4 -4
- 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/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +97 -82
- data/lib/rubocop/target_ruby.rb +102 -77
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +69 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +136 -42
- 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
@@ -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 =
|
197
|
+
configs = cop_config
|
148
198
|
.each_key
|
149
199
|
.reject { |key| key.start_with?('Supported') }
|
150
200
|
.reject { |key| key.start_with?('AllowMultipleStyles') }
|
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
|
@@ -198,7 +250,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
198
250
|
table = ['|===', "| #{header.join(' | ')}\n\n"].join("\n")
|
199
251
|
marked_contents = content.map do |plain_content|
|
200
252
|
# Escape `|` with backslash to prevent the regexp `|` is not used as a table separator.
|
201
|
-
plain_content.map { |c| "| #{c.gsub(
|
253
|
+
plain_content.map { |c| "| #{c.gsub('|', '\|')}" }.join("\n")
|
202
254
|
end
|
203
255
|
table << marked_contents.join("\n\n")
|
204
256
|
table << "\n|===\n"
|
@@ -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
|
@@ -15,49 +15,24 @@ module RuboCop
|
|
15
15
|
# see `ext/regexp_parser`.
|
16
16
|
attr_reader :parsed_tree
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
super
|
18
|
+
def assign_properties(*)
|
19
|
+
super
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
origin = loc.begin.end
|
29
|
-
@parsed_tree&.each_expression(true) { |e| e.origin = origin }
|
30
|
-
end
|
31
|
-
# Please remove this `else` branch when support for regexp_parser 1.8 will be dropped.
|
32
|
-
# It's for compatibility with regexp_parser 1.8 and will never be maintained.
|
33
|
-
else
|
34
|
-
def assign_properties(*)
|
35
|
-
super
|
36
|
-
|
37
|
-
str = with_interpolations_blanked
|
38
|
-
begin
|
39
|
-
@parsed_tree = Regexp::Parser.parse(str, options: options)
|
40
|
-
rescue StandardError
|
41
|
-
@parsed_tree = nil
|
42
|
-
else
|
43
|
-
origin = loc.begin.end
|
44
|
-
source = @parsed_tree.to_s
|
45
|
-
@parsed_tree.each_expression(true) do |e|
|
46
|
-
e.origin = origin
|
47
|
-
e.source = source
|
48
|
-
end
|
49
|
-
end
|
21
|
+
str = with_interpolations_blanked
|
22
|
+
@parsed_tree = begin
|
23
|
+
Regexp::Parser.parse(str, options: options)
|
24
|
+
rescue StandardError
|
25
|
+
nil
|
50
26
|
end
|
27
|
+
origin = loc.begin.end
|
28
|
+
@parsed_tree&.each_expression(true) { |e| e.origin = origin }
|
51
29
|
end
|
52
30
|
|
53
31
|
def each_capture(named: ANY)
|
54
32
|
return enum_for(__method__, named: named) unless block_given?
|
55
33
|
|
56
34
|
parsed_tree&.traverse do |event, exp, _index|
|
57
|
-
yield(exp) if event
|
58
|
-
named == exp.respond_to?(:name) &&
|
59
|
-
exp.respond_to?(:capturing?) &&
|
60
|
-
exp.capturing?
|
35
|
+
yield(exp) if named_capturing?(exp, event, named)
|
61
36
|
end
|
62
37
|
|
63
38
|
self
|
@@ -65,6 +40,13 @@ module RuboCop
|
|
65
40
|
|
66
41
|
private
|
67
42
|
|
43
|
+
def named_capturing?(exp, event, named)
|
44
|
+
event == :enter &&
|
45
|
+
named == exp.respond_to?(:name) &&
|
46
|
+
exp.respond_to?(:capturing?) &&
|
47
|
+
exp.capturing?
|
48
|
+
end
|
49
|
+
|
68
50
|
def with_interpolations_blanked
|
69
51
|
# Ignore the trailing regopt node
|
70
52
|
children[0...-1].map do |child|
|
@@ -22,26 +22,9 @@ module RuboCop
|
|
22
22
|
module Base
|
23
23
|
attr_accessor :origin
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
@expression ||= origin.adjust(begin_pos: ts, end_pos: ts + full_length)
|
29
|
-
end
|
30
|
-
# Please remove this `else` branch when support for regexp_parser 1.8 will be dropped.
|
31
|
-
# It's for compatibility with regexp_parser 1.8 and will never be maintained.
|
32
|
-
else
|
33
|
-
attr_accessor :source
|
34
|
-
|
35
|
-
def start_index
|
36
|
-
# ts is a byte index; convert it to a character index
|
37
|
-
@start_index ||= source.byteslice(0, ts).length
|
38
|
-
end
|
39
|
-
|
40
|
-
# Shortcut to `loc.expression`
|
41
|
-
def expression
|
42
|
-
end_pos = start_index + full_length
|
43
|
-
@expression ||= origin.adjust(begin_pos: start_index, end_pos: end_pos)
|
44
|
-
end
|
25
|
+
# Shortcut to `loc.expression`
|
26
|
+
def expression
|
27
|
+
@expression ||= origin.adjust(begin_pos: ts, end_pos: ts + full_length)
|
45
28
|
end
|
46
29
|
|
47
30
|
# @returns a location map like `parser` does, with:
|
@@ -68,7 +51,9 @@ module RuboCop
|
|
68
51
|
return { body: expression } unless (q = quantifier)
|
69
52
|
|
70
53
|
body = expression.adjust(end_pos: -q.text.length)
|
71
|
-
|
54
|
+
q.origin = origin
|
55
|
+
q_loc = q.expression
|
56
|
+
|
72
57
|
{ body: body, quantifier: q_loc }
|
73
58
|
end
|
74
59
|
end
|
@@ -86,6 +71,7 @@ module RuboCop
|
|
86
71
|
end
|
87
72
|
end
|
88
73
|
::Regexp::Expression::Base.include Expression::Base
|
74
|
+
::Regexp::Expression::Quantifier.include Expression::Base
|
89
75
|
::Regexp::Expression::CharacterSet.include Expression::CharacterSet
|
90
76
|
end
|
91
77
|
end
|