rubocop 1.42.0 → 1.64.1
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 +7 -6
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +342 -64
- data/config/obsoletion.yml +5 -0
- data/lib/rubocop/cached_data.rb +11 -3
- data/lib/rubocop/cli/command/auto_generate_config.rb +27 -6
- data/lib/rubocop/cli/command/execute_runner.rb +7 -2
- data/lib/rubocop/cli/command/lsp.rb +19 -0
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli.rb +68 -10
- data/lib/rubocop/comment_config.rb +19 -0
- data/lib/rubocop/config.rb +43 -15
- data/lib/rubocop/config_finder.rb +14 -4
- data/lib/rubocop/config_loader.rb +20 -24
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +13 -10
- data/lib/rubocop/config_validator.rb +14 -7
- data/lib/rubocop/cop/autocorrect_logic.rb +37 -14
- data/lib/rubocop/cop/base.rb +97 -28
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -0
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
- data/lib/rubocop/cop/bundler/gem_version.rb +5 -7
- data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
- data/lib/rubocop/cop/commissioner.rb +8 -2
- data/lib/rubocop/cop/cop.rb +25 -5
- data/lib/rubocop/cop/corrector.rb +11 -3
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +6 -14
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +2 -7
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/documentation.rb +16 -6
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +6 -8
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -3
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +107 -0
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +37 -13
- data/lib/rubocop/cop/internal_affairs/example_description.rb +46 -24
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +37 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +53 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +128 -34
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
- data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +11 -3
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +66 -0
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
- data/lib/rubocop/cop/internal_affairs.rb +5 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +7 -15
- data/lib/rubocop/cop/layout/class_structure.rb +15 -19
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +2 -6
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -5
- data/lib/rubocop/cop/layout/empty_comment.rb +6 -4
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +42 -9
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +28 -5
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +23 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +3 -4
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +8 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +24 -7
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +25 -34
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +7 -19
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +42 -52
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +38 -55
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +12 -6
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +12 -12
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +3 -3
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +18 -12
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +12 -8
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +8 -27
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +7 -26
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +4 -21
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -3
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +6 -30
- data/lib/rubocop/cop/layout/redundant_line_break.rb +33 -11
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +6 -6
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +53 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +19 -10
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +11 -13
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +3 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +3 -3
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +4 -4
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +6 -6
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +6 -6
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -2
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +49 -26
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +62 -112
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +47 -22
- data/lib/rubocop/cop/lint/else_layout.rb +3 -7
- data/lib/rubocop/cop/lint/empty_block.rb +2 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +6 -4
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +27 -21
- data/lib/rubocop/cop/lint/float_comparison.rb +10 -0
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +14 -7
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +16 -18
- data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +47 -5
- data/lib/rubocop/cop/lint/missing_super.rb +63 -5
- data/lib/rubocop/cop/lint/mixed_case_range.rb +116 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +4 -9
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -21
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -5
- data/lib/rubocop/cop/lint/number_conversion.rb +14 -4
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +8 -12
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +11 -5
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +5 -5
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +21 -2
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +72 -8
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
- data/lib/rubocop/cop/lint/redundant_with_index.rb +7 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -3
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +2 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +14 -8
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +38 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -12
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +10 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +23 -6
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -2
- data/lib/rubocop/cop/lint/unreachable_code.rb +4 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +11 -5
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +12 -9
- data/lib/rubocop/cop/lint/useless_assignment.rb +94 -10
- data/lib/rubocop/cop/lint/useless_method_definition.rb +12 -4
- data/lib/rubocop/cop/lint/useless_rescue.rb +89 -0
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +9 -1
- data/lib/rubocop/cop/lint/useless_times.rb +3 -3
- data/lib/rubocop/cop/lint/void.rb +119 -20
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -3
- data/lib/rubocop/cop/metrics/block_length.rb +2 -2
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +8 -2
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +76 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +27 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +3 -7
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +38 -10
- data/lib/rubocop/cop/migration/department_name.rb +3 -3
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +3 -1
- data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +21 -11
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +78 -29
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +3 -3
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/line_length_help.rb +3 -1
- data/lib/rubocop/cop/mixin/method_complexity.rb +15 -6
- data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +0 -3
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -3
- 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 +6 -8
- data/lib/rubocop/cop/mixin/range_help.rb +1 -6
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -3
- data/lib/rubocop/cop/mixin/string_help.rb +4 -2
- data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +38 -7
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +2 -3
- data/lib/rubocop/cop/naming/file_name.rb +3 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +24 -6
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +26 -11
- data/lib/rubocop/cop/naming/method_name.rb +3 -3
- data/lib/rubocop/cop/naming/predicate_name.rb +3 -3
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -4
- data/lib/rubocop/cop/naming/variable_name.rb +6 -1
- data/lib/rubocop/cop/registry.rb +16 -9
- data/lib/rubocop/cop/security/compound_hash.rb +2 -2
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +78 -13
- data/lib/rubocop/cop/style/accessor_grouping.rb +44 -18
- data/lib/rubocop/cop/style/alias.rb +10 -8
- data/lib/rubocop/cop/style/arguments_forwarding.rb +414 -62
- data/lib/rubocop/cop/style/array_first_last.rb +64 -0
- data/lib/rubocop/cop/style/array_intersect.rb +14 -6
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +11 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/begin_block.rb +1 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +3 -3
- data/lib/rubocop/cop/style/block_comments.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +22 -6
- data/lib/rubocop/cop/style/case_like_if.rb +25 -8
- data/lib/rubocop/cop/style/class_and_module_children.rb +5 -12
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +58 -40
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +37 -14
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
- data/lib/rubocop/cop/style/combinable_loops.rb +36 -8
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +7 -4
- data/lib/rubocop/cop/style/comparable_clamp.rb +125 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +12 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +15 -20
- data/lib/rubocop/cop/style/copyright.rb +37 -24
- data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/dir_empty.rb +54 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +3 -3
- data/lib/rubocop/cop/style/documentation.rb +36 -30
- data/lib/rubocop/cop/style/documentation_method.rb +30 -4
- data/lib/rubocop/cop/style/double_negation.rb +2 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
- data/lib/rubocop/cop/style/each_with_object.rb +3 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +14 -23
- data/lib/rubocop/cop/style/exact_regexp_match.rb +70 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +3 -3
- data/lib/rubocop/cop/style/file_empty.rb +71 -0
- data/lib/rubocop/cop/style/file_read.rb +3 -3
- data/lib/rubocop/cop/style/file_write.rb +1 -1
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +33 -12
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -2
- data/lib/rubocop/cop/style/guard_clause.rb +29 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +106 -21
- data/lib/rubocop/cop/style/hash_except.rb +25 -13
- data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
- data/lib/rubocop/cop/style/hash_syntax.rb +29 -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 +34 -5
- data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +111 -15
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +7 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
- data/lib/rubocop/cop/style/inverse_methods.rb +14 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +160 -0
- data/lib/rubocop/cop/style/lambda.rb +3 -3
- data/lib/rubocop/cop/style/lambda_call.rb +5 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +8 -10
- data/lib/rubocop/cop/style/map_into_array.rb +175 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +20 -7
- data/lib/rubocop/cop/style/map_to_set.rb +5 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +48 -28
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +46 -41
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +22 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max.rb +3 -3
- data/lib/rubocop/cop/style/min_max_comparison.rb +11 -1
- data/lib/rubocop/cop/style/missing_else.rb +13 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +2 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +5 -5
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +0 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +17 -5
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +13 -12
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
- data/lib/rubocop/cop/style/next.rb +1 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
- data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +10 -2
- data/lib/rubocop/cop/style/object_then.rb +5 -3
- data/lib/rubocop/cop/style/one_line_conditional.rb +4 -7
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +24 -4
- data/lib/rubocop/cop/style/parallel_assignment.rb +32 -24
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +4 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +33 -4
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +10 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +10 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +18 -3
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -14
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +39 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +103 -9
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +9 -7
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +200 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +73 -24
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +100 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +7 -8
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +13 -4
- data/lib/rubocop/cop/style/redundant_return.rb +14 -3
- data/lib/rubocop/cop/style/redundant_self.rb +17 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +8 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +13 -12
- data/lib/rubocop/cop/style/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +6 -5
- data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
- data/lib/rubocop/cop/style/require_order.rb +12 -15
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/return_nil.rb +6 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +95 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +22 -11
- data/lib/rubocop/cop/style/self_assignment.rb +3 -3
- data/lib/rubocop/cop/style/semicolon.rb +43 -5
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +90 -0
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/single_argument_dig.rb +7 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +67 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +77 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +9 -5
- data/lib/rubocop/cop/style/special_global_vars.rb +4 -6
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_hash_keys.rb +4 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +156 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +68 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/word_array.rb +18 -6
- data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +17 -8
- data/lib/rubocop/cop/style/yoda_expression.rb +26 -9
- data/lib/rubocop/cop/style/zero_length_predicate.rb +9 -5
- data/lib/rubocop/cop/team.rb +36 -23
- data/lib/rubocop/cop/util.rb +14 -5
- data/lib/rubocop/cop/utils/regexp_ranges.rb +113 -0
- data/lib/rubocop/cop/variable_force/assignment.rb +45 -4
- data/lib/rubocop/cop/variable_force/scope.rb +3 -3
- data/lib/rubocop/cop/variable_force/variable.rb +5 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -3
- data/lib/rubocop/cop/variable_force.rb +2 -1
- data/lib/rubocop/cops_documentation_generator.rb +26 -7
- data/lib/rubocop/directive_comment.rb +13 -11
- data/lib/rubocop/ext/comment.rb +18 -0
- data/lib/rubocop/ext/regexp_node.rb +10 -5
- data/lib/rubocop/ext/regexp_parser.rb +5 -2
- data/lib/rubocop/file_finder.rb +4 -7
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -8
- data/lib/rubocop/formatter/formatter_set.rb +7 -1
- data/lib/rubocop/formatter/html_formatter.rb +35 -14
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +4 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +12 -2
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -2
- data/lib/rubocop/lockfile.rb +56 -7
- data/lib/rubocop/lsp/logger.rb +22 -0
- data/lib/rubocop/lsp/routes.rb +243 -0
- data/lib/rubocop/lsp/runtime.rb +99 -0
- data/lib/rubocop/lsp/server.rb +73 -0
- data/lib/rubocop/lsp/severity.rb +27 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +13 -11
- data/lib/rubocop/options.rb +49 -12
- data/lib/rubocop/path_util.rb +17 -8
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/result_cache.rb +6 -3
- data/lib/rubocop/rspec/cop_helper.rb +9 -3
- data/lib/rubocop/rspec/expect_offense.rb +18 -8
- data/lib/rubocop/rspec/shared_contexts.rb +59 -19
- data/lib/rubocop/rspec/support.rb +3 -0
- data/lib/rubocop/runner.rb +59 -10
- data/lib/rubocop/server/cache.rb +11 -4
- data/lib/rubocop/server/cli.rb +37 -18
- data/lib/rubocop/server/client_command/exec.rb +4 -4
- data/lib/rubocop/server/client_command/start.rb +6 -1
- data/lib/rubocop/server/core.rb +24 -9
- data/lib/rubocop/server/helper.rb +1 -1
- data/lib/rubocop/server/server_command/exec.rb +1 -2
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +91 -81
- data/lib/rubocop/target_ruby.rb +85 -78
- data/lib/rubocop/version.rb +27 -8
- data/lib/rubocop.rb +35 -0
- metadata +76 -35
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -36,7 +36,6 @@ module RuboCop
|
|
36
36
|
# STR
|
37
37
|
class RedundantStringEscape < Base
|
38
38
|
include MatchRange
|
39
|
-
include RangeHelp
|
40
39
|
extend AutoCorrector
|
41
40
|
|
42
41
|
MSG = 'Redundant escape of %<char>s inside string literal.'
|
@@ -64,10 +63,10 @@ module RuboCop
|
|
64
63
|
def str_contents_range(node)
|
65
64
|
if heredoc?(node)
|
66
65
|
node.loc.heredoc_body
|
66
|
+
elsif node.str_type?
|
67
|
+
node.source_range
|
67
68
|
elsif begin_loc_present?(node)
|
68
69
|
contents_range(node)
|
69
|
-
else
|
70
|
-
node.loc.expression
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
@@ -134,12 +133,12 @@ module RuboCop
|
|
134
133
|
end
|
135
134
|
|
136
135
|
def percent_array_literal?(node)
|
137
|
-
|
136
|
+
percent_w_literal?(node) || percent_w_upper_literal?(node)
|
138
137
|
end
|
139
138
|
|
140
139
|
def heredoc_with_disabled_interpolation?(node)
|
141
140
|
if heredoc?(node)
|
142
|
-
node.
|
141
|
+
node.source.end_with?("'")
|
143
142
|
elsif node.parent&.dstr_type?
|
144
143
|
heredoc_with_disabled_interpolation?(node.parent)
|
145
144
|
else
|
@@ -158,6 +157,8 @@ module RuboCop
|
|
158
157
|
return delimiter?(node.parent, char)
|
159
158
|
end
|
160
159
|
|
160
|
+
return true unless node.loc.begin
|
161
|
+
|
161
162
|
delimiters = [node.loc.begin.source[-1], node.loc.end.source[0]]
|
162
163
|
|
163
164
|
delimiters.include?(char)
|
@@ -3,7 +3,16 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Enforces using
|
6
|
+
# Enforces using `//` or `%r` around regular expressions.
|
7
|
+
#
|
8
|
+
# NOTE: The following `%r` cases using a regexp starts with a blank or `=`
|
9
|
+
# as a method argument allowed to prevent syntax errors.
|
10
|
+
#
|
11
|
+
# [source,ruby]
|
12
|
+
# ----
|
13
|
+
# do_something %r{ regexp} # `do_something / regexp/` is an invalid syntax.
|
14
|
+
# do_something %r{=regexp} # `do_something /=regexp/` is an invalid syntax.
|
15
|
+
# ----
|
7
16
|
#
|
8
17
|
# @example EnforcedStyle: slashes (default)
|
9
18
|
# # bad
|
@@ -151,7 +160,7 @@ module RuboCop
|
|
151
160
|
|
152
161
|
def allowed_omit_parentheses_with_percent_r_literal?(node)
|
153
162
|
return false unless node.parent&.call_type?
|
154
|
-
return true if node.content.start_with?(' ')
|
163
|
+
return true if node.content.start_with?(' ', '=')
|
155
164
|
|
156
165
|
enforced_style = config.for_cop('Style/MethodCallWithArgsParentheses')['EnforcedStyle']
|
157
166
|
|
@@ -88,11 +88,7 @@ module RuboCop
|
|
88
88
|
return unless previous_older_sibling
|
89
89
|
|
90
90
|
add_offense(node, message: format(MSG, name: node.method_name)) do |corrector|
|
91
|
-
|
92
|
-
range_with_comments_and_lines(previous_older_sibling),
|
93
|
-
range_with_comments_and_lines(node.parent.if_type? ? node.parent : node),
|
94
|
-
corrector: corrector
|
95
|
-
)
|
91
|
+
autocorrect(corrector, node, previous_older_sibling)
|
96
92
|
end
|
97
93
|
end
|
98
94
|
|
@@ -110,11 +106,20 @@ module RuboCop
|
|
110
106
|
break unless sibling&.send_type? && sibling&.method?(node.method_name)
|
111
107
|
break unless sibling.arguments? && !sibling.receiver
|
112
108
|
break unless in_same_section?(sibling, node)
|
109
|
+
break unless node.first_argument.str_type? && sibling.first_argument.str_type?
|
113
110
|
|
114
|
-
node.first_argument.
|
111
|
+
node.first_argument.value < sibling.first_argument.value
|
115
112
|
end
|
116
113
|
end
|
117
114
|
|
115
|
+
def autocorrect(corrector, node, previous_older_sibling)
|
116
|
+
range1 = range_with_comments_and_lines(previous_older_sibling)
|
117
|
+
range2 = range_with_comments_and_lines(node.parent.if_type? ? node.parent : node)
|
118
|
+
|
119
|
+
corrector.remove(range2)
|
120
|
+
corrector.insert_before(range1, range2.source)
|
121
|
+
end
|
122
|
+
|
118
123
|
def search_node(node)
|
119
124
|
node.parent.if_type? ? node.parent : node
|
120
125
|
end
|
@@ -126,15 +131,7 @@ module RuboCop
|
|
126
131
|
end
|
127
132
|
|
128
133
|
def in_same_section?(node1, node2)
|
129
|
-
!node1.
|
130
|
-
end_pos: node2.location.expression.end_pos
|
131
|
-
).source.include?("\n\n")
|
132
|
-
end
|
133
|
-
|
134
|
-
def swap(range1, range2, corrector:)
|
135
|
-
inserted = range2.source
|
136
|
-
corrector.insert_before(range1, inserted)
|
137
|
-
corrector.remove(range2)
|
134
|
+
!node1.source_range.join(node2.source_range.end).source.include?("\n\n")
|
138
135
|
end
|
139
136
|
end
|
140
137
|
end
|
@@ -3,9 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks for uses of rescue in its modifier form
|
7
|
-
#
|
8
|
-
# The cop to check `rescue` in its modifier form is added for following
|
6
|
+
# Checks for uses of `rescue` in its modifier form is added for following
|
9
7
|
# reasons:
|
10
8
|
#
|
11
9
|
# * The syntax of modifier form `rescue` can be misleading because it
|
@@ -105,11 +105,11 @@ module RuboCop
|
|
105
105
|
private
|
106
106
|
|
107
107
|
def offense_for_implicit_enforced_style(node, error)
|
108
|
-
range = node.loc.keyword.join(error.
|
108
|
+
range = node.loc.keyword.join(error.source_range)
|
109
109
|
|
110
110
|
add_offense(range, message: MSG_IMPLICIT) do |corrector|
|
111
111
|
error = rescue_standard_error?(node)
|
112
|
-
range = range_between(node.loc.keyword.end_pos, error.
|
112
|
+
range = range_between(node.loc.keyword.end_pos, error.source_range.end_pos)
|
113
113
|
|
114
114
|
corrector.remove(range)
|
115
115
|
end
|
@@ -3,9 +3,13 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Enforces consistency between
|
6
|
+
# Enforces consistency between `return nil` and `return`.
|
7
7
|
#
|
8
|
-
#
|
8
|
+
# This cop is disabled by default. Because there seems to be a perceived semantic difference
|
9
|
+
# between `return` and `return nil`. The former can be seen as just halting evaluation,
|
10
|
+
# while the latter might be used when the return value is of specific concern.
|
11
|
+
#
|
12
|
+
# Supported styles are `return` and `return_nil`.
|
9
13
|
#
|
10
14
|
# @example EnforcedStyle: return (default)
|
11
15
|
# # bad
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks if `return` or `return nil` is used in predicate method definitions.
|
7
|
+
#
|
8
|
+
# @safety
|
9
|
+
# Autocorrection is marked as unsafe because the change of the return value
|
10
|
+
# from `nil` to `false` could potentially lead to incompatibility issues.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# # bad
|
14
|
+
# def foo?
|
15
|
+
# return if condition
|
16
|
+
#
|
17
|
+
# do_something?
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# # bad
|
21
|
+
# def foo?
|
22
|
+
# return nil if condition
|
23
|
+
#
|
24
|
+
# do_something?
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# def foo?
|
29
|
+
# return false if condition
|
30
|
+
#
|
31
|
+
# do_something?
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# @example AllowedMethods: ['foo?']
|
35
|
+
# # good
|
36
|
+
# def foo?
|
37
|
+
# return if condition
|
38
|
+
#
|
39
|
+
# do_something?
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# @example AllowedPatterns: [/foo/]
|
43
|
+
# # good
|
44
|
+
# def foo?
|
45
|
+
# return if condition
|
46
|
+
#
|
47
|
+
# do_something?
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
class ReturnNilInPredicateMethodDefinition < Base
|
51
|
+
extend AutoCorrector
|
52
|
+
include AllowedMethods
|
53
|
+
include AllowedPattern
|
54
|
+
|
55
|
+
MSG = 'Return `false` instead of `nil` in predicate methods.'
|
56
|
+
|
57
|
+
# @!method return_nil?(node)
|
58
|
+
def_node_matcher :return_nil?, <<~PATTERN
|
59
|
+
{(return) (return (nil))}
|
60
|
+
PATTERN
|
61
|
+
|
62
|
+
def on_def(node)
|
63
|
+
return unless node.predicate_method?
|
64
|
+
return if allowed_method?(node.method_name) || matches_allowed_pattern?(node.method_name)
|
65
|
+
return unless (body = node.body)
|
66
|
+
|
67
|
+
body.each_descendant(:return) do |return_node|
|
68
|
+
register_offense(return_node, 'return false') if return_nil?(return_node)
|
69
|
+
end
|
70
|
+
|
71
|
+
return unless (nil_node = nil_node_at_the_end_of_method_body(body))
|
72
|
+
|
73
|
+
register_offense(nil_node, 'false')
|
74
|
+
end
|
75
|
+
alias on_defs on_def
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def nil_node_at_the_end_of_method_body(body)
|
80
|
+
return body if body.nil_type?
|
81
|
+
return unless body.begin_type?
|
82
|
+
return unless (last_child = body.children.last)
|
83
|
+
|
84
|
+
last_child if last_child.is_a?(AST::Node) && last_child.nil_type?
|
85
|
+
end
|
86
|
+
|
87
|
+
def register_offense(offense_node, replacement)
|
88
|
+
add_offense(offense_node) do |corrector|
|
89
|
+
corrector.replace(offense_node, replacement)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -297,11 +297,11 @@ module RuboCop
|
|
297
297
|
end
|
298
298
|
|
299
299
|
def begin_range(node, method_call)
|
300
|
-
range_between(node.
|
300
|
+
range_between(node.source_range.begin_pos, method_call.source_range.begin_pos)
|
301
301
|
end
|
302
302
|
|
303
303
|
def end_range(node, method_call)
|
304
|
-
range_between(method_call.
|
304
|
+
range_between(method_call.source_range.end_pos, node.source_range.end_pos)
|
305
305
|
end
|
306
306
|
|
307
307
|
def add_safe_nav_to_all_methods_in_chain(corrector,
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
|
36
36
|
# @!method sample_candidate?(node)
|
37
37
|
def_node_matcher :sample_candidate?, <<~PATTERN
|
38
|
-
(
|
38
|
+
(call $(call _ :shuffle $...) ${:#{RESTRICT_ON_SEND.join(' :')}} $...)
|
39
39
|
PATTERN
|
40
40
|
|
41
41
|
def on_send(node)
|
@@ -52,6 +52,7 @@ module RuboCop
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
55
|
+
alias on_csend on_send
|
55
56
|
|
56
57
|
private
|
57
58
|
|
@@ -109,9 +110,7 @@ module RuboCop
|
|
109
110
|
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
110
111
|
|
111
112
|
def source_range(shuffle_node, node)
|
112
|
-
|
113
|
-
shuffle_node.loc.selector.begin_pos,
|
114
|
-
node.source_range.end_pos)
|
113
|
+
shuffle_node.loc.selector.join(node.source_range.end)
|
115
114
|
end
|
116
115
|
|
117
116
|
def message(shuffle_arg, method, method_args, range)
|
@@ -55,8 +55,8 @@ module RuboCop
|
|
55
55
|
# @!method regexp_match?(node)
|
56
56
|
def_node_matcher :regexp_match?, <<~PATTERN
|
57
57
|
{
|
58
|
-
(block
|
59
|
-
(numblock
|
58
|
+
(block call (args (arg $_)) ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
59
|
+
(numblock call $1 ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
60
60
|
}
|
61
61
|
PATTERN
|
62
62
|
|
@@ -64,9 +64,9 @@ module RuboCop
|
|
64
64
|
# @!method creates_hash?(node)
|
65
65
|
def_node_matcher :creates_hash?, <<~PATTERN
|
66
66
|
{
|
67
|
-
(
|
68
|
-
(block (
|
69
|
-
(
|
67
|
+
(call (const _ :Hash) {:new :[]} ...)
|
68
|
+
(block (call (const _ :Hash) :new ...) ...)
|
69
|
+
(call _ { :to_h :to_hash } ...)
|
70
70
|
}
|
71
71
|
PATTERN
|
72
72
|
|
@@ -84,6 +84,7 @@ module RuboCop
|
|
84
84
|
}
|
85
85
|
PATTERN
|
86
86
|
|
87
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
87
88
|
def on_send(node)
|
88
89
|
return unless (block_node = node.block_node)
|
89
90
|
return if block_node.body&.begin_type?
|
@@ -91,11 +92,15 @@ module RuboCop
|
|
91
92
|
return unless (regexp_method_send_node = extract_send_node(block_node))
|
92
93
|
return if match_predicate_without_receiver?(regexp_method_send_node)
|
93
94
|
|
94
|
-
|
95
|
+
replacement = replacement(regexp_method_send_node, node)
|
96
|
+
return if target_ruby_version <= 2.2 && replacement == 'grep_v'
|
97
|
+
|
95
98
|
regexp = find_regexp(regexp_method_send_node, block_node)
|
96
99
|
|
97
|
-
register_offense(node, block_node, regexp,
|
100
|
+
register_offense(node, block_node, regexp, replacement)
|
98
101
|
end
|
102
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
103
|
+
alias on_csend on_send
|
99
104
|
|
100
105
|
private
|
101
106
|
|
@@ -105,9 +110,15 @@ module RuboCop
|
|
105
110
|
node.hash_type? || creates_hash?(node) || env_const?(node)
|
106
111
|
end
|
107
112
|
|
108
|
-
def
|
109
|
-
|
110
|
-
|
113
|
+
def replacement(regexp_method_send_node, node)
|
114
|
+
opposite = opposite?(regexp_method_send_node)
|
115
|
+
|
116
|
+
method_name = node.method_name
|
117
|
+
|
118
|
+
opposite ? OPPOSITE_REPLACEMENTS[method_name] : REPLACEMENTS[method_name]
|
119
|
+
end
|
120
|
+
|
121
|
+
def register_offense(node, block_node, regexp, replacement)
|
111
122
|
message = format(MSG, replacement: replacement, original_method: node.method_name)
|
112
123
|
|
113
124
|
add_offense(block_node, message: message) do |corrector|
|
@@ -136,7 +147,7 @@ module RuboCop
|
|
136
147
|
return node.child_nodes.first if node.match_with_lvasgn_type?
|
137
148
|
|
138
149
|
if node.receiver.lvar_type? &&
|
139
|
-
(block.numblock_type? || node.receiver.source == block.
|
150
|
+
(block.numblock_type? || node.receiver.source == block.first_argument.source)
|
140
151
|
node.first_argument
|
141
152
|
elsif node.first_argument.lvar_type?
|
142
153
|
node.receiver
|
@@ -16,7 +16,7 @@ module RuboCop
|
|
16
16
|
extend AutoCorrector
|
17
17
|
|
18
18
|
MSG = 'Use self-assignment shorthand `%<method>s=`.'
|
19
|
-
OPS = %i[+ - * ** / | &].freeze
|
19
|
+
OPS = %i[+ - * ** / % ^ << >> | &].freeze
|
20
20
|
|
21
21
|
def self.autocorrect_incompatible_with
|
22
22
|
[Layout::SpaceAroundOperators]
|
@@ -42,7 +42,7 @@ module RuboCop
|
|
42
42
|
|
43
43
|
if rhs.send_type?
|
44
44
|
check_send_node(node, rhs, var_name, var_type)
|
45
|
-
elsif
|
45
|
+
elsif rhs.operator_keyword?
|
46
46
|
check_boolean_node(node, rhs, var_name, var_type)
|
47
47
|
end
|
48
48
|
end
|
@@ -76,7 +76,7 @@ module RuboCop
|
|
76
76
|
|
77
77
|
if rhs.send_type?
|
78
78
|
autocorrect_send_node(corrector, node, rhs)
|
79
|
-
elsif
|
79
|
+
elsif rhs.operator_keyword?
|
80
80
|
autocorrect_boolean_node(corrector, node, rhs)
|
81
81
|
end
|
82
82
|
end
|
@@ -62,9 +62,6 @@ module RuboCop
|
|
62
62
|
private
|
63
63
|
|
64
64
|
def check_for_line_terminator_or_opener
|
65
|
-
# Make the obvious check first
|
66
|
-
return unless processed_source.raw_source.include?(';')
|
67
|
-
|
68
65
|
each_semicolon do |line, column, token_before_semicolon|
|
69
66
|
register_semicolon(line, column, false, token_before_semicolon)
|
70
67
|
end
|
@@ -72,8 +69,10 @@ module RuboCop
|
|
72
69
|
|
73
70
|
def each_semicolon
|
74
71
|
tokens_for_lines.each do |line, tokens|
|
75
|
-
|
76
|
-
|
72
|
+
semicolon_pos = semicolon_position(tokens)
|
73
|
+
after_expr_pos = semicolon_pos == -1 ? -2 : semicolon_pos
|
74
|
+
|
75
|
+
yield line, tokens[semicolon_pos].column, tokens[after_expr_pos] if semicolon_pos
|
77
76
|
end
|
78
77
|
end
|
79
78
|
|
@@ -81,6 +80,45 @@ module RuboCop
|
|
81
80
|
processed_source.tokens.group_by(&:line)
|
82
81
|
end
|
83
82
|
|
83
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
84
|
+
def semicolon_position(tokens)
|
85
|
+
if tokens.last.semicolon?
|
86
|
+
-1
|
87
|
+
elsif tokens.first.semicolon?
|
88
|
+
0
|
89
|
+
elsif exist_semicolon_before_right_curly_brace?(tokens)
|
90
|
+
-3
|
91
|
+
elsif exist_semicolon_after_left_curly_brace?(tokens) ||
|
92
|
+
exist_semicolon_after_left_string_interpolation_brace?(tokens)
|
93
|
+
2
|
94
|
+
elsif exist_semicolon_after_left_lambda_curly_brace?(tokens)
|
95
|
+
3
|
96
|
+
elsif exist_semicolon_before_right_string_interpolation_brace?(tokens)
|
97
|
+
-4
|
98
|
+
end
|
99
|
+
end
|
100
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
101
|
+
|
102
|
+
def exist_semicolon_before_right_curly_brace?(tokens)
|
103
|
+
tokens[-2]&.right_curly_brace? && tokens[-3]&.semicolon?
|
104
|
+
end
|
105
|
+
|
106
|
+
def exist_semicolon_after_left_curly_brace?(tokens)
|
107
|
+
tokens[1]&.left_curly_brace? && tokens[2]&.semicolon?
|
108
|
+
end
|
109
|
+
|
110
|
+
def exist_semicolon_after_left_lambda_curly_brace?(tokens)
|
111
|
+
tokens[2]&.type == :tLAMBEG && tokens[3]&.semicolon?
|
112
|
+
end
|
113
|
+
|
114
|
+
def exist_semicolon_before_right_string_interpolation_brace?(tokens)
|
115
|
+
tokens[-3]&.type == :tSTRING_DEND && tokens[-4]&.semicolon?
|
116
|
+
end
|
117
|
+
|
118
|
+
def exist_semicolon_after_left_string_interpolation_brace?(tokens)
|
119
|
+
tokens[1]&.type == :tSTRING_DBEG && tokens[2]&.semicolon?
|
120
|
+
end
|
121
|
+
|
84
122
|
def register_semicolon(line, column, after_expression, token_before_semicolon = nil)
|
85
123
|
range = source_range(processed_source.buffer, line, column)
|
86
124
|
|
@@ -7,12 +7,12 @@ module RuboCop
|
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
# # bad
|
10
|
-
# Foo.send(
|
11
|
-
# quuz.send(
|
10
|
+
# Foo.send(bar)
|
11
|
+
# quuz.send(fred)
|
12
12
|
#
|
13
13
|
# # good
|
14
|
-
# Foo.__send__(
|
15
|
-
# quuz.public_send(
|
14
|
+
# Foo.__send__(bar)
|
15
|
+
# quuz.public_send(fred)
|
16
16
|
class Send < Base
|
17
17
|
MSG = 'Prefer `Object#__send__` or `Object#public_send` to `send`.'
|
18
18
|
RESTRICT_ON_SEND = %i[send].freeze
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Detects the use of the `public_send` method with a literal method name argument.
|
7
|
+
# Since the `send` method can be used to call private methods, by default,
|
8
|
+
# only the `public_send` method is detected.
|
9
|
+
#
|
10
|
+
# @safety
|
11
|
+
# This cop is not safe because it can incorrectly detect based on the receiver.
|
12
|
+
# Additionally, when `AllowSend` is set to `true`, it cannot determine whether
|
13
|
+
# the `send` method being detected is calling a private method.
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
# # bad
|
17
|
+
# obj.public_send(:method_name)
|
18
|
+
# obj.public_send('method_name')
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# obj.method_name
|
22
|
+
#
|
23
|
+
# @example AllowSend: true (default)
|
24
|
+
# # good
|
25
|
+
# obj.send(:method_name)
|
26
|
+
# obj.send('method_name')
|
27
|
+
# obj.__send__(:method_name)
|
28
|
+
# obj.__send__('method_name')
|
29
|
+
#
|
30
|
+
# @example AllowSend: false
|
31
|
+
# # bad
|
32
|
+
# obj.send(:method_name)
|
33
|
+
# obj.send('method_name')
|
34
|
+
# obj.__send__(:method_name)
|
35
|
+
# obj.__send__('method_name')
|
36
|
+
#
|
37
|
+
# # good
|
38
|
+
# obj.method_name
|
39
|
+
#
|
40
|
+
class SendWithLiteralMethodName < Base
|
41
|
+
extend AutoCorrector
|
42
|
+
|
43
|
+
MSG = 'Use `%<method_name>s` method call directly instead.'
|
44
|
+
RESTRICT_ON_SEND = %i[public_send send __send__].freeze
|
45
|
+
STATIC_METHOD_NAME_NODE_TYPES = %i[sym str].freeze
|
46
|
+
METHOD_NAME_PATTERN = /\A[a-zA-Z_][a-zA-Z0-9_]*[!?=]?\z/.freeze
|
47
|
+
RESERVED_WORDS = %i[
|
48
|
+
BEGIN END alias and begin break case class def defined? do else elsif end ensure
|
49
|
+
false for if in module next nil not or redo rescue retry return self super then true
|
50
|
+
undef unless until when while yield
|
51
|
+
].freeze
|
52
|
+
|
53
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
54
|
+
def on_send(node)
|
55
|
+
return if allow_send? && !node.method?(:public_send)
|
56
|
+
return unless (first_argument = node.first_argument)
|
57
|
+
return unless STATIC_METHOD_NAME_NODE_TYPES.include?(first_argument.type)
|
58
|
+
|
59
|
+
offense_range = offense_range(node)
|
60
|
+
method_name = first_argument.value
|
61
|
+
return if !METHOD_NAME_PATTERN.match?(method_name) || RESERVED_WORDS.include?(method_name)
|
62
|
+
|
63
|
+
add_offense(offense_range, message: format(MSG, method_name: method_name)) do |corrector|
|
64
|
+
if node.arguments.one?
|
65
|
+
corrector.replace(offense_range, method_name)
|
66
|
+
else
|
67
|
+
corrector.replace(node.loc.selector, method_name)
|
68
|
+
corrector.remove(removal_argument_range(first_argument, node.arguments[1]))
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def allow_send?
|
77
|
+
!!cop_config['AllowSend']
|
78
|
+
end
|
79
|
+
|
80
|
+
def offense_range(node)
|
81
|
+
node.loc.selector.join(node.source_range.end)
|
82
|
+
end
|
83
|
+
|
84
|
+
def removal_argument_range(first_argument, second_argument)
|
85
|
+
first_argument.source_range.begin.join(second_argument.source_range.begin)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -3,8 +3,11 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Sometimes using dig method ends up with just a single
|
7
|
-
# argument. In such cases, dig should be replaced with []
|
6
|
+
# Sometimes using `dig` method ends up with just a single
|
7
|
+
# argument. In such cases, dig should be replaced with `[]`.
|
8
|
+
#
|
9
|
+
# Since replacing `hash&.dig(:key)` with `hash[:key]` could potentially lead to error,
|
10
|
+
# calls to the `dig` method using safe navigation will be ignored.
|
8
11
|
#
|
9
12
|
# @safety
|
10
13
|
# This cop is unsafe because it cannot be guaranteed that the receiver
|
@@ -33,6 +36,7 @@ module RuboCop
|
|
33
36
|
|
34
37
|
MSG = 'Use `%<receiver>s[%<argument>s]` instead of `%<original>s`.'
|
35
38
|
RESTRICT_ON_SEND = %i[dig].freeze
|
39
|
+
IGNORED_ARGUMENT_TYPES = %i[block_pass forwarded_restarg forwarded_args hash].freeze
|
36
40
|
|
37
41
|
# @!method single_argument_dig?(node)
|
38
42
|
def_node_matcher :single_argument_dig?, <<~PATTERN
|
@@ -44,7 +48,7 @@ module RuboCop
|
|
44
48
|
|
45
49
|
expression = single_argument_dig?(node)
|
46
50
|
return unless expression
|
47
|
-
return if expression.
|
51
|
+
return if IGNORED_ARGUMENT_TYPES.include?(expression.type)
|
48
52
|
|
49
53
|
receiver = node.receiver.source
|
50
54
|
argument = expression.source
|