rubocop 1.57.1 → 1.81.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +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 +48 -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 +8 -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 -8
- 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 +1 -2
- 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 +185 -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 +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/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 +8 -4
- 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 +30 -7
- 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 +72 -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
|
@@ -43,22 +43,26 @@ module RuboCop
|
|
|
43
43
|
# @!method nil_check?(node)
|
|
44
44
|
def_node_matcher :nil_check?, '(send _ :nil?)'
|
|
45
45
|
|
|
46
|
+
# rubocop:disable Metrics/AbcSize
|
|
46
47
|
def on_send(node)
|
|
48
|
+
return unless node.receiver
|
|
49
|
+
|
|
47
50
|
style_check?(node) do
|
|
48
51
|
add_offense(node.loc.selector) do |corrector|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
if prefer_comparison?
|
|
53
|
+
range = node.loc.dot.join(node.loc.selector.end)
|
|
54
|
+
corrector.replace(range, ' == nil')
|
|
55
|
+
else
|
|
56
|
+
range = node.receiver.source_range.end.join(node.source_range.end)
|
|
57
|
+
corrector.replace(range, '.nil?')
|
|
58
|
+
end
|
|
56
59
|
|
|
57
60
|
parent = node.parent
|
|
58
61
|
corrector.wrap(node, '(', ')') if parent.respond_to?(:method?) && parent.method?(:!)
|
|
59
62
|
end
|
|
60
63
|
end
|
|
61
64
|
end
|
|
65
|
+
# rubocop:enable Metrics/AbcSize
|
|
62
66
|
|
|
63
67
|
private
|
|
64
68
|
|
|
@@ -8,8 +8,8 @@ module RuboCop
|
|
|
8
8
|
# These can be replaced by their respective predicate methods.
|
|
9
9
|
# This cop can also be configured to do the reverse.
|
|
10
10
|
#
|
|
11
|
-
# This cop can be customized
|
|
12
|
-
# By default, there are no methods
|
|
11
|
+
# This cop's allowed methods can be customized with `AllowedMethods`.
|
|
12
|
+
# By default, there are no allowed methods.
|
|
13
13
|
#
|
|
14
14
|
# This cop disregards `#nonzero?` as its value is truthy or falsey,
|
|
15
15
|
# but not `true` and `false`, and thus not always interchangeable with
|
|
@@ -118,12 +118,14 @@ module RuboCop
|
|
|
118
118
|
|
|
119
119
|
return unless numeric && operator && replacement_supported?(operator)
|
|
120
120
|
|
|
121
|
-
[numeric, replacement(numeric, operator)]
|
|
121
|
+
[numeric, replacement(node, numeric, operator)]
|
|
122
122
|
end
|
|
123
123
|
|
|
124
|
-
def replacement(numeric, operation)
|
|
124
|
+
def replacement(node, numeric, operation)
|
|
125
125
|
if style == :predicate
|
|
126
126
|
[parenthesized_source(numeric), REPLACEMENTS.invert[operation.to_s]].join('.')
|
|
127
|
+
elsif negated?(node)
|
|
128
|
+
"(#{numeric.source} #{REPLACEMENTS[operation.to_s]} 0)"
|
|
127
129
|
else
|
|
128
130
|
[numeric.source, REPLACEMENTS[operation.to_s], 0].join(' ')
|
|
129
131
|
end
|
|
@@ -157,6 +159,12 @@ module RuboCop
|
|
|
157
159
|
end
|
|
158
160
|
end
|
|
159
161
|
|
|
162
|
+
def negated?(node)
|
|
163
|
+
return false unless (parent = node.parent)
|
|
164
|
+
|
|
165
|
+
parent.send_type? && parent.method?(:!)
|
|
166
|
+
end
|
|
167
|
+
|
|
160
168
|
# @!method predicate(node)
|
|
161
169
|
def_node_matcher :predicate, <<~PATTERN
|
|
162
170
|
(send $(...) ${:zero? :positive? :negative?})
|
|
@@ -30,39 +30,41 @@ module RuboCop
|
|
|
30
30
|
minimum_target_ruby_version 2.6
|
|
31
31
|
|
|
32
32
|
MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
|
|
33
|
+
RESTRICT_ON_SEND = %i[then yield_self].freeze
|
|
33
34
|
|
|
34
35
|
def on_block(node)
|
|
36
|
+
return unless RESTRICT_ON_SEND.include?(node.method_name)
|
|
37
|
+
|
|
35
38
|
check_method_node(node.send_node)
|
|
36
39
|
end
|
|
37
|
-
|
|
38
40
|
alias on_numblock on_block
|
|
41
|
+
alias on_itblock on_block
|
|
39
42
|
|
|
40
43
|
def on_send(node)
|
|
41
44
|
return unless node.arguments.one? && node.first_argument.block_pass_type?
|
|
42
45
|
|
|
43
46
|
check_method_node(node)
|
|
44
47
|
end
|
|
48
|
+
alias on_csend on_send
|
|
45
49
|
|
|
46
50
|
private
|
|
47
51
|
|
|
48
52
|
def check_method_node(node)
|
|
49
|
-
|
|
53
|
+
if preferred_method?(node)
|
|
54
|
+
correct_style_detected
|
|
55
|
+
else
|
|
56
|
+
opposite_style_detected
|
|
57
|
+
message = message(node)
|
|
58
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
|
59
|
+
prefer = style == :then && node.receiver.nil? ? 'self.then' : style
|
|
50
60
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
corrector.replace(node.loc.selector, style.to_s)
|
|
61
|
+
corrector.replace(node.loc.selector, prefer)
|
|
62
|
+
end
|
|
54
63
|
end
|
|
55
64
|
end
|
|
56
65
|
|
|
57
|
-
def preferred_method(node)
|
|
58
|
-
|
|
59
|
-
when :then
|
|
60
|
-
node.method?(:yield_self)
|
|
61
|
-
when :yield_self
|
|
62
|
-
node.method?(:then)
|
|
63
|
-
else
|
|
64
|
-
false
|
|
65
|
-
end
|
|
66
|
+
def preferred_method?(node)
|
|
67
|
+
node.method?(style)
|
|
66
68
|
end
|
|
67
69
|
|
|
68
70
|
def message(node)
|
|
@@ -4,8 +4,8 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for uses of if/then/else/end constructs on a single line.
|
|
7
|
-
# AlwaysCorrectToMultiline config option can be set to true to
|
|
8
|
-
# multi-line constructs. When AlwaysCorrectToMultiline is false (default case) the
|
|
7
|
+
# `AlwaysCorrectToMultiline` config option can be set to true to autocorrect all offenses to
|
|
8
|
+
# multi-line constructs. When `AlwaysCorrectToMultiline` is false (default case) the
|
|
9
9
|
# autocorrect will first try converting them to ternary operators.
|
|
10
10
|
#
|
|
11
11
|
# @example
|
|
@@ -30,34 +30,65 @@ module RuboCop
|
|
|
30
30
|
# else
|
|
31
31
|
# baz
|
|
32
32
|
# end
|
|
33
|
+
#
|
|
34
|
+
# @example AlwaysCorrectToMultiline: false (default)
|
|
35
|
+
# # bad
|
|
36
|
+
# if cond then run else dont end
|
|
37
|
+
#
|
|
38
|
+
# # good
|
|
39
|
+
# cond ? run : dont
|
|
40
|
+
#
|
|
41
|
+
# @example AlwaysCorrectToMultiline: true
|
|
42
|
+
# # bad
|
|
43
|
+
# if cond then run else dont end
|
|
44
|
+
#
|
|
45
|
+
# # good
|
|
46
|
+
# if cond
|
|
47
|
+
# run
|
|
48
|
+
# else
|
|
49
|
+
# dont
|
|
50
|
+
# end
|
|
51
|
+
#
|
|
33
52
|
class OneLineConditional < Base
|
|
34
53
|
include Alignment
|
|
35
54
|
include ConfigurableEnforcedStyle
|
|
36
55
|
include OnNormalIfUnless
|
|
37
56
|
extend AutoCorrector
|
|
38
57
|
|
|
39
|
-
|
|
40
|
-
|
|
58
|
+
MSG_SUFFIX = 'over single-line `%<keyword>s/then/else/end` constructs.'
|
|
59
|
+
MSG_TERNARY = "Favor the ternary operator (`?:`) #{MSG_SUFFIX}"
|
|
60
|
+
MSG_MULTILINE = "Favor multi-line `%<keyword>s` #{MSG_SUFFIX}"
|
|
41
61
|
|
|
42
62
|
def on_normal_if_unless(node)
|
|
43
63
|
return unless node.single_line?
|
|
44
64
|
return unless node.else_branch
|
|
45
|
-
return if node.elsif?
|
|
65
|
+
return if node.elsif? || node.if_branch&.begin_type?
|
|
66
|
+
|
|
67
|
+
multiline = multiline?(node)
|
|
68
|
+
|
|
69
|
+
add_offense(node, message: message(node, multiline)) do |corrector|
|
|
70
|
+
next if part_of_ignored_node?(node)
|
|
71
|
+
|
|
72
|
+
autocorrect(corrector, node, multiline)
|
|
46
73
|
|
|
47
|
-
|
|
48
|
-
add_offense(node, message: message) do |corrector|
|
|
49
|
-
autocorrect(corrector, node)
|
|
74
|
+
ignore_node(node)
|
|
50
75
|
end
|
|
51
76
|
end
|
|
52
77
|
|
|
53
78
|
private
|
|
54
79
|
|
|
55
|
-
def
|
|
56
|
-
|
|
80
|
+
def multiline?(node)
|
|
81
|
+
always_multiline? || cannot_replace_to_ternary?(node)
|
|
57
82
|
end
|
|
58
83
|
|
|
59
|
-
def
|
|
60
|
-
|
|
84
|
+
def message(node, multiline)
|
|
85
|
+
template = multiline ? MSG_MULTILINE : MSG_TERNARY
|
|
86
|
+
|
|
87
|
+
format(template, keyword: node.keyword)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def autocorrect(corrector, node, multiline)
|
|
91
|
+
if multiline
|
|
61
92
|
IfThenCorrector.new(node, indentation: configured_indentation_width).call(corrector)
|
|
62
93
|
else
|
|
63
94
|
corrector.replace(node, ternary_correction(node))
|
|
@@ -75,15 +106,17 @@ module RuboCop
|
|
|
75
106
|
end
|
|
76
107
|
|
|
77
108
|
def always_multiline?
|
|
78
|
-
|
|
109
|
+
cop_config['AlwaysCorrectToMultiline']
|
|
79
110
|
end
|
|
80
111
|
|
|
81
112
|
def cannot_replace_to_ternary?(node)
|
|
82
|
-
node.elsif_conditional?
|
|
113
|
+
return true if node.elsif_conditional?
|
|
114
|
+
|
|
115
|
+
node.else_branch.begin_type? && node.else_branch.children.compact.count >= 2
|
|
83
116
|
end
|
|
84
117
|
|
|
85
118
|
def ternary_replacement(node)
|
|
86
|
-
condition, if_branch, else_branch = *node
|
|
119
|
+
condition, if_branch, else_branch = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
|
87
120
|
|
|
88
121
|
"#{expr_replacement(condition)} ? " \
|
|
89
122
|
"#{expr_replacement(if_branch)} : " \
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Flags uses of OpenStruct
|
|
6
|
+
# Flags uses of `OpenStruct`, as it is now officially discouraged
|
|
7
7
|
# to be used for performance, version compatibility, and potential security issues.
|
|
8
8
|
#
|
|
9
9
|
# @safety
|
|
10
|
-
#
|
|
11
10
|
# Note that this cop may flag false positives; for instance, the following legal
|
|
12
11
|
# use of a hand-rolled `OpenStruct` type would be considered an offense:
|
|
13
12
|
#
|
|
14
|
-
#
|
|
13
|
+
# [source,ruby]
|
|
14
|
+
# -----
|
|
15
15
|
# module MyNamespace
|
|
16
16
|
# class OpenStruct # not the OpenStruct we're looking for
|
|
17
17
|
# end
|
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
|
20
20
|
# OpenStruct.new # resolves to MyNamespace::OpenStruct
|
|
21
21
|
# end
|
|
22
22
|
# end
|
|
23
|
-
#
|
|
23
|
+
# -----
|
|
24
24
|
#
|
|
25
25
|
# @example
|
|
26
26
|
#
|
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
|
61
61
|
def custom_class_or_module_definition?(node)
|
|
62
62
|
parent = node.parent
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
parent.type?(:class, :module) && node.left_siblings.empty?
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
end
|
|
@@ -4,8 +4,8 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for redundant dot before operator method call.
|
|
7
|
-
# The target operator methods are `|`, `^`, `&`,
|
|
8
|
-
#
|
|
7
|
+
# The target operator methods are `|`, `^`, `&`, ``<=>``, `==`, `===`, `=~`, `>`, `>=`, `<`,
|
|
8
|
+
# ``<=``, `<<`, `>>`, `+`, `-`, `*`, `/`, `%`, `**`, `~`, `!`, `!=`, and `!~`.
|
|
9
9
|
#
|
|
10
10
|
# @example
|
|
11
11
|
#
|
|
@@ -22,21 +22,25 @@ module RuboCop
|
|
|
22
22
|
|
|
23
23
|
MSG = 'Redundant dot detected.'
|
|
24
24
|
RESTRICT_ON_SEND = %i[| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ ! != !~].freeze
|
|
25
|
+
INVALID_SYNTAX_ARG_TYPES = %i[
|
|
26
|
+
splat kwsplat forwarded_args forwarded_restarg forwarded_kwrestarg block_pass
|
|
27
|
+
].freeze
|
|
25
28
|
|
|
26
29
|
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
27
30
|
def on_send(node)
|
|
28
31
|
return unless (dot = node.loc.dot)
|
|
29
32
|
return if node.receiver.const_type? || !node.arguments.one?
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
return if
|
|
34
|
+
return unless (rhs = node.first_argument)
|
|
35
|
+
return if method_call_with_parenthesized_arg?(rhs)
|
|
36
|
+
return if invalid_syntax_argument?(rhs)
|
|
33
37
|
|
|
34
38
|
add_offense(dot) do |corrector|
|
|
35
39
|
wrap_in_parentheses_if_chained(corrector, node)
|
|
36
40
|
corrector.replace(dot, ' ')
|
|
37
41
|
|
|
38
42
|
selector = node.loc.selector
|
|
39
|
-
corrector.insert_after(selector, ' ') if
|
|
43
|
+
corrector.insert_after(selector, ' ') if insert_space_after?(node)
|
|
40
44
|
end
|
|
41
45
|
end
|
|
42
46
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
@@ -50,11 +54,10 @@ module RuboCop
|
|
|
50
54
|
argument.children.first && argument.parent.parenthesized?
|
|
51
55
|
end
|
|
52
56
|
|
|
53
|
-
def
|
|
54
|
-
|
|
55
|
-
return true if argument.hash_type? && argument.children.first&.forwarded_kwrestarg_type?
|
|
57
|
+
def invalid_syntax_argument?(argument)
|
|
58
|
+
type = argument.hash_type? ? argument.children.first&.type : argument.type
|
|
56
59
|
|
|
57
|
-
|
|
60
|
+
INVALID_SYNTAX_ARG_TYPES.include?(type)
|
|
58
61
|
end
|
|
59
62
|
|
|
60
63
|
def wrap_in_parentheses_if_chained(corrector, node)
|
|
@@ -67,6 +70,21 @@ module RuboCop
|
|
|
67
70
|
corrector.insert_after(operator, ' ')
|
|
68
71
|
corrector.wrap(node, '(', ')')
|
|
69
72
|
end
|
|
73
|
+
|
|
74
|
+
def insert_space_after?(node)
|
|
75
|
+
rhs = node.first_argument
|
|
76
|
+
selector = node.loc.selector
|
|
77
|
+
|
|
78
|
+
return true if selector.end_pos == rhs.source_range.begin_pos
|
|
79
|
+
return false if node.parent&.call_type? # if chained, a space is already added
|
|
80
|
+
|
|
81
|
+
# For `/` operations, if the RHS starts with a `(` without space,
|
|
82
|
+
# add one to avoid a syntax error.
|
|
83
|
+
range = selector.end.join(rhs.source_range.begin)
|
|
84
|
+
return true if node.method?(:/) && range.source == '('
|
|
85
|
+
|
|
86
|
+
false
|
|
87
|
+
end
|
|
70
88
|
end
|
|
71
89
|
end
|
|
72
90
|
end
|
|
@@ -78,18 +78,15 @@ module RuboCop
|
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
def take_variable_and_default_from_ternary(node)
|
|
81
|
-
|
|
82
|
-
[variable, if_statement.else_branch]
|
|
81
|
+
[node.name, node.expression.else_branch]
|
|
83
82
|
end
|
|
84
83
|
|
|
85
84
|
def take_variable_and_default_from_unless(node)
|
|
86
85
|
if node.if_branch
|
|
87
|
-
|
|
86
|
+
[node.if_branch.name, node.if_branch.expression]
|
|
88
87
|
else
|
|
89
|
-
|
|
88
|
+
[node.else_branch.name, node.else_branch.expression]
|
|
90
89
|
end
|
|
91
|
-
|
|
92
|
-
[variable, default]
|
|
93
90
|
end
|
|
94
91
|
end
|
|
95
92
|
end
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'tsort'
|
|
4
|
-
|
|
5
3
|
module RuboCop
|
|
6
4
|
module Cop
|
|
7
5
|
module Style
|
|
@@ -28,28 +26,28 @@ module RuboCop
|
|
|
28
26
|
|
|
29
27
|
MSG = 'Do not use parallel assignment.'
|
|
30
28
|
|
|
31
|
-
def on_masgn(node)
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
def on_masgn(node) # rubocop:disable Metrics/AbcSize
|
|
30
|
+
return if part_of_ignored_node?(node)
|
|
31
|
+
|
|
32
|
+
rhs = node.rhs
|
|
34
33
|
rhs = rhs.body if rhs.rescue_type?
|
|
35
34
|
rhs_elements = Array(rhs).compact # edge case for one constant
|
|
36
35
|
|
|
37
|
-
return if allowed_lhs?(
|
|
38
|
-
allowed_masign?(
|
|
36
|
+
return if allowed_lhs?(node.assignments) || allowed_rhs?(rhs) ||
|
|
37
|
+
allowed_masign?(node.assignments, rhs_elements)
|
|
39
38
|
|
|
40
39
|
range = node.source_range.begin.join(rhs.source_range.end)
|
|
41
40
|
|
|
42
41
|
add_offense(range) do |corrector|
|
|
43
|
-
autocorrect(corrector, node,
|
|
42
|
+
autocorrect(corrector, node, rhs)
|
|
44
43
|
end
|
|
44
|
+
ignore_node(node)
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
private
|
|
48
48
|
|
|
49
|
-
def autocorrect(corrector, node,
|
|
50
|
-
|
|
51
|
-
right_elements = Array(rhs).compact
|
|
52
|
-
order = find_valid_order(left_elements, right_elements)
|
|
49
|
+
def autocorrect(corrector, node, rhs)
|
|
50
|
+
order = find_valid_order(node.assignments, Array(rhs).compact)
|
|
53
51
|
correction = assignment_corrector(node, rhs, order)
|
|
54
52
|
|
|
55
53
|
corrector.replace(correction.correction_range, correction.correction)
|
|
@@ -61,9 +59,7 @@ module RuboCop
|
|
|
61
59
|
add_self_to_getters(rhs_elements))
|
|
62
60
|
end
|
|
63
61
|
|
|
64
|
-
def allowed_lhs?(
|
|
65
|
-
elements = *node
|
|
66
|
-
|
|
62
|
+
def allowed_lhs?(elements)
|
|
67
63
|
# Account for edge cases using one variable with a comma
|
|
68
64
|
# E.g.: `foo, = *bar`
|
|
69
65
|
elements.one? || elements.any?(&:splat_type?)
|
|
@@ -74,11 +70,7 @@ module RuboCop
|
|
|
74
70
|
elements = Array(node).compact
|
|
75
71
|
|
|
76
72
|
# Account for edge case of `Constant::CONSTANT`
|
|
77
|
-
!node.array_type? ||
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def return_of_method_call?(node)
|
|
81
|
-
node.block_type? || node.send_type?
|
|
73
|
+
!node.array_type? || elements.any?(&:splat_type?)
|
|
82
74
|
end
|
|
83
75
|
|
|
84
76
|
def assignment_corrector(node, rhs, order)
|
|
@@ -100,15 +92,9 @@ module RuboCop
|
|
|
100
92
|
def find_valid_order(left_elements, right_elements)
|
|
101
93
|
# arrange left_elements in an order such that no corresponding right
|
|
102
94
|
# element refers to a left element earlier in the sequence
|
|
103
|
-
# this can be done using an algorithm called a "topological sort"
|
|
104
|
-
# fortunately for us, Ruby's stdlib contains an implementation
|
|
105
95
|
assignments = left_elements.zip(right_elements)
|
|
106
96
|
|
|
107
|
-
|
|
108
|
-
AssignmentSorter.new(assignments).tsort
|
|
109
|
-
rescue TSort::Cyclic
|
|
110
|
-
nil
|
|
111
|
-
end
|
|
97
|
+
AssignmentSorter.new(assignments).tsort
|
|
112
98
|
end
|
|
113
99
|
|
|
114
100
|
# Converts (send nil :something) nodes to (send (:self) :something).
|
|
@@ -123,10 +109,9 @@ module RuboCop
|
|
|
123
109
|
# @!method implicit_self_getter?(node)
|
|
124
110
|
def_node_matcher :implicit_self_getter?, '(send nil? $_)'
|
|
125
111
|
|
|
126
|
-
#
|
|
127
|
-
#
|
|
112
|
+
# Topologically sorts the assignments with Kahn's algorithm.
|
|
113
|
+
# https://en.wikipedia.org/wiki/Topological_sorting#Kahn's_algorithm
|
|
128
114
|
class AssignmentSorter
|
|
129
|
-
include TSort
|
|
130
115
|
extend RuboCop::NodePattern::Macros
|
|
131
116
|
|
|
132
117
|
# @!method var_name(node)
|
|
@@ -142,21 +127,39 @@ module RuboCop
|
|
|
142
127
|
@assignments = assignments
|
|
143
128
|
end
|
|
144
129
|
|
|
145
|
-
def
|
|
146
|
-
@assignments.
|
|
130
|
+
def tsort
|
|
131
|
+
dependencies = @assignments.to_h do |assignment|
|
|
132
|
+
[assignment, dependencies_for_assignment(assignment)]
|
|
133
|
+
end
|
|
134
|
+
result = []
|
|
135
|
+
|
|
136
|
+
while (matched_node, = dependencies.find { |_node, edges| edges.empty? })
|
|
137
|
+
dependencies.delete(matched_node)
|
|
138
|
+
result.push(matched_node)
|
|
139
|
+
|
|
140
|
+
dependencies.each do |node, edges|
|
|
141
|
+
dependencies[node].delete(matched_node) if edges.include?(matched_node)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
# Cyclic dependency
|
|
145
|
+
return nil if dependencies.any?
|
|
146
|
+
|
|
147
|
+
result
|
|
147
148
|
end
|
|
148
149
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
150
|
+
# Returns all the assignments which must come after `assignment`
|
|
151
|
+
# (due to dependencies on the previous value of the assigned var)
|
|
152
|
+
def dependencies_for_assignment(assignment)
|
|
152
153
|
my_lhs, _my_rhs = *assignment
|
|
153
154
|
|
|
154
|
-
@assignments.
|
|
155
|
-
|
|
155
|
+
@assignments.filter_map do |other|
|
|
156
|
+
# Exclude self, there are no dependencies in cases such as `a, b = a, b`.
|
|
157
|
+
next if other == assignment
|
|
156
158
|
|
|
159
|
+
_other_lhs, other_rhs = *other
|
|
157
160
|
next unless dependency?(my_lhs, other_rhs)
|
|
158
161
|
|
|
159
|
-
|
|
162
|
+
other
|
|
160
163
|
end
|
|
161
164
|
end
|
|
162
165
|
|
|
@@ -211,15 +214,16 @@ module RuboCop
|
|
|
211
214
|
protected
|
|
212
215
|
|
|
213
216
|
def assignment
|
|
214
|
-
@new_elements.map { |lhs, rhs| "#{lhs.source} = #{source(rhs)}" }
|
|
217
|
+
@new_elements.map { |lhs, rhs| "#{lhs.source} = #{source(rhs, rhs.loc)}" }
|
|
215
218
|
end
|
|
216
219
|
|
|
217
220
|
private
|
|
218
221
|
|
|
219
|
-
def source(node)
|
|
220
|
-
|
|
222
|
+
def source(node, loc)
|
|
223
|
+
# __FILE__ is treated as a StrNode but has no begin
|
|
224
|
+
if node.str_type? && loc.respond_to?(:begin) && loc.begin.nil?
|
|
221
225
|
"'#{node.source}'"
|
|
222
|
-
elsif node.sym_type? &&
|
|
226
|
+
elsif node.sym_type? && loc.begin.nil?
|
|
223
227
|
":#{node.source}"
|
|
224
228
|
else
|
|
225
229
|
node.source
|
|
@@ -289,9 +293,7 @@ module RuboCop
|
|
|
289
293
|
private
|
|
290
294
|
|
|
291
295
|
def modifier_range(node)
|
|
292
|
-
|
|
293
|
-
node.loc.keyword.begin_pos,
|
|
294
|
-
node.source_range.end_pos)
|
|
296
|
+
node.loc.keyword.join(node.source_range.end)
|
|
295
297
|
end
|
|
296
298
|
end
|
|
297
299
|
end
|
|
@@ -81,6 +81,7 @@ module RuboCop
|
|
|
81
81
|
cond = node.condition
|
|
82
82
|
|
|
83
83
|
control_op_condition(cond) do |first_child, rest_children|
|
|
84
|
+
return if require_parentheses?(node, first_child)
|
|
84
85
|
return if semicolon_separated_expressions?(first_child, rest_children)
|
|
85
86
|
return if modifier_op?(first_child)
|
|
86
87
|
return if parens_allowed?(cond)
|
|
@@ -92,6 +93,13 @@ module RuboCop
|
|
|
92
93
|
end
|
|
93
94
|
end
|
|
94
95
|
|
|
96
|
+
def require_parentheses?(node, condition_body)
|
|
97
|
+
return false unless node.type?(:while, :until)
|
|
98
|
+
return false unless condition_body.any_block_type?
|
|
99
|
+
|
|
100
|
+
condition_body.send_node.block_literal? && condition_body.keywords?
|
|
101
|
+
end
|
|
102
|
+
|
|
95
103
|
def semicolon_separated_expressions?(first_exp, rest_exps)
|
|
96
104
|
return false unless (second_exp = rest_exps.first)
|
|
97
105
|
|
|
@@ -45,7 +45,7 @@ module RuboCop
|
|
|
45
45
|
# Report offense only if changing case doesn't change semantics,
|
|
46
46
|
# i.e., if the string would become dynamic or has special characters.
|
|
47
47
|
ast = parse(corrected(node.source)).ast
|
|
48
|
-
return if node.children != ast
|
|
48
|
+
return if node.children != ast&.children
|
|
49
49
|
|
|
50
50
|
add_offense(node.loc.begin) do |corrector|
|
|
51
51
|
corrector.replace(node, corrected(node.source))
|
|
@@ -19,8 +19,7 @@ module RuboCop
|
|
|
19
19
|
MSG = 'Use `proc` instead of `Proc.new`.'
|
|
20
20
|
|
|
21
21
|
# @!method proc_new?(node)
|
|
22
|
-
def_node_matcher :proc_new?,
|
|
23
|
-
'({block numblock} $(send (const {nil? cbase} :Proc) :new) ...)'
|
|
22
|
+
def_node_matcher :proc_new?, '(any_block $(send (const {nil? cbase} :Proc) :new) ...)'
|
|
24
23
|
|
|
25
24
|
def on_block(node)
|
|
26
25
|
proc_new?(node) do |block_method|
|
|
@@ -31,6 +30,7 @@ module RuboCop
|
|
|
31
30
|
end
|
|
32
31
|
|
|
33
32
|
alias on_numblock on_block
|
|
33
|
+
alias on_itblock on_block
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
end
|
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
|
9
9
|
#
|
|
10
10
|
# String interpolation is always kept in double quotes.
|
|
11
11
|
#
|
|
12
|
-
#
|
|
12
|
+
# NOTE: `Lint/SymbolConversion` can be used in parallel to ensure that symbols
|
|
13
13
|
# are not quoted that don't need to be. This cop is for configuring the quoting
|
|
14
14
|
# style to use for symbols that require quotes.
|
|
15
15
|
#
|
|
@@ -98,9 +98,7 @@ module RuboCop
|
|
|
98
98
|
|
|
99
99
|
def style
|
|
100
100
|
return super unless super == :same_as_string_literals
|
|
101
|
-
|
|
102
|
-
string_literals_config = config.for_cop('Style/StringLiterals')
|
|
103
|
-
return :single_quotes unless string_literals_config['Enabled']
|
|
101
|
+
return :single_quotes unless config.cop_enabled?('Style/StringLiterals')
|
|
104
102
|
|
|
105
103
|
string_literals_config['EnforcedStyle'].to_sym
|
|
106
104
|
end
|