rubocop 1.67.0 → 1.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +22 -16
- data/config/default.yml +313 -51
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/lib/rubocop/cached_data.rb +12 -4
- 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 +1 -1
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +52 -9
- 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_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +51 -26
- 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 +1 -12
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +50 -6
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -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 +8 -4
- 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 +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/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.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 +44 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
- 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 +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +36 -6
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +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 -6
- 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 +123 -4
- 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 +3 -4
- 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 +6 -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 +2 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +23 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +8 -34
- 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 +11 -1
- 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 +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- 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_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -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 +3 -2
- 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 +86 -19
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- 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 +3 -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 +47 -14
- 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 +110 -9
- 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 -1
- 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 +93 -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 +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
- 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/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
- 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 +8 -10
- 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/useless_access_modifier.rb +5 -4
- 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 +87 -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 +2 -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 +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/void.rb +16 -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 +2 -2
- 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/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 +3 -2
- 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 +5 -4
- 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 +0 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +64 -8
- data/lib/rubocop/cop/naming/predicate_method.rb +216 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +46 -2
- 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/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
- 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 +47 -28
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +42 -30
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +43 -25
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- 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/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 +39 -27
- 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 +4 -4
- 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 +150 -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 +16 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
- data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
- 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 +1 -2
- 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 +25 -7
- 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 +15 -12
- 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 +36 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +119 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +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 +12 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +27 -17
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -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/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/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
- 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 +9 -18
- 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 +48 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +2 -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_format.rb +262 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +54 -18
- data/lib/rubocop/cop/style/redundant_parentheses.rb +67 -26
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +9 -15
- 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 +42 -12
- 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 +1 -1
- 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 +6 -7
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +42 -106
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_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_proc.rb +2 -0
- 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 +11 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- 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/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 +10 -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 +5 -11
- data/lib/rubocop/cops_documentation_generator.rb +50 -25
- 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 +3 -2
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +7 -23
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +85 -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/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 +13 -13
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +26 -15
- data/lib/rubocop/server/cache.rb +47 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +7 -2
- data/lib/rubocop/target_ruby.rb +17 -2
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +38 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +85 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,115 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks for multiple `defined?` calls joined by `&&` that can be combined
|
7
|
+
# into a single `defined?`.
|
8
|
+
#
|
9
|
+
# When checking that a nested constant or chained method is defined, it is
|
10
|
+
# not necessary to check each ancestor or component of the chain.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# # bad
|
14
|
+
# defined?(Foo) && defined?(Foo::Bar) && defined?(Foo::Bar::Baz)
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
# defined?(Foo::Bar::Baz)
|
18
|
+
#
|
19
|
+
# # bad
|
20
|
+
# defined?(foo) && defined?(foo.bar) && defined?(foo.bar.baz)
|
21
|
+
#
|
22
|
+
# # good
|
23
|
+
# defined?(foo.bar.baz)
|
24
|
+
class CombinableDefined < Base
|
25
|
+
extend AutoCorrector
|
26
|
+
include RangeHelp
|
27
|
+
|
28
|
+
MSG = 'Combine nested `defined?` calls.'
|
29
|
+
OPERATORS = %w[&& and].freeze
|
30
|
+
|
31
|
+
def on_and(node)
|
32
|
+
# Only register an offense if all `&&` terms are `defined?` calls
|
33
|
+
return unless (terms = terms(node)).all?(&:defined_type?)
|
34
|
+
|
35
|
+
calls = defined_calls(terms)
|
36
|
+
namespaces = namespaces(calls)
|
37
|
+
|
38
|
+
calls.each do |call|
|
39
|
+
next unless namespaces.any?(call)
|
40
|
+
|
41
|
+
add_offense(node) do |corrector|
|
42
|
+
remove_term(corrector, call)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def terms(node)
|
50
|
+
node.each_descendant.select do |descendant|
|
51
|
+
descendant.parent.and_type? && !descendant.and_type?
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def defined_calls(nodes)
|
56
|
+
nodes.filter_map do |defined_node|
|
57
|
+
subject = defined_node.first_argument
|
58
|
+
subject if subject.type?(:const, :call)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def namespaces(nodes)
|
63
|
+
nodes.filter_map do |node|
|
64
|
+
if node.respond_to?(:namespace)
|
65
|
+
node.namespace
|
66
|
+
elsif node.respond_to?(:receiver)
|
67
|
+
node.receiver
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def remove_term(corrector, term)
|
73
|
+
term = term.parent until term.parent.and_type?
|
74
|
+
range = if term == term.parent.children.last
|
75
|
+
rhs_range_to_remove(term)
|
76
|
+
else
|
77
|
+
lhs_range_to_remove(term)
|
78
|
+
end
|
79
|
+
|
80
|
+
corrector.remove(range)
|
81
|
+
end
|
82
|
+
|
83
|
+
# If the redundant `defined?` node is the LHS of an `and` node,
|
84
|
+
# the term as well as the subsequent `&&`/`and` operator will be removed.
|
85
|
+
def lhs_range_to_remove(term)
|
86
|
+
source = @processed_source.buffer.source
|
87
|
+
|
88
|
+
pos = term.source_range.end_pos
|
89
|
+
pos += 1 until source[..pos].end_with?(*OPERATORS)
|
90
|
+
|
91
|
+
range_with_surrounding_space(
|
92
|
+
range: term.source_range.with(end_pos: pos + 1),
|
93
|
+
side: :right,
|
94
|
+
newlines: false
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
# If the redundant `defined?` node is the RHS of an `and` node,
|
99
|
+
# the term as well as the preceding `&&`/`and` operator will be removed.
|
100
|
+
def rhs_range_to_remove(term)
|
101
|
+
source = @processed_source.buffer.source
|
102
|
+
|
103
|
+
pos = term.source_range.begin_pos
|
104
|
+
pos -= 1 until source[pos, 3].start_with?(*OPERATORS)
|
105
|
+
|
106
|
+
range_with_surrounding_space(
|
107
|
+
range: term.source_range.with(begin_pos: pos - 1),
|
108
|
+
side: :right,
|
109
|
+
newlines: false
|
110
|
+
)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -80,6 +80,7 @@ module RuboCop
|
|
80
80
|
# rubocop:enable Metrics/CyclomaticComplexity
|
81
81
|
|
82
82
|
alias on_numblock on_block
|
83
|
+
alias on_itblock on_block
|
83
84
|
|
84
85
|
def on_for(node)
|
85
86
|
return unless node.parent&.begin_type?
|
@@ -98,7 +99,7 @@ module RuboCop
|
|
98
99
|
end
|
99
100
|
|
100
101
|
def same_collection_looping_block?(node, sibling)
|
101
|
-
return false if sibling.nil? ||
|
102
|
+
return false if sibling.nil? || !sibling.any_block_type?
|
102
103
|
|
103
104
|
sibling.method?(node.method_name) &&
|
104
105
|
sibling.receiver == node.receiver &&
|
@@ -118,7 +119,7 @@ module RuboCop
|
|
118
119
|
|
119
120
|
def correct_end_of_block(corrector, node)
|
120
121
|
return unless node.left_sibling.respond_to?(:braces?)
|
121
|
-
return if node.right_sibling&.
|
122
|
+
return if node.right_sibling&.any_block_type?
|
122
123
|
|
123
124
|
end_of_block = node.left_sibling.braces? ? '}' : ' end'
|
124
125
|
corrector.remove(node.loc.end)
|
@@ -9,8 +9,8 @@ module RuboCop
|
|
9
9
|
# These keywords are: `class`, `module`, `def`, `begin`, `end`.
|
10
10
|
#
|
11
11
|
# Note that some comments
|
12
|
-
# (`:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`)
|
13
|
-
#
|
12
|
+
# (`:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`),
|
13
|
+
# RBS::Inline annotation, and Steep annotation (`steep:ignore`) are allowed.
|
14
14
|
#
|
15
15
|
# Autocorrection removes comments from `end` keyword and keeps comments
|
16
16
|
# for `class`, `module`, `def` and `begin` above the keyword.
|
@@ -57,6 +57,11 @@ module RuboCop
|
|
57
57
|
|
58
58
|
REGEXP = /(?<keyword>\S+).*#/.freeze
|
59
59
|
|
60
|
+
SUBCLASS_DEFINITION = /\A\s*class\s+(\w|::)+\s*<\s*(\w|::)+/.freeze
|
61
|
+
METHOD_OR_END_DEFINITIONS = /\A\s*(def\s|end)/.freeze
|
62
|
+
|
63
|
+
STEEP_REGEXP = /#\ssteep:ignore(\s|\z)/.freeze
|
64
|
+
|
60
65
|
def on_new_investigation
|
61
66
|
processed_source.comments.each do |comment|
|
62
67
|
next unless offensive?(comment) && (match = source_line(comment).match(REGEXP))
|
@@ -83,6 +88,7 @@ module RuboCop
|
|
83
88
|
def offensive?(comment)
|
84
89
|
line = source_line(comment)
|
85
90
|
return false if rbs_inline_annotation?(line, comment)
|
91
|
+
return false if steep_annotation?(comment)
|
86
92
|
|
87
93
|
KEYWORD_REGEXES.any? { |r| r.match?(line) } &&
|
88
94
|
ALLOWED_COMMENT_REGEXES.none? { |r| r.match?(line) }
|
@@ -93,7 +99,18 @@ module RuboCop
|
|
93
99
|
end
|
94
100
|
|
95
101
|
def rbs_inline_annotation?(line, comment)
|
96
|
-
|
102
|
+
case line
|
103
|
+
when SUBCLASS_DEFINITION
|
104
|
+
comment.text.start_with?(/#\[.+\]/)
|
105
|
+
when METHOD_OR_END_DEFINITIONS
|
106
|
+
comment.text.start_with?('#:')
|
107
|
+
else
|
108
|
+
false
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def steep_annotation?(comment)
|
113
|
+
comment.text.match?(STEEP_REGEXP)
|
97
114
|
end
|
98
115
|
end
|
99
116
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks for logical comparison which can be replaced with `Comparable#between?`.
|
7
|
+
#
|
8
|
+
# NOTE: `Comparable#between?` is on average slightly slower than logical comparison,
|
9
|
+
# although the difference generally isn't observable. If you require maximum
|
10
|
+
# performance, consider using logical comparison.
|
11
|
+
#
|
12
|
+
# @safety
|
13
|
+
# This cop is unsafe because the receiver may not respond to `between?`.
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
#
|
17
|
+
# # bad
|
18
|
+
# x >= min && x <= max
|
19
|
+
#
|
20
|
+
# # bad
|
21
|
+
# x <= max && x >= min
|
22
|
+
#
|
23
|
+
# # good
|
24
|
+
# x.between?(min, max)
|
25
|
+
#
|
26
|
+
class ComparableBetween < Base
|
27
|
+
extend AutoCorrector
|
28
|
+
|
29
|
+
MSG = 'Prefer `%<prefer>s` over logical comparison.'
|
30
|
+
|
31
|
+
# @!method logical_comparison_between_by_min_first?(node)
|
32
|
+
def_node_matcher :logical_comparison_between_by_min_first?, <<~PATTERN
|
33
|
+
(and
|
34
|
+
(send
|
35
|
+
{$_value :>= $_min | $_min :<= $_value})
|
36
|
+
(send
|
37
|
+
{$_value :<= $_max | $_max :>= $_value}))
|
38
|
+
PATTERN
|
39
|
+
|
40
|
+
# @!method logical_comparison_between_by_max_first?(node)
|
41
|
+
def_node_matcher :logical_comparison_between_by_max_first?, <<~PATTERN
|
42
|
+
(and
|
43
|
+
(send
|
44
|
+
{$_value :<= $_max | $_max :>= $_value})
|
45
|
+
(send
|
46
|
+
{$_value :>= $_min | $_min :<= $_value}))
|
47
|
+
PATTERN
|
48
|
+
|
49
|
+
def on_and(node)
|
50
|
+
logical_comparison_between_by_min_first?(node) do |*args|
|
51
|
+
min_and_value, max_and_value = args.each_slice(2).to_a
|
52
|
+
|
53
|
+
register_offense(node, min_and_value, max_and_value)
|
54
|
+
end
|
55
|
+
|
56
|
+
logical_comparison_between_by_max_first?(node) do |*args|
|
57
|
+
max_and_value, min_and_value = args.each_slice(2).to_a
|
58
|
+
|
59
|
+
register_offense(node, min_and_value, max_and_value)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def register_offense(node, min_and_value, max_and_value)
|
66
|
+
value = (min_and_value & max_and_value).first
|
67
|
+
min = min_and_value.find { _1 != value } || value
|
68
|
+
max = max_and_value.find { _1 != value } || value
|
69
|
+
|
70
|
+
prefer = "#{value.source}.between?(#{min.source}, #{max.source})"
|
71
|
+
add_offense(node, message: format(MSG, prefer: prefer)) do |corrector|
|
72
|
+
corrector.replace(node, prefer)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -86,7 +86,7 @@ module RuboCop
|
|
86
86
|
|
87
87
|
def percent_literals_includes_only_basic_literals?(node)
|
88
88
|
node.arguments.select(&:percent_literal?).all? do |arg|
|
89
|
-
arg.children.all? { |child| child.
|
89
|
+
arg.children.all? { |child| child.type?(:str, :sym) }
|
90
90
|
end
|
91
91
|
end
|
92
92
|
end
|
@@ -33,24 +33,20 @@ module RuboCop
|
|
33
33
|
branch.begin_type? ? Array(branch).last : branch
|
34
34
|
end
|
35
35
|
|
36
|
-
# rubocop:disable Metrics/AbcSize
|
37
36
|
def lhs(node)
|
38
37
|
case node.type
|
39
38
|
when :send
|
40
39
|
lhs_for_send(node)
|
41
|
-
when :op_asgn
|
42
|
-
"#{node.
|
43
|
-
when :and_asgn, :or_asgn
|
44
|
-
"#{node.children[0].source} #{node.loc.operator.source} "
|
40
|
+
when :op_asgn, :and_asgn, :or_asgn
|
41
|
+
"#{node.assignment_node.source} #{node.operator}= "
|
45
42
|
when :casgn
|
46
43
|
lhs_for_casgn(node)
|
47
44
|
when *ConditionalAssignment::VARIABLE_ASSIGNMENT_TYPES
|
48
|
-
"#{node.
|
45
|
+
"#{node.name} = "
|
49
46
|
else
|
50
47
|
node.source
|
51
48
|
end
|
52
49
|
end
|
53
|
-
# rubocop:enable Metrics/AbcSize
|
54
50
|
|
55
51
|
def indent(cop, source)
|
56
52
|
conf = cop.config.for_cop(END_ALIGNMENT)
|
@@ -94,11 +90,12 @@ module RuboCop
|
|
94
90
|
end
|
95
91
|
|
96
92
|
def lhs_for_casgn(node)
|
97
|
-
|
98
|
-
|
99
|
-
|
93
|
+
if node.namespace.nil?
|
94
|
+
"#{node.name} = "
|
95
|
+
elsif node.namespace.cbase_type?
|
96
|
+
"::#{node.name} = "
|
100
97
|
else
|
101
|
-
"#{namespace.
|
98
|
+
"#{node.namespace.const_name}::#{node.name} = "
|
102
99
|
end
|
103
100
|
end
|
104
101
|
|
@@ -110,7 +107,7 @@ module RuboCop
|
|
110
107
|
parent = node.parent
|
111
108
|
return true unless parent
|
112
109
|
|
113
|
-
!
|
110
|
+
!parent.type?(:mlhs, :resbody)
|
114
111
|
end
|
115
112
|
end
|
116
113
|
|
@@ -210,7 +207,6 @@ module RuboCop
|
|
210
207
|
class ConditionalAssignment < Base
|
211
208
|
include ConditionalAssignmentHelper
|
212
209
|
include ConfigurableEnforcedStyle
|
213
|
-
include IgnoredNode
|
214
210
|
extend AutoCorrector
|
215
211
|
|
216
212
|
MSG = 'Use the return of the conditional for variable assignment and comparison.'
|
@@ -313,22 +309,25 @@ module RuboCop
|
|
313
309
|
end
|
314
310
|
|
315
311
|
def allowed_single_line?(branches)
|
316
|
-
single_line_conditions_only? && branches.any?(&:begin_type?)
|
312
|
+
single_line_conditions_only? && branches.compact.any?(&:begin_type?)
|
317
313
|
end
|
318
314
|
|
319
315
|
def assignment_node(node)
|
320
|
-
|
316
|
+
assignment = node.send_type? ? node.last_argument : node.expression
|
317
|
+
return unless assignment
|
321
318
|
|
322
319
|
# ignore pseudo-assignments without rhs in for nodes
|
323
320
|
return if node.parent&.for_type?
|
324
321
|
|
325
|
-
|
322
|
+
if assignment.begin_type? && assignment.children.one?
|
323
|
+
assignment = assignment.children.first
|
324
|
+
end
|
326
325
|
|
327
326
|
assignment
|
328
327
|
end
|
329
328
|
|
330
329
|
def move_assignment_outside_condition(corrector, node)
|
331
|
-
if node.
|
330
|
+
if node.type?(:case, :case_match)
|
332
331
|
CaseCorrector.correct(corrector, self, node)
|
333
332
|
elsif node.ternary?
|
334
333
|
TernaryCorrector.correct(corrector, node)
|
@@ -338,11 +337,11 @@ module RuboCop
|
|
338
337
|
end
|
339
338
|
|
340
339
|
def move_assignment_inside_condition(corrector, node)
|
341
|
-
|
340
|
+
condition = node.send_type? ? node.last_argument : node.expression
|
342
341
|
|
343
342
|
if ternary_condition?(condition)
|
344
343
|
TernaryCorrector.move_assignment_inside_condition(corrector, node)
|
345
|
-
elsif condition.
|
344
|
+
elsif condition.type?(:case, :case_match)
|
346
345
|
CaseCorrector.move_assignment_inside_condition(corrector, node)
|
347
346
|
elsif condition.if_type?
|
348
347
|
IfCorrector.move_assignment_inside_condition(corrector, node)
|
@@ -438,17 +437,28 @@ module RuboCop
|
|
438
437
|
# Helper module to provide common methods to ConditionalAssignment
|
439
438
|
# correctors
|
440
439
|
module ConditionalCorrectorHelper
|
440
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
441
441
|
def remove_whitespace_in_branches(corrector, branch, condition, column)
|
442
442
|
branch.each_node do |child|
|
443
443
|
next if child.source_range.nil?
|
444
|
+
next if child.parent.dstr_type?
|
444
445
|
|
445
446
|
white_space = white_space_range(child, column)
|
446
447
|
corrector.remove(white_space) if white_space.source.strip.empty?
|
447
448
|
end
|
448
449
|
|
449
|
-
|
450
|
-
corrector.remove_preceding(loc, loc.column - column)
|
450
|
+
if condition.loc.else && !same_line?(condition.else_branch, condition)
|
451
|
+
corrector.remove_preceding(condition.loc.else, condition.loc.else.column - column)
|
451
452
|
end
|
453
|
+
|
454
|
+
return unless condition.loc.end && !same_line?(condition.loc.end, condition)
|
455
|
+
|
456
|
+
corrector.remove_preceding(condition.loc.end, condition.loc.end.column - column)
|
457
|
+
end
|
458
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
459
|
+
|
460
|
+
def same_line?(node1, node2)
|
461
|
+
RuboCop::Cop::Util.same_line?(node1, node2)
|
452
462
|
end
|
453
463
|
|
454
464
|
def white_space_range(node, column)
|
@@ -459,7 +469,7 @@ module RuboCop
|
|
459
469
|
end
|
460
470
|
|
461
471
|
def assignment(node)
|
462
|
-
|
472
|
+
condition = node.send_type? ? node.last_argument : node.expression
|
463
473
|
|
464
474
|
node.source_range.begin.join(condition.source_range.begin)
|
465
475
|
end
|
@@ -506,7 +516,7 @@ module RuboCop
|
|
506
516
|
end
|
507
517
|
|
508
518
|
def move_assignment_inside_condition(corrector, node)
|
509
|
-
|
519
|
+
rhs = node.send_type? ? node.last_argument : node.expression
|
510
520
|
if_branch, else_branch = extract_branches(node)
|
511
521
|
assignment = assignment(node)
|
512
522
|
|
@@ -537,8 +547,8 @@ module RuboCop
|
|
537
547
|
end
|
538
548
|
|
539
549
|
def extract_branches(node)
|
540
|
-
|
541
|
-
condition
|
550
|
+
rhs = node.send_type? ? node.last_argument : node.expression
|
551
|
+
condition = rhs.children.first if rhs.begin_type? && rhs.children.one?
|
542
552
|
_condition, if_branch, else_branch = *(condition || rhs)
|
543
553
|
|
544
554
|
[if_branch, else_branch]
|
@@ -567,7 +577,7 @@ module RuboCop
|
|
567
577
|
|
568
578
|
def move_assignment_inside_condition(corrector, node)
|
569
579
|
column = node.source_range.column
|
570
|
-
|
580
|
+
condition = node.send_type? ? node.last_argument : node.expression
|
571
581
|
assignment = assignment(node)
|
572
582
|
|
573
583
|
corrector.remove(assignment)
|
@@ -595,6 +605,8 @@ module RuboCop
|
|
595
605
|
|
596
606
|
return unless (branch_else = branch.parent.loc.else)
|
597
607
|
|
608
|
+
return if same_line?(branch_else, condition)
|
609
|
+
|
598
610
|
corrector.remove_preceding(branch_else, branch_else.column - column)
|
599
611
|
end
|
600
612
|
end
|
@@ -618,7 +630,7 @@ module RuboCop
|
|
618
630
|
|
619
631
|
def move_assignment_inside_condition(corrector, node)
|
620
632
|
column = node.source_range.column
|
621
|
-
|
633
|
+
condition = node.send_type? ? node.last_argument : node.expression
|
622
634
|
assignment = assignment(node)
|
623
635
|
|
624
636
|
corrector.remove(assignment)
|
@@ -53,8 +53,7 @@ module RuboCop
|
|
53
53
|
return if visibility_declaration?(node)
|
54
54
|
return if ignore_modules? && module?(node)
|
55
55
|
|
56
|
-
message
|
57
|
-
add_offense(node, message: message)
|
56
|
+
add_offense(node, message: format(MSG, constant_name: node.name))
|
58
57
|
end
|
59
58
|
|
60
59
|
private
|
@@ -64,13 +63,7 @@ module RuboCop
|
|
64
63
|
end
|
65
64
|
|
66
65
|
def module?(node)
|
67
|
-
node.
|
68
|
-
end
|
69
|
-
|
70
|
-
def message(node)
|
71
|
-
_namespace, constant_name, _value = *node
|
72
|
-
|
73
|
-
format(MSG, constant_name: constant_name)
|
66
|
+
node.expression.class_constructor?
|
74
67
|
end
|
75
68
|
|
76
69
|
def class_or_module_scope?(node)
|
@@ -85,10 +78,8 @@ module RuboCop
|
|
85
78
|
end
|
86
79
|
|
87
80
|
def visibility_declaration?(node)
|
88
|
-
_namespace, constant_name, _value = *node
|
89
|
-
|
90
81
|
node.parent.each_child_node(:send).any? do |child|
|
91
|
-
visibility_declaration_for?(child,
|
82
|
+
visibility_declaration_for?(child, node.name)
|
92
83
|
end
|
93
84
|
end
|
94
85
|
|
@@ -4,6 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
6
|
# Checks for inheritance from `Data.define` to avoid creating the anonymous parent class.
|
7
|
+
# Inheriting from `Data.define` adds a superfluous level in inheritance tree.
|
7
8
|
#
|
8
9
|
# @safety
|
9
10
|
# Autocorrection is unsafe because it will change the inheritance
|
@@ -17,12 +18,18 @@ module RuboCop
|
|
17
18
|
# end
|
18
19
|
# end
|
19
20
|
#
|
21
|
+
# Person.ancestors
|
22
|
+
# # => [Person, #<Class:0x000000010b4e14a0>, Data, (...)]
|
23
|
+
#
|
20
24
|
# # good
|
21
25
|
# Person = Data.define(:first_name, :last_name) do
|
22
26
|
# def age
|
23
27
|
# 42
|
24
28
|
# end
|
25
29
|
# end
|
30
|
+
#
|
31
|
+
# Person.ancestors
|
32
|
+
# # => [Person, Data, (...)]
|
26
33
|
class DataInheritance < Base
|
27
34
|
include RangeHelp
|
28
35
|
extend AutoCorrector
|
@@ -25,8 +25,9 @@ module RuboCop
|
|
25
25
|
# # good
|
26
26
|
# def foo = do_something
|
27
27
|
#
|
28
|
-
# # good
|
28
|
+
# # good - without parentheses it's a syntax error
|
29
29
|
# def foo() do_something end
|
30
|
+
# def foo()=do_something
|
30
31
|
#
|
31
32
|
# # bad
|
32
33
|
# def Baz.foo()
|
@@ -38,19 +39,31 @@ module RuboCop
|
|
38
39
|
# do_something
|
39
40
|
# end
|
40
41
|
class DefWithParentheses < Base
|
42
|
+
include RangeHelp
|
41
43
|
extend AutoCorrector
|
42
44
|
|
43
45
|
MSG = "Omit the parentheses in defs when the method doesn't accept any arguments."
|
44
46
|
|
45
47
|
def on_def(node)
|
46
|
-
return
|
47
|
-
return
|
48
|
+
return unless !node.arguments? && (arguments_range = node.arguments.source_range)
|
49
|
+
return if parentheses_required?(node, arguments_range)
|
48
50
|
|
49
|
-
add_offense(
|
50
|
-
corrector.remove(
|
51
|
+
add_offense(arguments_range) do |corrector|
|
52
|
+
corrector.remove(arguments_range)
|
51
53
|
end
|
52
54
|
end
|
53
55
|
alias on_defs on_def
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def parentheses_required?(node, arguments_range)
|
60
|
+
return true if node.single_line? && !node.endless?
|
61
|
+
|
62
|
+
end_pos = arguments_range.end.end_pos
|
63
|
+
token_after_argument = range_between(end_pos, end_pos + 1).source
|
64
|
+
|
65
|
+
token_after_argument == '='
|
66
|
+
end
|
54
67
|
end
|
55
68
|
end
|
56
69
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Check for chained `dig` calls that can be collapsed into a single `dig`.
|
7
|
+
#
|
8
|
+
# @safety
|
9
|
+
# This cop is unsafe because it cannot be guaranteed that the receiver
|
10
|
+
# is an `Enumerable` or does not have a nonstandard implementation
|
11
|
+
# of `dig`.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# # bad
|
15
|
+
# x.dig(:foo).dig(:bar).dig(:baz)
|
16
|
+
# x.dig(:foo, :bar).dig(:baz)
|
17
|
+
# x.dig(:foo, :bar)&.dig(:baz)
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# x.dig(:foo, :bar, :baz)
|
21
|
+
#
|
22
|
+
# # good - `dig`s cannot be combined
|
23
|
+
# x.dig(:foo).bar.dig(:baz)
|
24
|
+
#
|
25
|
+
class DigChain < Base
|
26
|
+
extend AutoCorrector
|
27
|
+
include CommentsHelp
|
28
|
+
include DigHelp
|
29
|
+
|
30
|
+
MSG = 'Use `%<replacement>s` instead of chaining.'
|
31
|
+
RESTRICT_ON_SEND = %i[dig].freeze
|
32
|
+
|
33
|
+
def on_send(node)
|
34
|
+
return if ignored_node?(node)
|
35
|
+
return unless node.loc.dot
|
36
|
+
return unless dig?(node)
|
37
|
+
|
38
|
+
range, arguments = inspect_chain(node)
|
39
|
+
return if invalid_arguments?(arguments)
|
40
|
+
return unless range
|
41
|
+
|
42
|
+
register_offense(node, range, arguments)
|
43
|
+
end
|
44
|
+
alias on_csend on_send
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
# Walk up the method chain while the receiver is `dig` with arguments.
|
49
|
+
def inspect_chain(node)
|
50
|
+
arguments = node.arguments.dup
|
51
|
+
end_range = node.source_range.end
|
52
|
+
|
53
|
+
while dig?(node = node.receiver)
|
54
|
+
begin_range = node.loc.selector
|
55
|
+
arguments.unshift(*node.arguments)
|
56
|
+
ignore_node(node)
|
57
|
+
end
|
58
|
+
|
59
|
+
return unless begin_range
|
60
|
+
|
61
|
+
[begin_range.join(end_range), arguments]
|
62
|
+
end
|
63
|
+
|
64
|
+
def invalid_arguments?(arguments)
|
65
|
+
# If any of the arguments are arguments forwarding (`...`), it can only be the
|
66
|
+
# first argument, or else the resulting code will have a syntax error.
|
67
|
+
|
68
|
+
return false unless arguments&.any?
|
69
|
+
|
70
|
+
forwarded_args_index = arguments.index(&:forwarded_args_type?)
|
71
|
+
forwarded_args_index && forwarded_args_index < (arguments.size - 1)
|
72
|
+
end
|
73
|
+
|
74
|
+
def register_offense(node, range, arguments)
|
75
|
+
arguments = arguments.map(&:source).join(', ')
|
76
|
+
replacement = "dig(#{arguments})"
|
77
|
+
|
78
|
+
add_offense(range, message: format(MSG, replacement: replacement)) do |corrector|
|
79
|
+
corrector.replace(range, replacement)
|
80
|
+
|
81
|
+
comments_in_range(node).reverse_each do |comment|
|
82
|
+
corrector.insert_before(node, "#{comment.source}\n")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -186,7 +186,7 @@ module RuboCop
|
|
186
186
|
def qualify_const(node)
|
187
187
|
return if node.nil?
|
188
188
|
|
189
|
-
if node.
|
189
|
+
if node.type?(:cbase, :self, :call) || node.variable?
|
190
190
|
node.source
|
191
191
|
else
|
192
192
|
[qualify_const(node.namespace), node.short_name].compact
|