rubocop 1.81.7 → 1.92.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/config/default.yml +626 -111
- data/config/obsoletion.yml +39 -1
- data/exe/rubocop +1 -1
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +50 -5
- data/lib/rubocop/changed_files.rb +134 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +34 -2
- data/lib/rubocop/cli/command/cop_names.rb +57 -0
- data/lib/rubocop/cli/command/execute_runner.rb +54 -3
- data/lib/rubocop/cli/command/explain.rb +34 -0
- 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 +8 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +8 -10
- data/lib/rubocop/cli/command/suggest_extensions.rb +1 -1
- data/lib/rubocop/cli.rb +41 -14
- data/lib/rubocop/comment_config/directive_range.rb +34 -0
- data/lib/rubocop/comment_config/disable_next.rb +143 -0
- data/lib/rubocop/comment_config/push_pop.rb +55 -0
- data/lib/rubocop/comment_config.rb +97 -44
- data/lib/rubocop/config.rb +100 -15
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +49 -27
- data/lib/rubocop/config_loader_resolver.rb +95 -20
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
- data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +1 -1
- data/lib/rubocop/config_store.rb +2 -2
- data/lib/rubocop/config_validator.rb +69 -7
- data/lib/rubocop/cop/autocorrect_logic.rb +24 -6
- data/lib/rubocop/cop/badge.rb +10 -2
- data/lib/rubocop/cop/base.rb +128 -35
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -4
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -10
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/cop_documentation.rb +81 -0
- data/lib/rubocop/cop/cop_explanation.rb +140 -0
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +87 -9
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +37 -7
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +31 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +35 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +70 -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 +3 -4
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +14 -4
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -8
- data/lib/rubocop/cop/gemspec/require_mfa.rb +9 -6
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator.rb +5 -1
- 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 +28 -2
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +12 -16
- 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 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +0 -7
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +9 -3
- 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 +84 -4
- data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
- data/lib/rubocop/cop/layout/class_structure.rb +156 -41
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +4 -0
- data/lib/rubocop/cop/layout/dot_position.rb +26 -16
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -14
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +25 -7
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +21 -8
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +15 -2
- data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +21 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +23 -15
- data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +81 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +41 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -23
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +16 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +8 -4
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
- data/lib/rubocop/cop/layout/indentation_consistency.rb +22 -5
- data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +158 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +27 -0
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -4
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
- data/lib/rubocop/cop/layout/line_length.rb +265 -29
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +69 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +10 -1
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +65 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +268 -38
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +102 -2
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +19 -5
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +14 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +18 -3
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +4 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +44 -34
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +31 -8
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -12
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
- data/lib/rubocop/cop/lint/ambiguous_range.rb +1 -2
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +6 -1
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +45 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +165 -15
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +405 -28
- 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 +9 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -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 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +2 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +4 -0
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +36 -9
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +75 -37
- data/lib/rubocop/cop/lint/loop.rb +24 -2
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +245 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +46 -18
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- 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 +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +22 -11
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +10 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
- data/lib/rubocop/cop/lint/raise_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +160 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +28 -6
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -4
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +37 -14
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +11 -5
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -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 +2 -1
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +24 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +56 -6
- 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 +33 -2
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +14 -0
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +13 -2
- data/lib/rubocop/cop/lint/symbol_conversion.rb +22 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +72 -4
- 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 +54 -11
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +15 -9
- 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/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/useless_assignment.rb +61 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +40 -4
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +10 -10
- data/lib/rubocop/cop/lint/useless_or.rb +15 -2
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +10 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +11 -5
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +94 -14
- data/lib/rubocop/cop/lint/void.rb +59 -22
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/class_length.rb +4 -2
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
- data/lib/rubocop/cop/metrics/method_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +4 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -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.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +5 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +5 -1
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +47 -25
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +12 -8
- data/lib/rubocop/cop/mixin/code_length.rb +10 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +12 -1
- data/lib/rubocop/cop/mixin/endless_method_body_help.rb +105 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +2 -2
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +5 -1
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +58 -12
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +37 -10
- data/lib/rubocop/cop/mixin/hash_subset.rb +9 -2
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +14 -60
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +28 -3
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -8
- data/lib/rubocop/cop/mixin/project_index_help.rb +203 -0
- data/lib/rubocop/cop/mixin/range_help.rb +1 -2
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +181 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +69 -12
- data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -6
- data/lib/rubocop/cop/mixin/visibility_help.rb +2 -1
- data/lib/rubocop/cop/mixin.rb +93 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +4 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +4 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -5
- data/lib/rubocop/cop/naming/method_name.rb +6 -3
- data/lib/rubocop/cop/naming/predicate_method.rb +13 -2
- data/lib/rubocop/cop/naming/predicate_prefix.rb +30 -17
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -7
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +108 -9
- data/lib/rubocop/cop/registry.rb +232 -66
- data/lib/rubocop/cop/security/eval.rb +15 -2
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +16 -4
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/severity.rb +12 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +55 -8
- data/lib/rubocop/cop/style/accessor_grouping.rb +16 -5
- data/lib/rubocop/cop/style/alias.rb +33 -8
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
- data/lib/rubocop/cop/style/and_or.rb +8 -3
- data/lib/rubocop/cop/style/arguments_forwarding.rb +61 -17
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +28 -5
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +3 -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 +8 -6
- 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 +7 -6
- data/lib/rubocop/cop/style/block_delimiters.rb +74 -38
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +11 -10
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +151 -35
- data/lib/rubocop/cop/style/class_equality_comparison.rb +21 -13
- data/lib/rubocop/cop/style/class_methods_definitions.rb +26 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_querying.rb +79 -46
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +91 -9
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +65 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +34 -18
- data/lib/rubocop/cop/style/constant_visibility.rb +13 -7
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +18 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -2
- data/lib/rubocop/cop/style/dig_chain.rb +5 -0
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +304 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +184 -20
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +53 -6
- data/lib/rubocop/cop/style/documentation_method.rb +8 -12
- data/lib/rubocop/cop/style/double_negation.rb +11 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +2 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
- 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 +8 -3
- data/lib/rubocop/cop/style/empty_method.rb +15 -9
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +74 -22
- 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 +100 -21
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
- data/lib/rubocop/cop/style/explicit_block_argument.rb +50 -10
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- data/lib/rubocop/cop/style/file_null.rb +6 -4
- 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 +28 -14
- data/lib/rubocop/cop/style/for.rb +60 -1
- data/lib/rubocop/cop/style/format_string.rb +44 -9
- data/lib/rubocop/cop/style/format_string_token.rb +50 -7
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +57 -40
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +31 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +39 -11
- data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
- data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +19 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
- data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +38 -10
- data/lib/rubocop/cop/style/if_inside_else.rb +36 -8
- data/lib/rubocop/cop/style/if_unless_modifier.rb +80 -76
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +17 -14
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +24 -2
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +25 -5
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
- data/lib/rubocop/cop/style/it_block_parameter.rb +94 -4
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +10 -4
- data/lib/rubocop/cop/style/lambda.rb +45 -2
- data/lib/rubocop/cop/style/lambda_call.rb +24 -8
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +2 -3
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +102 -20
- 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 +42 -6
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/min_max_comparison.rb +4 -1
- data/lib/rubocop/cop/style/missing_else.rb +7 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
- data/lib/rubocop/cop/style/mixin_grouping.rb +12 -3
- 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_if_modifier.rb +45 -5
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -13
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +158 -14
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -3
- data/lib/rubocop/cop/style/negative_array_index.rb +228 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +36 -12
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
- data/lib/rubocop/cop/style/next.rb +24 -10
- data/lib/rubocop/cop/style/nil_comparison.rb +50 -12
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
- data/lib/rubocop/cop/style/not.rb +12 -3
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +22 -6
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +18 -6
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +10 -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 +26 -7
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +7 -2
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
- 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 +3 -2
- data/lib/rubocop/cop/style/raise_args.rb +20 -10
- data/lib/rubocop/cop/style/reduce_to_hash.rb +216 -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_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +25 -7
- data/lib/rubocop/cop/style/redundant_condition.rb +41 -23
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +13 -1
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +21 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +10 -2
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +43 -7
- data/lib/rubocop/cop/style/redundant_freeze.rb +11 -3
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +49 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +82 -115
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -83
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +13 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +27 -7
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -4
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +11 -2
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +27 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +45 -11
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +106 -28
- data/lib/rubocop/cop/style/require_order.rb +25 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +15 -14
- data/lib/rubocop/cop/style/return_nil.rb +17 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +18 -9
- data/lib/rubocop/cop/style/sample.rb +19 -13
- 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 +52 -23
- data/lib/rubocop/cop/style/self_assignment.rb +13 -16
- data/lib/rubocop/cop/style/semicolon.rb +39 -13
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +4 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +19 -7
- data/lib/rubocop/cop/style/single_line_methods.rb +24 -5
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +25 -7
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +31 -5
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +25 -6
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +36 -1
- data/lib/rubocop/cop/style/super_arguments.rb +6 -4
- data/lib/rubocop/cop/style/symbol_proc.rb +32 -14
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +34 -1
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- 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 -0
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +26 -12
- data/lib/rubocop/cop/style/yoda_expression.rb +11 -2
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/style.rb +311 -0
- data/lib/rubocop/cop/team.rb +171 -48
- data/lib/rubocop/cop/util.rb +5 -8
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -1
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/variable.rb +33 -9
- data/lib/rubocop/cops_documentation_generator.rb +27 -9
- data/lib/rubocop/directive_comment.rb +116 -7
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/base_formatter.rb +22 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +39 -10
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +7 -2
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +2 -4
- data/lib/rubocop/formatter/json_formatter.rb +82 -7
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/offense_count_formatter.rb +4 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +3 -1
- data/lib/rubocop/formatter/sarif_formatter.rb +186 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +8 -3
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +5 -4
- data/lib/rubocop/formatter.rb +23 -21
- data/lib/rubocop/lockfile.rb +18 -0
- data/lib/rubocop/lsp/diagnostic.rb +22 -42
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +130 -83
- data/lib/rubocop/lsp/runtime.rb +64 -15
- data/lib/rubocop/lsp/server.rb +6 -2
- data/lib/rubocop/lsp/stdin_runner.rb +35 -2
- data/lib/rubocop/lsp.rb +5 -2
- data/lib/rubocop/magic_comment.rb +47 -0
- data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
- data/lib/rubocop/mcp/explain_tool.rb +68 -0
- data/lib/rubocop/mcp/scope.rb +65 -0
- data/lib/rubocop/mcp/server.rb +307 -0
- data/lib/rubocop/mcp/source_files.rb +35 -0
- data/lib/rubocop/offense_limit.rb +30 -0
- data/lib/rubocop/options.rb +141 -13
- data/lib/rubocop/path_util.rb +16 -5
- data/lib/rubocop/pending_cops_reporter.rb +1 -6
- data/lib/rubocop/plugin/configuration_integrator.rb +13 -3
- data/lib/rubocop/plugin/loader.rb +2 -2
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +2 -3
- data/lib/rubocop/remote_config.rb +18 -13
- data/lib/rubocop/result_cache.rb +102 -59
- data/lib/rubocop/rspec/cop_helper.rb +8 -0
- data/lib/rubocop/rspec/expect_offense.rb +2 -4
- data/lib/rubocop/rspec/shared_contexts.rb +53 -5
- data/lib/rubocop/rspec/support.rb +2 -1
- data/lib/rubocop/runner.rb +362 -106
- data/lib/rubocop/server/cache.rb +21 -40
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +18 -8
- data/lib/rubocop/target_ruby.rb +42 -22
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/util.rb +69 -0
- data/lib/rubocop/version.rb +23 -7
- data/lib/rubocop.rb +34 -701
- data/lib/ruby_lsp/rubocop/addon.rb +1 -2
- metadata +80 -14
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
|
@@ -5,6 +5,7 @@ module RuboCop
|
|
|
5
5
|
# Common functionality for modifier cops.
|
|
6
6
|
module StatementModifier
|
|
7
7
|
include LineLengthHelp
|
|
8
|
+
include AllowedPattern
|
|
8
9
|
|
|
9
10
|
private
|
|
10
11
|
|
|
@@ -34,17 +35,58 @@ module RuboCop
|
|
|
34
35
|
condition.each_node.any?(&:lvasgn_type?)
|
|
35
36
|
end
|
|
36
37
|
|
|
38
|
+
# The rendered modifier form is compared against the bare maximum, not
|
|
39
|
+
# `acceptable_line_length?`: `Layout/LineLength`'s exemptions describe
|
|
40
|
+
# long lines the user tolerates, not permission to manufacture new ones,
|
|
41
|
+
# so collapsing to modifier form must never push a line past the maximum.
|
|
37
42
|
def modifier_fits_on_single_line?(node)
|
|
38
43
|
return true unless max_line_length
|
|
39
44
|
|
|
40
|
-
|
|
45
|
+
line_length(line_in_modifier_form(node)) <= max_line_length
|
|
41
46
|
end
|
|
42
47
|
|
|
43
|
-
def
|
|
48
|
+
def line_in_modifier_form(node)
|
|
44
49
|
keyword_element = node.loc.keyword
|
|
45
50
|
code_before = keyword_element.source_line[0...keyword_element.column]
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
|
|
52
|
+
"#{code_before}#{to_modifier_form(node)}#{code_after(node)}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Whether an existing line is acceptable to `Layout/LineLength`,
|
|
56
|
+
# exemptions (the cop disabled at that line, an allowed pattern, an
|
|
57
|
+
# allowed cop directive, an allowed URI) included. Only for judging
|
|
58
|
+
# lines already in the source as too long - see
|
|
59
|
+
# `modifier_fits_on_single_line?` for why the exemptions must not apply
|
|
60
|
+
# when deciding whether a modifier line may be created.
|
|
61
|
+
def acceptable_line_length?(line, line_number)
|
|
62
|
+
return true unless max_line_length
|
|
63
|
+
return true if line_length(line) <= max_line_length
|
|
64
|
+
return true unless line_length_enabled_at_line?(line_number)
|
|
65
|
+
return true if matches_allowed_pattern?(line)
|
|
66
|
+
|
|
67
|
+
if allow_cop_directives? && directive_on_source_line?(line_number - 1)
|
|
68
|
+
return line_length_without_directive(line) <= max_line_length
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
allowed_by_uri?(line)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def allowed_by_uri?(line)
|
|
75
|
+
return false unless allow_uri?
|
|
76
|
+
|
|
77
|
+
uri_range = find_excessive_range(line, :uri)
|
|
78
|
+
!uri_range.nil? && allowed_position?(line, uri_range)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def line_length_enabled_at_line?(line)
|
|
82
|
+
processed_source.comment_config.cop_enabled_at_line?('Layout/LineLength', line)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# `Layout/LineLength`'s allowed patterns, so a modifier line that the
|
|
86
|
+
# user has configured that cop to accept is not flagged for length here.
|
|
87
|
+
def allowed_patterns
|
|
88
|
+
line_length_config = config.for_cop('Layout/LineLength')
|
|
89
|
+
line_length_config['AllowedPatterns'] || line_length_config['IgnoredPatterns'] || []
|
|
48
90
|
end
|
|
49
91
|
|
|
50
92
|
def to_modifier_form(node)
|
|
@@ -54,15 +96,22 @@ module RuboCop
|
|
|
54
96
|
[parenthesized, first_line_comment(node)].compact.join(' ')
|
|
55
97
|
end
|
|
56
98
|
|
|
99
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
57
100
|
def if_body_source(if_body)
|
|
58
|
-
if
|
|
101
|
+
if unparenthesized_call_with_omitted_value?(if_body)
|
|
59
102
|
"#{method_source(if_body)}(#{if_body.arguments.map(&:source).join(', ')})"
|
|
103
|
+
elsif (value = wrapped_value(if_body))
|
|
104
|
+
prefix = if_body.source_range.begin.join(value.source_range.begin).source
|
|
105
|
+
suffix = value.source_range.end.join(if_body.source_range.end).source
|
|
106
|
+
|
|
107
|
+
"#{prefix}#{if_body_source(value)}#{suffix}"
|
|
60
108
|
else
|
|
61
109
|
if_body.source
|
|
62
110
|
end
|
|
63
111
|
end
|
|
64
112
|
|
|
65
|
-
def
|
|
113
|
+
def unparenthesized_call_with_omitted_value?(if_body)
|
|
114
|
+
return false if !if_body.call_type? || if_body.method?(:[]=) || if_body.parenthesized?
|
|
66
115
|
return false unless (last_argument = if_body.last_argument)
|
|
67
116
|
|
|
68
117
|
last_argument.hash_type? && last_argument.pairs.last&.value_omission?
|
|
@@ -74,8 +123,16 @@ module RuboCop
|
|
|
74
123
|
if_body.source_range.begin.join(end_range).source
|
|
75
124
|
end
|
|
76
125
|
|
|
126
|
+
def wrapped_value(if_body)
|
|
127
|
+
if if_body.type?(:return, :next, :break)
|
|
128
|
+
if_body.first_argument if if_body.arguments.one?
|
|
129
|
+
elsif if_body.type?(:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn)
|
|
130
|
+
if_body.expression
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
77
134
|
def first_line_comment(node)
|
|
78
|
-
comment = processed_source.
|
|
135
|
+
comment = processed_source.comment_at_line(node.first_line)
|
|
79
136
|
return unless comment
|
|
80
137
|
|
|
81
138
|
comment_source = comment.source
|
|
@@ -95,15 +152,15 @@ module RuboCop
|
|
|
95
152
|
parent = node.parent
|
|
96
153
|
return false if parent.nil?
|
|
97
154
|
return true if parent.assignment? || parent.operator_keyword?
|
|
98
|
-
return true if
|
|
155
|
+
return true if parent.type?(:array, :pair, :call, :yield, :super)
|
|
99
156
|
|
|
100
|
-
|
|
157
|
+
ternary_branch_or_endless_method_body?(parent)
|
|
101
158
|
end
|
|
102
159
|
|
|
103
|
-
def
|
|
104
|
-
return
|
|
160
|
+
def ternary_branch_or_endless_method_body?(parent)
|
|
161
|
+
return parent.ternary? if parent.if_type?
|
|
105
162
|
|
|
106
|
-
|
|
163
|
+
parent.any_def_type? && parent.endless?
|
|
107
164
|
end
|
|
108
165
|
|
|
109
166
|
def comment_disables_cop?(comment)
|
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
# Common methods shared by Style/TrailingCommaInArguments,
|
|
6
6
|
# Style/TrailingCommaInArrayLiteral and Style/TrailingCommaInHashLiteral
|
|
7
|
-
# rubocop:disable Metrics/ModuleLength
|
|
7
|
+
# rubocop:disable-next Metrics/ModuleLength
|
|
8
8
|
module TrailingComma
|
|
9
9
|
include ConfigurableEnforcedStyle
|
|
10
10
|
include RangeHelp
|
|
@@ -95,12 +95,14 @@ module RuboCop
|
|
|
95
95
|
node.multiline? && !allowed_multiline_argument?(node)
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
98
99
|
def method_name_and_arguments_on_same_line?(node)
|
|
99
|
-
return false
|
|
100
|
+
return false if !node.call_type? || node.last_line != node.last_argument.last_line
|
|
101
|
+
return true if node.last_argument.hash_type? && node.last_argument.braces?
|
|
100
102
|
|
|
101
|
-
line = node.loc.selector
|
|
103
|
+
line = node.loc.selector&.line || node.loc.line
|
|
102
104
|
|
|
103
|
-
line == node.last_argument.last_line
|
|
105
|
+
line == node.last_argument.last_line
|
|
104
106
|
end
|
|
105
107
|
|
|
106
108
|
# A single argument with the closing bracket on the same line as the end
|
|
@@ -185,7 +187,7 @@ module RuboCop
|
|
|
185
187
|
|
|
186
188
|
def heredoc?(node)
|
|
187
189
|
return false unless node.is_a?(RuboCop::AST::Node)
|
|
188
|
-
return true if node.loc
|
|
190
|
+
return true if node.loc?(:heredoc_body)
|
|
189
191
|
|
|
190
192
|
return heredoc_send?(node) if node.send_type?
|
|
191
193
|
|
|
@@ -220,6 +222,5 @@ module RuboCop
|
|
|
220
222
|
false
|
|
221
223
|
end
|
|
222
224
|
end
|
|
223
|
-
# rubocop:enable Metrics/ModuleLength
|
|
224
225
|
end
|
|
225
226
|
end
|
|
@@ -63,9 +63,10 @@ module RuboCop
|
|
|
63
63
|
(send nil? VISIBILITY_SCOPES def)
|
|
64
64
|
PATTERN
|
|
65
65
|
|
|
66
|
+
# A modifier applies to every symbol it is given, not only to a sole argument.
|
|
66
67
|
# @!method visibility_inline_on_method_name?(node, method_name:)
|
|
67
68
|
def_node_matcher :visibility_inline_on_method_name?, <<~PATTERN
|
|
68
|
-
(send nil? VISIBILITY_SCOPES (sym %method_name))
|
|
69
|
+
(send nil? VISIBILITY_SCOPES <(sym %method_name) ...>)
|
|
69
70
|
PATTERN
|
|
70
71
|
end
|
|
71
72
|
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop # rubocop:disable Style/Documentation -- a namespace that only autoloads the mixins below
|
|
5
|
+
# Autoloads mixin modules included by cops. Mixins are autoloaded to reduce the number of
|
|
6
|
+
# requires because they're used only when the relevant cop class is loaded.
|
|
7
|
+
|
|
8
|
+
autoload :ArrayMinSize, "#{__dir__}/mixin/array_min_size"
|
|
9
|
+
autoload :ArraySyntax, "#{__dir__}/mixin/array_syntax"
|
|
10
|
+
autoload :Alignment, "#{__dir__}/mixin/alignment"
|
|
11
|
+
autoload :AllowedIdentifiers, "#{__dir__}/mixin/allowed_identifiers"
|
|
12
|
+
autoload :AllowedMethods, "#{__dir__}/mixin/allowed_methods"
|
|
13
|
+
autoload :AllowedPattern, "#{__dir__}/mixin/allowed_pattern"
|
|
14
|
+
autoload :AllowedReceivers, "#{__dir__}/mixin/allowed_receivers"
|
|
15
|
+
autoload :ForbiddenIdentifiers, "#{__dir__}/mixin/forbidden_identifiers"
|
|
16
|
+
autoload :ForbiddenPattern, "#{__dir__}/mixin/forbidden_pattern"
|
|
17
|
+
autoload :AutoCorrector, "#{__dir__}/mixin/auto_corrector" # rubocop:todo Naming/InclusiveLanguage -- the file is named `auto_corrector.rb`
|
|
18
|
+
autoload :CheckAssignment, "#{__dir__}/mixin/check_assignment"
|
|
19
|
+
autoload :CheckLineBreakable, "#{__dir__}/mixin/check_line_breakable"
|
|
20
|
+
autoload :CheckSingleLineSuitability, "#{__dir__}/mixin/check_single_line_suitability"
|
|
21
|
+
autoload :ConfigurableMax, "#{__dir__}/mixin/configurable_max"
|
|
22
|
+
autoload :CodeLength, "#{__dir__}/mixin/code_length"
|
|
23
|
+
autoload :ConfigurableEnforcedStyle, "#{__dir__}/mixin/configurable_enforced_style"
|
|
24
|
+
autoload :ConfigurableFormatting, "#{__dir__}/mixin/configurable_formatting"
|
|
25
|
+
autoload :ConfigurableNaming, "#{__dir__}/mixin/configurable_naming"
|
|
26
|
+
autoload :ConfigurableNumbering, "#{__dir__}/mixin/configurable_numbering"
|
|
27
|
+
autoload :DigHelp, "#{__dir__}/mixin/dig_help"
|
|
28
|
+
autoload :DocumentationComment, "#{__dir__}/mixin/documentation_comment"
|
|
29
|
+
autoload :Duplication, "#{__dir__}/mixin/duplication"
|
|
30
|
+
autoload :RangeHelp, "#{__dir__}/mixin/range_help"
|
|
31
|
+
autoload :ProjectIndexHelp, "#{__dir__}/mixin/project_index_help"
|
|
32
|
+
autoload :AnnotationComment, "#{__dir__}/mixin/annotation_comment"
|
|
33
|
+
autoload :EmptyParameter, "#{__dir__}/mixin/empty_parameter"
|
|
34
|
+
autoload :EndKeywordAlignment, "#{__dir__}/mixin/end_keyword_alignment"
|
|
35
|
+
autoload :EndlessMethodBodyHelp, "#{__dir__}/mixin/endless_method_body_help"
|
|
36
|
+
autoload :EndlessMethodRewriter, "#{__dir__}/mixin/endless_method_rewriter"
|
|
37
|
+
autoload :EnforceSuperclass, "#{__dir__}/mixin/enforce_superclass"
|
|
38
|
+
autoload :FirstElementLineBreak, "#{__dir__}/mixin/first_element_line_break"
|
|
39
|
+
autoload :FrozenStringLiteral, "#{__dir__}/mixin/frozen_string_literal"
|
|
40
|
+
autoload :GemDeclaration, "#{__dir__}/mixin/gem_declaration"
|
|
41
|
+
autoload :GemspecHelp, "#{__dir__}/mixin/gemspec_help"
|
|
42
|
+
autoload :HashAlignmentStyles, "#{__dir__}/mixin/hash_alignment_styles"
|
|
43
|
+
autoload :HashSubset, "#{__dir__}/mixin/hash_subset"
|
|
44
|
+
autoload :HashTransformMethod, "#{__dir__}/mixin/hash_transform_method"
|
|
45
|
+
# Deprecated aliases of `AllowedMethods` and `AllowedPattern`, defined in those files.
|
|
46
|
+
autoload :IgnoredMethods, "#{__dir__}/mixin/allowed_methods"
|
|
47
|
+
autoload :IgnoredPattern, "#{__dir__}/mixin/allowed_pattern"
|
|
48
|
+
autoload :IndexedMethodArity, "#{__dir__}/mixin/indexed_method_arity"
|
|
49
|
+
autoload :IntegerNode, "#{__dir__}/mixin/integer_node"
|
|
50
|
+
autoload :Interpolation, "#{__dir__}/mixin/interpolation"
|
|
51
|
+
autoload :LineLengthHelp, "#{__dir__}/mixin/line_length_help"
|
|
52
|
+
autoload :MatchRange, "#{__dir__}/mixin/match_range"
|
|
53
|
+
autoload :HashShorthandSyntax, "#{__dir__}/mixin/hash_shorthand_syntax"
|
|
54
|
+
autoload :MethodComplexity, "#{__dir__}/mixin/method_complexity"
|
|
55
|
+
autoload :MethodPreference, "#{__dir__}/mixin/method_preference"
|
|
56
|
+
autoload :MinBodyLength, "#{__dir__}/mixin/min_body_length"
|
|
57
|
+
autoload :MinBranchesCount, "#{__dir__}/mixin/min_branches_count"
|
|
58
|
+
autoload :MultilineElementIndentation, "#{__dir__}/mixin/multiline_element_indentation"
|
|
59
|
+
autoload :MultilineElementLineBreaks, "#{__dir__}/mixin/multiline_element_line_breaks"
|
|
60
|
+
autoload :MultilineExpressionIndentation, "#{__dir__}/mixin/multiline_expression_indentation"
|
|
61
|
+
autoload :MultilineLiteralBraceLayout, "#{__dir__}/mixin/multiline_literal_brace_layout"
|
|
62
|
+
autoload :NegativeConditional, "#{__dir__}/mixin/negative_conditional"
|
|
63
|
+
autoload :Heredoc, "#{__dir__}/mixin/heredoc"
|
|
64
|
+
autoload :NilMethods, "#{__dir__}/mixin/nil_methods"
|
|
65
|
+
autoload :OnNormalIfUnless, "#{__dir__}/mixin/on_normal_if_unless"
|
|
66
|
+
autoload :OrderedGemNode, "#{__dir__}/mixin/ordered_gem_node"
|
|
67
|
+
autoload :Parentheses, "#{__dir__}/mixin/parentheses"
|
|
68
|
+
autoload :PatternMatchingHelp, "#{__dir__}/mixin/pattern_matching_help"
|
|
69
|
+
autoload :PercentArray, "#{__dir__}/mixin/percent_array"
|
|
70
|
+
autoload :PercentLiteral, "#{__dir__}/mixin/percent_literal"
|
|
71
|
+
autoload :PrecedingFollowingAlignment, "#{__dir__}/mixin/preceding_following_alignment"
|
|
72
|
+
autoload :PreferredDelimiters, "#{__dir__}/mixin/preferred_delimiters"
|
|
73
|
+
autoload :RationalLiteral, "#{__dir__}/mixin/rational_literal"
|
|
74
|
+
autoload :ReparsedEquivalence, "#{__dir__}/mixin/reparsed_equivalence"
|
|
75
|
+
autoload :RequireLibrary, "#{__dir__}/mixin/require_library"
|
|
76
|
+
autoload :RescueNode, "#{__dir__}/mixin/rescue_node"
|
|
77
|
+
autoload :SafeAssignment, "#{__dir__}/mixin/safe_assignment"
|
|
78
|
+
autoload :SpaceAfterPunctuation, "#{__dir__}/mixin/space_after_punctuation"
|
|
79
|
+
autoload :SpaceBeforePunctuation, "#{__dir__}/mixin/space_before_punctuation"
|
|
80
|
+
autoload :SurroundingSpace, "#{__dir__}/mixin/surrounding_space"
|
|
81
|
+
autoload :StatementModifier, "#{__dir__}/mixin/statement_modifier"
|
|
82
|
+
autoload :StringHelp, "#{__dir__}/mixin/string_help"
|
|
83
|
+
autoload :StringLiteralsHelp, "#{__dir__}/mixin/string_literals_help"
|
|
84
|
+
autoload :SymbolHelp, "#{__dir__}/mixin/symbol_help"
|
|
85
|
+
autoload :TargetRubyVersion, "#{__dir__}/mixin/target_ruby_version"
|
|
86
|
+
autoload :TrailingBody, "#{__dir__}/mixin/trailing_body"
|
|
87
|
+
autoload :TrailingComma, "#{__dir__}/mixin/trailing_comma"
|
|
88
|
+
autoload :UncommunicativeName, "#{__dir__}/mixin/uncommunicative_name"
|
|
89
|
+
autoload :VisibilityHelp, "#{__dir__}/mixin/visibility_help"
|
|
90
|
+
autoload :CommentsHelp, "#{__dir__}/mixin/comments_help"
|
|
91
|
+
autoload :DefNode, "#{__dir__}/mixin/def_node"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -11,6 +11,11 @@ module RuboCop
|
|
|
11
11
|
# Getters (`get_attribute`) must have no arguments to be registered,
|
|
12
12
|
# and setters (`set_attribute(value)`) must have exactly one.
|
|
13
13
|
#
|
|
14
|
+
# When `AllCops/UseProjectIndex` is enabled and the `rubydex` gem is
|
|
15
|
+
# installed, methods that override a method defined by an ancestor
|
|
16
|
+
# elsewhere in the project are not reported, since renaming an override
|
|
17
|
+
# breaks the inherited contract.
|
|
18
|
+
#
|
|
14
19
|
# @example
|
|
15
20
|
# # bad
|
|
16
21
|
# def set_attribute(value)
|
|
@@ -36,12 +41,15 @@ module RuboCop
|
|
|
36
41
|
# def set_value
|
|
37
42
|
# end
|
|
38
43
|
class AccessorMethodName < Base
|
|
44
|
+
include ProjectIndexHelp
|
|
45
|
+
|
|
39
46
|
MSG_READER = 'Do not prefix reader method names with `get_`.'
|
|
40
47
|
MSG_WRITER = 'Do not prefix writer method names with `set_`.'
|
|
41
48
|
|
|
42
49
|
def on_def(node)
|
|
43
50
|
return unless proper_attribute_name?(node)
|
|
44
51
|
return unless bad_reader_name?(node) || bad_writer_name?(node)
|
|
52
|
+
return if overrides_inherited_method?(node)
|
|
45
53
|
|
|
46
54
|
message = message(node)
|
|
47
55
|
|
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Naming
|
|
6
6
|
# Makes sure that certain binary operator methods have their
|
|
7
|
-
# sole
|
|
7
|
+
# sole parameter named `other`.
|
|
8
8
|
#
|
|
9
9
|
# @example
|
|
10
10
|
#
|
|
@@ -33,6 +33,7 @@ module RuboCop
|
|
|
33
33
|
node.each_descendant(:lvar, :lvasgn) do |lvar|
|
|
34
34
|
lvar_location = lvar.loc.name
|
|
35
35
|
next unless lvar_location.source == arg.source
|
|
36
|
+
next if shadowed?(lvar, arg.source, node)
|
|
36
37
|
|
|
37
38
|
corrector.replace(lvar_location, 'other')
|
|
38
39
|
end
|
|
@@ -47,6 +48,21 @@ module RuboCop
|
|
|
47
48
|
|
|
48
49
|
!/\A[[:word:]]/.match?(name) || OP_LIKE_METHODS.include?(name)
|
|
49
50
|
end
|
|
51
|
+
|
|
52
|
+
# A reference is shadowed when an enclosing block within the method redeclares the
|
|
53
|
+
# parameter name (as a block parameter or block-local). Such a reference points to
|
|
54
|
+
# the block's variable, not the operator's parameter, so it must not be renamed.
|
|
55
|
+
def shadowed?(node, name, def_node)
|
|
56
|
+
node.each_ancestor(:block).any? do |block|
|
|
57
|
+
def_node.source_range.contains?(block.source_range) && redeclares?(block, name)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def redeclares?(block, name)
|
|
62
|
+
block.arguments.any? do |argument|
|
|
63
|
+
argument.respond_to?(:name) && argument.name.to_s == name
|
|
64
|
+
end
|
|
65
|
+
end
|
|
50
66
|
end
|
|
51
67
|
end
|
|
52
68
|
end
|
|
@@ -62,7 +62,10 @@ module RuboCop
|
|
|
62
62
|
MSG = 'Use %<style>s block forwarding.'
|
|
63
63
|
|
|
64
64
|
def self.autocorrect_incompatible_with
|
|
65
|
-
[
|
|
65
|
+
[
|
|
66
|
+
Lint::AmbiguousOperator, Style::ArgumentsForwarding, Style::EndlessMethod,
|
|
67
|
+
Style::ExplicitBlockArgument, Style::MethodDefParentheses
|
|
68
|
+
]
|
|
66
69
|
end
|
|
67
70
|
|
|
68
71
|
def on_def(node)
|
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
|
38
38
|
class BlockParameterName < Base
|
|
39
39
|
include UncommunicativeName
|
|
40
40
|
|
|
41
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
41
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler -- there are no parameter names to check
|
|
42
42
|
return unless node.arguments?
|
|
43
43
|
|
|
44
44
|
check(node, node.arguments)
|
|
@@ -203,9 +203,10 @@ module RuboCop
|
|
|
203
203
|
|
|
204
204
|
def match_acronym?(expected, name)
|
|
205
205
|
expected = expected.to_s
|
|
206
|
-
name = name.to_s
|
|
207
|
-
|
|
208
|
-
|
|
206
|
+
name = allowed_acronyms.reduce(name.to_s) do |result, acronym|
|
|
207
|
+
result.gsub(acronym, acronym.capitalize)
|
|
208
|
+
end
|
|
209
|
+
expected == name
|
|
209
210
|
end
|
|
210
211
|
|
|
211
212
|
def to_namespace(path) # rubocop:disable Metrics/AbcSize
|
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
|
35
35
|
MSG = 'Use %<style>s heredoc delimiters.'
|
|
36
36
|
|
|
37
37
|
def on_heredoc(node)
|
|
38
|
-
return if correct_case_delimiters?(node)
|
|
38
|
+
return if correct_case_delimiters?(node) || corrected_delimiter_in_body?(node)
|
|
39
39
|
|
|
40
40
|
add_offense(node.loc.heredoc_end) do |corrector|
|
|
41
41
|
expr = node.source_range
|
|
@@ -52,7 +52,14 @@ module RuboCop
|
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
def correct_case_delimiters?(node)
|
|
55
|
-
|
|
55
|
+
delimiters = delimiter_string(node)
|
|
56
|
+
delimiters == correct_delimiters(delimiters)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def corrected_delimiter_in_body?(node)
|
|
60
|
+
corrected = correct_delimiters(delimiter_string(node))
|
|
61
|
+
|
|
62
|
+
node.loc.heredoc_body.source.each_line.any? { |line| line.strip == corrected }
|
|
56
63
|
end
|
|
57
64
|
|
|
58
65
|
def correct_delimiters(source)
|
|
@@ -43,9 +43,11 @@ module RuboCop
|
|
|
43
43
|
|
|
44
44
|
return false unless /\w/.match?(delimiters)
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
forbidden_delimiter_regexps.none? { |regexp| regexp.match?(delimiters) }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def forbidden_delimiter_regexps
|
|
50
|
+
@forbidden_delimiter_regexps ||= forbidden_delimiters.map { |d| Regexp.new(d) }
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
def forbidden_delimiters
|
|
@@ -91,6 +91,8 @@ module RuboCop
|
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
def on_new_investigation
|
|
94
|
+
return unless @flagged_terms_regex
|
|
95
|
+
|
|
94
96
|
investigate_filepath if cop_config['CheckFilepaths']
|
|
95
97
|
investigate_tokens
|
|
96
98
|
end
|
|
@@ -144,7 +146,7 @@ module RuboCop
|
|
|
144
146
|
def preprocess_flagged_terms
|
|
145
147
|
allowed_strings = []
|
|
146
148
|
flagged_term_strings = []
|
|
147
|
-
cop_config['FlaggedTerms'].each do |term, term_definition|
|
|
149
|
+
(cop_config['FlaggedTerms'] || {}).each do |term, term_definition|
|
|
148
150
|
next if term_definition.nil?
|
|
149
151
|
|
|
150
152
|
allowed_strings.concat(process_allowed_regex(term_definition['AllowedRegex']))
|
|
@@ -181,7 +183,11 @@ module RuboCop
|
|
|
181
183
|
end
|
|
182
184
|
|
|
183
185
|
def set_regexes(flagged_term_strings, allowed_strings)
|
|
184
|
-
|
|
186
|
+
# With no flagged terms an empty regex would match everything, so leave the
|
|
187
|
+
# regex nil and let `on_new_investigation` treat the cop as a no-op.
|
|
188
|
+
unless flagged_term_strings.empty?
|
|
189
|
+
@flagged_terms_regex = array_to_ignorecase_regex(flagged_term_strings)
|
|
190
|
+
end
|
|
185
191
|
@allowed_regex = array_to_ignorecase_regex(allowed_strings) unless allowed_strings.empty?
|
|
186
192
|
end
|
|
187
193
|
|
|
@@ -109,7 +109,7 @@ module RuboCop
|
|
|
109
109
|
# @_foo = calculate_expensive_thing
|
|
110
110
|
# end
|
|
111
111
|
#
|
|
112
|
-
# @example EnforcedStyleForLeadingUnderscores
|
|
112
|
+
# @example EnforcedStyleForLeadingUnderscores: optional
|
|
113
113
|
# # bad
|
|
114
114
|
# def foo
|
|
115
115
|
# @something ||= calculate_expensive_thing
|
|
@@ -167,13 +167,14 @@ module RuboCop
|
|
|
167
167
|
PATTERN
|
|
168
168
|
|
|
169
169
|
# rubocop:disable Metrics/AbcSize
|
|
170
|
-
# rubocop:disable Metrics/MethodLength
|
|
170
|
+
# rubocop:disable-next Metrics/MethodLength
|
|
171
171
|
def on_or_asgn(node)
|
|
172
172
|
lhs = node.lhs
|
|
173
173
|
return unless lhs.ivasgn_type?
|
|
174
174
|
|
|
175
175
|
method_node, method_name = find_definition(node)
|
|
176
176
|
return unless method_node
|
|
177
|
+
return unless nameable_method?(method_name)
|
|
177
178
|
|
|
178
179
|
body = method_node.body
|
|
179
180
|
return unless body == node || body.children.last == node
|
|
@@ -191,7 +192,6 @@ module RuboCop
|
|
|
191
192
|
corrector.replace(lhs.loc.name, "@#{suggested_var}")
|
|
192
193
|
end
|
|
193
194
|
end
|
|
194
|
-
# rubocop:enable Metrics/MethodLength
|
|
195
195
|
# rubocop:enable Metrics/AbcSize
|
|
196
196
|
|
|
197
197
|
# @!method defined_memoized?(node, ivar)
|
|
@@ -202,13 +202,14 @@ module RuboCop
|
|
|
202
202
|
$(ivasgn %1 _))
|
|
203
203
|
PATTERN
|
|
204
204
|
|
|
205
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
205
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/MethodLength
|
|
206
206
|
def on_defined?(node)
|
|
207
207
|
arg = node.first_argument
|
|
208
208
|
return false unless arg.ivar_type?
|
|
209
209
|
|
|
210
210
|
method_node, method_name = find_definition(node)
|
|
211
211
|
return false unless method_node
|
|
212
|
+
return false unless nameable_method?(method_name)
|
|
212
213
|
|
|
213
214
|
defined_memoized?(method_node.body, arg.name) do |defined_ivar, return_ivar, ivar_assign|
|
|
214
215
|
return false if matches?(method_name, ivar_assign)
|
|
@@ -231,7 +232,6 @@ module RuboCop
|
|
|
231
232
|
end
|
|
232
233
|
end
|
|
233
234
|
end
|
|
234
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
235
235
|
|
|
236
236
|
private
|
|
237
237
|
|
|
@@ -250,6 +250,13 @@ module RuboCop
|
|
|
250
250
|
nil
|
|
251
251
|
end
|
|
252
252
|
|
|
253
|
+
# Operator and other non-word method names (e.g. `[]`, `+`, `<=>`) cannot form a
|
|
254
|
+
# valid instance variable name, so there is no matching ivar to enforce and a
|
|
255
|
+
# suggested correction like `@[]` would be invalid Ruby.
|
|
256
|
+
def nameable_method?(method_name)
|
|
257
|
+
/\A[a-zA-Z_]\w*\z/.match?(method_name.to_s.delete('!?='))
|
|
258
|
+
end
|
|
259
|
+
|
|
253
260
|
def matches?(method_name, ivar_assign)
|
|
254
261
|
return true if ivar_assign.nil? || INITIALIZE_METHODS.include?(method_name)
|
|
255
262
|
|
|
@@ -105,6 +105,10 @@ module RuboCop
|
|
|
105
105
|
|
|
106
106
|
MSG = 'Use %<style>s for method names.'
|
|
107
107
|
MSG_FORBIDDEN = '`%<identifier>s` is forbidden, use another method name instead.'
|
|
108
|
+
RESTRICT_ON_SEND = %i[
|
|
109
|
+
define_method define_singleton_method new define alias_method
|
|
110
|
+
attr attr_reader attr_writer attr_accessor
|
|
111
|
+
].freeze
|
|
108
112
|
|
|
109
113
|
OPERATOR_METHODS = %i[| ^ & <=> == === =~ > >= < <= << >> + - * /
|
|
110
114
|
% ** ~ +@ -@ !@ ~@ [] []= ! != !~ `].to_set.freeze
|
|
@@ -209,7 +213,7 @@ module RuboCop
|
|
|
209
213
|
forbidden_identifier?(name) || forbidden_pattern?(name)
|
|
210
214
|
end
|
|
211
215
|
|
|
212
|
-
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
216
|
+
# rubocop:disable-next Metrics/MethodLength, Metrics/AbcSize
|
|
213
217
|
def register_forbidden_name(node)
|
|
214
218
|
if node.any_def_type?
|
|
215
219
|
name_node = node.loc.name
|
|
@@ -227,14 +231,13 @@ module RuboCop
|
|
|
227
231
|
message = format(MSG_FORBIDDEN, identifier: method_name)
|
|
228
232
|
add_offense(name_node, message: message)
|
|
229
233
|
end
|
|
230
|
-
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
231
234
|
|
|
232
235
|
def attr_name(name_item)
|
|
233
236
|
sym_name(name_item) || str_name(name_item)
|
|
234
237
|
end
|
|
235
238
|
|
|
236
239
|
def range_position(node)
|
|
237
|
-
if node.loc
|
|
240
|
+
if node.loc?(:selector)
|
|
238
241
|
selector_end_pos = node.loc.selector.end_pos + 1
|
|
239
242
|
expr_end_pos = node.source_range.end_pos
|
|
240
243
|
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
# Checks that predicate methods end with `?` and non-predicate methods do not.
|
|
7
7
|
#
|
|
8
8
|
# The names of predicate methods (methods that return a boolean value) should end
|
|
9
|
-
# in a question mark. Methods that don't return a boolean
|
|
9
|
+
# in a question mark. Methods that don't return a boolean shouldn't
|
|
10
10
|
# end in a question mark.
|
|
11
11
|
#
|
|
12
12
|
# The cop assesses a predicate method as one that returns boolean values. Likewise,
|
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
|
22
22
|
# return values are detected.
|
|
23
23
|
#
|
|
24
24
|
# The cop also has `AllowedMethods` configuration in order to prevent the cop from
|
|
25
|
-
# registering an offense from a method name that does not
|
|
25
|
+
# registering an offense from a method name that does not conform to the naming
|
|
26
26
|
# guidelines. By default, `call` is allowed. The cop also has `AllowedPatterns`
|
|
27
27
|
# configuration to allow method names by regular expression.
|
|
28
28
|
#
|
|
@@ -137,6 +137,17 @@ module RuboCop
|
|
|
137
137
|
# true
|
|
138
138
|
# end
|
|
139
139
|
#
|
|
140
|
+
# @example WaywardPredicates: ['infinite?', 'nonzero?'] (default)
|
|
141
|
+
# # good
|
|
142
|
+
# def non_predicate_method(num)
|
|
143
|
+
# num.infinite?
|
|
144
|
+
# end
|
|
145
|
+
#
|
|
146
|
+
# # good
|
|
147
|
+
# def non_predicate_method(num)
|
|
148
|
+
# num.nonzero?
|
|
149
|
+
# end
|
|
150
|
+
#
|
|
140
151
|
class PredicateMethod < Base
|
|
141
152
|
include AllowedMethods
|
|
142
153
|
include AllowedPattern
|