rubocop 1.67.0 → 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 +23 -19
- data/config/default.yml +384 -72
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -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 +19 -4
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +56 -48
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- 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 +46 -2
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +53 -28
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- 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/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- 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 +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- 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/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
- 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_source_range.rb +3 -1
- 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 +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +7 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- 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/def_end_alignment.rb +1 -1
- 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_line_after_guard_clause.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -20
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_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 +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- 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_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- 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 +158 -10
- 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 +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -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 +31 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- 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 +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- 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 +3 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -3
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- 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 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +125 -10
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- 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 +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- 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 +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- 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 +113 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- 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_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +39 -15
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.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/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- 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/useless_access_modifier.rb +34 -8
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
- 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 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
- 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 -25
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +23 -12
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- 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 +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- 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 +3 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- 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/comments_help.rb +8 -3
- 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 +4 -3
- 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 +22 -22
- 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 +27 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- 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_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/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- 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 +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +2 -4
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- 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_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- 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 +2 -3
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- 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 +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- 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 +57 -44
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- 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/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
- data/lib/rubocop/cop/style/case_like_if.rb +9 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- 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 +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +49 -31
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- 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 +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +17 -4
- 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_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -1
- 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 +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +17 -3
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- 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 +9 -3
- 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 +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
- 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 +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- 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 +1 -0
- 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/map_into_array.rb +11 -3
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -4
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +18 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- 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 +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- 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_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +42 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +41 -38
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
- 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_line_continuation.rb +55 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -36
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +15 -18
- 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 +3 -3
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +75 -16
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +21 -6
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +68 -102
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- 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/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- 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 +3 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- 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 +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +12 -5
- 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 +30 -19
- data/lib/rubocop/cops_documentation_generator.rb +54 -28
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +20 -6
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +66 -26
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +2 -4
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/magic_comment.rb +11 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- 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 +4 -1
- data/lib/rubocop/result_cache.rb +27 -25
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +15 -5
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +31 -18
- data/lib/rubocop/server/cache.rb +51 -13
- 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 +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +14 -9
- data/lib/rubocop/target_ruby.rb +27 -3
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +44 -2
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +91 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
|
@@ -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
|
|
|
@@ -94,8 +94,8 @@ module RuboCop
|
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
def require_parentheses?(node, condition_body)
|
|
97
|
-
return false
|
|
98
|
-
return false
|
|
97
|
+
return false unless node.type?(:while, :until)
|
|
98
|
+
return false unless condition_body.any_block_type?
|
|
99
99
|
|
|
100
100
|
condition_body.send_node.block_literal? && condition_body.keywords?
|
|
101
101
|
end
|
|
@@ -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
|
|
@@ -98,7 +98,7 @@ module RuboCop
|
|
|
98
98
|
|
|
99
99
|
def style
|
|
100
100
|
return super unless super == :same_as_string_literals
|
|
101
|
-
return :single_quotes unless
|
|
101
|
+
return :single_quotes unless config.cop_enabled?('Style/StringLiterals')
|
|
102
102
|
|
|
103
103
|
string_literals_config['EnforcedStyle'].to_sym
|
|
104
104
|
end
|
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks the args passed to `fail` and `raise`.
|
|
7
|
-
# style (default), it recommends passing the exception class and message
|
|
8
|
-
# to `raise`, rather than construct an instance of the error. It will
|
|
9
|
-
# still allow passing just a message, or the construction of an error
|
|
10
|
-
# with more than one argument.
|
|
6
|
+
# Checks the args passed to `fail` and `raise`.
|
|
11
7
|
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
8
|
+
# Exploded style (default) enforces passing the exception class and message
|
|
9
|
+
# arguments separately, rather than constructing an instance of the error.
|
|
10
|
+
#
|
|
11
|
+
# Compact style enforces constructing an error instance.
|
|
12
|
+
#
|
|
13
|
+
# Both styles allow passing just a message, or an error instance when there is more
|
|
14
|
+
# than one argument.
|
|
15
15
|
#
|
|
16
16
|
# The exploded style has an `AllowedCompactTypes` configuration
|
|
17
|
-
# option that takes an Array of exception name Strings.
|
|
17
|
+
# option that takes an `Array` of exception name Strings.
|
|
18
18
|
#
|
|
19
19
|
# @safety
|
|
20
20
|
# This cop is unsafe because `raise Foo` calls `Foo.exception`, not `Foo.new`.
|
|
@@ -50,6 +50,9 @@ module RuboCop
|
|
|
50
50
|
|
|
51
51
|
EXPLODED_MSG = 'Provide an exception class and message as arguments to `%<method>s`.'
|
|
52
52
|
COMPACT_MSG = 'Provide an exception object as an argument to `%<method>s`.'
|
|
53
|
+
ACCEPTABLE_ARG_TYPES = %i[
|
|
54
|
+
hash forwarded_restarg splat forwarded_restarg forwarded_args
|
|
55
|
+
].freeze
|
|
53
56
|
|
|
54
57
|
RESTRICT_ON_SEND = %i[raise fail].freeze
|
|
55
58
|
|
|
@@ -138,9 +141,8 @@ module RuboCop
|
|
|
138
141
|
|
|
139
142
|
arg = args.first
|
|
140
143
|
|
|
141
|
-
# Allow
|
|
142
|
-
|
|
143
|
-
arg.hash_type? || arg.splat_type?
|
|
144
|
+
# Allow nodes that may forward more than one argument
|
|
145
|
+
ACCEPTABLE_ARG_TYPES.include?(arg.type)
|
|
144
146
|
end
|
|
145
147
|
|
|
146
148
|
def allowed_non_exploded_type?(arg)
|
|
@@ -150,7 +152,7 @@ module RuboCop
|
|
|
150
152
|
end
|
|
151
153
|
|
|
152
154
|
def requires_parens?(parent)
|
|
153
|
-
parent.
|
|
155
|
+
parent.operator_keyword? || (parent.if_type? && parent.ternary?)
|
|
154
156
|
end
|
|
155
157
|
end
|
|
156
158
|
end
|
|
@@ -36,7 +36,7 @@ module RuboCop
|
|
|
36
36
|
(send
|
|
37
37
|
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
|
38
38
|
:rand
|
|
39
|
-
{int (
|
|
39
|
+
{int (range int int)}))
|
|
40
40
|
PATTERN
|
|
41
41
|
|
|
42
42
|
# @!method rand_op_integer?(node)
|
|
@@ -45,7 +45,7 @@ module RuboCop
|
|
|
45
45
|
(send
|
|
46
46
|
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
|
47
47
|
:rand
|
|
48
|
-
{int (
|
|
48
|
+
{int (range int int)})
|
|
49
49
|
{:+ :-}
|
|
50
50
|
int)
|
|
51
51
|
PATTERN
|
|
@@ -56,7 +56,7 @@ module RuboCop
|
|
|
56
56
|
(send
|
|
57
57
|
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
|
58
58
|
:rand
|
|
59
|
-
{int (
|
|
59
|
+
{int (range int int)})
|
|
60
60
|
{:succ :pred :next})
|
|
61
61
|
PATTERN
|
|
62
62
|
|
|
@@ -118,7 +118,9 @@ module RuboCop
|
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
def exclude_cntrl_character?(target_argument, redundant_argument)
|
|
121
|
-
|
|
121
|
+
return true unless (target_argument_string = target_argument.to_s).valid_encoding?
|
|
122
|
+
|
|
123
|
+
!target_argument_string.sub(/\A'/, '"').sub(/'\z/, '"').match?(/[[:cntrl:]]/) ||
|
|
122
124
|
!redundant_argument.match?(/[[:cntrl:]]/)
|
|
123
125
|
end
|
|
124
126
|
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Checks for redundant calls of `Array#flatten`.
|
|
7
|
+
#
|
|
8
|
+
# `Array#join` joins nested arrays recursively, so flattening an array
|
|
9
|
+
# beforehand is redundant.
|
|
10
|
+
#
|
|
11
|
+
# @safety
|
|
12
|
+
# Cop is unsafe because the receiver of `flatten` method might not
|
|
13
|
+
# be an `Array`, so it's possible it won't respond to `join` method,
|
|
14
|
+
# or the end result would be different.
|
|
15
|
+
# Also, if the global variable `$,` is set to a value other than the default `nil`,
|
|
16
|
+
# false positives may occur.
|
|
17
|
+
#
|
|
18
|
+
# @example
|
|
19
|
+
# # bad
|
|
20
|
+
# x.flatten.join
|
|
21
|
+
# x.flatten(1).join
|
|
22
|
+
#
|
|
23
|
+
# # good
|
|
24
|
+
# x.join
|
|
25
|
+
#
|
|
26
|
+
class RedundantArrayFlatten < Base
|
|
27
|
+
extend AutoCorrector
|
|
28
|
+
|
|
29
|
+
MSG = 'Remove the redundant `flatten`.'
|
|
30
|
+
|
|
31
|
+
RESTRICT_ON_SEND = %i[flatten].freeze
|
|
32
|
+
|
|
33
|
+
# @!method flatten_join?(node)
|
|
34
|
+
def_node_matcher :flatten_join?, <<~PATTERN
|
|
35
|
+
(call (call !nil? :flatten _?) :join (nil)?)
|
|
36
|
+
PATTERN
|
|
37
|
+
|
|
38
|
+
def on_send(node)
|
|
39
|
+
return unless flatten_join?(node.parent)
|
|
40
|
+
|
|
41
|
+
range = node.loc.dot.begin.join(node.source_range.end)
|
|
42
|
+
add_offense(range) do |corrector|
|
|
43
|
+
corrector.remove(range)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
alias on_csend on_send
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -85,6 +85,29 @@ module RuboCop
|
|
|
85
85
|
end
|
|
86
86
|
alias on_defs on_def
|
|
87
87
|
|
|
88
|
+
def on_if(node)
|
|
89
|
+
return if node.modifier_form?
|
|
90
|
+
|
|
91
|
+
inspect_branches(node)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def on_case(node)
|
|
95
|
+
inspect_branches(node)
|
|
96
|
+
end
|
|
97
|
+
alias on_case_match on_case
|
|
98
|
+
|
|
99
|
+
def on_while(node)
|
|
100
|
+
return if node.modifier_form?
|
|
101
|
+
|
|
102
|
+
body = node.body
|
|
103
|
+
|
|
104
|
+
return unless body&.kwbegin_type?
|
|
105
|
+
return if body.rescue_node || body.ensure_node
|
|
106
|
+
|
|
107
|
+
register_offense(body)
|
|
108
|
+
end
|
|
109
|
+
alias on_until on_while
|
|
110
|
+
|
|
88
111
|
def on_block(node)
|
|
89
112
|
return if target_ruby_version < 2.5
|
|
90
113
|
return if node.send_node.lambda_literal?
|
|
@@ -95,6 +118,7 @@ module RuboCop
|
|
|
95
118
|
end
|
|
96
119
|
|
|
97
120
|
alias on_numblock on_block
|
|
121
|
+
alias on_itblock on_block
|
|
98
122
|
|
|
99
123
|
def on_kwbegin(node)
|
|
100
124
|
return unless (target_node = offensive_kwbegins(node).to_a.last)
|
|
@@ -179,13 +203,15 @@ module RuboCop
|
|
|
179
203
|
end
|
|
180
204
|
|
|
181
205
|
def begin_block_has_multiline_statements?(node)
|
|
206
|
+
return false unless node.parent
|
|
207
|
+
|
|
182
208
|
node.children.count >= 2
|
|
183
209
|
end
|
|
184
210
|
|
|
185
211
|
def contain_rescue_or_ensure?(node)
|
|
186
212
|
first_child = node.children.first
|
|
187
213
|
|
|
188
|
-
first_child.
|
|
214
|
+
first_child.type?(:rescue, :ensure)
|
|
189
215
|
end
|
|
190
216
|
|
|
191
217
|
def valid_context_using_only_begin?(node)
|
|
@@ -198,6 +224,15 @@ module RuboCop
|
|
|
198
224
|
def valid_begin_assignment?(node)
|
|
199
225
|
node.parent&.assignment? && !node.children.one?
|
|
200
226
|
end
|
|
227
|
+
|
|
228
|
+
def inspect_branches(node)
|
|
229
|
+
node.branches.each do |branch|
|
|
230
|
+
next unless branch&.kwbegin_type?
|
|
231
|
+
next if branch.rescue_node || branch.ensure_node
|
|
232
|
+
|
|
233
|
+
register_offense(branch)
|
|
234
|
+
end
|
|
235
|
+
end
|
|
201
236
|
end
|
|
202
237
|
end
|
|
203
238
|
end
|
|
@@ -5,6 +5,19 @@ module RuboCop
|
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for unnecessary conditional expressions.
|
|
7
7
|
#
|
|
8
|
+
# NOTE: Since the intention of the comment cannot be automatically determined,
|
|
9
|
+
# autocorrection is not applied when a comment is used, as shown below:
|
|
10
|
+
#
|
|
11
|
+
# [source,ruby]
|
|
12
|
+
# -----
|
|
13
|
+
# if b
|
|
14
|
+
# # Important note.
|
|
15
|
+
# b
|
|
16
|
+
# else
|
|
17
|
+
# c
|
|
18
|
+
# end
|
|
19
|
+
# -----
|
|
20
|
+
#
|
|
8
21
|
# @example
|
|
9
22
|
# # bad
|
|
10
23
|
# a = b ? b : c
|
|
@@ -29,7 +42,29 @@ module RuboCop
|
|
|
29
42
|
# c
|
|
30
43
|
# end
|
|
31
44
|
#
|
|
45
|
+
# # bad
|
|
46
|
+
# a.nil? ? true : a
|
|
47
|
+
#
|
|
48
|
+
# # good
|
|
49
|
+
# a.nil? || a
|
|
50
|
+
#
|
|
51
|
+
# # bad
|
|
52
|
+
# if a.nil?
|
|
53
|
+
# true
|
|
54
|
+
# else
|
|
55
|
+
# a
|
|
56
|
+
# end
|
|
57
|
+
#
|
|
58
|
+
# # good
|
|
59
|
+
# a.nil? || a
|
|
60
|
+
#
|
|
61
|
+
# @example AllowedMethods: ['nonzero?'] (default)
|
|
62
|
+
# # good
|
|
63
|
+
# num.nonzero? ? true : false
|
|
64
|
+
#
|
|
32
65
|
class RedundantCondition < Base
|
|
66
|
+
include AllowedMethods
|
|
67
|
+
include CommentsHelp
|
|
33
68
|
include RangeHelp
|
|
34
69
|
extend AutoCorrector
|
|
35
70
|
|
|
@@ -39,25 +74,15 @@ module RuboCop
|
|
|
39
74
|
splat block_pass forwarded_restarg forwarded_kwrestarg forwarded_args
|
|
40
75
|
].freeze
|
|
41
76
|
|
|
42
|
-
# rubocop:disable Metrics/AbcSize
|
|
43
77
|
def on_if(node)
|
|
44
78
|
return if node.modifier_form? || node.elsif_conditional? || !offense?(node)
|
|
45
79
|
|
|
46
80
|
message = message(node)
|
|
47
81
|
|
|
48
82
|
add_offense(range_of_offense(node), message: message) do |corrector|
|
|
49
|
-
|
|
50
|
-
correct_ternary(corrector, node)
|
|
51
|
-
elsif redundant_condition?(node)
|
|
52
|
-
corrector.replace(node, node.if_branch.source)
|
|
53
|
-
else
|
|
54
|
-
corrected = make_ternary_form(node)
|
|
55
|
-
|
|
56
|
-
corrector.replace(node, corrected)
|
|
57
|
-
end
|
|
83
|
+
autocorrect(corrector, node)
|
|
58
84
|
end
|
|
59
85
|
end
|
|
60
|
-
# rubocop:enable Metrics/AbcSize
|
|
61
86
|
|
|
62
87
|
private
|
|
63
88
|
|
|
@@ -69,6 +94,20 @@ module RuboCop
|
|
|
69
94
|
end
|
|
70
95
|
end
|
|
71
96
|
|
|
97
|
+
def autocorrect(corrector, node)
|
|
98
|
+
return if node.each_descendant.any? { |descendant| contains_comments?(descendant) }
|
|
99
|
+
|
|
100
|
+
if node.ternary? && !branches_have_method?(node)
|
|
101
|
+
correct_ternary(corrector, node)
|
|
102
|
+
elsif redundant_condition?(node)
|
|
103
|
+
corrector.replace(node, node.if_branch.source)
|
|
104
|
+
else
|
|
105
|
+
corrected = make_ternary_form(node)
|
|
106
|
+
|
|
107
|
+
corrector.replace(node, corrected)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
72
111
|
def range_of_offense(node)
|
|
73
112
|
return node.source_range unless node.ternary?
|
|
74
113
|
return node.source_range if node.ternary? && branches_have_method?(node)
|
|
@@ -77,8 +116,7 @@ module RuboCop
|
|
|
77
116
|
end
|
|
78
117
|
|
|
79
118
|
def offense?(node)
|
|
80
|
-
_condition, _if_branch, else_branch = *node
|
|
81
|
-
|
|
119
|
+
_condition, _if_branch, else_branch = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
|
82
120
|
return false if use_if_branch?(else_branch) || use_hash_key_assignment?(else_branch)
|
|
83
121
|
|
|
84
122
|
synonymous_condition_and_branch?(node) && !node.elsif? &&
|
|
@@ -102,7 +140,7 @@ module RuboCop
|
|
|
102
140
|
end
|
|
103
141
|
|
|
104
142
|
def synonymous_condition_and_branch?(node)
|
|
105
|
-
condition, if_branch, _else_branch = *node
|
|
143
|
+
condition, if_branch, _else_branch = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
|
106
144
|
# e.g.
|
|
107
145
|
# if var
|
|
108
146
|
# var
|
|
@@ -111,6 +149,16 @@ module RuboCop
|
|
|
111
149
|
# end
|
|
112
150
|
return true if condition == if_branch
|
|
113
151
|
|
|
152
|
+
# e.g.
|
|
153
|
+
# a.nil? ? true : a
|
|
154
|
+
# or
|
|
155
|
+
# if a.nil?
|
|
156
|
+
# true
|
|
157
|
+
# else
|
|
158
|
+
# a
|
|
159
|
+
# end
|
|
160
|
+
return true if if_branch_is_true_type_and_else_is_not?(node)
|
|
161
|
+
|
|
114
162
|
# e.g.
|
|
115
163
|
# if foo
|
|
116
164
|
# @value = foo
|
|
@@ -129,8 +177,20 @@ module RuboCop
|
|
|
129
177
|
!use_hash_key_access?(if_branch)
|
|
130
178
|
end
|
|
131
179
|
|
|
180
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
181
|
+
def if_branch_is_true_type_and_else_is_not?(node)
|
|
182
|
+
return false unless node.ternary? || node.if?
|
|
183
|
+
|
|
184
|
+
cond = node.condition
|
|
185
|
+
return false unless cond.call_type?
|
|
186
|
+
return false if !cond.predicate_method? || allowed_method?(cond.method_name)
|
|
187
|
+
|
|
188
|
+
node.if_branch&.true_type? && node.else_branch && !node.else_branch.true_type?
|
|
189
|
+
end
|
|
190
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
191
|
+
|
|
132
192
|
def branches_have_assignment?(node)
|
|
133
|
-
_condition, if_branch, else_branch = *node
|
|
193
|
+
_condition, if_branch, else_branch = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
|
134
194
|
|
|
135
195
|
return false unless if_branch && else_branch
|
|
136
196
|
|
|
@@ -140,16 +200,14 @@ module RuboCop
|
|
|
140
200
|
end
|
|
141
201
|
|
|
142
202
|
def asgn_type?(node)
|
|
143
|
-
node.
|
|
203
|
+
node.type?(:lvasgn, :ivasgn, :cvasgn, :gvasgn)
|
|
144
204
|
end
|
|
145
205
|
|
|
146
206
|
def branches_have_method?(node)
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return false unless if_branch && else_branch
|
|
207
|
+
return false unless node.if_branch && node.else_branch
|
|
150
208
|
|
|
151
|
-
single_argument_method?(if_branch) && single_argument_method?(else_branch) &&
|
|
152
|
-
same_method?(if_branch, else_branch)
|
|
209
|
+
single_argument_method?(node.if_branch) && single_argument_method?(node.else_branch) &&
|
|
210
|
+
same_method?(node.if_branch, node.else_branch)
|
|
153
211
|
end
|
|
154
212
|
|
|
155
213
|
def single_argument_method?(node)
|
|
@@ -169,9 +227,17 @@ module RuboCop
|
|
|
169
227
|
return false unless argument.hash_type?
|
|
170
228
|
return false unless (node = argument.children.first)
|
|
171
229
|
|
|
172
|
-
node.
|
|
230
|
+
node.type?(:kwsplat, :forwarded_kwrestarg)
|
|
173
231
|
end
|
|
174
232
|
|
|
233
|
+
def wrap_arguments_with_parens(condition)
|
|
234
|
+
method = condition.source_range.begin.join(condition.loc.selector.end)
|
|
235
|
+
arguments = condition.first_argument.source_range.begin.join(condition.source_range.end)
|
|
236
|
+
|
|
237
|
+
"#{method.source}(#{arguments.source})"
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
# rubocop:disable Metrics/AbcSize
|
|
175
241
|
def if_source(if_branch, arithmetic_operation)
|
|
176
242
|
if branches_have_method?(if_branch.parent) && if_branch.parenthesized?
|
|
177
243
|
if_branch.source.delete_suffix(')')
|
|
@@ -179,10 +245,16 @@ module RuboCop
|
|
|
179
245
|
argument_source = if_branch.first_argument.source
|
|
180
246
|
|
|
181
247
|
"#{if_branch.receiver.source} #{if_branch.method_name} (#{argument_source}"
|
|
248
|
+
elsif if_branch.true_type?
|
|
249
|
+
condition = if_branch.parent.condition
|
|
250
|
+
return condition.source if condition.arguments.empty? || condition.parenthesized?
|
|
251
|
+
|
|
252
|
+
wrap_arguments_with_parens(condition)
|
|
182
253
|
else
|
|
183
254
|
if_branch.source
|
|
184
255
|
end
|
|
185
256
|
end
|
|
257
|
+
# rubocop:enable Metrics/AbcSize
|
|
186
258
|
|
|
187
259
|
def else_source(else_branch, arithmetic_operation) # rubocop:disable Metrics/AbcSize
|
|
188
260
|
if arithmetic_operation
|
|
@@ -221,7 +293,7 @@ module RuboCop
|
|
|
221
293
|
end
|
|
222
294
|
|
|
223
295
|
def make_ternary_form(node)
|
|
224
|
-
_condition, if_branch, else_branch = *node
|
|
296
|
+
_condition, if_branch, else_branch = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
|
225
297
|
arithmetic_operation = use_arithmetic_operation?(if_branch)
|
|
226
298
|
|
|
227
299
|
ternary_form = [
|