rubocop 1.69.2 → 1.75.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 +4 -4
- data/config/default.yml +154 -23
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +3 -1
- data/lib/rubocop/cli/command/execute_runner.rb +3 -3
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli.rb +1 -1
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +52 -9
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_validator.rb +20 -9
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/base.rb +6 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -3
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +230 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
- data/lib/rubocop/cop/internal_affairs.rb +6 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +28 -1
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +9 -4
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -5
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -17
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +103 -9
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +12 -9
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +13 -13
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +0 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
- data/lib/rubocop/cop/mixin/range_help.rb +15 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +64 -8
- data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
- data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +39 -28
- data/lib/rubocop/cop/style/block_delimiters.rb +9 -21
- data/lib/rubocop/cop/style/class_and_module_children.rb +35 -10
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +10 -3
- data/lib/rubocop/cop/style/comparable_between.rb +75 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +9 -4
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +4 -4
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -0
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/guard_clause.rb +2 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +24 -148
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +105 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
- data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +100 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +1 -0
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +2 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +23 -16
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
- data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/object_then.rb +14 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +14 -12
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +59 -2
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_format.rb +257 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
- data/lib/rubocop/cop/style/redundant_parentheses.rb +30 -15
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_self.rb +1 -0
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
- data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +41 -106
- data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +10 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cop/variable_force.rb +1 -1
- data/lib/rubocop/cops_documentation_generator.rb +25 -14
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +7 -23
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/magic_comment.rb +8 -0
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/rake_task.rb +4 -1
- data/lib/rubocop/result_cache.rb +13 -13
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +39 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +10 -7
- data/lib/rubocop/server/cache.rb +47 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +2 -1
- data/lib/rubocop/target_ruby.rb +16 -1
- data/lib/rubocop/version.rb +30 -8
- data/lib/rubocop.rb +16 -1
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +59 -16
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -96,11 +96,7 @@ module RuboCop
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def autocorrect(corrector, node, if_branch)
|
99
|
-
if node.
|
100
|
-
corrector.wrap(node.condition, '(', ')')
|
101
|
-
end
|
102
|
-
|
103
|
-
if outer_condition_modify_form?(node, if_branch)
|
99
|
+
if node.modifier_form?
|
104
100
|
autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
105
101
|
else
|
106
102
|
autocorrect_outer_condition_basic(corrector, node, if_branch)
|
@@ -108,74 +104,48 @@ module RuboCop
|
|
108
104
|
end
|
109
105
|
|
110
106
|
def autocorrect_outer_condition_basic(corrector, node, if_branch)
|
111
|
-
|
112
|
-
|
113
|
-
outer_condition = node.condition
|
114
|
-
correct_outer_condition(corrector, outer_condition)
|
107
|
+
correct_node(corrector, node)
|
115
108
|
|
116
|
-
and_operator = if_branch.unless? ? ' && !' : ' && '
|
117
109
|
if if_branch.modifier_form?
|
118
|
-
correct_for_guard_condition_style(corrector,
|
110
|
+
correct_for_guard_condition_style(corrector, node, if_branch)
|
119
111
|
else
|
120
|
-
correct_for_basic_condition_style(corrector, node, if_branch
|
112
|
+
correct_for_basic_condition_style(corrector, node, if_branch)
|
121
113
|
correct_for_comment(corrector, node, if_branch)
|
122
114
|
end
|
123
115
|
end
|
124
116
|
|
125
|
-
def
|
126
|
-
|
127
|
-
|
117
|
+
def correct_node(corrector, node)
|
118
|
+
corrector.replace(node.loc.keyword, 'if') if node.unless?
|
119
|
+
corrector.replace(node.condition, chainable_condition(node))
|
128
120
|
end
|
129
121
|
|
130
|
-
def
|
131
|
-
corrector.
|
132
|
-
|
133
|
-
insert_bang(corrector, node, is_modify_form)
|
134
|
-
end
|
122
|
+
def correct_for_guard_condition_style(corrector, node, if_branch)
|
123
|
+
corrector.insert_after(node.condition, " && #{chainable_condition(if_branch)}")
|
135
124
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
range = range_between(if_branch.loc.keyword.begin_pos, condition.source_range.end_pos)
|
125
|
+
range = range_between(
|
126
|
+
if_branch.loc.keyword.begin_pos, if_branch.condition.source_range.end_pos
|
127
|
+
)
|
141
128
|
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
142
|
-
corrector.remove(if_branch.loc.keyword)
|
143
129
|
end
|
144
130
|
|
145
|
-
def correct_for_basic_condition_style(corrector, node, if_branch
|
131
|
+
def correct_for_basic_condition_style(corrector, node, if_branch)
|
146
132
|
range = range_between(
|
147
133
|
node.condition.source_range.end_pos, if_branch.condition.source_range.begin_pos
|
148
134
|
)
|
149
|
-
corrector.replace(range,
|
150
|
-
corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
|
151
|
-
|
152
|
-
wrap_condition(corrector, if_branch.condition)
|
153
|
-
end
|
154
|
-
|
155
|
-
def wrap_condition(corrector, condition)
|
156
|
-
# Handle `send` and `block` nodes that need to be wrapped in parens
|
157
|
-
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
158
|
-
# but wrapping the argument list would be a more ergonomic correction.
|
159
|
-
node_to_check = condition&.block_type? ? condition.send_node : condition
|
160
|
-
return unless wrap_condition?(node_to_check)
|
135
|
+
corrector.replace(range, ' && ')
|
161
136
|
|
162
|
-
|
163
|
-
source = parenthesized_method_arguments(condition)
|
137
|
+
corrector.replace(if_branch.condition, chainable_condition(if_branch))
|
164
138
|
|
165
|
-
|
166
|
-
else
|
167
|
-
corrector.wrap(condition, '(', ')')
|
168
|
-
end
|
139
|
+
corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
|
169
140
|
end
|
170
141
|
|
171
|
-
def
|
172
|
-
|
173
|
-
corrector.insert_before(condition,
|
174
|
-
"#{'!' if node.unless?}#{replace_condition(node.condition)} && ")
|
142
|
+
def autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
143
|
+
correct_node(corrector, if_branch)
|
175
144
|
|
176
|
-
corrector.
|
177
|
-
|
178
|
-
|
145
|
+
corrector.insert_before(if_branch.condition, "#{chainable_condition(node)} && ")
|
146
|
+
|
147
|
+
range = range_between(node.loc.keyword.begin_pos, node.condition.source_range.end_pos)
|
148
|
+
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
179
149
|
end
|
180
150
|
|
181
151
|
def correct_for_comment(corrector, node, if_branch)
|
@@ -187,67 +157,36 @@ module RuboCop
|
|
187
157
|
corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
|
188
158
|
end
|
189
159
|
|
190
|
-
def
|
191
|
-
|
160
|
+
def chainable_condition(node)
|
161
|
+
wrapped_condition = add_parentheses_if_needed(node.condition)
|
192
162
|
|
193
|
-
|
194
|
-
begin_pos = condition.first_argument.source_range.begin_pos
|
195
|
-
return if end_pos > begin_pos
|
163
|
+
return wrapped_condition if node.if?
|
196
164
|
|
197
|
-
|
198
|
-
corrector.remove(range)
|
199
|
-
corrector.insert_after(range, '(')
|
200
|
-
corrector.insert_after(condition.last_argument, ')')
|
165
|
+
node.condition.and_type? ? "!(#{wrapped_condition})" : "!#{wrapped_condition}"
|
201
166
|
end
|
202
167
|
|
203
|
-
def
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
elsif condition.and_type?
|
210
|
-
insert_bang_for_and(corrector, node)
|
211
|
-
else
|
212
|
-
corrector.insert_before(condition, '!')
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
def insert_bang_for_and(corrector, node)
|
217
|
-
lhs, rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
168
|
+
def add_parentheses_if_needed(condition)
|
169
|
+
# Handle `send` and `block` nodes that need to be wrapped in parens
|
170
|
+
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
171
|
+
# but wrapping the argument list would be a more ergonomic correction.
|
172
|
+
node_to_check = condition&.any_block_type? ? condition.send_node : condition
|
173
|
+
return condition.source unless add_parentheses?(node_to_check)
|
218
174
|
|
219
|
-
if
|
220
|
-
|
221
|
-
corrector.insert_before(rhs, '!') if rhs
|
175
|
+
if parenthesize_method?(condition)
|
176
|
+
parenthesized_method_arguments(condition)
|
222
177
|
else
|
223
|
-
|
224
|
-
corrector.insert_before(rhs, '!')
|
178
|
+
"(#{condition.source})"
|
225
179
|
end
|
226
180
|
end
|
227
181
|
|
228
|
-
def
|
229
|
-
|
230
|
-
!
|
231
|
-
end
|
232
|
-
|
233
|
-
def arguments_range(node)
|
234
|
-
range_between(
|
235
|
-
node.first_argument.source_range.begin_pos, node.last_argument.source_range.end_pos
|
236
|
-
)
|
182
|
+
def parenthesize_method?(node)
|
183
|
+
node.call_type? && node.arguments.any? && !node.parenthesized? &&
|
184
|
+
!node.comparison_method? && !node.operator_method?
|
237
185
|
end
|
238
186
|
|
239
|
-
def
|
240
|
-
node.
|
241
|
-
|
242
|
-
|
243
|
-
def replace_condition(condition)
|
244
|
-
return condition.source unless wrap_condition?(condition)
|
245
|
-
|
246
|
-
if condition.call_type?
|
247
|
-
parenthesized_method_arguments(condition)
|
248
|
-
else
|
249
|
-
"(#{condition.source})"
|
250
|
-
end
|
187
|
+
def add_parentheses?(node)
|
188
|
+
node.assignment? || (node.operator_keyword? && !node.and_type?) ||
|
189
|
+
(node.call_type? && node.arguments.any? && !node.parenthesized?)
|
251
190
|
end
|
252
191
|
|
253
192
|
def parenthesized_method_arguments(node)
|
@@ -260,10 +199,6 @@ module RuboCop
|
|
260
199
|
def allow_modifier?
|
261
200
|
cop_config['AllowModifier']
|
262
201
|
end
|
263
|
-
|
264
|
-
def outer_condition_modify_form?(node, if_branch)
|
265
|
-
node.condition.source_range.begin_pos > if_branch.condition.source_range.begin_pos
|
266
|
-
end
|
267
202
|
end
|
268
203
|
end
|
269
204
|
end
|
@@ -128,11 +128,11 @@ module RuboCop
|
|
128
128
|
end
|
129
129
|
|
130
130
|
def uncorrectable?(part)
|
131
|
-
part.multiline? || heredoc?(part) || part.each_descendant(:
|
131
|
+
part.multiline? || heredoc?(part) || part.each_descendant(:any_block).any?
|
132
132
|
end
|
133
133
|
|
134
134
|
def heredoc?(node)
|
135
|
-
return false unless node.
|
135
|
+
return false unless node.type?(:str, :dstr)
|
136
136
|
|
137
137
|
node.heredoc?
|
138
138
|
end
|
@@ -23,6 +23,10 @@ module RuboCop
|
|
23
23
|
# `define_method`, therefore, `super` used within these blocks will be allowed.
|
24
24
|
# This approach might result in false negatives, yet ensuring safe detection takes precedence.
|
25
25
|
#
|
26
|
+
# NOTE: When forwarding the same arguments but replacing the block argument with a new inline
|
27
|
+
# block, it is not necessary to explicitly list the non-block arguments. As such, an offense
|
28
|
+
# will be registered in this case.
|
29
|
+
#
|
26
30
|
# @example
|
27
31
|
# # bad
|
28
32
|
# def method(*args, **kwargs)
|
@@ -44,6 +48,16 @@ module RuboCop
|
|
44
48
|
# super()
|
45
49
|
# end
|
46
50
|
#
|
51
|
+
# # bad - forwarding with overridden block
|
52
|
+
# def method(*args, **kwargs, &block)
|
53
|
+
# super(*args, **kwargs) { do_something }
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# # good - implicitly passing all non-block arguments
|
57
|
+
# def method(*args, **kwargs, &block)
|
58
|
+
# super { do_something }
|
59
|
+
# end
|
60
|
+
#
|
47
61
|
# # good - assigning to the block variable before calling super
|
48
62
|
# def method(&block)
|
49
63
|
# # Assigning to the block variable would pass the old value to super,
|
@@ -54,50 +68,80 @@ module RuboCop
|
|
54
68
|
class SuperArguments < Base
|
55
69
|
extend AutoCorrector
|
56
70
|
|
57
|
-
DEF_TYPES = %i[def defs].freeze
|
58
71
|
ASSIGN_TYPES = %i[or_asgn lvasgn].freeze
|
59
72
|
|
60
73
|
MSG = 'Call `super` without arguments and parentheses when the signature is identical.'
|
74
|
+
MSG_INLINE_BLOCK = 'Call `super` without arguments and parentheses when all positional ' \
|
75
|
+
'and keyword arguments are forwarded.'
|
61
76
|
|
62
77
|
def on_super(super_node)
|
63
|
-
def_node = super_node
|
78
|
+
return unless (def_node = find_def_node(super_node))
|
79
|
+
|
80
|
+
def_node_args = def_node.arguments.argument_list
|
81
|
+
super_args = preprocess_super_args(super_node.arguments)
|
82
|
+
|
83
|
+
return unless arguments_identical?(def_node, super_node, def_node_args, super_args)
|
84
|
+
|
85
|
+
# If the number of arguments to the def node and super node are different here,
|
86
|
+
# it's because the block argument is not forwarded.
|
87
|
+
message = def_node_args.size == super_args.size ? MSG : MSG_INLINE_BLOCK
|
88
|
+
add_offense(super_node, message: message) do |corrector|
|
89
|
+
corrector.replace(super_node, 'super')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def find_def_node(super_node)
|
96
|
+
super_node.ancestors.find do |node|
|
64
97
|
# When defining dynamic methods, implicitly calling `super` is not possible.
|
65
98
|
# Since there is a possibility of delegation to `define_method`,
|
66
99
|
# `super` used within the block is always allowed.
|
67
|
-
break if node.
|
100
|
+
break if node.any_block_type? && !block_sends_to_super?(super_node, node)
|
68
101
|
|
69
|
-
break node if
|
102
|
+
break node if node.any_def_type?
|
70
103
|
end
|
71
|
-
return unless def_node
|
72
|
-
return unless arguments_identical?(def_node, def_node.arguments.argument_list,
|
73
|
-
super_node.arguments)
|
74
|
-
|
75
|
-
add_offense(super_node) { |corrector| corrector.replace(super_node, 'super') }
|
76
104
|
end
|
77
105
|
|
78
|
-
private
|
79
|
-
|
80
106
|
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
81
|
-
def arguments_identical?(def_node, def_args, super_args)
|
82
|
-
|
83
|
-
return false if def_args.size != super_args.size
|
107
|
+
def arguments_identical?(def_node, super_node, def_args, super_args)
|
108
|
+
return false if argument_list_size_differs?(def_args, super_args, super_node)
|
84
109
|
|
85
110
|
def_args.zip(super_args).each do |def_arg, super_arg|
|
86
111
|
next if positional_arg_same?(def_arg, super_arg)
|
87
112
|
next if positional_rest_arg_same(def_arg, super_arg)
|
88
113
|
next if keyword_arg_same?(def_arg, super_arg)
|
89
114
|
next if keyword_rest_arg_same?(def_arg, super_arg)
|
90
|
-
next if block_arg_same?(def_node, def_arg, super_arg)
|
115
|
+
next if block_arg_same?(def_node, super_node, def_arg, super_arg)
|
91
116
|
next if forward_arg_same?(def_arg, super_arg)
|
92
117
|
|
93
118
|
return false
|
94
119
|
end
|
120
|
+
|
95
121
|
true
|
96
122
|
end
|
97
123
|
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
98
124
|
|
125
|
+
def argument_list_size_differs?(def_args, super_args, super_node)
|
126
|
+
# If the def node has a block argument and the super node has an explicit block,
|
127
|
+
# the number of arguments is the same, so ignore the def node block arg.
|
128
|
+
def_args_size = def_args.size
|
129
|
+
def_args_size -= 1 if def_args.any?(&:blockarg_type?) && block_sends_to_super?(super_node)
|
130
|
+
|
131
|
+
def_args_size != super_args.size
|
132
|
+
end
|
133
|
+
|
134
|
+
def block_sends_to_super?(super_node, parent_node = super_node.parent)
|
135
|
+
# Checks if the send node of a block is the given super node,
|
136
|
+
# or a method chain containing it.
|
137
|
+
return false unless parent_node
|
138
|
+
return false unless parent_node.any_block_type?
|
139
|
+
|
140
|
+
parent_node.send_node.each_node(:super).any?(super_node)
|
141
|
+
end
|
142
|
+
|
99
143
|
def positional_arg_same?(def_arg, super_arg)
|
100
|
-
return false unless def_arg.
|
144
|
+
return false unless def_arg.type?(:arg, :optarg)
|
101
145
|
return false unless super_arg.lvar_type?
|
102
146
|
|
103
147
|
def_arg.name == super_arg.children.first
|
@@ -114,7 +158,7 @@ module RuboCop
|
|
114
158
|
end
|
115
159
|
|
116
160
|
def keyword_arg_same?(def_arg, super_arg)
|
117
|
-
return false unless def_arg.
|
161
|
+
return false unless def_arg.type?(:kwarg, :kwoptarg)
|
118
162
|
return false unless (pair_node = super_arg).pair_type?
|
119
163
|
return false unless (sym_node = pair_node.key).sym_type?
|
120
164
|
return false unless (lvar_node = pair_node.value).lvar_type?
|
@@ -133,8 +177,11 @@ module RuboCop
|
|
133
177
|
def_arg.name == lvar_node.children.first
|
134
178
|
end
|
135
179
|
|
136
|
-
def block_arg_same?(def_node, def_arg, super_arg)
|
137
|
-
return false unless def_arg.blockarg_type?
|
180
|
+
def block_arg_same?(def_node, super_node, def_arg, super_arg)
|
181
|
+
return false unless def_arg.blockarg_type?
|
182
|
+
return true if block_sends_to_super?(super_node)
|
183
|
+
return false unless super_arg.block_pass_type?
|
184
|
+
|
138
185
|
# anonymous forwarding
|
139
186
|
return true if (block_pass_child = super_arg.children.first).nil? && def_arg.name.nil?
|
140
187
|
|
@@ -159,6 +159,7 @@ module RuboCop
|
|
159
159
|
{
|
160
160
|
(block $#symbol_proc_receiver? $(args (arg _var)) (send (lvar _var) $_))
|
161
161
|
(numblock $#symbol_proc_receiver? $1 (send (lvar :_1) $_))
|
162
|
+
(itblock $#symbol_proc_receiver? $_ (send (lvar :it) $_))
|
162
163
|
}
|
163
164
|
PATTERN
|
164
165
|
|
@@ -185,6 +186,7 @@ module RuboCop
|
|
185
186
|
end
|
186
187
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
187
188
|
alias on_numblock on_block
|
189
|
+
alias on_itblock on_block
|
188
190
|
|
189
191
|
def destructuring_block_argument?(argument_node)
|
190
192
|
argument_node.one? && argument_node.source.include?(',')
|
@@ -64,6 +64,7 @@ module RuboCop
|
|
64
64
|
end
|
65
65
|
|
66
66
|
alias on_numblock on_block
|
67
|
+
alias on_itblock on_block
|
67
68
|
|
68
69
|
private
|
69
70
|
|
@@ -77,7 +78,7 @@ module RuboCop
|
|
77
78
|
|
78
79
|
# @!method define_method_block?(node)
|
79
80
|
def_node_matcher :define_method_block?, <<~PATTERN
|
80
|
-
(
|
81
|
+
(any_block (send _ :define_method _) ...)
|
81
82
|
PATTERN
|
82
83
|
end
|
83
84
|
end
|
@@ -7,12 +7,15 @@ module RuboCop
|
|
7
7
|
# The supported styles are:
|
8
8
|
#
|
9
9
|
# * `consistent_comma`: Requires a comma after the last argument,
|
10
|
-
# for all parenthesized method calls with arguments.
|
10
|
+
# for all parenthesized multi-line method calls with arguments.
|
11
11
|
# * `comma`: Requires a comma after the last argument, but only for
|
12
12
|
# parenthesized method calls where each argument is on its own line.
|
13
13
|
# * `no_comma`: Requires that there is no comma after the last
|
14
14
|
# argument.
|
15
15
|
#
|
16
|
+
# Regardless of style, trailing commas are not allowed in
|
17
|
+
# single-line method calls.
|
18
|
+
#
|
16
19
|
# @example EnforcedStyleForMultiline: consistent_comma
|
17
20
|
# # bad
|
18
21
|
# method(1, 2,)
|
@@ -6,12 +6,13 @@ module RuboCop
|
|
6
6
|
# Checks for trailing comma in array literals.
|
7
7
|
# The configuration options are:
|
8
8
|
#
|
9
|
-
# * `consistent_comma`: Requires a comma after the
|
10
|
-
#
|
11
|
-
# * `comma`: Requires a comma after last item in an array,
|
12
|
-
#
|
13
|
-
# * `
|
14
|
-
#
|
9
|
+
# * `consistent_comma`: Requires a comma after the last item of all non-empty, multiline array
|
10
|
+
# literals.
|
11
|
+
# * `comma`: Requires a comma after the last item in an array, but only when each item is on
|
12
|
+
# its own line.
|
13
|
+
# * `diff_comma`: Requires a comma after the last item in an array, but only when that item is
|
14
|
+
# followed by an immediate newline.
|
15
|
+
# * `no_comma`: Does not require a comma after the last item in an array
|
15
16
|
#
|
16
17
|
# @example EnforcedStyleForMultiline: consistent_comma
|
17
18
|
# # bad
|
@@ -37,6 +38,14 @@ module RuboCop
|
|
37
38
|
# 2,
|
38
39
|
# ]
|
39
40
|
#
|
41
|
+
# # bad
|
42
|
+
# a = [1, 2,
|
43
|
+
# 3, 4]
|
44
|
+
#
|
45
|
+
# # good
|
46
|
+
# a = [1, 2,
|
47
|
+
# 3, 4,]
|
48
|
+
#
|
40
49
|
# @example EnforcedStyleForMultiline: comma
|
41
50
|
# # bad
|
42
51
|
# a = [1, 2,]
|
@@ -72,6 +81,38 @@ module RuboCop
|
|
72
81
|
# 2,
|
73
82
|
# ]
|
74
83
|
#
|
84
|
+
# @example EnforcedStyleForMultiline: diff_comma
|
85
|
+
# # bad
|
86
|
+
# a = [1, 2,]
|
87
|
+
#
|
88
|
+
# # good
|
89
|
+
# a = [1, 2]
|
90
|
+
#
|
91
|
+
# # good
|
92
|
+
# a = [
|
93
|
+
# 1, 2,
|
94
|
+
# 3,
|
95
|
+
# ]
|
96
|
+
#
|
97
|
+
# # good
|
98
|
+
# a = [
|
99
|
+
# 1, 2, 3,
|
100
|
+
# ]
|
101
|
+
#
|
102
|
+
# # good
|
103
|
+
# a = [
|
104
|
+
# 1,
|
105
|
+
# 2,
|
106
|
+
# ]
|
107
|
+
#
|
108
|
+
# # bad
|
109
|
+
# a = [1, 2,
|
110
|
+
# 3, 4,]
|
111
|
+
#
|
112
|
+
# # good
|
113
|
+
# a = [1, 2,
|
114
|
+
# 3, 4]
|
115
|
+
#
|
75
116
|
# @example EnforcedStyleForMultiline: no_comma (default)
|
76
117
|
# # bad
|
77
118
|
# a = [1, 2,]
|
@@ -6,12 +6,13 @@ module RuboCop
|
|
6
6
|
# Checks for trailing comma in hash literals.
|
7
7
|
# The configuration options are:
|
8
8
|
#
|
9
|
-
# * `consistent_comma`: Requires a comma after the
|
10
|
-
#
|
11
|
-
# * `comma`: Requires a comma after the last item in a hash,
|
12
|
-
#
|
13
|
-
# * `
|
14
|
-
#
|
9
|
+
# * `consistent_comma`: Requires a comma after the last item of all non-empty, multiline hash
|
10
|
+
# literals.
|
11
|
+
# * `comma`: Requires a comma after the last item in a hash, but only when each item is on its
|
12
|
+
# own line.
|
13
|
+
# * `diff_comma`: Requires a comma after the last item in a hash, but only when that item is
|
14
|
+
# followed by an immediate newline.
|
15
|
+
# * `no_comma`: Does not require a comma after the last item in a hash
|
15
16
|
#
|
16
17
|
# @example EnforcedStyleForMultiline: consistent_comma
|
17
18
|
#
|
@@ -38,6 +39,14 @@ module RuboCop
|
|
38
39
|
# bar: 2,
|
39
40
|
# }
|
40
41
|
#
|
42
|
+
# # bad
|
43
|
+
# a = { foo: 1, bar: 2,
|
44
|
+
# baz: 3, qux: 4 }
|
45
|
+
#
|
46
|
+
# # good
|
47
|
+
# a = { foo: 1, bar: 2,
|
48
|
+
# baz: 3, qux: 4, }
|
49
|
+
#
|
41
50
|
# @example EnforcedStyleForMultiline: comma
|
42
51
|
#
|
43
52
|
# # bad
|
@@ -74,6 +83,39 @@ module RuboCop
|
|
74
83
|
# bar: 2,
|
75
84
|
# }
|
76
85
|
#
|
86
|
+
# @example EnforcedStyleForMultiline: diff_comma
|
87
|
+
#
|
88
|
+
# # bad
|
89
|
+
# a = { foo: 1, bar: 2, }
|
90
|
+
#
|
91
|
+
# # good
|
92
|
+
# a = { foo: 1, bar: 2 }
|
93
|
+
#
|
94
|
+
# # good
|
95
|
+
# a = {
|
96
|
+
# foo: 1, bar: 2,
|
97
|
+
# qux: 3,
|
98
|
+
# }
|
99
|
+
#
|
100
|
+
# # good
|
101
|
+
# a = {
|
102
|
+
# foo: 1, bar: 2, qux: 3,
|
103
|
+
# }
|
104
|
+
#
|
105
|
+
# # good
|
106
|
+
# a = {
|
107
|
+
# foo: 1,
|
108
|
+
# bar: 2,
|
109
|
+
# }
|
110
|
+
#
|
111
|
+
# # bad
|
112
|
+
# a = { foo: 1, bar: 2,
|
113
|
+
# baz: 3, qux: 4, }
|
114
|
+
#
|
115
|
+
# # good
|
116
|
+
# a = { foo: 1, bar: 2,
|
117
|
+
# baz: 3, qux: 4 }
|
118
|
+
#
|
77
119
|
# @example EnforcedStyleForMultiline: no_comma (default)
|
78
120
|
#
|
79
121
|
# # bad
|
@@ -113,7 +113,7 @@ module RuboCop
|
|
113
113
|
private
|
114
114
|
|
115
115
|
def in_module_or_instance_eval?(node)
|
116
|
-
node.each_ancestor(:
|
116
|
+
node.each_ancestor(:any_block, :class, :sclass, :module).each do |pnode|
|
117
117
|
case pnode.type
|
118
118
|
when :class, :sclass
|
119
119
|
return false
|
@@ -85,6 +85,12 @@ module RuboCop
|
|
85
85
|
NONCOMMUTATIVE_OPERATORS = %i[===].freeze
|
86
86
|
PROGRAM_NAMES = %i[$0 $PROGRAM_NAME].freeze
|
87
87
|
RESTRICT_ON_SEND = RuboCop::AST::Node::COMPARISON_OPERATORS
|
88
|
+
ENFORCE_YODA_STYLES = %i[
|
89
|
+
require_for_all_comparison_operators require_for_equality_operators_only
|
90
|
+
].freeze
|
91
|
+
EQUALITY_ONLY_STYLES = %i[
|
92
|
+
forbid_for_equality_operators_only require_for_equality_operators_only
|
93
|
+
].freeze
|
88
94
|
|
89
95
|
# @!method file_constant_equal_program_name?(node)
|
90
96
|
def_node_matcher :file_constant_equal_program_name?, <<~PATTERN
|
@@ -105,13 +111,11 @@ module RuboCop
|
|
105
111
|
private
|
106
112
|
|
107
113
|
def enforce_yoda?
|
108
|
-
style
|
109
|
-
style == :require_for_equality_operators_only
|
114
|
+
ENFORCE_YODA_STYLES.include?(style)
|
110
115
|
end
|
111
116
|
|
112
117
|
def equality_only?
|
113
|
-
style
|
114
|
-
style == :require_for_equality_operators_only
|
118
|
+
EQUALITY_ONLY_STYLES.include?(style)
|
115
119
|
end
|
116
120
|
|
117
121
|
def yoda_compatible_condition?(node)
|
@@ -50,6 +50,7 @@ module RuboCop
|
|
50
50
|
|
51
51
|
def on_send(node)
|
52
52
|
return unless supported_operators.include?(node.method_name.to_s)
|
53
|
+
return unless node.arguments?
|
53
54
|
|
54
55
|
lhs = node.receiver
|
55
56
|
rhs = node.first_argument
|
@@ -71,7 +72,7 @@ module RuboCop
|
|
71
72
|
end
|
72
73
|
|
73
74
|
def constant_portion?(node)
|
74
|
-
node.
|
75
|
+
node.type?(:numeric, :const)
|
75
76
|
end
|
76
77
|
|
77
78
|
def supported_operators
|