rubocop 1.71.1 → 1.88.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +513 -149
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +38 -4
- data/exe/rubocop +1 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +48 -11
- data/lib/rubocop/comment_config.rb +60 -18
- data/lib/rubocop/config.rb +53 -16
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +65 -49
- data/lib/rubocop/config_loader_resolver.rb +44 -19
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -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 +7 -2
- data/lib/rubocop/config_validator.rb +7 -6
- data/lib/rubocop/cop/autocorrect_logic.rb +27 -14
- data/lib/rubocop/cop/base.rb +38 -12
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +26 -7
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +36 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +2 -3
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -3
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +13 -13
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -1
- 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/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_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +3 -16
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +60 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +56 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +9 -2
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +28 -9
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
- 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_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +10 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +35 -2
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +20 -15
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/hash_alignment.rb +5 -8
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +152 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +62 -15
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +236 -41
- 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/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +12 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +15 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +10 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +18 -3
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- 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_assignment.rb +1 -11
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- 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/assignment_in_condition.rb +13 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +93 -11
- data/lib/rubocop/cop/lint/constant_resolution.rb +6 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +219 -32
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +20 -65
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -5
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +129 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +9 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +19 -10
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +19 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -13
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -12
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -23
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -11
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +268 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +4 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +22 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +123 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +36 -3
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +36 -10
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +17 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- 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 +55 -25
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +11 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +147 -0
- data/lib/rubocop/cop/lint/void.rb +50 -21
- 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 +2 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +3 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +38 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/migration/department_name.rb +12 -1
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -4
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +5 -7
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- 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 +20 -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_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +27 -4
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/line_length_help.rb +45 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- 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/project_index_help.rb +48 -0
- data/lib/rubocop/cop/mixin/range_help.rb +15 -3
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -7
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +25 -6
- data/lib/rubocop/cop/mixin.rb +86 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +6 -5
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -2
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -4
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/offense.rb +17 -1
- data/lib/rubocop/cop/registry.rb +66 -39
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +45 -12
- data/lib/rubocop/cop/style/accessor_grouping.rb +46 -8
- data/lib/rubocop/cop/style/alias.rb +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +46 -31
- data/lib/rubocop/cop/style/array_first_last.rb +12 -1
- data/lib/rubocop/cop/style/array_intersect.rb +117 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +5 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +8 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +42 -34
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +67 -12
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- 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/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +6 -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/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +33 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +20 -12
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/data_inheritance.rb +11 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -1
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +6 -6
- data/lib/rubocop/cop/style/documentation_method.rb +12 -8
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +12 -2
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +11 -2
- data/lib/rubocop/cop/style/empty_method.rb +0 -6
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +181 -18
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +8 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
- data/lib/rubocop/cop/style/file_null.rb +4 -2
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +15 -1
- data/lib/rubocop/cop/style/for.rb +4 -0
- data/lib/rubocop/cop/style/format_string.rb +17 -4
- data/lib/rubocop/cop/style/format_string_token.rb +85 -14
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +29 -23
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +28 -12
- 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_lookup_method.rb +102 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -1
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +18 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +26 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +83 -16
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +16 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -6
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -6
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- 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_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +8 -1
- data/lib/rubocop/cop/style/lambda_call.rb +26 -10
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +3 -3
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +5 -2
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- 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/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +33 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +11 -5
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -5
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -7
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- 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_if_then.rb +4 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +13 -16
- data/lib/rubocop/cop/style/mutable_constant.rb +106 -12
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +21 -12
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +11 -2
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +57 -25
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +4 -0
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +4 -2
- data/lib/rubocop/cop/style/raise_args.rb +9 -9
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +38 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +61 -1
- data/lib/rubocop/cop/style/redundant_constant_base.rb +5 -5
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_each.rb +3 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +7 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -10
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +312 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +28 -7
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +111 -37
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +9 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -0
- data/lib/rubocop/cop/style/redundant_return.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +6 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +67 -20
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +53 -20
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +45 -12
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +21 -6
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -8
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +77 -101
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
- 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/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +24 -2
- data/lib/rubocop/cop/style/super_arguments.rb +3 -4
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +10 -7
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +11 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
- 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 +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +18 -19
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/team.rb +105 -40
- data/lib/rubocop/cop/util.rb +4 -5
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +10 -3
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +23 -7
- data/lib/rubocop/directive_comment.rb +80 -3
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +38 -13
- data/lib/rubocop/formatter/formatter_set.rb +2 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/junit_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/formatter/simple_text_formatter.rb +0 -2
- data/lib/rubocop/formatter/tap_formatter.rb +5 -2
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lsp/diagnostic.rb +22 -37
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +47 -11
- data/lib/rubocop/lsp/runtime.rb +19 -8
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +11 -18
- data/lib/rubocop/magic_comment.rb +28 -0
- data/lib/rubocop/mcp/server.rb +200 -0
- data/lib/rubocop/options.rb +60 -14
- data/lib/rubocop/path_util.rb +18 -2
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/project_index_loader.rb +66 -0
- data/lib/rubocop/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +10 -8
- data/lib/rubocop/result_cache.rb +72 -47
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +9 -3
- data/lib/rubocop/rspec/shared_contexts.rb +71 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +188 -65
- data/lib/rubocop/server/cache.rb +56 -41
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/target_finder.rb +21 -10
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/version.rb +50 -10
- data/lib/rubocop.rb +47 -96
- data/lib/ruby_lsp/rubocop/addon.rb +29 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +86 -16
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for uses of Module#attr
|
|
6
|
+
# Checks for uses of `Module#attr`. The `attr` method has confusing
|
|
7
|
+
# behavior: with a single argument it creates a reader (like `attr_reader`),
|
|
8
|
+
# but with a second boolean argument it creates an accessor (deprecated in
|
|
9
|
+
# Ruby 1.9). Use `attr_reader` or `attr_accessor` to make intent explicit.
|
|
7
10
|
#
|
|
8
11
|
# @example
|
|
9
|
-
# # bad
|
|
12
|
+
# # bad
|
|
10
13
|
# attr :something, true
|
|
11
14
|
# attr :one, :two, :three # behaves as attr_reader
|
|
12
15
|
#
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks if usage of
|
|
6
|
+
# Checks if usage of `%()` or `%Q()` matches configuration.
|
|
7
|
+
# Consistent use of one style makes the codebase easier
|
|
8
|
+
# to read.
|
|
7
9
|
#
|
|
8
10
|
# @example EnforcedStyle: bare_percent (default)
|
|
9
11
|
# # bad
|
|
@@ -41,8 +43,7 @@ module RuboCop
|
|
|
41
43
|
|
|
42
44
|
def check(node)
|
|
43
45
|
return if node.heredoc?
|
|
44
|
-
return unless node.loc
|
|
45
|
-
return unless node.loc.begin
|
|
46
|
+
return unless node.loc?(:begin)
|
|
46
47
|
|
|
47
48
|
source = node.loc.begin.source
|
|
48
49
|
if requires_percent_q?(source)
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for BEGIN blocks.
|
|
6
|
+
# Checks for `BEGIN` blocks. They are Perl-style constructs that execute
|
|
7
|
+
# code before the rest of the file is parsed, making the control flow
|
|
8
|
+
# harder to follow and reason about.
|
|
7
9
|
#
|
|
8
10
|
# @example
|
|
9
11
|
# # bad
|
|
@@ -70,18 +70,25 @@ module RuboCop
|
|
|
70
70
|
(send _ :& _))
|
|
71
71
|
PATTERN
|
|
72
72
|
|
|
73
|
+
# rubocop:disable Metrics/AbcSize
|
|
73
74
|
def on_send(node)
|
|
74
75
|
return unless node.receiver&.begin_type?
|
|
75
76
|
return unless (preferred_method = preferred_method(node))
|
|
76
77
|
|
|
77
78
|
bit_operation = node.receiver.children.first
|
|
78
79
|
lhs, _operator, rhs = *bit_operation
|
|
79
|
-
|
|
80
|
+
|
|
81
|
+
preferred = if preferred_method == 'allbits?' && lhs.source == node.first_argument.source
|
|
82
|
+
"#{rhs.source}.allbits?(#{lhs.source})"
|
|
83
|
+
else
|
|
84
|
+
"#{lhs.source}.#{preferred_method}(#{rhs.source})"
|
|
85
|
+
end
|
|
80
86
|
|
|
81
87
|
add_offense(node, message: format(MSG, preferred: preferred)) do |corrector|
|
|
82
88
|
corrector.replace(node, preferred)
|
|
83
89
|
end
|
|
84
90
|
end
|
|
91
|
+
# rubocop:enable Metrics/AbcSize
|
|
85
92
|
|
|
86
93
|
private
|
|
87
94
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
module RuboCop
|
|
5
5
|
module Cop
|
|
6
6
|
module Style
|
|
7
|
-
#
|
|
7
|
+
# Checks for uses of braces or do/end around single line or
|
|
8
8
|
# multi-line blocks.
|
|
9
9
|
#
|
|
10
10
|
# Methods that can be either procedural or functional and cannot be
|
|
@@ -198,16 +198,18 @@ module RuboCop
|
|
|
198
198
|
alias on_csend on_send
|
|
199
199
|
|
|
200
200
|
def on_block(node)
|
|
201
|
-
return if
|
|
201
|
+
return if part_of_ignored_node?(node)
|
|
202
202
|
return if proper_block_style?(node)
|
|
203
203
|
|
|
204
204
|
message = message(node)
|
|
205
205
|
add_offense(node.loc.begin, message: message) do |corrector|
|
|
206
206
|
autocorrect(corrector, node)
|
|
207
|
+
ignore_node(node)
|
|
207
208
|
end
|
|
208
209
|
end
|
|
209
210
|
|
|
210
211
|
alias on_numblock on_block
|
|
212
|
+
alias on_itblock on_block
|
|
211
213
|
|
|
212
214
|
private
|
|
213
215
|
|
|
@@ -230,9 +232,7 @@ module RuboCop
|
|
|
230
232
|
end
|
|
231
233
|
|
|
232
234
|
def semantic_message(node)
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if block_begin == '{'
|
|
235
|
+
if node.braces?
|
|
236
236
|
'Prefer `do...end` over `{...}` for procedural blocks.'
|
|
237
237
|
else
|
|
238
238
|
'Prefer `{...}` over `do...end` for functional blocks.'
|
|
@@ -347,7 +347,7 @@ module RuboCop
|
|
|
347
347
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
348
348
|
def get_blocks(node, &block)
|
|
349
349
|
case node.type
|
|
350
|
-
when :block, :numblock
|
|
350
|
+
when :block, :numblock, :itblock
|
|
351
351
|
yield node
|
|
352
352
|
when :send, :csend
|
|
353
353
|
# When a method has an argument which is another method with a block,
|
|
@@ -370,36 +370,42 @@ module RuboCop
|
|
|
370
370
|
end
|
|
371
371
|
# rubocop:enable Metrics/CyclomaticComplexity
|
|
372
372
|
|
|
373
|
+
# rubocop:disable Metrics/CyclomaticComplexity -- inlined special_method checks to avoid double evaluation
|
|
373
374
|
def proper_block_style?(node)
|
|
374
375
|
return true if require_do_end?(node)
|
|
375
|
-
|
|
376
|
+
|
|
377
|
+
method_name = node.method_name
|
|
378
|
+
return true if allowed_method?(method_name) || matches_allowed_pattern?(method_name)
|
|
379
|
+
return node.braces? if braces_required_method?(method_name)
|
|
376
380
|
|
|
377
381
|
case style
|
|
378
382
|
when :line_count_based then line_count_based_block_style?(node)
|
|
379
383
|
when :semantic then semantic_block_style?(node)
|
|
380
384
|
when :braces_for_chaining then braces_for_chaining_style?(node)
|
|
381
|
-
when :always_braces then
|
|
385
|
+
when :always_braces then node.braces?
|
|
382
386
|
end
|
|
383
387
|
end
|
|
388
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
384
389
|
|
|
385
390
|
def require_do_end?(node)
|
|
386
391
|
return false if node.braces? || node.multiline?
|
|
387
|
-
return false unless (resbody = node.each_descendant(:resbody).first)
|
|
388
392
|
|
|
389
|
-
|
|
390
|
-
|
|
393
|
+
body = node.body
|
|
394
|
+
return false unless body
|
|
395
|
+
# `ensure` and a block-level `rescue` are illegal inside `{ }`; only a
|
|
396
|
+
# bare modifier rescue (`expr rescue expr`) can be written with braces.
|
|
397
|
+
return true if body.ensure_type?
|
|
398
|
+
return false unless body.rescue_type?
|
|
391
399
|
|
|
392
|
-
|
|
393
|
-
allowed_method?(method_name) ||
|
|
394
|
-
matches_allowed_pattern?(method_name) ||
|
|
395
|
-
braces_required_method?(method_name)
|
|
400
|
+
!modifier_rescue?(body)
|
|
396
401
|
end
|
|
397
402
|
|
|
398
|
-
def
|
|
399
|
-
|
|
400
|
-
return
|
|
403
|
+
def modifier_rescue?(rescue_node)
|
|
404
|
+
return false if rescue_node.body.nil? || rescue_node.else_branch
|
|
405
|
+
return false unless rescue_node.resbody_branches.one?
|
|
401
406
|
|
|
402
|
-
|
|
407
|
+
resbody = rescue_node.resbody_branches.first
|
|
408
|
+
resbody.exceptions.empty? && resbody.exception_variable.nil?
|
|
403
409
|
end
|
|
404
410
|
|
|
405
411
|
def braces_required_method?(method_name)
|
|
@@ -419,24 +425,18 @@ module RuboCop
|
|
|
419
425
|
|
|
420
426
|
if node.braces?
|
|
421
427
|
functional_method?(method_name) || functional_block?(node) ||
|
|
422
|
-
(procedural_oneliners_may_have_braces? &&
|
|
428
|
+
(procedural_oneliners_may_have_braces? && node.single_line?)
|
|
423
429
|
else
|
|
424
430
|
procedural_method?(method_name) || !return_value_used?(node)
|
|
425
431
|
end
|
|
426
432
|
end
|
|
427
433
|
|
|
428
434
|
def braces_for_chaining_style?(node)
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
'{'
|
|
435
|
-
end
|
|
436
|
-
end
|
|
437
|
-
|
|
438
|
-
def braces_style?(node)
|
|
439
|
-
node.loc.begin.source == '{'
|
|
435
|
+
if node.multiline?
|
|
436
|
+
node.chained? ? node.braces? : !node.braces?
|
|
437
|
+
else
|
|
438
|
+
node.braces?
|
|
439
|
+
end
|
|
440
440
|
end
|
|
441
441
|
|
|
442
442
|
def correction_would_break_code?(node)
|
|
@@ -446,7 +446,11 @@ module RuboCop
|
|
|
446
446
|
end
|
|
447
447
|
|
|
448
448
|
def functional_method?(method_name)
|
|
449
|
-
|
|
449
|
+
functional_methods.include?(method_name)
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
def functional_methods
|
|
453
|
+
@functional_methods ||= cop_config['FunctionalMethods'].to_set(&:to_sym).freeze
|
|
450
454
|
end
|
|
451
455
|
|
|
452
456
|
def functional_block?(node)
|
|
@@ -458,7 +462,11 @@ module RuboCop
|
|
|
458
462
|
end
|
|
459
463
|
|
|
460
464
|
def procedural_method?(method_name)
|
|
461
|
-
|
|
465
|
+
procedural_methods.include?(method_name)
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
def procedural_methods
|
|
469
|
+
@procedural_methods ||= cop_config['ProceduralMethods'].to_set(&:to_sym).freeze
|
|
462
470
|
end
|
|
463
471
|
|
|
464
472
|
def return_value_used?(node)
|
|
@@ -487,7 +495,7 @@ module RuboCop
|
|
|
487
495
|
def begin_required?(block_node)
|
|
488
496
|
# If the block contains `rescue` or `ensure`, it needs to be wrapped in
|
|
489
497
|
# `begin`...`end` when changing `do-end` to `{}`.
|
|
490
|
-
block_node.each_child_node(:rescue, :ensure).any? &&
|
|
498
|
+
block_node.each_child_node(:rescue, :ensure).any? && block_node.multiline?
|
|
491
499
|
end
|
|
492
500
|
|
|
493
501
|
def single_argument_operator_method?(node)
|
|
@@ -3,31 +3,40 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for uses of the case equality operator(
|
|
6
|
+
# Checks for uses of the case equality operator (`===`).
|
|
7
|
+
# The `===` operator has different behavior depending on the
|
|
8
|
+
# receiver and its use outside of `case`/`when` is confusing.
|
|
9
|
+
# Prefer more explicit alternatives like `is_a?`, `include?`,
|
|
10
|
+
# or `match?`.
|
|
7
11
|
#
|
|
8
12
|
# If `AllowOnConstant` option is enabled, the cop will ignore violations when the receiver of
|
|
9
13
|
# the case equality operator is a constant.
|
|
10
|
-
|
|
14
|
+
#
|
|
11
15
|
# If `AllowOnSelfClass` option is enabled, the cop will ignore violations when the receiver of
|
|
12
16
|
# the case equality operator is `self.class`. Note intermediate variables are not accepted.
|
|
13
17
|
#
|
|
18
|
+
# NOTE: Regexp case equality (`/regexp/ === var`) is allowed because changing it to
|
|
19
|
+
# `/regexp/.match?(var)` needs to take into account `Regexp.last_match?`, `$~`, `$1`, etc.
|
|
20
|
+
# This potentially incompatible transformation is handled by `Performance/RegexpMatch` cop.
|
|
21
|
+
#
|
|
14
22
|
# @example
|
|
15
23
|
# # bad
|
|
16
24
|
# (1..100) === 7
|
|
17
|
-
# /something/ === some_string
|
|
18
25
|
#
|
|
19
26
|
# # good
|
|
20
|
-
# something.is_a?(Array)
|
|
21
27
|
# (1..100).include?(7)
|
|
22
|
-
# /something/.match?(some_string)
|
|
23
28
|
#
|
|
24
29
|
# @example AllowOnConstant: false (default)
|
|
25
30
|
# # bad
|
|
26
31
|
# Array === something
|
|
27
32
|
#
|
|
33
|
+
# # good
|
|
34
|
+
# something.is_a?(Array)
|
|
35
|
+
#
|
|
28
36
|
# @example AllowOnConstant: true
|
|
29
37
|
# # good
|
|
30
38
|
# Array === something
|
|
39
|
+
# something.is_a?(Array)
|
|
31
40
|
#
|
|
32
41
|
# @example AllowOnSelfClass: false (default)
|
|
33
42
|
# # bad
|
|
@@ -51,7 +60,7 @@ module RuboCop
|
|
|
51
60
|
|
|
52
61
|
def on_send(node)
|
|
53
62
|
case_equality?(node) do |lhs, rhs|
|
|
54
|
-
return if lhs.const_type? && !lhs.module_name?
|
|
63
|
+
return if lhs.regexp_type? || (lhs.const_type? && !lhs.module_name?)
|
|
55
64
|
|
|
56
65
|
add_offense(node.loc.selector) do |corrector|
|
|
57
66
|
replacement = replacement(lhs, rhs)
|
|
@@ -71,13 +80,6 @@ module RuboCop
|
|
|
71
80
|
|
|
72
81
|
def replacement(lhs, rhs)
|
|
73
82
|
case lhs.type
|
|
74
|
-
when :regexp
|
|
75
|
-
# The automatic correction from `a === b` to `a.match?(b)` needs to
|
|
76
|
-
# consider `Regexp.last_match?`, `$~`, `$1`, and etc.
|
|
77
|
-
# This correction is expected to be supported by `Performance/Regexp` cop.
|
|
78
|
-
# See: https://github.com/rubocop/rubocop-performance/issues/152
|
|
79
|
-
#
|
|
80
|
-
# So here is noop.
|
|
81
83
|
when :begin
|
|
82
84
|
begin_replacement(lhs, rhs)
|
|
83
85
|
when :const
|
|
@@ -94,13 +96,25 @@ module RuboCop
|
|
|
94
96
|
end
|
|
95
97
|
|
|
96
98
|
def const_replacement(lhs, rhs)
|
|
97
|
-
"#{rhs
|
|
99
|
+
"#{parenthesize_if_needed(rhs)}.is_a?(#{lhs.source})"
|
|
98
100
|
end
|
|
99
101
|
|
|
100
102
|
def send_replacement(lhs, rhs)
|
|
101
103
|
return unless self_class?(lhs)
|
|
102
104
|
|
|
103
|
-
"#{rhs
|
|
105
|
+
"#{parenthesize_if_needed(rhs)}.is_a?(#{lhs.source})"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# `Array === a + b` must become `(a + b).is_a?(Array)`, not
|
|
109
|
+
# `a + b.is_a?(Array)` (which parses as `a + (b.is_a?(Array))`).
|
|
110
|
+
def parenthesize_if_needed(node)
|
|
111
|
+
requires_parentheses?(node) ? "(#{node.source})" : node.source
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def requires_parentheses?(node)
|
|
115
|
+
return true if node.type?(:and, :or, :if, :range) || node.assignment?
|
|
116
|
+
|
|
117
|
+
node.send_type? && (node.operator_method? || node.unary_operation?)
|
|
104
118
|
end
|
|
105
119
|
end
|
|
106
120
|
end
|
|
@@ -8,8 +8,8 @@ module RuboCop
|
|
|
8
8
|
# essentially one-character strings, so this syntax
|
|
9
9
|
# is mostly redundant at this point.
|
|
10
10
|
#
|
|
11
|
-
#
|
|
12
|
-
# That's a good use case of
|
|
11
|
+
# A `?` character literal can be used to express meta and control characters.
|
|
12
|
+
# That's a good use case of a `?` literal so it doesn't count as an offense.
|
|
13
13
|
#
|
|
14
14
|
# @example
|
|
15
15
|
# # bad
|
|
@@ -3,29 +3,49 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks
|
|
7
|
-
#
|
|
6
|
+
# Checks that namespaced classes and modules are defined with a consistent style.
|
|
7
|
+
#
|
|
8
|
+
# With `nested` style, classes and modules should be defined separately (one constant
|
|
9
|
+
# on each line, without `::`). With `compact` style, classes and modules should be
|
|
10
|
+
# defined with fully qualified names (using `::` for namespaces).
|
|
11
|
+
#
|
|
12
|
+
# NOTE: The style chosen will affect `Module.nesting` for the class or module. Using
|
|
13
|
+
# `nested` style will result in each level being added, whereas `compact` style will
|
|
14
|
+
# only include the fully qualified class or module name.
|
|
15
|
+
#
|
|
16
|
+
# By default, `EnforcedStyle` applies to both classes and modules. If desired, separate
|
|
17
|
+
# styles can be defined for classes and modules by using `EnforcedStyleForClasses` and
|
|
18
|
+
# `EnforcedStyleForModules` respectively. If not set, or set to nil, the `EnforcedStyle`
|
|
19
|
+
# value will be used.
|
|
8
20
|
#
|
|
9
21
|
# @safety
|
|
10
22
|
# Autocorrection is unsafe.
|
|
11
23
|
#
|
|
12
|
-
# Moving from compact to nested children requires knowledge of whether the
|
|
13
|
-
# outer parent is a module or a class. Moving from nested to compact requires
|
|
24
|
+
# Moving from `compact` to `nested` children requires knowledge of whether the
|
|
25
|
+
# outer parent is a module or a class. Moving from `nested` to `compact` requires
|
|
14
26
|
# verification that the outer parent is defined elsewhere. RuboCop does not
|
|
15
27
|
# have the knowledge to perform either operation safely and thus requires
|
|
16
28
|
# manual oversight.
|
|
17
29
|
#
|
|
18
30
|
# @example EnforcedStyle: nested (default)
|
|
31
|
+
# # bad
|
|
32
|
+
# class Foo::Bar
|
|
33
|
+
# end
|
|
34
|
+
#
|
|
19
35
|
# # good
|
|
20
|
-
# # have each child on its own line
|
|
21
36
|
# class Foo
|
|
22
37
|
# class Bar
|
|
23
38
|
# end
|
|
24
39
|
# end
|
|
25
40
|
#
|
|
26
41
|
# @example EnforcedStyle: compact
|
|
42
|
+
# # bad
|
|
43
|
+
# class Foo
|
|
44
|
+
# class Bar
|
|
45
|
+
# end
|
|
46
|
+
# end
|
|
47
|
+
#
|
|
27
48
|
# # good
|
|
28
|
-
# # combine definitions as much as possible
|
|
29
49
|
# class Foo::Bar
|
|
30
50
|
# end
|
|
31
51
|
#
|
|
@@ -42,16 +62,18 @@ module RuboCop
|
|
|
42
62
|
def on_class(node)
|
|
43
63
|
return if node.parent_class && style != :nested
|
|
44
64
|
|
|
45
|
-
check_style(node, node.body)
|
|
65
|
+
check_style(node, node.body, style_for_classes)
|
|
46
66
|
end
|
|
47
67
|
|
|
48
68
|
def on_module(node)
|
|
49
|
-
check_style(node, node.body)
|
|
69
|
+
check_style(node, node.body, style_for_modules)
|
|
50
70
|
end
|
|
51
71
|
|
|
52
72
|
private
|
|
53
73
|
|
|
54
74
|
def nest_or_compact(corrector, node)
|
|
75
|
+
style = node.class_type? ? style_for_classes : style_for_modules
|
|
76
|
+
|
|
55
77
|
if style == :nested
|
|
56
78
|
nest_definition(corrector, node)
|
|
57
79
|
else
|
|
@@ -117,21 +139,27 @@ module RuboCop
|
|
|
117
139
|
"#{node.body.children.first.const_name}"
|
|
118
140
|
end
|
|
119
141
|
|
|
142
|
+
# rubocop:disable Metrics/AbcSize
|
|
120
143
|
def remove_end(corrector, body)
|
|
121
|
-
remove_begin_pos = body.loc.
|
|
144
|
+
remove_begin_pos = if same_line?(body.loc.name, body.loc.end)
|
|
145
|
+
body.loc.name.end_pos
|
|
146
|
+
else
|
|
147
|
+
body.loc.end.begin_pos - leading_spaces(body).size
|
|
148
|
+
end
|
|
122
149
|
adjustment = processed_source.raw_source[remove_begin_pos] == ';' ? 0 : 1
|
|
123
150
|
range = range_between(remove_begin_pos, body.loc.end.end_pos + adjustment)
|
|
124
151
|
|
|
125
152
|
corrector.remove(range)
|
|
126
153
|
end
|
|
154
|
+
# rubocop:enable Metrics/AbcSize
|
|
127
155
|
|
|
128
156
|
def unindent(corrector, node)
|
|
129
157
|
return unless node.body.children.last
|
|
130
158
|
|
|
131
159
|
last_child_leading_spaces = leading_spaces(node.body.children.last)
|
|
132
|
-
return if leading_spaces(node)
|
|
160
|
+
return if spaces_size(leading_spaces(node)) == spaces_size(last_child_leading_spaces)
|
|
133
161
|
|
|
134
|
-
column_delta = configured_indentation_width - last_child_leading_spaces
|
|
162
|
+
column_delta = configured_indentation_width - spaces_size(last_child_leading_spaces)
|
|
135
163
|
return if column_delta.zero?
|
|
136
164
|
|
|
137
165
|
AlignmentCorrector.correct(corrector, processed_source, node, column_delta)
|
|
@@ -141,8 +169,19 @@ module RuboCop
|
|
|
141
169
|
node.source_range.source_line[/\A\s*/]
|
|
142
170
|
end
|
|
143
171
|
|
|
144
|
-
def
|
|
172
|
+
def spaces_size(spaces_string)
|
|
173
|
+
mapping = { "\t" => tab_indentation_width }
|
|
174
|
+
spaces_string.chars.sum { |character| mapping.fetch(character, 1) }
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def tab_indentation_width
|
|
178
|
+
config.for_cop('Layout/IndentationStyle')['IndentationWidth'] ||
|
|
179
|
+
configured_indentation_width
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def check_style(node, body, style)
|
|
145
183
|
return if node.identifier.namespace&.cbase_type?
|
|
184
|
+
return unless const_namespace?(node.identifier.namespace)
|
|
146
185
|
|
|
147
186
|
if style == :nested
|
|
148
187
|
check_nested_style(node)
|
|
@@ -151,8 +190,16 @@ module RuboCop
|
|
|
151
190
|
end
|
|
152
191
|
end
|
|
153
192
|
|
|
193
|
+
def const_namespace?(node)
|
|
194
|
+
return true if node.nil? || node.cbase_type?
|
|
195
|
+
return false unless node.const_type?
|
|
196
|
+
|
|
197
|
+
const_namespace?(node.namespace)
|
|
198
|
+
end
|
|
199
|
+
|
|
154
200
|
def check_nested_style(node)
|
|
155
201
|
return unless compact_node_name?(node)
|
|
202
|
+
return if node.parent&.type?(:class, :module)
|
|
156
203
|
|
|
157
204
|
add_offense(node.loc.name, message: NESTED_MSG) do |corrector|
|
|
158
205
|
autocorrect(corrector, node)
|
|
@@ -183,6 +230,14 @@ module RuboCop
|
|
|
183
230
|
def compact_node_name?(node)
|
|
184
231
|
node.identifier.source.include?('::')
|
|
185
232
|
end
|
|
233
|
+
|
|
234
|
+
def style_for_classes
|
|
235
|
+
cop_config['EnforcedStyleForClasses'] || style
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def style_for_modules
|
|
239
|
+
cop_config['EnforcedStyleForModules'] || style
|
|
240
|
+
end
|
|
186
241
|
end
|
|
187
242
|
end
|
|
188
243
|
end
|
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
|
68
68
|
PATTERN
|
|
69
69
|
|
|
70
70
|
def on_send(node)
|
|
71
|
-
def_node = node.each_ancestor(:
|
|
71
|
+
def_node = node.each_ancestor(:any_def).first
|
|
72
72
|
return if def_node &&
|
|
73
73
|
(allowed_method?(def_node.method_name) ||
|
|
74
74
|
matches_allowed_pattern?(def_node.method_name))
|
|
@@ -90,25 +90,33 @@ module RuboCop
|
|
|
90
90
|
private
|
|
91
91
|
|
|
92
92
|
def class_name(class_node, node)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
unless class_name_method?(node.children.first.method_name)
|
|
94
|
+
# `var.class == 'Foo'` compares a `Class` to a `String` (always false) and
|
|
95
|
+
# has no valid `instance_of?` rewrite, so don't suggest one.
|
|
96
|
+
return if class_node.str_type?
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
# When a variable or return value of a method is used, it returns nil
|
|
104
|
-
# because the type is not known and cannot be suggested.
|
|
105
|
-
return
|
|
106
|
-
end
|
|
98
|
+
return class_node.source
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
if (receiver = class_node.receiver) && class_name_method?(class_node.method_name)
|
|
102
|
+
return receiver.source
|
|
107
103
|
end
|
|
108
104
|
|
|
105
|
+
return string_class_name(class_node) if class_node.str_type?
|
|
106
|
+
# When a variable or return value of a method is used, the type is not known
|
|
107
|
+
# and cannot be suggested.
|
|
108
|
+
return if unable_to_determine_type?(class_node)
|
|
109
|
+
|
|
109
110
|
class_node.source
|
|
110
111
|
end
|
|
111
112
|
|
|
113
|
+
def string_class_name(class_node)
|
|
114
|
+
value = trim_string_quotes(class_node)
|
|
115
|
+
# Avoid `::::Foo` when the name is already fully qualified.
|
|
116
|
+
value.prepend('::') if require_cbase?(class_node) && !value.start_with?('::')
|
|
117
|
+
value
|
|
118
|
+
end
|
|
119
|
+
|
|
112
120
|
def class_name_method?(method_name)
|
|
113
121
|
CLASS_NAME_METHODS.include?(method_name)
|
|
114
122
|
end
|
|
@@ -140,15 +140,21 @@ module RuboCop
|
|
|
140
140
|
|
|
141
141
|
def extract_def_from_sclass(def_node, sclass_node)
|
|
142
142
|
range = source_range_with_comment(def_node)
|
|
143
|
-
source = range
|
|
144
|
-
"def #{def_node.method_name}",
|
|
145
|
-
"def self.#{def_node.method_name}"
|
|
146
|
-
)
|
|
147
|
-
|
|
143
|
+
source = prefix_def_with_self(range, def_node)
|
|
148
144
|
source = source.gsub(/^ {#{indentation_diff(def_node, sclass_node)}}/, '')
|
|
149
145
|
[range, source.chomp]
|
|
150
146
|
end
|
|
151
147
|
|
|
148
|
+
# Splice in `self.` at the actual `def` keyword rather than substituting the
|
|
149
|
+
# first textual `def <name>`, which may appear inside a preceding comment.
|
|
150
|
+
def prefix_def_with_self(range, def_node)
|
|
151
|
+
keyword_offset = def_node.loc.keyword.begin_pos - range.begin_pos
|
|
152
|
+
name_end_offset = def_node.loc.name.end_pos - range.begin_pos
|
|
153
|
+
source = range.source.dup
|
|
154
|
+
source[keyword_offset...name_end_offset] = "def self.#{def_node.method_name}"
|
|
155
|
+
source
|
|
156
|
+
end
|
|
157
|
+
|
|
152
158
|
def indentation_diff(node1, node2)
|
|
153
159
|
node1.loc.column - node2.loc.column
|
|
154
160
|
end
|