rubocop 1.72.1 → 1.81.7
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/README.md +22 -18
- data/config/default.yml +240 -65
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli.rb +19 -4
- data/lib/rubocop/config.rb +35 -6
- data/lib/rubocop/config_loader.rb +8 -40
- data/lib/rubocop/config_loader_resolver.rb +9 -7
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +7 -6
- data/lib/rubocop/cop/autocorrect_logic.rb +22 -14
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +6 -1
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +36 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +32 -14
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +4 -7
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
- data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
- data/lib/rubocop/cop/layout/line_length.rb +43 -10
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/redundant_line_break.rb +9 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +11 -5
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +10 -0
- data/lib/rubocop/cop/layout/space_around_keyword.rb +6 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +12 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -38
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +12 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -5
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +13 -7
- data/lib/rubocop/cop/lint/debugger.rb +2 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +32 -10
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/literal_as_condition.rb +124 -10
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +1 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- 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_safe_navigation.rb +101 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +43 -13
- 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/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +4 -4
- data/lib/rubocop/cop/lint/self_assignment.rb +31 -5
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +12 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +30 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +2 -0
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +9 -12
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +1 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +3 -3
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +16 -2
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/method_length.rb +1 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -3
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/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 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_subset.rb +19 -4
- data/lib/rubocop/cop/mixin/line_length_help.rb +24 -8
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -0
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +18 -2
- data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +4 -4
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +32 -10
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- data/lib/rubocop/cop/style/arguments_forwarding.rb +21 -24
- data/lib/rubocop/cop/style/array_intersect.rb +113 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/bitwise_predicate.rb +8 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +3 -2
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +48 -10
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +1 -0
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +26 -8
- data/lib/rubocop/cop/style/constant_visibility.rb +14 -9
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/empty_literal.rb +4 -0
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +176 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +3 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +32 -6
- data/lib/rubocop/cop/style/float_division.rb +15 -1
- 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 +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/guard_clause.rb +2 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -8
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -2
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -1
- 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 +3 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
- data/lib/rubocop/cop/style/if_unless_modifier.rb +35 -8
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -6
- 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 +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +13 -7
- data/lib/rubocop/cop/style/lambda.rb +1 -0
- data/lib/rubocop/cop/style/lambda_call.rb +7 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +4 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +12 -3
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +9 -8
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +16 -0
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +17 -9
- data/lib/rubocop/cop/style/parallel_assignment.rb +32 -20
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -0
- data/lib/rubocop/cop/style/raise_args.rb +8 -8
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +35 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +57 -0
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +14 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
- data/lib/rubocop/cop/style/redundant_format.rb +79 -18
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +1 -4
- data/lib/rubocop/cop/style/redundant_parentheses.rb +73 -18
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -0
- data/lib/rubocop/cop/style/redundant_self.rb +9 -5
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +61 -14
- data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
- data/lib/rubocop/cop/style/semicolon.rb +23 -7
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +3 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +10 -7
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +75 -101
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +18 -15
- data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +1 -2
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +15 -2
- data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +3 -8
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +23 -7
- data/lib/rubocop/directive_comment.rb +1 -1
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +19 -5
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +25 -24
- data/lib/rubocop/lsp/routes.rb +65 -9
- data/lib/rubocop/lsp/runtime.rb +5 -5
- data/lib/rubocop/lsp/server.rb +2 -2
- data/lib/rubocop/lsp/stdin_runner.rb +3 -17
- data/lib/rubocop/magic_comment.rb +8 -0
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +2 -0
- data/lib/rubocop/plugin/load_error.rb +1 -1
- data/lib/rubocop/plugin.rb +9 -2
- data/lib/rubocop/result_cache.rb +14 -12
- data/lib/rubocop/rspec/cop_helper.rb +6 -1
- data/lib/rubocop/rspec/expect_offense.rb +9 -3
- data/lib/rubocop/rspec/shared_contexts.rb +34 -0
- data/lib/rubocop/rspec/support.rb +3 -0
- data/lib/rubocop/runner.rb +10 -4
- data/lib/rubocop/server/cache.rb +17 -12
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +13 -9
- data/lib/rubocop/target_ruby.rb +11 -2
- data/lib/rubocop/version.rb +14 -7
- data/lib/rubocop.rb +17 -2
- data/lib/ruby_lsp/rubocop/addon.rb +25 -10
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +57 -5
- metadata +24 -8
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# This module encapsulates the ability to forbid certain patterns in a cop.
|
|
6
|
+
module ForbiddenPattern
|
|
7
|
+
def forbidden_pattern?(name)
|
|
8
|
+
forbidden_patterns.any? { |pattern| Regexp.new(pattern).match?(name) }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def forbidden_patterns
|
|
12
|
+
cop_config.fetch('ForbiddenPatterns', [])
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -6,7 +6,6 @@ module RuboCop
|
|
|
6
6
|
module FrozenStringLiteral
|
|
7
7
|
module_function
|
|
8
8
|
|
|
9
|
-
FROZEN_STRING_LITERAL_REGEXP = /#\s*frozen[-_]?string[-_]?literal:/i.freeze
|
|
10
9
|
FROZEN_STRING_LITERAL_ENABLED = '# frozen_string_literal: true'
|
|
11
10
|
FROZEN_STRING_LITERAL_TYPES_RUBY27 = %i[str dstr].freeze
|
|
12
11
|
|
|
@@ -90,7 +89,7 @@ module RuboCop
|
|
|
90
89
|
|
|
91
90
|
if first_non_comment_token
|
|
92
91
|
# `line` is 1-indexed so we need to subtract 1 to get the array index
|
|
93
|
-
processed_source.lines[0...first_non_comment_token.line - 1]
|
|
92
|
+
processed_source.lines[0...(first_non_comment_token.line - 1)]
|
|
94
93
|
else
|
|
95
94
|
processed_source.lines
|
|
96
95
|
end
|
|
@@ -25,6 +25,28 @@ module RuboCop
|
|
|
25
25
|
(args
|
|
26
26
|
(arg $_)) ...)
|
|
27
27
|
PATTERN
|
|
28
|
+
|
|
29
|
+
# @!method assignment_method_declarations(node)
|
|
30
|
+
def_node_search :assignment_method_declarations, <<~PATTERN
|
|
31
|
+
(send
|
|
32
|
+
(lvar {#match_block_variable_name? :_1 :it}) _ ...)
|
|
33
|
+
PATTERN
|
|
34
|
+
|
|
35
|
+
# @!method indexed_assignment_method_declarations(node)
|
|
36
|
+
def_node_search :indexed_assignment_method_declarations, <<~PATTERN
|
|
37
|
+
(send
|
|
38
|
+
(send (lvar {#match_block_variable_name? :_1 :it}) _)
|
|
39
|
+
:[]=
|
|
40
|
+
literal?
|
|
41
|
+
_
|
|
42
|
+
)
|
|
43
|
+
PATTERN
|
|
44
|
+
|
|
45
|
+
def match_block_variable_name?(receiver_name)
|
|
46
|
+
gem_specification(processed_source.ast) do |block_variable_name|
|
|
47
|
+
return block_variable_name == receiver_name
|
|
48
|
+
end
|
|
49
|
+
end
|
|
28
50
|
end
|
|
29
51
|
end
|
|
30
52
|
end
|
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
|
10
10
|
true
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def deltas_for_first_pair(first_pair
|
|
13
|
+
def deltas_for_first_pair(first_pair)
|
|
14
14
|
{
|
|
15
15
|
separator: separator_delta(first_pair),
|
|
16
16
|
value: value_delta(first_pair)
|
|
@@ -81,13 +81,7 @@ module RuboCop
|
|
|
81
81
|
class TableAlignment
|
|
82
82
|
include ValueAlignment
|
|
83
83
|
|
|
84
|
-
def
|
|
85
|
-
self.max_key_width = 0
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def deltas_for_first_pair(first_pair, node)
|
|
89
|
-
self.max_key_width = node.keys.map { |key| key.source.length }.max
|
|
90
|
-
|
|
84
|
+
def deltas_for_first_pair(first_pair)
|
|
91
85
|
separator_delta = separator_delta(first_pair, first_pair, 0)
|
|
92
86
|
{
|
|
93
87
|
separator: separator_delta,
|
|
@@ -97,30 +91,37 @@ module RuboCop
|
|
|
97
91
|
|
|
98
92
|
private
|
|
99
93
|
|
|
100
|
-
attr_accessor :max_key_width
|
|
101
|
-
|
|
102
94
|
def key_delta(first_pair, current_pair)
|
|
103
95
|
first_pair.key_delta(current_pair)
|
|
104
96
|
end
|
|
105
97
|
|
|
106
98
|
def hash_rocket_delta(first_pair, current_pair)
|
|
107
|
-
first_pair.loc.column + max_key_width + 1 -
|
|
99
|
+
first_pair.loc.column + max_key_width(first_pair.parent) + 1 -
|
|
100
|
+
current_pair.loc.operator.column
|
|
108
101
|
end
|
|
109
102
|
|
|
110
103
|
def value_delta(first_pair, current_pair)
|
|
111
104
|
correct_value_column = first_pair.key.loc.column +
|
|
112
|
-
|
|
113
|
-
|
|
105
|
+
max_key_width(first_pair.parent) +
|
|
106
|
+
max_delimiter_width(first_pair.parent)
|
|
114
107
|
|
|
115
108
|
current_pair.value_omission? ? 0 : correct_value_column - current_pair.value.loc.column
|
|
116
109
|
end
|
|
110
|
+
|
|
111
|
+
def max_key_width(hash_node)
|
|
112
|
+
hash_node.keys.map { |key| key.source.length }.max
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def max_delimiter_width(hash_node)
|
|
116
|
+
hash_node.pairs.map { |pair| pair.delimiter(true).length }.max
|
|
117
|
+
end
|
|
117
118
|
end
|
|
118
119
|
|
|
119
120
|
# Handles calculation of deltas when the enforced style is 'separator'.
|
|
120
121
|
class SeparatorAlignment
|
|
121
122
|
include ValueAlignment
|
|
122
123
|
|
|
123
|
-
def deltas_for_first_pair(
|
|
124
|
+
def deltas_for_first_pair(_first_pair)
|
|
124
125
|
{}
|
|
125
126
|
end
|
|
126
127
|
|
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
|
23
23
|
(call _ _)
|
|
24
24
|
(args
|
|
25
25
|
$(arg _key)
|
|
26
|
-
(arg _))
|
|
26
|
+
$(arg _))
|
|
27
27
|
{
|
|
28
28
|
$(send
|
|
29
29
|
{(lvar _key) $_ _ | _ $_ (lvar _key)})
|
|
@@ -67,7 +67,7 @@ module RuboCop
|
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def extracts_hash_subset?(block)
|
|
70
|
-
block_with_first_arg_check?(block) do |key_arg, send_node, method|
|
|
70
|
+
block_with_first_arg_check?(block) do |key_arg, value_arg, send_node, method|
|
|
71
71
|
# Only consider methods that have one argument
|
|
72
72
|
return false unless send_node.arguments.one?
|
|
73
73
|
|
|
@@ -76,15 +76,22 @@ module RuboCop
|
|
|
76
76
|
|
|
77
77
|
case method
|
|
78
78
|
when :include?, :exclude?
|
|
79
|
-
send_node
|
|
79
|
+
slices_key?(send_node, :first_argument, key_arg, value_arg)
|
|
80
80
|
when :in?
|
|
81
|
-
send_node
|
|
81
|
+
slices_key?(send_node, :receiver, key_arg, value_arg)
|
|
82
82
|
else
|
|
83
83
|
true
|
|
84
84
|
end
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
+
def slices_key?(send_node, method, key_arg, value_arg)
|
|
89
|
+
return false if using_value_variable?(send_node, value_arg)
|
|
90
|
+
|
|
91
|
+
node = method == :receiver ? send_node.receiver : send_node.first_argument
|
|
92
|
+
node.source == key_arg.source
|
|
93
|
+
end
|
|
94
|
+
|
|
88
95
|
def range_include?(send_node)
|
|
89
96
|
# When checking `include?`, `exclude?` and `in?` for offenses, if the receiver
|
|
90
97
|
# or first argument is a range, an offense should not be registered.
|
|
@@ -97,6 +104,14 @@ module RuboCop
|
|
|
97
104
|
receiver.range_type?
|
|
98
105
|
end
|
|
99
106
|
|
|
107
|
+
def using_value_variable?(send_node, value_arg)
|
|
108
|
+
# If the receiver of `include?` or `exclude?`, or the first argument of `in?` is the
|
|
109
|
+
# hash value block argument, an offense should not be registered.
|
|
110
|
+
# ie. `v.include?(k)` or `k.in?(v)`
|
|
111
|
+
(send_node.receiver.lvar_type? && send_node.receiver.name == value_arg.name) ||
|
|
112
|
+
(send_node.first_argument.lvar_type? && send_node.first_argument.name == value_arg.name)
|
|
113
|
+
end
|
|
114
|
+
|
|
100
115
|
def supported_subset_method?(method)
|
|
101
116
|
if active_support_extensions_enabled?
|
|
102
117
|
ACTIVE_SUPPORT_SUBSET_METHODS.include?(method)
|
|
@@ -25,20 +25,24 @@ module RuboCop
|
|
|
25
25
|
config.for_cop('Layout/LineLength')['AllowURI']
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def
|
|
29
|
-
|
|
28
|
+
def allow_qualified_name?
|
|
29
|
+
config.for_cop('Layout/LineLength')['AllowQualifiedName']
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def allowed_position?(line, range)
|
|
33
|
+
range.begin < max_line_length && range.end == line_length(line)
|
|
30
34
|
end
|
|
31
35
|
|
|
32
36
|
def line_length(line)
|
|
33
37
|
line.length + indentation_difference(line)
|
|
34
38
|
end
|
|
35
39
|
|
|
36
|
-
def
|
|
37
|
-
|
|
38
|
-
return nil unless
|
|
40
|
+
def find_excessive_range(line, type)
|
|
41
|
+
last_match = (type == :uri ? match_uris(line) : match_qualified_names(line)).last
|
|
42
|
+
return nil unless last_match
|
|
39
43
|
|
|
40
|
-
begin_position, end_position =
|
|
41
|
-
end_position =
|
|
44
|
+
begin_position, end_position = last_match.offset(0)
|
|
45
|
+
end_position = extend_end_position(line, end_position)
|
|
42
46
|
|
|
43
47
|
line_indentation_difference = indentation_difference(line)
|
|
44
48
|
begin_position += line_indentation_difference
|
|
@@ -57,6 +61,14 @@ module RuboCop
|
|
|
57
61
|
matches
|
|
58
62
|
end
|
|
59
63
|
|
|
64
|
+
def match_qualified_names(string)
|
|
65
|
+
matches = []
|
|
66
|
+
string.scan(qualified_name_regexp) do
|
|
67
|
+
matches << $LAST_MATCH_INFO
|
|
68
|
+
end
|
|
69
|
+
matches
|
|
70
|
+
end
|
|
71
|
+
|
|
60
72
|
def indentation_difference(line)
|
|
61
73
|
return 0 unless tab_indentation_width
|
|
62
74
|
|
|
@@ -70,7 +82,7 @@ module RuboCop
|
|
|
70
82
|
index * (tab_indentation_width - 1)
|
|
71
83
|
end
|
|
72
84
|
|
|
73
|
-
def
|
|
85
|
+
def extend_end_position(line, end_position)
|
|
74
86
|
# Extend the end position YARD comments with linked URLs of the form {<uri> <title>}
|
|
75
87
|
if line&.match(/{(\s|\S)*}$/)
|
|
76
88
|
match = line[end_position..line_length(line)]&.match(/(\s|\S)*}/)
|
|
@@ -101,6 +113,10 @@ module RuboCop
|
|
|
101
113
|
end
|
|
102
114
|
end
|
|
103
115
|
|
|
116
|
+
def qualified_name_regexp
|
|
117
|
+
/\b(?:[A-Z][A-Za-z0-9_]*::)+[A-Za-z_][A-Za-z0-9_]*\b/
|
|
118
|
+
end
|
|
119
|
+
|
|
104
120
|
def valid_uri?(uri_ish_string)
|
|
105
121
|
URI.parse(uri_ish_string)
|
|
106
122
|
true
|
|
@@ -24,7 +24,7 @@ module RuboCop
|
|
|
24
24
|
gem_canonical_name(string_a) < gem_canonical_name(string_b)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
def consecutive_lines(previous, current)
|
|
27
|
+
def consecutive_lines?(previous, current)
|
|
28
28
|
first_line = get_source_range(current, treat_comments_as_separators).first_line
|
|
29
29
|
previous.source_range.last_line == first_line - 1
|
|
30
30
|
end
|
|
@@ -34,6 +34,18 @@ module RuboCop
|
|
|
34
34
|
range_between(node.loc.begin.end_pos, node.loc.end.begin_pos)
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
+
# A range containing the first to the last argument
|
|
38
|
+
# of a method call or method definition.
|
|
39
|
+
# def foo(a, b:)
|
|
40
|
+
# ^^^^^
|
|
41
|
+
# bar(1, 2, 3, &blk)
|
|
42
|
+
# ^^^^^^^^^^^^^
|
|
43
|
+
# baz { |x, y:, z:| }
|
|
44
|
+
# ^^^^^^^^^
|
|
45
|
+
def arguments_range(node)
|
|
46
|
+
node.first_argument.source_range.join(node.last_argument.source_range)
|
|
47
|
+
end
|
|
48
|
+
|
|
37
49
|
def range_between(start_pos, end_pos)
|
|
38
50
|
Parser::Source::Range.new(processed_source.buffer, start_pos, end_pos)
|
|
39
51
|
end
|
|
@@ -4,6 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
# Common methods shared by Style/TrailingCommaInArguments,
|
|
6
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
|
|
@@ -102,7 +107,7 @@ module RuboCop
|
|
|
102
107
|
# of the argument is not considered multiline, even if the argument
|
|
103
108
|
# itself might span multiple lines.
|
|
104
109
|
def allowed_multiline_argument?(node)
|
|
105
|
-
elements(node).one? && !Util.begins_its_line?(node
|
|
110
|
+
elements(node).one? && !Util.begins_its_line?(node_end_location(node))
|
|
106
111
|
end
|
|
107
112
|
|
|
108
113
|
def elements(node)
|
|
@@ -122,14 +127,24 @@ module RuboCop
|
|
|
122
127
|
|
|
123
128
|
def no_elements_on_same_line?(node)
|
|
124
129
|
items = elements(node).map(&:source_range)
|
|
125
|
-
items << node
|
|
130
|
+
items << node_end_location(node)
|
|
126
131
|
items.each_cons(2).none? { |a, b| on_same_line?(a, b) }
|
|
127
132
|
end
|
|
128
133
|
|
|
134
|
+
def node_end_location(node)
|
|
135
|
+
node.loc.end || node.source_range.end.adjust(begin_pos: -1)
|
|
136
|
+
end
|
|
137
|
+
|
|
129
138
|
def on_same_line?(range1, range2)
|
|
130
139
|
range1.last_line == range2.line
|
|
131
140
|
end
|
|
132
141
|
|
|
142
|
+
def last_item_precedes_newline?(node)
|
|
143
|
+
after_last_item = node.children.last.source_range.end.join(node.source_range.end)
|
|
144
|
+
|
|
145
|
+
after_last_item.source.start_with?(/,?\s*(#.*)?\n/)
|
|
146
|
+
end
|
|
147
|
+
|
|
133
148
|
def avoid_comma(kind, comma_begin_pos, extra_info)
|
|
134
149
|
range = range_between(comma_begin_pos, comma_begin_pos + 1)
|
|
135
150
|
article = kind.include?('array') ? 'an' : 'a'
|
|
@@ -205,5 +220,6 @@ module RuboCop
|
|
|
205
220
|
false
|
|
206
221
|
end
|
|
207
222
|
end
|
|
223
|
+
# rubocop:enable Metrics/ModuleLength
|
|
208
224
|
end
|
|
209
225
|
end
|
|
@@ -14,10 +14,10 @@ module RuboCop
|
|
|
14
14
|
# autocorrected.
|
|
15
15
|
#
|
|
16
16
|
# [NOTE]
|
|
17
|
-
#
|
|
17
|
+
# ====
|
|
18
18
|
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
|
19
19
|
# no offense will be registered until Ruby 3.4:
|
|
20
|
-
|
|
20
|
+
#
|
|
21
21
|
# [source,ruby]
|
|
22
22
|
# ----
|
|
23
23
|
# def foo(&block)
|
|
@@ -25,7 +25,7 @@ module RuboCop
|
|
|
25
25
|
# block_method { bar(&block) }
|
|
26
26
|
# end
|
|
27
27
|
# ----
|
|
28
|
-
#
|
|
28
|
+
# ====
|
|
29
29
|
#
|
|
30
30
|
# @example EnforcedStyle: anonymous (default)
|
|
31
31
|
#
|
|
@@ -152,7 +152,7 @@ module RuboCop
|
|
|
152
152
|
|
|
153
153
|
const_namespace, const_name = *const
|
|
154
154
|
next if name != const_name && !match_acronym?(name, const_name)
|
|
155
|
-
next unless namespace.empty? ||
|
|
155
|
+
next unless namespace.empty? || namespace_matches?(child, const_namespace, namespace)
|
|
156
156
|
|
|
157
157
|
return node
|
|
158
158
|
end
|
|
@@ -169,7 +169,7 @@ module RuboCop
|
|
|
169
169
|
s(:const, namespace, name) if name
|
|
170
170
|
end
|
|
171
171
|
|
|
172
|
-
def
|
|
172
|
+
def namespace_matches?(node, namespace, expected)
|
|
173
173
|
match_partial = partial_matcher!(expected)
|
|
174
174
|
|
|
175
175
|
match_partial.call(namespace)
|
|
@@ -242,7 +242,7 @@ module RuboCop
|
|
|
242
242
|
def find_definition(node)
|
|
243
243
|
# Methods can be defined in a `def` or `defs`,
|
|
244
244
|
# or dynamically via a `block` node.
|
|
245
|
-
node.each_ancestor(:
|
|
245
|
+
node.each_ancestor(:any_def, :block).each do |ancestor|
|
|
246
246
|
method_node, method_name = method_definition?(ancestor)
|
|
247
247
|
return [method_node, method_name] if method_node
|
|
248
248
|
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
|
|
@@ -22,18 +39,75 @@ module RuboCop
|
|
|
22
39
|
# # good
|
|
23
40
|
# def foo_bar; end
|
|
24
41
|
#
|
|
42
|
+
# # bad
|
|
43
|
+
# define_method :fooBar do
|
|
44
|
+
# end
|
|
45
|
+
#
|
|
46
|
+
# # good
|
|
47
|
+
# define_method :foo_bar do
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
50
|
+
# # bad
|
|
51
|
+
# Struct.new(:fooBar)
|
|
52
|
+
#
|
|
53
|
+
# # good
|
|
54
|
+
# Struct.new(:foo_bar)
|
|
55
|
+
#
|
|
56
|
+
# # bad
|
|
57
|
+
# alias_method :fooBar, :some_method
|
|
58
|
+
#
|
|
59
|
+
# # good
|
|
60
|
+
# alias_method :foo_bar, :some_method
|
|
61
|
+
#
|
|
25
62
|
# @example EnforcedStyle: camelCase
|
|
26
63
|
# # bad
|
|
27
64
|
# def foo_bar; end
|
|
28
65
|
#
|
|
29
66
|
# # good
|
|
30
67
|
# def fooBar; end
|
|
68
|
+
#
|
|
69
|
+
# # bad
|
|
70
|
+
# define_method :foo_bar do
|
|
71
|
+
# end
|
|
72
|
+
#
|
|
73
|
+
# # good
|
|
74
|
+
# define_method :fooBar do
|
|
75
|
+
# end
|
|
76
|
+
#
|
|
77
|
+
# # bad
|
|
78
|
+
# Struct.new(:foo_bar)
|
|
79
|
+
#
|
|
80
|
+
# # good
|
|
81
|
+
# Struct.new(:fooBar)
|
|
82
|
+
#
|
|
83
|
+
# # bad
|
|
84
|
+
# alias_method :foo_bar, :some_method
|
|
85
|
+
#
|
|
86
|
+
# # good
|
|
87
|
+
# alias_method :fooBar, :some_method
|
|
88
|
+
#
|
|
89
|
+
# @example ForbiddenIdentifiers: ['def', 'super']
|
|
90
|
+
# # bad
|
|
91
|
+
# def def; end
|
|
92
|
+
# def super; end
|
|
93
|
+
#
|
|
94
|
+
# @example ForbiddenPatterns: ['_v1\z', '_gen1\z']
|
|
95
|
+
# # bad
|
|
96
|
+
# def release_v1; end
|
|
97
|
+
# def api_gen1; end
|
|
98
|
+
#
|
|
31
99
|
class MethodName < Base
|
|
32
100
|
include ConfigurableNaming
|
|
33
101
|
include AllowedPattern
|
|
34
102
|
include RangeHelp
|
|
103
|
+
include ForbiddenIdentifiers
|
|
104
|
+
include ForbiddenPattern
|
|
35
105
|
|
|
36
106
|
MSG = 'Use %<style>s for method names.'
|
|
107
|
+
MSG_FORBIDDEN = '`%<identifier>s` is forbidden, use another method name instead.'
|
|
108
|
+
|
|
109
|
+
OPERATOR_METHODS = %i[| ^ & <=> == === =~ > >= < <= << >> + - * /
|
|
110
|
+
% ** ~ +@ -@ !@ ~@ [] []= ! != !~ `].to_set.freeze
|
|
37
111
|
|
|
38
112
|
# @!method sym_name(node)
|
|
39
113
|
def_node_matcher :sym_name, '(sym $_name)'
|
|
@@ -41,35 +115,133 @@ module RuboCop
|
|
|
41
115
|
# @!method str_name(node)
|
|
42
116
|
def_node_matcher :str_name, '(str $_name)'
|
|
43
117
|
|
|
118
|
+
# @!method new_struct?(node)
|
|
119
|
+
def_node_matcher :new_struct?, '(send (const {nil? cbase} :Struct) :new ...)'
|
|
120
|
+
|
|
121
|
+
# @!method define_data?(node)
|
|
122
|
+
def_node_matcher :define_data?, '(send (const {nil? cbase} :Data) :define ...)'
|
|
123
|
+
|
|
44
124
|
def on_send(node)
|
|
125
|
+
if node.method?(:define_method) || node.method?(:define_singleton_method)
|
|
126
|
+
handle_define_method(node)
|
|
127
|
+
elsif new_struct?(node)
|
|
128
|
+
handle_new_struct(node)
|
|
129
|
+
elsif define_data?(node)
|
|
130
|
+
handle_define_data(node)
|
|
131
|
+
elsif node.method?(:alias_method)
|
|
132
|
+
handle_alias_method(node)
|
|
133
|
+
else
|
|
134
|
+
handle_attr_accessor(node)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def on_def(node)
|
|
139
|
+
return if node.operator_method? || matches_allowed_pattern?(node.method_name)
|
|
140
|
+
|
|
141
|
+
if forbidden_name?(node.method_name.to_s)
|
|
142
|
+
register_forbidden_name(node)
|
|
143
|
+
else
|
|
144
|
+
check_name(node, node.method_name, node.loc.name)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
alias on_defs on_def
|
|
148
|
+
|
|
149
|
+
def on_alias(node)
|
|
150
|
+
return unless (new_identifier = node.new_identifier).sym_type?
|
|
151
|
+
|
|
152
|
+
handle_method_name(new_identifier, new_identifier.value)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
private
|
|
156
|
+
|
|
157
|
+
def handle_define_method(node)
|
|
158
|
+
return unless node.first_argument&.type?(:str, :sym)
|
|
159
|
+
|
|
160
|
+
handle_method_name(node, node.first_argument.value)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def handle_new_struct(node)
|
|
164
|
+
arguments = node.first_argument&.str_type? ? node.arguments[1..] : node.arguments
|
|
165
|
+
arguments.select { |argument| argument.type?(:sym, :str) }.each do |name|
|
|
166
|
+
handle_method_name(name, name.value)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def handle_define_data(node)
|
|
171
|
+
node.arguments.select { |argument| argument.type?(:sym, :str) }.each do |name|
|
|
172
|
+
handle_method_name(name, name.value)
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def handle_alias_method(node)
|
|
177
|
+
return unless node.arguments.size == 2
|
|
178
|
+
return unless node.first_argument.type?(:str, :sym)
|
|
179
|
+
|
|
180
|
+
handle_method_name(node.first_argument, node.first_argument.value)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def handle_attr_accessor(node)
|
|
45
184
|
return unless (attrs = node.attribute_accessor?)
|
|
46
185
|
|
|
47
186
|
attrs.last.each do |name_item|
|
|
48
187
|
name = attr_name(name_item)
|
|
49
188
|
next if !name || matches_allowed_pattern?(name)
|
|
50
189
|
|
|
51
|
-
|
|
190
|
+
if forbidden_name?(name.to_s)
|
|
191
|
+
register_forbidden_name(node)
|
|
192
|
+
else
|
|
193
|
+
check_name(node, name, range_position(node))
|
|
194
|
+
end
|
|
52
195
|
end
|
|
53
196
|
end
|
|
54
197
|
|
|
55
|
-
def
|
|
56
|
-
return if
|
|
198
|
+
def handle_method_name(node, name)
|
|
199
|
+
return if !name || matches_allowed_pattern?(name)
|
|
57
200
|
|
|
58
|
-
|
|
201
|
+
if forbidden_name?(name.to_s)
|
|
202
|
+
register_forbidden_name(node)
|
|
203
|
+
elsif !OPERATOR_METHODS.include?(name.to_sym)
|
|
204
|
+
check_name(node, name, range_position(node))
|
|
205
|
+
end
|
|
59
206
|
end
|
|
60
|
-
alias on_defs on_def
|
|
61
207
|
|
|
62
|
-
|
|
208
|
+
def forbidden_name?(name)
|
|
209
|
+
forbidden_identifier?(name) || forbidden_pattern?(name)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
213
|
+
def register_forbidden_name(node)
|
|
214
|
+
if node.any_def_type?
|
|
215
|
+
name_node = node.loc.name
|
|
216
|
+
method_name = node.method_name
|
|
217
|
+
elsif node.literal?
|
|
218
|
+
name_node = node
|
|
219
|
+
method_name = node.value
|
|
220
|
+
elsif (attrs = node.attribute_accessor?)
|
|
221
|
+
name_node = attrs.last.last
|
|
222
|
+
method_name = attr_name(name_node)
|
|
223
|
+
else
|
|
224
|
+
name_node = node.first_argument
|
|
225
|
+
method_name = node.first_argument.value
|
|
226
|
+
end
|
|
227
|
+
message = format(MSG_FORBIDDEN, identifier: method_name)
|
|
228
|
+
add_offense(name_node, message: message)
|
|
229
|
+
end
|
|
230
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
63
231
|
|
|
64
232
|
def attr_name(name_item)
|
|
65
233
|
sym_name(name_item) || str_name(name_item)
|
|
66
234
|
end
|
|
67
235
|
|
|
68
236
|
def range_position(node)
|
|
69
|
-
|
|
70
|
-
|
|
237
|
+
if node.loc.respond_to?(:selector)
|
|
238
|
+
selector_end_pos = node.loc.selector.end_pos + 1
|
|
239
|
+
expr_end_pos = node.source_range.end_pos
|
|
71
240
|
|
|
72
|
-
|
|
241
|
+
range_between(selector_end_pos, expr_end_pos)
|
|
242
|
+
else
|
|
243
|
+
node.source_range
|
|
244
|
+
end
|
|
73
245
|
end
|
|
74
246
|
|
|
75
247
|
def message(style)
|