rubocop 1.69.2 → 1.75.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 +4 -4
- data/config/default.yml +154 -23
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +3 -1
- data/lib/rubocop/cli/command/execute_runner.rb +3 -3
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- 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 +20 -9
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/base.rb +6 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -3
- 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/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 +229 -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/on_send_without_on_csend.rb +90 -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/undefined_config.rb +7 -1
- data/lib/rubocop/cop/internal_affairs.rb +6 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
- data/lib/rubocop/cop/layout/block_alignment.rb +4 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
- 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 +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +28 -1
- 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 +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- 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 +3 -8
- 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 +6 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
- 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 +9 -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 +1 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- 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_block_braces.rb +1 -0
- 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 +119 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -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/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -14
- 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_expression.rb +0 -2
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +103 -9
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
- 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_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +258 -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/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +4 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -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/unescaped_bracket_in_regexp.rb +1 -4
- 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 +2 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -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_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +12 -9
- 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/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- 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/code_length_calculator.rb +1 -1
- 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_line_breakable.rb +13 -13
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
- data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
- 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 +1 -1
- 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/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
- data/lib/rubocop/cop/mixin/range_help.rb +15 -3
- 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 +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- data/lib/rubocop/cop/naming/method_name.rb +64 -8
- data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
- data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +39 -28
- data/lib/rubocop/cop/style/block_delimiters.rb +9 -21
- data/lib/rubocop/cop/style/class_and_module_children.rb +35 -10
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +10 -3
- data/lib/rubocop/cop/style/comparable_between.rb +75 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
- 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 +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -0
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +2 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +24 -148
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +105 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
- data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
- 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 +100 -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/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +2 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -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 +22 -15
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
- 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/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
- data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/object_then.rb +14 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
- 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/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +14 -12
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +47 -2
- 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 +257 -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 +34 -13
- data/lib/rubocop/cop/style/redundant_parentheses.rb +30 -15
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -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_self.rb +1 -0
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- 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/rescue_modifier.rb +3 -0
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
- 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/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
- 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 +41 -106
- data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
- 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/super_arguments.rb +65 -17
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- 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/trivial_accessors.rb +1 -1
- 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/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +9 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cop/variable_force.rb +1 -1
- data/lib/rubocop/cops_documentation_generator.rb +25 -14
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/formatter_set.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/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 +39 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +10 -7
- data/lib/rubocop/server/cache.rb +35 -2
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +16 -1
- data/lib/rubocop/version.rb +30 -8
- data/lib/rubocop.rb +16 -1
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +59 -16
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -55,14 +55,19 @@ module RuboCop
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def if_body_source(if_body)
|
58
|
-
if if_body.call_type? &&
|
59
|
-
if_body.last_argument&.hash_type? && if_body.last_argument.pairs.last&.value_omission?
|
58
|
+
if if_body.call_type? && !if_body.method?(:[]=) && omitted_value_in_last_hash_arg?(if_body)
|
60
59
|
"#{method_source(if_body)}(#{if_body.arguments.map(&:source).join(', ')})"
|
61
60
|
else
|
62
61
|
if_body.source
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
65
|
+
def omitted_value_in_last_hash_arg?(if_body)
|
66
|
+
return false unless (last_argument = if_body.last_argument)
|
67
|
+
|
68
|
+
last_argument.hash_type? && last_argument.pairs.last&.value_omission?
|
69
|
+
end
|
70
|
+
|
66
71
|
def method_source(if_body)
|
67
72
|
end_range = if_body.implicit_call? ? if_body.loc.dot.end : if_body.loc.selector
|
68
73
|
|
@@ -96,7 +101,7 @@ module RuboCop
|
|
96
101
|
end
|
97
102
|
|
98
103
|
def max_line_length
|
99
|
-
return unless config.
|
104
|
+
return unless config.cop_enabled?('Layout/LineLength')
|
100
105
|
|
101
106
|
config.for_cop('Layout/LineLength')['Max']
|
102
107
|
end
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
def on_str(node)
|
11
11
|
# Constants like __FILE__ are handled as strings,
|
12
12
|
# but don't respond to begin.
|
13
|
-
return unless node.loc
|
13
|
+
return unless node.loc?(:begin)
|
14
14
|
return if part_of_ignored_node?(node)
|
15
15
|
|
16
16
|
if offense?(node)
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
# A :begin node inside a :dstr, :dsym, or :regexp node is an interpolation.
|
34
34
|
node.ancestors
|
35
35
|
.drop_while { |a| !a.begin_type? }
|
36
|
-
.any? { |a| a.
|
36
|
+
.any? { |a| a.type?(:dstr, :dsym, :regexp) }
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
|
-
# Common methods shared by Style/TrailingCommaInArguments
|
6
|
-
# Style/
|
5
|
+
# Common methods shared by Style/TrailingCommaInArguments,
|
6
|
+
# Style/TrailingCommaInArrayLiteral and Style/TrailingCommaInHashLiteral
|
7
|
+
# rubocop:disable Metrics/ModuleLength
|
7
8
|
module TrailingComma
|
8
9
|
include ConfigurableEnforcedStyle
|
9
10
|
include RangeHelp
|
@@ -57,6 +58,8 @@ module RuboCop
|
|
57
58
|
', unless each item is on its own line'
|
58
59
|
when :consistent_comma
|
59
60
|
', unless items are split onto multiple lines'
|
61
|
+
when :diff_comma
|
62
|
+
', unless that item immediately precedes a newline'
|
60
63
|
else
|
61
64
|
''
|
62
65
|
end
|
@@ -68,6 +71,8 @@ module RuboCop
|
|
68
71
|
multiline?(node) && no_elements_on_same_line?(node)
|
69
72
|
when :consistent_comma
|
70
73
|
multiline?(node) && !method_name_and_arguments_on_same_line?(node)
|
74
|
+
when :diff_comma
|
75
|
+
multiline?(node) && last_item_precedes_newline?(node)
|
71
76
|
else
|
72
77
|
false
|
73
78
|
end
|
@@ -130,6 +135,12 @@ module RuboCop
|
|
130
135
|
range1.last_line == range2.line
|
131
136
|
end
|
132
137
|
|
138
|
+
def last_item_precedes_newline?(node)
|
139
|
+
after_last_item =
|
140
|
+
range_between(node.children.last.source_range.end_pos, node.loc.end.begin_pos)
|
141
|
+
after_last_item.source =~ /\A,?\s*\n/
|
142
|
+
end
|
143
|
+
|
133
144
|
def avoid_comma(kind, comma_begin_pos, extra_info)
|
134
145
|
range = range_between(comma_begin_pos, comma_begin_pos + 1)
|
135
146
|
article = kind.include?('array') ? 'an' : 'a'
|
@@ -181,7 +192,7 @@ module RuboCop
|
|
181
192
|
# ...
|
182
193
|
# SOURCE
|
183
194
|
# })
|
184
|
-
return heredoc?(node.children.last) if node.
|
195
|
+
return heredoc?(node.children.last) if node.type?(:pair, :hash)
|
185
196
|
|
186
197
|
false
|
187
198
|
end
|
@@ -205,5 +216,6 @@ module RuboCop
|
|
205
216
|
false
|
206
217
|
end
|
207
218
|
end
|
219
|
+
# rubocop:enable Metrics/ModuleLength
|
208
220
|
end
|
209
221
|
end
|
@@ -13,6 +13,20 @@ module RuboCop
|
|
13
13
|
# The default variable name is `block`. If the name is already in use, it will not be
|
14
14
|
# autocorrected.
|
15
15
|
#
|
16
|
+
# [NOTE]
|
17
|
+
# ====
|
18
|
+
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
19
|
+
# no offense will be registered until Ruby 3.4:
|
20
|
+
#
|
21
|
+
# [source,ruby]
|
22
|
+
# ----
|
23
|
+
# def foo(&block)
|
24
|
+
# # Using an anonymous block would be a syntax error on Ruby 3.3.0
|
25
|
+
# block_method { bar(&block) }
|
26
|
+
# end
|
27
|
+
# ----
|
28
|
+
# ====
|
29
|
+
#
|
16
30
|
# @example EnforcedStyle: anonymous (default)
|
17
31
|
#
|
18
32
|
# # bad
|
@@ -90,21 +104,11 @@ module RuboCop
|
|
90
104
|
last_argument.source == block_pass_node.source
|
91
105
|
end
|
92
106
|
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
96
|
-
# def foo(&)
|
97
|
-
# block_method do
|
98
|
-
# bar(&)
|
99
|
-
# end
|
100
|
-
# end
|
101
|
-
#
|
102
|
-
# $ ruby -vc foo.rb
|
103
|
-
# ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin22]
|
104
|
-
# foo.rb: foo.rb:4: anonymous block parameter is also used within block (SyntaxError)
|
105
|
-
#
|
107
|
+
# Ruby 3.3.0 had a bug where accessing an anonymous block argument inside of a block
|
108
|
+
# was a syntax error in unambiguous cases: https://bugs.ruby-lang.org/issues/20090
|
109
|
+
# We disallow this also for earlier Ruby versions so that code is forwards compatible.
|
106
110
|
def invalidates_syntax?(block_pass_node)
|
107
|
-
block_pass_node.each_ancestor(:
|
111
|
+
target_ruby_version <= 3.3 && block_pass_node.each_ancestor(:any_block).any?
|
108
112
|
end
|
109
113
|
|
110
114
|
def use_kwarg_in_method_definition?(node)
|
@@ -138,7 +142,7 @@ module RuboCop
|
|
138
142
|
def use_block_argument_as_local_variable?(node, last_argument)
|
139
143
|
return false if node.body.nil?
|
140
144
|
|
141
|
-
node.body.
|
145
|
+
node.body.each_node(:lvar, :lvasgn).any? do |lvar|
|
142
146
|
!lvar.parent.block_pass_type? && lvar.node_parts[0].to_s == last_argument
|
143
147
|
end
|
144
148
|
end
|
@@ -6,14 +6,31 @@ module RuboCop
|
|
6
6
|
# Makes sure that all methods use the configured style,
|
7
7
|
# snake_case or camelCase, for their names.
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# Method names matching patterns are always allowed.
|
10
10
|
#
|
11
|
-
#
|
12
|
-
# AllowedPatterns:
|
13
|
-
# - '\AonSelectionBulkChange\z'
|
14
|
-
# - '\AonSelectionCleared\z'
|
11
|
+
# The cop can be configured with `AllowedPatterns` to allow certain regexp patterns:
|
15
12
|
#
|
16
|
-
#
|
13
|
+
# [source,yaml]
|
14
|
+
# ----
|
15
|
+
# Naming/MethodName:
|
16
|
+
# AllowedPatterns:
|
17
|
+
# - '\AonSelectionBulkChange\z'
|
18
|
+
# - '\AonSelectionCleared\z'
|
19
|
+
# ----
|
20
|
+
#
|
21
|
+
# As well, you can also forbid specific method names or regexp patterns
|
22
|
+
# using `ForbiddenIdentifiers` or `ForbiddenPatterns`:
|
23
|
+
#
|
24
|
+
# [source,yaml]
|
25
|
+
# ----
|
26
|
+
# Naming/MethodName:
|
27
|
+
# ForbiddenIdentifiers:
|
28
|
+
# - 'def'
|
29
|
+
# - 'super'
|
30
|
+
# ForbiddenPatterns:
|
31
|
+
# - '_v1\z'
|
32
|
+
# - '_gen1\z'
|
33
|
+
# ----
|
17
34
|
#
|
18
35
|
# @example EnforcedStyle: snake_case (default)
|
19
36
|
# # bad
|
@@ -28,12 +45,26 @@ module RuboCop
|
|
28
45
|
#
|
29
46
|
# # good
|
30
47
|
# def fooBar; end
|
48
|
+
#
|
49
|
+
# @example ForbiddenIdentifiers: ['def', 'super']
|
50
|
+
# # bad
|
51
|
+
# def def; end
|
52
|
+
# def super; end
|
53
|
+
#
|
54
|
+
# @example ForbiddenPatterns: ['_v1\z', '_gen1\z']
|
55
|
+
# # bad
|
56
|
+
# def release_v1; end
|
57
|
+
# def api_gen1; end
|
58
|
+
#
|
31
59
|
class MethodName < Base
|
32
60
|
include ConfigurableNaming
|
33
61
|
include AllowedPattern
|
34
62
|
include RangeHelp
|
63
|
+
include ForbiddenIdentifiers
|
64
|
+
include ForbiddenPattern
|
35
65
|
|
36
66
|
MSG = 'Use %<style>s for method names.'
|
67
|
+
MSG_FORBIDDEN = '`%<identifier>s` is forbidden, use another method name instead.'
|
37
68
|
|
38
69
|
# @!method sym_name(node)
|
39
70
|
def_node_matcher :sym_name, '(sym $_name)'
|
@@ -48,19 +79,44 @@ module RuboCop
|
|
48
79
|
name = attr_name(name_item)
|
49
80
|
next if !name || matches_allowed_pattern?(name)
|
50
81
|
|
51
|
-
|
82
|
+
if forbidden_name?(name.to_s)
|
83
|
+
register_forbidden_name(node)
|
84
|
+
else
|
85
|
+
check_name(node, name, range_position(node))
|
86
|
+
end
|
52
87
|
end
|
53
88
|
end
|
54
89
|
|
55
90
|
def on_def(node)
|
56
91
|
return if node.operator_method? || matches_allowed_pattern?(node.method_name)
|
57
92
|
|
58
|
-
|
93
|
+
if forbidden_name?(node.method_name.to_s)
|
94
|
+
register_forbidden_name(node)
|
95
|
+
else
|
96
|
+
check_name(node, node.method_name, node.loc.name)
|
97
|
+
end
|
59
98
|
end
|
60
99
|
alias on_defs on_def
|
61
100
|
|
62
101
|
private
|
63
102
|
|
103
|
+
def forbidden_name?(name)
|
104
|
+
forbidden_identifier?(name) || forbidden_pattern?(name)
|
105
|
+
end
|
106
|
+
|
107
|
+
def register_forbidden_name(node)
|
108
|
+
if node.type?(:def, :defs)
|
109
|
+
name_node = node.loc.name
|
110
|
+
method_name = node.method_name
|
111
|
+
else
|
112
|
+
attrs = node.attribute_accessor?
|
113
|
+
name_node = attrs.last.last
|
114
|
+
method_name = attr_name(name_node)
|
115
|
+
end
|
116
|
+
message = format(MSG_FORBIDDEN, identifier: method_name)
|
117
|
+
add_offense(name_node, message: message)
|
118
|
+
end
|
119
|
+
|
64
120
|
def attr_name(name_item)
|
65
121
|
sym_name(name_item) || str_name(name_item)
|
66
122
|
end
|
@@ -17,6 +17,10 @@ module RuboCop
|
|
17
17
|
# they end with a `?`. These methods should be changed to remove the
|
18
18
|
# prefix.
|
19
19
|
#
|
20
|
+
# When `UseSorbetSigs` set to true (optional), the cop will only report
|
21
|
+
# offenses if the method has a Sorbet `sig` with a return type of
|
22
|
+
# `T::Boolean`. Dynamic methods are not supported with this configuration.
|
23
|
+
#
|
20
24
|
# @example NamePrefix: ['is_', 'has_', 'have_'] (default)
|
21
25
|
# # bad
|
22
26
|
# def is_even(value)
|
@@ -58,6 +62,30 @@ module RuboCop
|
|
58
62
|
# def is_even?(value)
|
59
63
|
# end
|
60
64
|
#
|
65
|
+
# @example UseSorbetSigs: false (default)
|
66
|
+
# # bad
|
67
|
+
# sig { returns(String) }
|
68
|
+
# def is_this_thing_on
|
69
|
+
# "yes"
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# # good - Sorbet signature is not evaluated
|
73
|
+
# sig { returns(String) }
|
74
|
+
# def is_this_thing_on?
|
75
|
+
# "yes"
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
# @example UseSorbetSigs: true
|
79
|
+
# # bad
|
80
|
+
# sig { returns(T::Boolean) }
|
81
|
+
# def odd(value)
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# # good
|
85
|
+
# sig { returns(T::Boolean) }
|
86
|
+
# def odd?(value)
|
87
|
+
# end
|
88
|
+
#
|
61
89
|
# @example MethodDefinitionMacros: ['define_method', 'define_singleton_method'] (default)
|
62
90
|
# # bad
|
63
91
|
# define_method(:is_even) { |value| }
|
@@ -100,6 +128,7 @@ module RuboCop
|
|
100
128
|
method_name = node.method_name.to_s
|
101
129
|
|
102
130
|
next if allowed_method_name?(method_name, prefix)
|
131
|
+
next if use_sorbet_sigs? && !sorbet_sig?(node, return_type: 'T::Boolean')
|
103
132
|
|
104
133
|
add_offense(
|
105
134
|
node.loc.name,
|
@@ -121,6 +150,17 @@ module RuboCop
|
|
121
150
|
|
122
151
|
private
|
123
152
|
|
153
|
+
# @!method sorbet_return_type(node)
|
154
|
+
def_node_matcher :sorbet_return_type, <<~PATTERN
|
155
|
+
(block (send nil? :sig) args (send _ :returns $_type))
|
156
|
+
PATTERN
|
157
|
+
|
158
|
+
def sorbet_sig?(node, return_type: nil)
|
159
|
+
return false unless (type = sorbet_return_type(node.left_sibling))
|
160
|
+
|
161
|
+
type.source == return_type
|
162
|
+
end
|
163
|
+
|
124
164
|
def allowed_method_name?(method_name, prefix)
|
125
165
|
!(method_name.start_with?(prefix) && # cheap check to avoid allocating Regexp
|
126
166
|
method_name.match?(/^#{prefix}[^0-9]/)) ||
|
@@ -151,6 +191,10 @@ module RuboCop
|
|
151
191
|
cop_config['NamePrefix']
|
152
192
|
end
|
153
193
|
|
194
|
+
def use_sorbet_sigs?
|
195
|
+
cop_config['UseSorbetSigs']
|
196
|
+
end
|
197
|
+
|
154
198
|
def method_definition_macros(macro_name)
|
155
199
|
cop_config['MethodDefinitionMacros'].include?(macro_name.to_s)
|
156
200
|
end
|
@@ -113,7 +113,7 @@ module RuboCop
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
# rubocop:disable Metrics/
|
116
|
+
# rubocop:disable Metrics/MethodLength
|
117
117
|
def correct_node(corrector, node, offending_name, preferred_name)
|
118
118
|
return unless node
|
119
119
|
|
@@ -129,13 +129,13 @@ module RuboCop
|
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
|
-
if child_node.
|
132
|
+
if child_node.type?(:masgn, :lvasgn)
|
133
133
|
correct_reassignment(corrector, child_node, offending_name, preferred_name)
|
134
134
|
break
|
135
135
|
end
|
136
136
|
end
|
137
137
|
end
|
138
|
-
# rubocop:enable Metrics/
|
138
|
+
# rubocop:enable Metrics/MethodLength
|
139
139
|
|
140
140
|
# If the exception variable is reassigned, that assignment needs to be corrected.
|
141
141
|
# Further `lvar` nodes will not be corrected though since they now refer to a
|
@@ -3,8 +3,15 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Naming
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# Checks that the configured style (snake_case or camelCase) is used for all variable names.
|
7
|
+
# This includes local variables, instance variables, class variables, method arguments
|
8
|
+
# (positional, keyword, rest or block), and block arguments.
|
9
|
+
#
|
10
|
+
# The cop can also be configured to forbid using specific names for variables, using
|
11
|
+
# `ForbiddenIdentifiers` or `ForbiddenPatterns`. In addition to the above, this applies
|
12
|
+
# to global variables as well.
|
13
|
+
#
|
14
|
+
# Method definitions and method calls are not affected by this cop.
|
8
15
|
#
|
9
16
|
# @example EnforcedStyle: snake_case (default)
|
10
17
|
# # bad
|
@@ -26,24 +33,45 @@ module RuboCop
|
|
26
33
|
#
|
27
34
|
# @example AllowedPatterns: ['_v\d+\z']
|
28
35
|
# # good (with EnforcedStyle: camelCase)
|
29
|
-
#
|
36
|
+
# release_v1 = true
|
37
|
+
#
|
38
|
+
# @example ForbiddenIdentifiers: ['fooBar']
|
39
|
+
# # bad (in all cases)
|
40
|
+
# fooBar = 1
|
41
|
+
# @fooBar = 1
|
42
|
+
# @@fooBar = 1
|
43
|
+
# $fooBar = 1
|
44
|
+
#
|
45
|
+
# @example ForbiddenPatterns: ['_v\d+\z']
|
46
|
+
# # bad (in all cases)
|
47
|
+
# release_v1 = true
|
48
|
+
# @release_v1 = true
|
49
|
+
# @@release_v1 = true
|
50
|
+
# $release_v1 = true
|
30
51
|
#
|
31
52
|
class VariableName < Base
|
32
53
|
include AllowedIdentifiers
|
33
54
|
include ConfigurableNaming
|
34
55
|
include AllowedPattern
|
56
|
+
include ForbiddenIdentifiers
|
57
|
+
include ForbiddenPattern
|
35
58
|
|
36
59
|
MSG = 'Use %<style>s for variable names.'
|
60
|
+
MSG_FORBIDDEN = '`%<identifier>s` is forbidden, use another name instead.'
|
37
61
|
|
38
62
|
def valid_name?(node, name, given_style = style)
|
39
63
|
super || matches_allowed_pattern?(name)
|
40
64
|
end
|
41
65
|
|
42
66
|
def on_lvasgn(node)
|
43
|
-
return unless node.name
|
44
|
-
return if allowed_identifier?(
|
67
|
+
return unless (name = node.name)
|
68
|
+
return if allowed_identifier?(name)
|
45
69
|
|
46
|
-
|
70
|
+
if forbidden_name?(name)
|
71
|
+
register_forbidden_name(node)
|
72
|
+
else
|
73
|
+
check_name(node, name, node.loc.name)
|
74
|
+
end
|
47
75
|
end
|
48
76
|
alias on_ivasgn on_lvasgn
|
49
77
|
alias on_cvasgn on_lvasgn
|
@@ -56,11 +84,28 @@ module RuboCop
|
|
56
84
|
alias on_blockarg on_lvasgn
|
57
85
|
alias on_lvar on_lvasgn
|
58
86
|
|
87
|
+
# Only forbidden names are checked for global variable assignment
|
88
|
+
def on_gvasgn(node)
|
89
|
+
return unless (name = node.name)
|
90
|
+
return unless forbidden_name?(name)
|
91
|
+
|
92
|
+
register_forbidden_name(node)
|
93
|
+
end
|
94
|
+
|
59
95
|
private
|
60
96
|
|
97
|
+
def forbidden_name?(name)
|
98
|
+
forbidden_identifier?(name) || forbidden_pattern?(name)
|
99
|
+
end
|
100
|
+
|
61
101
|
def message(style)
|
62
102
|
format(MSG, style: style)
|
63
103
|
end
|
104
|
+
|
105
|
+
def register_forbidden_name(node)
|
106
|
+
message = format(MSG_FORBIDDEN, identifier: node.name)
|
107
|
+
add_offense(node.loc.name, message: message)
|
108
|
+
end
|
64
109
|
end
|
65
110
|
end
|
66
111
|
end
|
data/lib/rubocop/cop/registry.rb
CHANGED
@@ -23,8 +23,8 @@ module RuboCop
|
|
23
23
|
global.without_department(:Test).cops
|
24
24
|
end
|
25
25
|
|
26
|
-
def self.qualified_cop_name(name, origin)
|
27
|
-
global.qualified_cop_name(name, origin)
|
26
|
+
def self.qualified_cop_name(name, origin, warn: true)
|
27
|
+
global.qualified_cop_name(name, origin, warn: warn)
|
28
28
|
end
|
29
29
|
|
30
30
|
# Changes momentarily the global registry
|
@@ -139,7 +139,7 @@ module RuboCop
|
|
139
139
|
|
140
140
|
case potential_badges.size
|
141
141
|
when 0 then name # No namespace found. Deal with it later in caller.
|
142
|
-
when 1 then resolve_badge(badge, potential_badges.first, path)
|
142
|
+
when 1 then resolve_badge(badge, potential_badges.first, path, warn: warn)
|
143
143
|
else raise AmbiguousCopName.new(badge, path, potential_badges)
|
144
144
|
end
|
145
145
|
end
|
@@ -296,11 +296,14 @@ module RuboCop
|
|
296
296
|
self.class.new(cops)
|
297
297
|
end
|
298
298
|
|
299
|
-
def resolve_badge(given_badge, real_badge, source_path)
|
299
|
+
def resolve_badge(given_badge, real_badge, source_path, warn: true)
|
300
300
|
unless given_badge.match?(real_badge)
|
301
301
|
path = PathUtil.smart_path(source_path)
|
302
|
-
|
303
|
-
|
302
|
+
|
303
|
+
if warn
|
304
|
+
warn("#{path}: #{given_badge} has the wrong namespace - " \
|
305
|
+
"replace it with #{given_badge.with_department(real_badge.department)}")
|
306
|
+
end
|
304
307
|
end
|
305
308
|
|
306
309
|
real_badge.to_s
|
@@ -112,6 +112,26 @@ module RuboCop
|
|
112
112
|
# private attr :quux
|
113
113
|
#
|
114
114
|
# end
|
115
|
+
#
|
116
|
+
# @example AllowModifiersOnAliasMethod: true (default)
|
117
|
+
# # good
|
118
|
+
# class Foo
|
119
|
+
#
|
120
|
+
# public alias_method :bar, :foo
|
121
|
+
# protected alias_method :baz, :foo
|
122
|
+
# private alias_method :qux, :foo
|
123
|
+
#
|
124
|
+
# end
|
125
|
+
#
|
126
|
+
# @example AllowModifiersOnAliasMethod: false
|
127
|
+
# # bad
|
128
|
+
# class Foo
|
129
|
+
#
|
130
|
+
# public alias_method :bar, :foo
|
131
|
+
# protected alias_method :baz, :foo
|
132
|
+
# private alias_method :qux, :foo
|
133
|
+
#
|
134
|
+
# end
|
115
135
|
class AccessModifierDeclarations < Base
|
116
136
|
extend AutoCorrector
|
117
137
|
|
@@ -130,8 +150,6 @@ module RuboCop
|
|
130
150
|
|
131
151
|
RESTRICT_ON_SEND = %i[private protected public module_function].freeze
|
132
152
|
|
133
|
-
ALLOWED_NODE_TYPES = %i[pair block].freeze
|
134
|
-
|
135
153
|
# @!method access_modifier_with_symbol?(node)
|
136
154
|
def_node_matcher :access_modifier_with_symbol?, <<~PATTERN
|
137
155
|
(send nil? {:private :protected :public :module_function}
|
@@ -145,6 +163,12 @@ module RuboCop
|
|
145
163
|
(send nil? {:attr :attr_reader :attr_writer :attr_accessor} _+))
|
146
164
|
PATTERN
|
147
165
|
|
166
|
+
# @!method access_modifier_with_alias_method?, <<~PATTERN
|
167
|
+
def_node_matcher :access_modifier_with_alias_method?, <<~PATTERN
|
168
|
+
(send nil? {:private :protected :public :module_function}
|
169
|
+
(send nil? :alias_method _ _))
|
170
|
+
PATTERN
|
171
|
+
|
148
172
|
def on_send(node)
|
149
173
|
return if allowed?(node)
|
150
174
|
|
@@ -162,9 +186,10 @@ module RuboCop
|
|
162
186
|
|
163
187
|
def allowed?(node)
|
164
188
|
!node.access_modifier? ||
|
165
|
-
|
189
|
+
node.parent&.type?(:pair, :any_block) ||
|
166
190
|
allow_modifiers_on_symbols?(node) ||
|
167
|
-
allow_modifiers_on_attrs?(node)
|
191
|
+
allow_modifiers_on_attrs?(node) ||
|
192
|
+
allow_modifiers_on_alias_method?(node)
|
168
193
|
end
|
169
194
|
|
170
195
|
def autocorrect(corrector, node)
|
@@ -194,6 +219,10 @@ module RuboCop
|
|
194
219
|
cop_config['AllowModifiersOnAttrs'] && access_modifier_with_attr?(node)
|
195
220
|
end
|
196
221
|
|
222
|
+
def allow_modifiers_on_alias_method?(node)
|
223
|
+
cop_config['AllowModifiersOnAliasMethod'] && access_modifier_with_alias_method?(node)
|
224
|
+
end
|
225
|
+
|
197
226
|
def offense?(node)
|
198
227
|
(group_style? && access_modifier_is_inlined?(node) &&
|
199
228
|
!node.parent&.if_type? && !right_siblings_same_inline_method?(node)) ||
|
@@ -281,7 +310,7 @@ module RuboCop
|
|
281
310
|
argument_less_modifier_node = find_argument_less_modifier_node(node)
|
282
311
|
if argument_less_modifier_node
|
283
312
|
corrector.insert_after(argument_less_modifier_node, "\n\n#{source}")
|
284
|
-
elsif (ancestor = node.each_ancestor(:
|
313
|
+
elsif (ancestor = node.each_ancestor(:class, :module).first)
|
285
314
|
|
286
315
|
corrector.insert_before(ancestor.loc.end, "#{node.method_name}\n\n#{source}\n")
|
287
316
|
else
|
@@ -139,12 +139,16 @@ module RuboCop
|
|
139
139
|
style == :separated
|
140
140
|
end
|
141
141
|
|
142
|
+
def groupable_sibling_accessor?(node, sibling)
|
143
|
+
sibling.attribute_accessor? &&
|
144
|
+
sibling.method?(node.method_name) &&
|
145
|
+
node_visibility(sibling) == node_visibility(node) &&
|
146
|
+
groupable_accessor?(sibling) && !previous_line_comment?(sibling)
|
147
|
+
end
|
148
|
+
|
142
149
|
def groupable_sibling_accessors(send_node)
|
143
150
|
send_node.parent.each_child_node(:send).select do |sibling|
|
144
|
-
|
145
|
-
sibling.method?(send_node.method_name) &&
|
146
|
-
node_visibility(sibling) == node_visibility(send_node) &&
|
147
|
-
groupable_accessor?(sibling) && !previous_line_comment?(sibling)
|
151
|
+
groupable_sibling_accessor?(send_node, sibling)
|
148
152
|
end
|
149
153
|
end
|
150
154
|
|
@@ -155,13 +159,23 @@ module RuboCop
|
|
155
159
|
|
156
160
|
def preferred_accessors(node)
|
157
161
|
if grouped_style?
|
162
|
+
return if skip_for_grouping?(node)
|
163
|
+
|
158
164
|
accessors = groupable_sibling_accessors(node)
|
159
|
-
|
165
|
+
if node.loc == accessors.first.loc || skip_for_grouping?(accessors.first)
|
166
|
+
group_accessors(node, accessors)
|
167
|
+
end
|
160
168
|
else
|
161
169
|
separate_accessors(node)
|
162
170
|
end
|
163
171
|
end
|
164
172
|
|
173
|
+
# Group after constants
|
174
|
+
def skip_for_grouping?(node)
|
175
|
+
node.right_siblings.any?(&:casgn_type?) &&
|
176
|
+
node.right_siblings.any? { |n| n.send_type? && groupable_sibling_accessor?(node, n) }
|
177
|
+
end
|
178
|
+
|
165
179
|
def group_accessors(node, accessors)
|
166
180
|
accessor_names = accessors.flat_map { |accessor| accessor.arguments.map(&:source) }.uniq
|
167
181
|
|