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
|
@@ -29,25 +29,30 @@ module RuboCop
|
|
|
29
29
|
# @example IgnoreModules: false (default)
|
|
30
30
|
# # bad
|
|
31
31
|
# class Foo
|
|
32
|
-
# MyClass = Struct.new
|
|
32
|
+
# MyClass = Struct.new
|
|
33
33
|
# end
|
|
34
34
|
#
|
|
35
35
|
# # good
|
|
36
36
|
# class Foo
|
|
37
|
-
# MyClass = Struct.new
|
|
37
|
+
# MyClass = Struct.new
|
|
38
38
|
# public_constant :MyClass
|
|
39
39
|
# end
|
|
40
40
|
#
|
|
41
41
|
# @example IgnoreModules: true
|
|
42
42
|
# # good
|
|
43
43
|
# class Foo
|
|
44
|
-
# MyClass = Struct.new
|
|
44
|
+
# MyClass = Struct.new
|
|
45
45
|
# end
|
|
46
46
|
#
|
|
47
47
|
class ConstantVisibility < Base
|
|
48
48
|
MSG = 'Explicitly make `%<constant_name>s` public or private using ' \
|
|
49
49
|
'either `#public_constant` or `#private_constant`.'
|
|
50
50
|
|
|
51
|
+
# @!method visibility_declaration_for(node)
|
|
52
|
+
def_node_matcher :visibility_declaration_for, <<~PATTERN
|
|
53
|
+
(send nil? {:public_constant :private_constant} $...)
|
|
54
|
+
PATTERN
|
|
55
|
+
|
|
51
56
|
def on_casgn(node)
|
|
52
57
|
return unless class_or_module_scope?(node)
|
|
53
58
|
return if visibility_declaration?(node)
|
|
@@ -77,20 +82,23 @@ module RuboCop
|
|
|
77
82
|
end
|
|
78
83
|
end
|
|
79
84
|
|
|
85
|
+
# rubocop:disable Metrics/AbcSize
|
|
80
86
|
def visibility_declaration?(node)
|
|
81
87
|
node.parent.each_child_node(:send).any? do |child|
|
|
82
|
-
visibility_declaration_for
|
|
83
|
-
end
|
|
84
|
-
end
|
|
88
|
+
next false unless (arguments = visibility_declaration_for(child))
|
|
85
89
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
arguments = arguments.first.children.first.to_a if arguments.first&.splat_type?
|
|
91
|
+
constant_values = arguments.map do |argument|
|
|
92
|
+
# `respond_to?(:value)` is too broad: `int`/`float` nodes respond to it
|
|
93
|
+
# but their value is a `Numeric`, which has no `to_sym` (e.g.
|
|
94
|
+
# `private_constant 42`). Only symbol/string arguments are real names.
|
|
95
|
+
argument.value.to_sym if argument.type?(:sym, :str)
|
|
96
|
+
end
|
|
90
97
|
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
constant_values.include?(node.name)
|
|
99
|
+
end
|
|
93
100
|
end
|
|
101
|
+
# rubocop:enable Metrics/AbcSize
|
|
94
102
|
end
|
|
95
103
|
end
|
|
96
104
|
end
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
#
|
|
6
|
+
# Checks that a copyright notice was given in each source file.
|
|
7
7
|
#
|
|
8
8
|
# The default regexp for an acceptable copyright notice can be found in
|
|
9
9
|
# config/default.yml. The default can be changed as follows:
|
|
@@ -46,15 +46,16 @@ module RuboCop
|
|
|
46
46
|
token = insert_notice_before(processed_source)
|
|
47
47
|
range = token.nil? ? range_between(0, 0) : token.pos
|
|
48
48
|
|
|
49
|
-
corrector.insert_before(range, "#{
|
|
49
|
+
corrector.insert_before(range, "#{normalized_autocorrect_notice}\n")
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
def
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
def normalized_autocorrect_notice
|
|
53
|
+
autocorrect_notice.lines.map do |line|
|
|
54
|
+
next line if line.start_with?('#')
|
|
55
|
+
next "#\n" if line.chomp.empty?
|
|
55
56
|
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
"# #{line}"
|
|
58
|
+
end.join
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
def verify_autocorrect_notice!
|
|
@@ -62,8 +63,7 @@ module RuboCop
|
|
|
62
63
|
raise Warning, "#{cop_name}: #{AUTOCORRECT_EMPTY_WARNING}"
|
|
63
64
|
end
|
|
64
65
|
|
|
65
|
-
|
|
66
|
-
return if autocorrect_notice.gsub(/^# */, '').match?(regex)
|
|
66
|
+
return if normalized_autocorrect_notice.gsub(/^# */, '').match?(notice_regexp)
|
|
67
67
|
|
|
68
68
|
message = "AutocorrectNotice '#{autocorrect_notice}' must match Notice /#{notice}/"
|
|
69
69
|
raise Warning, "#{cop_name}: #{message}"
|
|
@@ -91,18 +91,29 @@ module RuboCop
|
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
def notice_found?(processed_source)
|
|
94
|
-
notice_regexp = Regexp.new(notice.lines.map(&:strip).join)
|
|
95
94
|
multiline_notice = +''
|
|
96
95
|
processed_source.tokens.each do |token|
|
|
97
96
|
break unless token.comment?
|
|
98
97
|
|
|
99
|
-
multiline_notice << token.text.sub(/\A# */, '')
|
|
98
|
+
multiline_notice << token.text.sub(/\A# */, '') << "\n"
|
|
100
99
|
|
|
101
100
|
break if notice_regexp.match?(token.text)
|
|
102
101
|
end
|
|
103
102
|
|
|
104
103
|
multiline_notice.match?(notice_regexp)
|
|
105
104
|
end
|
|
105
|
+
|
|
106
|
+
def notice_regexp
|
|
107
|
+
@notice_regexp ||= Regexp.new(notice.sub(/\A(?:\\A|\^)?#(?:\\s[*+?]?|\s)*/, ''))
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def notice
|
|
111
|
+
cop_config['Notice']
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def autocorrect_notice
|
|
115
|
+
cop_config['AutocorrectNotice']
|
|
116
|
+
end
|
|
106
117
|
end
|
|
107
118
|
end
|
|
108
119
|
end
|
|
@@ -4,6 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for inheritance from `Data.define` to avoid creating the anonymous parent class.
|
|
7
|
+
# Inheriting from `Data.define` adds a superfluous level in inheritance tree.
|
|
7
8
|
#
|
|
8
9
|
# @safety
|
|
9
10
|
# Autocorrection is unsafe because it will change the inheritance
|
|
@@ -17,12 +18,18 @@ module RuboCop
|
|
|
17
18
|
# end
|
|
18
19
|
# end
|
|
19
20
|
#
|
|
21
|
+
# Person.ancestors
|
|
22
|
+
# # => [Person, #<Class:0x000000010b4e14a0>, Data, (...)]
|
|
23
|
+
#
|
|
20
24
|
# # good
|
|
21
25
|
# Person = Data.define(:first_name, :last_name) do
|
|
22
26
|
# def age
|
|
23
27
|
# 42
|
|
24
28
|
# end
|
|
25
29
|
# end
|
|
30
|
+
#
|
|
31
|
+
# Person.ancestors
|
|
32
|
+
# # => [Person, Data, (...)]
|
|
26
33
|
class DataInheritance < Base
|
|
27
34
|
include RangeHelp
|
|
28
35
|
extend AutoCorrector
|
|
@@ -54,6 +61,10 @@ module RuboCop
|
|
|
54
61
|
|
|
55
62
|
def correct_parent(parent, corrector)
|
|
56
63
|
if parent.block_type?
|
|
64
|
+
# Convert a brace block to `do`, so the class's own `end` closes it
|
|
65
|
+
# once the closing delimiter is removed; otherwise a dangling `{` is
|
|
66
|
+
# left behind, producing invalid Ruby.
|
|
67
|
+
corrector.replace(parent.loc.begin, 'do') if parent.braces?
|
|
57
68
|
corrector.remove(range_with_surrounding_space(parent.loc.end, newlines: false))
|
|
58
69
|
elsif (class_node = parent.parent).body.nil?
|
|
59
70
|
corrector.remove(range_for_empty_class_body(class_node, parent))
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for consistent usage of the `
|
|
7
|
-
# `
|
|
6
|
+
# Checks for consistent usage of the `Time` class over the
|
|
7
|
+
# `DateTime` class. This cop is disabled by default since these classes,
|
|
8
8
|
# although highly overlapping, have particularities that make them not
|
|
9
9
|
# replaceable in certain situations when dealing with multiple timezones
|
|
10
10
|
# and/or DST.
|
|
@@ -59,12 +59,12 @@ module RuboCop
|
|
|
59
59
|
|
|
60
60
|
# @!method historic_date?(node)
|
|
61
61
|
def_node_matcher :historic_date?, <<~PATTERN
|
|
62
|
-
(
|
|
62
|
+
(call _ _ _ (const (const {nil? (cbase)} :Date) _))
|
|
63
63
|
PATTERN
|
|
64
64
|
|
|
65
65
|
# @!method to_datetime?(node)
|
|
66
66
|
def_node_matcher :to_datetime?, <<~PATTERN
|
|
67
|
-
(call
|
|
67
|
+
(call !nil? :to_datetime)
|
|
68
68
|
PATTERN
|
|
69
69
|
|
|
70
70
|
def on_send(node)
|
|
@@ -25,8 +25,9 @@ module RuboCop
|
|
|
25
25
|
# # good
|
|
26
26
|
# def foo = do_something
|
|
27
27
|
#
|
|
28
|
-
# # good
|
|
28
|
+
# # good - without parentheses it's a syntax error
|
|
29
29
|
# def foo() do_something end
|
|
30
|
+
# def foo()=do_something
|
|
30
31
|
#
|
|
31
32
|
# # bad
|
|
32
33
|
# def Baz.foo()
|
|
@@ -38,19 +39,35 @@ module RuboCop
|
|
|
38
39
|
# do_something
|
|
39
40
|
# end
|
|
40
41
|
class DefWithParentheses < Base
|
|
42
|
+
include RangeHelp
|
|
41
43
|
extend AutoCorrector
|
|
42
44
|
|
|
43
45
|
MSG = "Omit the parentheses in defs when the method doesn't accept any arguments."
|
|
44
46
|
|
|
45
47
|
def on_def(node)
|
|
46
|
-
return
|
|
47
|
-
return
|
|
48
|
+
return unless !node.arguments? && (arguments_range = node.arguments.source_range)
|
|
49
|
+
return if parentheses_required?(node, arguments_range)
|
|
48
50
|
|
|
49
|
-
add_offense(
|
|
50
|
-
corrector.remove(
|
|
51
|
+
add_offense(arguments_range) do |corrector|
|
|
52
|
+
corrector.remove(arguments_range)
|
|
51
53
|
end
|
|
52
54
|
end
|
|
53
55
|
alias on_defs on_def
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def parentheses_required?(node, arguments_range)
|
|
60
|
+
end_pos = arguments_range.end.end_pos
|
|
61
|
+
token_after_argument = range_between(end_pos, end_pos + 1).source
|
|
62
|
+
|
|
63
|
+
# A `;` after the parentheses (e.g. `def foo(); end`) already separates the
|
|
64
|
+
# signature from the body, so the parentheses can be removed (`def foo; end`).
|
|
65
|
+
return false if token_after_argument == ';'
|
|
66
|
+
|
|
67
|
+
return true if node.single_line? && !node.endless?
|
|
68
|
+
|
|
69
|
+
token_after_argument == '='
|
|
70
|
+
end
|
|
54
71
|
end
|
|
55
72
|
end
|
|
56
73
|
end
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
#
|
|
6
|
+
# Checks for chained `dig` calls that can be collapsed into a single `dig`.
|
|
7
7
|
#
|
|
8
8
|
# @safety
|
|
9
9
|
# This cop is unsafe because it cannot be guaranteed that the receiver
|
|
@@ -79,6 +79,11 @@ module RuboCop
|
|
|
79
79
|
corrector.replace(range, replacement)
|
|
80
80
|
|
|
81
81
|
comments_in_range(node).reverse_each do |comment|
|
|
82
|
+
# Only relocate comments that the replacement destroys. A trailing
|
|
83
|
+
# comment after the chain survives in place, so moving it would
|
|
84
|
+
# duplicate it (and splitting the line drops the indentation).
|
|
85
|
+
next if comment.source_range.begin_pos >= range.end_pos
|
|
86
|
+
|
|
82
87
|
corrector.insert_before(node, "#{comment.source}\n")
|
|
83
88
|
end
|
|
84
89
|
end
|
|
@@ -35,6 +35,10 @@ module RuboCop
|
|
|
35
35
|
PATTERN
|
|
36
36
|
|
|
37
37
|
def on_send(node)
|
|
38
|
+
# A trailing block (e.g. `Dir.each_child(path).none? { ... }`) changes
|
|
39
|
+
# the meaning and is not equivalent to `Dir.empty?`.
|
|
40
|
+
return if node.block_literal?
|
|
41
|
+
|
|
38
42
|
offensive?(node) do |const_node, arg_node|
|
|
39
43
|
replacement = "#{bang(node)}#{const_node.source}.empty?(#{arg_node.source})"
|
|
40
44
|
add_offense(node, message: format(MSG, replacement: replacement)) do |corrector|
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
module Cop
|
|
7
7
|
module Style
|
|
8
8
|
# Detects comments to enable/disable RuboCop.
|
|
9
|
-
# This is useful if want to make sure that every RuboCop error gets fixed
|
|
9
|
+
# This is useful if you want to make sure that every RuboCop error gets fixed
|
|
10
10
|
# and not quickly disabled with a comment.
|
|
11
11
|
#
|
|
12
12
|
# Specific cops can be allowed with the `AllowedCops` configuration. Note that
|
|
@@ -161,7 +161,12 @@ module RuboCop
|
|
|
161
161
|
source = source.gsub(COMMENT_REGEXP, '')
|
|
162
162
|
return if source.blank?
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
# Treat `\#` (an escaped interpolation marker in the heredoc) as matching
|
|
165
|
+
# either `\#` or `#` in the comment, since the comment may show either
|
|
166
|
+
# the literal source form or the runtime appearance.
|
|
167
|
+
segments = source.strip.split('\\#', -1).map { |segment| Regexp.escape(segment) }
|
|
168
|
+
|
|
169
|
+
/\s*#{segments.join('\\\\?#')}/
|
|
165
170
|
end
|
|
166
171
|
end
|
|
167
172
|
end
|
|
@@ -62,12 +62,12 @@ module RuboCop
|
|
|
62
62
|
#
|
|
63
63
|
# @example AllowedConstants: ['ClassMethods']
|
|
64
64
|
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
#
|
|
65
|
+
# # good
|
|
66
|
+
# module A
|
|
67
|
+
# module ClassMethods
|
|
68
|
+
# # ...
|
|
69
|
+
# end
|
|
70
|
+
# end
|
|
71
71
|
#
|
|
72
72
|
class Documentation < Base
|
|
73
73
|
include DocumentationComment
|
|
@@ -97,14 +97,14 @@ module RuboCop
|
|
|
97
97
|
#
|
|
98
98
|
# @example AllowedMethods: ['method_missing', 'respond_to_missing?']
|
|
99
99
|
#
|
|
100
|
-
#
|
|
101
|
-
#
|
|
102
|
-
#
|
|
103
|
-
#
|
|
100
|
+
# # good
|
|
101
|
+
# class Foo
|
|
102
|
+
# def method_missing(name, *args)
|
|
103
|
+
# end
|
|
104
104
|
#
|
|
105
|
-
#
|
|
106
|
-
#
|
|
107
|
-
#
|
|
105
|
+
# def respond_to_missing?(symbol, include_private)
|
|
106
|
+
# end
|
|
107
|
+
# end
|
|
108
108
|
#
|
|
109
109
|
class DocumentationMethod < Base
|
|
110
110
|
include DocumentationComment
|
|
@@ -140,7 +140,11 @@ module RuboCop
|
|
|
140
140
|
end
|
|
141
141
|
|
|
142
142
|
def method_allowed?(node)
|
|
143
|
-
|
|
143
|
+
# For a modifier form like `module_function def foo; end`, `node` is the
|
|
144
|
+
# `module_function`/`ruby2_keywords` send; the real method name is on its
|
|
145
|
+
# `def`/`defs` argument, not the modifier itself.
|
|
146
|
+
method_name = node.send_type? ? node.first_argument.method_name : node.method_name
|
|
147
|
+
allowed_methods.include?(method_name)
|
|
144
148
|
end
|
|
145
149
|
|
|
146
150
|
def allowed_methods
|
|
@@ -96,20 +96,20 @@ module RuboCop
|
|
|
96
96
|
elsif last_child.type?(:pair, :hash) || last_child.parent.array_type?
|
|
97
97
|
false
|
|
98
98
|
else
|
|
99
|
-
last_child.
|
|
99
|
+
last_child.first_line <= node.first_line
|
|
100
100
|
end
|
|
101
101
|
end
|
|
102
102
|
|
|
103
103
|
def find_def_node_from_ascendant(node)
|
|
104
104
|
return unless (parent = node.parent)
|
|
105
|
-
return parent if parent.
|
|
105
|
+
return parent if parent.any_def_type?
|
|
106
106
|
return node.parent.child_nodes.first if define_method?(parent)
|
|
107
107
|
|
|
108
108
|
find_def_node_from_ascendant(node.parent)
|
|
109
109
|
end
|
|
110
110
|
|
|
111
111
|
def define_method?(node)
|
|
112
|
-
return false unless node.
|
|
112
|
+
return false unless node.any_block_type?
|
|
113
113
|
|
|
114
114
|
child = node.child_nodes.first
|
|
115
115
|
return false unless child.send_type?
|
|
@@ -26,7 +26,7 @@ module RuboCop
|
|
|
26
26
|
|
|
27
27
|
MSG = 'Use `Integer#times` for a simple loop which iterates a fixed number of times.'
|
|
28
28
|
|
|
29
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
29
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler
|
|
30
30
|
return unless offending?(node)
|
|
31
31
|
|
|
32
32
|
send_node = node.send_node
|
|
@@ -40,6 +40,8 @@ module RuboCop
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
alias on_itblock on_block
|
|
44
|
+
|
|
43
45
|
def on_numblock(node)
|
|
44
46
|
each_with_object_numblock_candidate?(node) do |method, body|
|
|
45
47
|
_, method_name, method_arg = *method
|
|
@@ -58,7 +60,7 @@ module RuboCop
|
|
|
58
60
|
|
|
59
61
|
# @!method each_with_object_block_candidate?(node)
|
|
60
62
|
def_node_matcher :each_with_object_block_candidate?, <<~PATTERN
|
|
61
|
-
(block $(call _ {:inject :reduce} _) $_ $_)
|
|
63
|
+
(block $(call _ {:inject :reduce} _) $(args _ _) $_)
|
|
62
64
|
PATTERN
|
|
63
65
|
|
|
64
66
|
# @!method each_with_object_numblock_candidate?(node)
|
|
@@ -71,8 +73,7 @@ module RuboCop
|
|
|
71
73
|
|
|
72
74
|
first_arg, second_arg = *node.arguments
|
|
73
75
|
|
|
74
|
-
corrector.
|
|
75
|
-
corrector.replace(second_arg, first_arg.source)
|
|
76
|
+
corrector.swap(first_arg, second_arg)
|
|
76
77
|
|
|
77
78
|
if return_value_occupies_whole_line?(return_value)
|
|
78
79
|
corrector.remove(whole_line_expression(return_value))
|
|
@@ -28,7 +28,7 @@ module RuboCop
|
|
|
28
28
|
|
|
29
29
|
MSG = 'Omit pipes for the empty block parameters.'
|
|
30
30
|
|
|
31
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
31
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler
|
|
32
32
|
send_node = node.send_node
|
|
33
33
|
check(node) unless send_node.send_type? && send_node.lambda_literal?
|
|
34
34
|
end
|
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
|
40
40
|
extend AutoCorrector
|
|
41
41
|
|
|
42
42
|
MSG = 'Do not use empty `case` condition, instead use an `if` expression.'
|
|
43
|
-
NOT_SUPPORTED_PARENT_TYPES = %i[return break next send csend].freeze
|
|
43
|
+
NOT_SUPPORTED_PARENT_TYPES = %i[return break next send csend yield super].freeze
|
|
44
44
|
|
|
45
45
|
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
46
46
|
def on_case(case_node)
|
|
@@ -90,7 +90,17 @@ module RuboCop
|
|
|
90
90
|
range = range_between(conditions.first.source_range.begin_pos,
|
|
91
91
|
conditions.last.source_range.end_pos)
|
|
92
92
|
|
|
93
|
-
corrector.replace(range, conditions.map(
|
|
93
|
+
corrector.replace(range, conditions.map { |c| parenthesize_condition(c) }.join(' || '))
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# A condition that binds looser than `||` (e.g. a ternary, range, or
|
|
98
|
+
# assignment) must be parenthesized so the joined `||` keeps its meaning.
|
|
99
|
+
def parenthesize_condition(condition)
|
|
100
|
+
if condition.assignment? || condition.type?(:if, :and, :or, :range)
|
|
101
|
+
"(#{condition.source})"
|
|
102
|
+
else
|
|
103
|
+
condition.source
|
|
94
104
|
end
|
|
95
105
|
end
|
|
96
106
|
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Enforces consistent style for empty class definitions.
|
|
7
|
+
#
|
|
8
|
+
# This cop can enforce either a standard class definition or `Class.new`
|
|
9
|
+
# for classes with no body.
|
|
10
|
+
#
|
|
11
|
+
# The supported styles are:
|
|
12
|
+
#
|
|
13
|
+
# * class_keyword (default) - prefer standard class definition over `Class.new`
|
|
14
|
+
# * class_new - prefer `Class.new` over class definition
|
|
15
|
+
#
|
|
16
|
+
# One difference between the two styles is that the `Class.new` form does not make
|
|
17
|
+
# the subclass name available to the base class's `inherited` callback.
|
|
18
|
+
# For this reason, `EnforcedStyle: class_keyword` is set as the default style.
|
|
19
|
+
# Class definitions without a superclass, which are not involved in inheritance,
|
|
20
|
+
# are not detected. This ensures safe detection regardless of the applied style.
|
|
21
|
+
# This avoids overlapping responsibilities with the `Lint/EmptyClass` cop.
|
|
22
|
+
#
|
|
23
|
+
# Use `AllowedParentClasses` to permit both styles for specific parent classes.
|
|
24
|
+
# For example, adding `StandardError` allows both `Error = Class.new(StandardError)`
|
|
25
|
+
# and `class Error < StandardError; end` regardless of the enforced style.
|
|
26
|
+
#
|
|
27
|
+
# @example EnforcedStyle: class_keyword (default)
|
|
28
|
+
# # bad
|
|
29
|
+
# FooError = Class.new(StandardError)
|
|
30
|
+
#
|
|
31
|
+
# # okish
|
|
32
|
+
# class FooError < StandardError; end
|
|
33
|
+
#
|
|
34
|
+
# # good
|
|
35
|
+
# class FooError < StandardError
|
|
36
|
+
# end
|
|
37
|
+
#
|
|
38
|
+
# @example EnforcedStyle: class_new
|
|
39
|
+
# # bad
|
|
40
|
+
# class FooError < StandardError
|
|
41
|
+
# end
|
|
42
|
+
#
|
|
43
|
+
# # bad
|
|
44
|
+
# class FooError < StandardError; end
|
|
45
|
+
#
|
|
46
|
+
# # good
|
|
47
|
+
# FooError = Class.new(StandardError)
|
|
48
|
+
#
|
|
49
|
+
# @example AllowedParentClasses: ['StandardError']
|
|
50
|
+
# # good - allowed regardless of EnforcedStyle
|
|
51
|
+
# FooError = Class.new(StandardError)
|
|
52
|
+
#
|
|
53
|
+
# # good - allowed regardless of EnforcedStyle
|
|
54
|
+
# class FooError < StandardError
|
|
55
|
+
# end
|
|
56
|
+
#
|
|
57
|
+
class EmptyClassDefinition < Base
|
|
58
|
+
include ConfigurableEnforcedStyle
|
|
59
|
+
extend AutoCorrector
|
|
60
|
+
|
|
61
|
+
MSG_CLASS_KEYWORD =
|
|
62
|
+
'Use the `class` keyword instead of `Class.new` to define an empty class.'
|
|
63
|
+
MSG_CLASS_NEW = 'Use `Class.new` instead of the `class` keyword to define an empty class.'
|
|
64
|
+
|
|
65
|
+
# @!method class_new_assignment(node)
|
|
66
|
+
def_node_matcher :class_new_assignment, <<~PATTERN
|
|
67
|
+
(casgn _ _ $(send (const _ :Class) :new _))
|
|
68
|
+
PATTERN
|
|
69
|
+
|
|
70
|
+
def on_casgn(node)
|
|
71
|
+
return unless %i[class_keyword class_definition].include?(style)
|
|
72
|
+
return unless (class_new_node = class_new_assignment(node))
|
|
73
|
+
return if (arg = class_new_node.first_argument) && !arg.const_type?
|
|
74
|
+
return if allowed_parent_class?(class_new_node.first_argument.source)
|
|
75
|
+
|
|
76
|
+
add_offense(node, message: MSG_CLASS_KEYWORD) do |corrector|
|
|
77
|
+
autocorrect_class_new(corrector, node, class_new_node)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def on_class(node)
|
|
82
|
+
return unless style == :class_new
|
|
83
|
+
return unless node.parent_class
|
|
84
|
+
return if (body = node.body) && !body.children.empty?
|
|
85
|
+
return if allowed_parent_class?(node.parent_class.source)
|
|
86
|
+
|
|
87
|
+
add_offense(node, message: MSG_CLASS_NEW) do |corrector|
|
|
88
|
+
autocorrect_class_definition(corrector, node)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
def allowed_parent_class?(parent_class_name)
|
|
95
|
+
allowed_parent_classes.include?(parent_class_name)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def allowed_parent_classes
|
|
99
|
+
cop_config.fetch('AllowedParentClasses', [])
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def autocorrect_class_new(corrector, node, class_new_node)
|
|
103
|
+
indent = ' ' * node.loc.column
|
|
104
|
+
class_name = constant_name(node)
|
|
105
|
+
parent_class_name = class_new_node.first_argument.source
|
|
106
|
+
|
|
107
|
+
corrector.replace(node, "class #{class_name} < #{parent_class_name}\n#{indent}end")
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Preserve any namespace on the assigned constant (e.g. `Foo::Bar`),
|
|
111
|
+
# which `node.name` drops.
|
|
112
|
+
def constant_name(node)
|
|
113
|
+
namespace = node.namespace
|
|
114
|
+
namespace ? "#{namespace.source}::#{node.name}" : node.name
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def autocorrect_class_definition(corrector, node)
|
|
118
|
+
class_name = node.identifier.source
|
|
119
|
+
parent_class_name = node.parent_class.source
|
|
120
|
+
|
|
121
|
+
corrector.replace(node, "#{class_name} = Class.new(#{parent_class_name})")
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -42,6 +42,10 @@ module RuboCop
|
|
|
42
42
|
MSG = 'Use an empty string literal instead of heredoc.'
|
|
43
43
|
|
|
44
44
|
def on_heredoc(node)
|
|
45
|
+
# A backtick heredoc (`<<~`CMD``) executes a command, so it cannot be
|
|
46
|
+
# replaced with an empty string literal.
|
|
47
|
+
return if node.xstr_type?
|
|
48
|
+
|
|
45
49
|
heredoc_body = node.loc.heredoc_body
|
|
46
50
|
|
|
47
51
|
return unless heredoc_body.source.empty?
|
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
|
23
23
|
|
|
24
24
|
MSG = 'Omit parentheses for the empty lambda parameters.'
|
|
25
25
|
|
|
26
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
26
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler
|
|
27
27
|
send_node = node.send_node
|
|
28
28
|
return unless send_node.send_type?
|
|
29
29
|
|
|
@@ -6,6 +6,10 @@ module RuboCop
|
|
|
6
6
|
# Checks for the use of a method, the result of which
|
|
7
7
|
# would be a literal, like an empty array, hash, or string.
|
|
8
8
|
#
|
|
9
|
+
# NOTE: When frozen string literals are enabled, `String.new`
|
|
10
|
+
# isn't corrected to an empty string since the former is
|
|
11
|
+
# mutable and the latter would be frozen.
|
|
12
|
+
#
|
|
9
13
|
# @example
|
|
10
14
|
# # bad
|
|
11
15
|
# a = Array.new
|
|
@@ -40,13 +44,18 @@ module RuboCop
|
|
|
40
44
|
def_node_matcher :str_node, '(send (const {nil? cbase} :String) :new)'
|
|
41
45
|
|
|
42
46
|
# @!method array_with_block(node)
|
|
43
|
-
def_node_matcher :array_with_block,
|
|
47
|
+
def_node_matcher :array_with_block, <<~PATTERN
|
|
48
|
+
{
|
|
49
|
+
(block (send (const {nil? cbase} :Array) :new) args _)
|
|
50
|
+
({numblock itblock} (send (const {nil? cbase} :Array) :new) ...)
|
|
51
|
+
}
|
|
52
|
+
PATTERN
|
|
44
53
|
|
|
45
54
|
# @!method hash_with_block(node)
|
|
46
55
|
def_node_matcher :hash_with_block, <<~PATTERN
|
|
47
56
|
{
|
|
48
57
|
(block (send (const {nil? cbase} :Hash) :new) args _)
|
|
49
|
-
(numblock (send (const {nil? cbase} :Hash) :new) ...)
|
|
58
|
+
({numblock itblock} (send (const {nil? cbase} :Hash) :new) ...)
|
|
50
59
|
}
|
|
51
60
|
PATTERN
|
|
52
61
|
|