rubocop 1.31.1 → 1.51.0
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 +5 -5
- data/config/default.yml +342 -52
- data/config/obsoletion.yml +23 -1
- data/exe/rubocop +1 -1
- data/lib/rubocop/arguments_env.rb +17 -0
- data/lib/rubocop/arguments_file.rb +17 -0
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/{auto_genenerate_config.rb → auto_generate_config.rb} +9 -2
- data/lib/rubocop/cli/command/execute_runner.rb +14 -9
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/suggest_extensions.rb +61 -16
- data/lib/rubocop/cli.rb +56 -9
- data/lib/rubocop/comment_config.rb +60 -1
- data/lib/rubocop/config.rb +48 -20
- data/lib/rubocop/config_finder.rb +68 -0
- data/lib/rubocop/config_loader.rb +46 -68
- data/lib/rubocop/config_loader_resolver.rb +11 -12
- data/lib/rubocop/config_obsoletion/changed_parameter.rb +5 -0
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +4 -0
- data/lib/rubocop/config_obsoletion.rb +9 -4
- data/lib/rubocop/config_validator.rb +1 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +29 -13
- data/lib/rubocop/cop/badge.rb +9 -4
- data/lib/rubocop/cop/base.rb +115 -83
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/commissioner.rb +19 -6
- data/lib/rubocop/cop/cop.rb +54 -34
- data/lib/rubocop/cop/corrector.rb +31 -11
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +23 -7
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +2 -7
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +58 -0
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/dependency_version.rb +17 -19
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -1
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +107 -0
- data/lib/rubocop/cop/gemspec/require_mfa.rb +1 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +2 -2
- data/lib/rubocop/cop/generator.rb +5 -2
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/create_empty_file.rb +37 -0
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +111 -0
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/lambda_or_proc.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +37 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +11 -3
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +66 -0
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +62 -0
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +16 -12
- data/lib/rubocop/cop/layout/block_end_newline.rb +31 -9
- data/lib/rubocop/cop/layout/class_structure.rb +37 -27
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +2 -6
- data/lib/rubocop/cop/layout/comment_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +3 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +7 -2
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +9 -1
- data/lib/rubocop/cop/layout/end_of_line.rb +4 -4
- data/lib/rubocop/cop/layout/extra_spacing.rb +15 -6
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +15 -4
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +35 -8
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +36 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +57 -8
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +52 -19
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +10 -4
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +8 -11
- data/lib/rubocop/cop/layout/indentation_style.rb +7 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +6 -2
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +80 -12
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +18 -8
- data/lib/rubocop/cop/layout/line_length.rb +8 -1
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +31 -1
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -1
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +29 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +39 -2
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +77 -0
- data/lib/rubocop/cop/layout/redundant_line_break.rb +9 -10
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -0
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +22 -20
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +27 -9
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +30 -3
- data/lib/rubocop/cop/layout/space_inside_parens.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +34 -0
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +10 -6
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +5 -4
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +12 -5
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +1 -1
- data/lib/rubocop/cop/legacy/corrector.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +39 -8
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +5 -1
- data/lib/rubocop/cop/lint/debugger.rb +27 -31
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +66 -110
- data/lib/rubocop/cop/lint/deprecated_constants.rb +8 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_branch.rb +0 -2
- data/lib/rubocop/cop/lint/duplicate_magic_comment.rb +73 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +48 -18
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +26 -9
- data/lib/rubocop/cop/lint/duplicate_require.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +3 -7
- data/lib/rubocop/cop/lint/empty_block.rb +3 -7
- data/lib/rubocop/cop/lint/empty_class.rb +3 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +110 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -11
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +14 -7
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +15 -17
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -2
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +4 -3
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +48 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18 -3
- data/lib/rubocop/cop/lint/missing_super.rb +31 -2
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +53 -9
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +25 -6
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +68 -28
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +12 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +28 -6
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +4 -5
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +17 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +5 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +49 -9
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -6
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +7 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +48 -10
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +13 -0
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
- data/lib/rubocop/cop/lint/redundant_with_index.rb +14 -11
- data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -12
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +2 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +41 -8
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +1 -1
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -4
- data/lib/rubocop/cop/lint/shadowed_exception.rb +16 -11
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +28 -3
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -0
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +13 -3
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +12 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +6 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +17 -12
- data/lib/rubocop/cop/lint/useless_assignment.rb +56 -1
- data/lib/rubocop/cop/lint/useless_method_definition.rb +12 -4
- data/lib/rubocop/cop/lint/useless_rescue.rb +89 -0
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +15 -5
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +92 -21
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -2
- data/lib/rubocop/cop/metrics/block_length.rb +16 -11
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +11 -5
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +76 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +17 -11
- data/lib/rubocop/cop/metrics/module_length.rb +10 -5
- data/lib/rubocop/cop/metrics/parameter_lists.rb +27 -0
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +3 -6
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +9 -6
- data/lib/rubocop/cop/migration/department_name.rb +1 -1
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_identifiers.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_methods.rb +23 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +17 -1
- data/lib/rubocop/cop/mixin/annotation_comment.rb +14 -7
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -1
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +29 -7
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +21 -9
- data/lib/rubocop/cop/mixin/def_node.rb +2 -7
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +11 -7
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +152 -12
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +13 -9
- data/lib/rubocop/cop/mixin/line_length_help.rb +11 -2
- data/lib/rubocop/cop/mixin/method_complexity.rb +13 -16
- data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +7 -14
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +5 -6
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +58 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +22 -5
- data/lib/rubocop/cop/mixin/require_library.rb +2 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +5 -3
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +18 -3
- data/lib/rubocop/cop/mixin/surrounding_space.rb +13 -11
- data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -2
- data/lib/rubocop/cop/mixin/visibility_help.rb +40 -5
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +5 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +3 -1
- data/lib/rubocop/cop/naming/constant_name.rb +3 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +28 -6
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +22 -7
- data/lib/rubocop/cop/naming/method_name.rb +3 -3
- data/lib/rubocop/cop/naming/predicate_name.rb +31 -2
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -4
- data/lib/rubocop/cop/registry.rb +73 -45
- data/lib/rubocop/cop/security/compound_hash.rb +2 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +92 -3
- data/lib/rubocop/cop/style/accessor_grouping.rb +46 -20
- data/lib/rubocop/cop/style/alias.rb +9 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +6 -5
- data/lib/rubocop/cop/style/array_intersect.rb +111 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +11 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -10
- data/lib/rubocop/cop/style/case_equality.rb +40 -10
- data/lib/rubocop/cop/style/case_like_if.rb +20 -3
- data/lib/rubocop/cop/style/character_literal.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +8 -15
- data/lib/rubocop/cop/style/class_equality_comparison.rb +94 -12
- data/lib/rubocop/cop/style/class_methods_definitions.rb +2 -1
- data/lib/rubocop/cop/style/collection_compact.rb +21 -5
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
- data/lib/rubocop/cop/style/combinable_loops.rb +29 -7
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
- data/lib/rubocop/cop/style/comparable_clamp.rb +125 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +94 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +8 -14
- data/lib/rubocop/cop/style/copyright.rb +6 -3
- data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
- data/lib/rubocop/cop/style/dir_empty.rb +60 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +22 -10
- data/lib/rubocop/cop/style/documentation_method.rb +10 -4
- data/lib/rubocop/cop/style/double_negation.rb +4 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +41 -6
- data/lib/rubocop/cop/style/each_with_object.rb +40 -9
- data/lib/rubocop/cop/style/empty_block_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_else.rb +37 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +73 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +62 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +5 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +10 -177
- data/lib/rubocop/cop/style/file_empty.rb +71 -0
- data/lib/rubocop/cop/style/file_read.rb +1 -1
- data/lib/rubocop/cop/style/file_write.rb +1 -1
- data/lib/rubocop/cop/style/for.rb +2 -0
- data/lib/rubocop/cop/style/format_string_token.rb +25 -6
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +127 -38
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +48 -12
- data/lib/rubocop/cop/style/hash_except.rb +27 -16
- data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
- data/lib/rubocop/cop/style/hash_syntax.rb +26 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +15 -0
- data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +112 -16
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +29 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +4 -4
- data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
- data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +118 -0
- data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -1
- data/lib/rubocop/cop/style/magic_comment_format.rb +307 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +2 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +4 -1
- data/lib/rubocop/cop/style/map_to_set.rb +64 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +40 -24
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +5 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +48 -41
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +21 -2
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +4 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -4
- data/lib/rubocop/cop/style/min_max.rb +3 -3
- data/lib/rubocop/cop/style/min_max_comparison.rb +83 -0
- data/lib/rubocop/cop/style/missing_else.rb +13 -1
- data/lib/rubocop/cop/style/mixin_grouping.rb +4 -4
- data/lib/rubocop/cop/style/module_function.rb +30 -8
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +0 -4
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +7 -4
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +18 -3
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +17 -10
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +9 -0
- data/lib/rubocop/cop/style/next.rb +3 -5
- data/lib/rubocop/cop/style/nil_lambda.rb +4 -4
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
- data/lib/rubocop/cop/style/numeric_literals.rb +16 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +43 -9
- data/lib/rubocop/cop/style/object_then.rb +5 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +3 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +67 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +29 -19
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +22 -1
- data/lib/rubocop/cop/style/proc.rb +4 -1
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +3 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +41 -8
- data/lib/rubocop/cop/style/redundant_conditional.rb +0 -4
- data/lib/rubocop/cop/style/redundant_constant_base.rb +85 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +45 -0
- data/lib/rubocop/cop/style/redundant_each.rb +116 -0
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +7 -5
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
- data/lib/rubocop/cop/style/redundant_initialize.rb +3 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +183 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +22 -24
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +9 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +21 -4
- data/lib/rubocop/cop/style/redundant_return.rb +7 -0
- data/lib/rubocop/cop/style/redundant_self.rb +2 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +24 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +24 -8
- data/lib/rubocop/cop/style/redundant_string_escape.rb +183 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
- data/lib/rubocop/cop/style/require_order.rb +138 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +41 -10
- data/lib/rubocop/cop/style/select_by_regexp.rb +13 -5
- data/lib/rubocop/cop/style/self_assignment.rb +2 -2
- data/lib/rubocop/cop/style/semicolon.rb +63 -5
- data/lib/rubocop/cop/style/signal_exception.rb +8 -6
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +17 -8
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -2
- data/lib/rubocop/cop/style/static_class.rb +32 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_hash_keys.rb +4 -1
- data/lib/rubocop/cop/style/string_literals.rb +1 -5
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +6 -5
- data/lib/rubocop/cop/style/symbol_proc.rb +42 -10
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -13
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -4
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +4 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
- data/lib/rubocop/cop/style/unpack_first.rb +3 -3
- data/lib/rubocop/cop/style/word_array.rb +59 -5
- data/lib/rubocop/cop/style/yoda_condition.rb +13 -6
- data/lib/rubocop/cop/style/yoda_expression.rb +90 -0
- data/lib/rubocop/cop/style/zero_length_predicate.rb +40 -19
- data/lib/rubocop/cop/team.rb +63 -56
- data/lib/rubocop/cop/util.rb +44 -8
- data/lib/rubocop/cop/variable_force/assignment.rb +5 -1
- data/lib/rubocop/cop/variable_force/scope.rb +3 -3
- data/lib/rubocop/cop/variable_force/variable.rb +5 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +6 -4
- data/lib/rubocop/cop/variable_force.rb +18 -30
- data/lib/rubocop/cops_documentation_generator.rb +45 -15
- data/lib/rubocop/directive_comment.rb +4 -4
- data/lib/rubocop/ext/comment.rb +18 -0
- data/lib/rubocop/ext/processed_source.rb +2 -0
- data/lib/rubocop/ext/range.rb +15 -0
- data/lib/rubocop/ext/regexp_node.rb +1 -1
- data/lib/rubocop/ext/regexp_parser.rb +1 -1
- data/lib/rubocop/feature_loader.rb +94 -0
- data/lib/rubocop/file_patterns.rb +43 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +26 -9
- data/lib/rubocop/formatter/html_formatter.rb +4 -4
- data/lib/rubocop/formatter/junit_formatter.rb +4 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +8 -5
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +1 -1
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +6 -3
- data/lib/rubocop/formatter.rb +4 -1
- data/lib/rubocop/options.rb +55 -22
- data/lib/rubocop/path_util.rb +50 -22
- data/lib/rubocop/rake_task.rb +5 -1
- data/lib/rubocop/result_cache.rb +26 -24
- data/lib/rubocop/rspec/cop_helper.rb +26 -3
- data/lib/rubocop/rspec/expect_offense.rb +6 -4
- data/lib/rubocop/rspec/shared_contexts.rb +31 -14
- data/lib/rubocop/rspec/support.rb +17 -2
- data/lib/rubocop/runner.rb +73 -18
- data/lib/rubocop/server/cache.rb +48 -2
- data/lib/rubocop/server/cli.rb +62 -19
- data/lib/rubocop/server/client_command/base.rb +1 -1
- data/lib/rubocop/server/client_command/exec.rb +6 -1
- data/lib/rubocop/server/client_command/start.rb +6 -1
- data/lib/rubocop/server/core.rb +42 -10
- data/lib/rubocop/server/helper.rb +1 -1
- data/lib/rubocop/server/server_command/exec.rb +1 -1
- data/lib/rubocop/server/socket_reader.rb +5 -1
- data/lib/rubocop/server.rb +1 -1
- data/lib/rubocop/target_finder.rb +1 -1
- data/lib/rubocop/target_ruby.rb +5 -5
- data/lib/rubocop/version.rb +10 -4
- data/lib/rubocop.rb +45 -9
- metadata +58 -33
- data/lib/rubocop/cop/mixin/ignored_methods.rb +0 -52
@@ -132,25 +132,20 @@ module RuboCop
|
|
132
132
|
# end
|
133
133
|
# end
|
134
134
|
#
|
135
|
-
# @see https://rubystyle.guide#consistent-classes
|
136
135
|
class ClassStructure < Base
|
137
136
|
include VisibilityHelp
|
137
|
+
include CommentsHelp
|
138
138
|
extend AutoCorrector
|
139
139
|
|
140
140
|
HUMANIZED_NODE_TYPE = {
|
141
141
|
casgn: :constants,
|
142
|
-
defs: :
|
142
|
+
defs: :public_class_methods,
|
143
143
|
def: :public_methods,
|
144
144
|
sclass: :class_singleton
|
145
145
|
}.freeze
|
146
146
|
|
147
147
|
MSG = '`%<category>s` is supposed to appear before `%<previous>s`.'
|
148
148
|
|
149
|
-
# @!method dynamic_constant?(node)
|
150
|
-
def_node_matcher :dynamic_constant?, <<~PATTERN
|
151
|
-
(casgn nil? _ (send ...))
|
152
|
-
PATTERN
|
153
|
-
|
154
149
|
# Validates code style on class declaration.
|
155
150
|
# Add offense when find a node out of expected order.
|
156
151
|
def on_class(class_node)
|
@@ -164,12 +159,13 @@ module RuboCop
|
|
164
159
|
previous = index
|
165
160
|
end
|
166
161
|
end
|
162
|
+
alias on_sclass on_class
|
167
163
|
|
168
164
|
private
|
169
165
|
|
170
166
|
# Autocorrect by swapping between two nodes autocorrecting them
|
171
167
|
def autocorrect(corrector, node)
|
172
|
-
previous = node.left_siblings.find do |sibling|
|
168
|
+
previous = node.left_siblings.reverse.find do |sibling|
|
173
169
|
!ignore_for_autocorrect?(node, sibling)
|
174
170
|
end
|
175
171
|
return unless previous
|
@@ -222,7 +218,7 @@ module RuboCop
|
|
222
218
|
def walk_over_nested_class_definition(class_node)
|
223
219
|
class_elements(class_node).each do |node|
|
224
220
|
classification = classify(node)
|
225
|
-
next if ignore?(classification)
|
221
|
+
next if ignore?(node, classification)
|
226
222
|
|
227
223
|
yield node, classification
|
228
224
|
end
|
@@ -240,17 +236,20 @@ module RuboCop
|
|
240
236
|
end
|
241
237
|
end
|
242
238
|
|
243
|
-
def ignore?(classification)
|
239
|
+
def ignore?(node, classification)
|
244
240
|
classification.nil? ||
|
245
241
|
classification.to_s.end_with?('=') ||
|
246
|
-
expected_order.index(classification).nil?
|
242
|
+
expected_order.index(classification).nil? ||
|
243
|
+
private_constant?(node)
|
247
244
|
end
|
248
245
|
|
249
246
|
def ignore_for_autocorrect?(node, sibling)
|
250
247
|
classification = classify(node)
|
251
248
|
sibling_class = classify(sibling)
|
252
249
|
|
253
|
-
ignore?(sibling_class) ||
|
250
|
+
ignore?(sibling, sibling_class) ||
|
251
|
+
classification == sibling_class ||
|
252
|
+
dynamic_constant?(node)
|
254
253
|
end
|
255
254
|
|
256
255
|
def humanize_node(node)
|
@@ -262,26 +261,37 @@ module RuboCop
|
|
262
261
|
HUMANIZED_NODE_TYPE[node.type] || node.type
|
263
262
|
end
|
264
263
|
|
265
|
-
def
|
266
|
-
|
267
|
-
if (node.def_type? && !node.method?(:initialize)) ||
|
268
|
-
(node.send_type? && node.def_modifier?)
|
269
|
-
start_node = find_visibility_start(node) || node
|
270
|
-
end_node = find_visibility_end(node) || node
|
271
|
-
[begin_pos_with_comment(start_node),
|
272
|
-
end_position_for(end_node) + 1]
|
273
|
-
else
|
274
|
-
[begin_pos_with_comment(node), end_position_for(node)]
|
275
|
-
end
|
264
|
+
def dynamic_constant?(node)
|
265
|
+
return false unless node.casgn_type? && node.namespace.nil?
|
276
266
|
|
277
|
-
|
267
|
+
expression = node.expression
|
268
|
+
expression.send_type? &&
|
269
|
+
!(expression.method?(:freeze) && expression.receiver&.recursive_basic_literal?)
|
270
|
+
end
|
271
|
+
|
272
|
+
def private_constant?(node)
|
273
|
+
return false unless node.casgn_type? && node.namespace.nil?
|
274
|
+
return false unless (parent = node.parent)
|
275
|
+
|
276
|
+
parent.each_child_node(:send) do |child_node|
|
277
|
+
return true if marked_as_private_constant?(child_node, node.name)
|
278
|
+
end
|
279
|
+
false
|
280
|
+
end
|
281
|
+
|
282
|
+
def marked_as_private_constant?(node, name)
|
283
|
+
return false unless node.method?(:private_constant)
|
284
|
+
|
285
|
+
node.arguments.any? { |arg| (arg.sym_type? || arg.str_type?) && arg.value == name }
|
278
286
|
end
|
279
287
|
|
280
288
|
def end_position_for(node)
|
281
|
-
|
282
|
-
|
289
|
+
if node.casgn_type?
|
290
|
+
heredoc = find_heredoc(node)
|
291
|
+
return heredoc.location.heredoc_end.end_pos + 1 if heredoc
|
292
|
+
end
|
283
293
|
|
284
|
-
end_line = buffer.line_for_position(node.
|
294
|
+
end_line = buffer.line_for_position(node.source_range.end_pos)
|
285
295
|
buffer.line_range(end_line).end_pos
|
286
296
|
end
|
287
297
|
|
@@ -144,7 +144,7 @@ module RuboCop
|
|
144
144
|
def expected_column(left_paren, elements)
|
145
145
|
if line_break_after_left_paren?(left_paren, elements)
|
146
146
|
source_indent = processed_source.line_indentation(first_argument_line(elements))
|
147
|
-
new_indent = source_indent -
|
147
|
+
new_indent = source_indent - configured_indentation_width
|
148
148
|
|
149
149
|
new_indent.negative? ? 0 : new_indent
|
150
150
|
elsif all_elements_aligned?(elements)
|
@@ -157,7 +157,7 @@ module RuboCop
|
|
157
157
|
def all_elements_aligned?(elements)
|
158
158
|
elements.flat_map do |e|
|
159
159
|
if e.hash_type?
|
160
|
-
e.
|
160
|
+
e.each_child_node.map { |child| child.loc.column }
|
161
161
|
else
|
162
162
|
e.loc.column
|
163
163
|
end
|
@@ -184,10 +184,6 @@ module RuboCop
|
|
184
184
|
end
|
185
185
|
end
|
186
186
|
|
187
|
-
def indentation_width
|
188
|
-
@config.for_cop('Layout/IndentationWidth')['Width'] || 2
|
189
|
-
end
|
190
|
-
|
191
187
|
def line_break_after_left_paren?(left_paren, elements)
|
192
188
|
elements.first && elements.first.loc.line > left_paren.line
|
193
189
|
end
|
@@ -154,7 +154,9 @@ module RuboCop
|
|
154
154
|
end
|
155
155
|
|
156
156
|
def less_indented?(line)
|
157
|
-
|
157
|
+
rule = config.for_cop('Layout/AccessModifierIndentation')['EnforcedStyle'] == 'outdent'
|
158
|
+
access_modifier = 'private|protected|public'
|
159
|
+
/\A\s*(end\b|[)}\]])/.match?(line) || (rule && /\A\s*(#{access_modifier})\b/.match?(line))
|
158
160
|
end
|
159
161
|
|
160
162
|
def two_alternatives?(line)
|
@@ -97,9 +97,9 @@ module RuboCop
|
|
97
97
|
def autocorrect(corrector, node)
|
98
98
|
previous_token = previous_token(node)
|
99
99
|
range = if previous_token && same_line?(node, previous_token)
|
100
|
-
range_with_surrounding_space(node.
|
100
|
+
range_with_surrounding_space(node.source_range, newlines: false)
|
101
101
|
else
|
102
|
-
range_by_whole_lines(node.
|
102
|
+
range_by_whole_lines(node.source_range, include_final_newline: true)
|
103
103
|
end
|
104
104
|
|
105
105
|
corrector.remove(range)
|
@@ -137,7 +137,7 @@ module RuboCop
|
|
137
137
|
end
|
138
138
|
|
139
139
|
def current_token(comment)
|
140
|
-
processed_source.
|
140
|
+
processed_source.tokens.find { |token| token.pos == comment.source_range }
|
141
141
|
end
|
142
142
|
|
143
143
|
def previous_token(node)
|
@@ -27,9 +27,11 @@ module RuboCop
|
|
27
27
|
|
28
28
|
def on_new_investigation
|
29
29
|
return if processed_source.tokens.empty?
|
30
|
+
# Quick check if we possibly have consecutive blank lines.
|
31
|
+
return unless processed_source.raw_source.include?("\n\n\n")
|
30
32
|
|
31
33
|
lines = Set.new
|
32
|
-
processed_source.
|
34
|
+
processed_source.tokens.each { |token| lines << token.line }
|
33
35
|
|
34
36
|
each_extra_empty_line(lines.sort) do |range|
|
35
37
|
add_offense(range) do |corrector|
|
@@ -51,6 +51,8 @@ module RuboCop
|
|
51
51
|
MSG_BEFORE_FOR_ONLY_BEFORE = 'Keep a blank line before `%<modifier>s`.'
|
52
52
|
MSG_AFTER_FOR_ONLY_BEFORE = 'Remove a blank line after `%<modifier>s`.'
|
53
53
|
|
54
|
+
RESTRICT_ON_SEND = %i[public protected private module_function].freeze
|
55
|
+
|
54
56
|
def initialize(config = nil, options = nil)
|
55
57
|
super
|
56
58
|
|
@@ -80,8 +82,11 @@ module RuboCop
|
|
80
82
|
@block_line = node.source_range.first_line
|
81
83
|
end
|
82
84
|
|
83
|
-
|
84
|
-
|
85
|
+
alias on_numblock on_block
|
86
|
+
|
87
|
+
def on_send(node) # rubocop:disable Metrics/CyclomaticComplexity
|
88
|
+
return unless node.bare_access_modifier? &&
|
89
|
+
!(node.parent&.block_type? || node.parent&.numblock_type?)
|
85
90
|
return if expected_empty_lines?(node)
|
86
91
|
|
87
92
|
message = message(node)
|
@@ -82,6 +82,10 @@ module RuboCop
|
|
82
82
|
check_other_alignment(node)
|
83
83
|
end
|
84
84
|
|
85
|
+
def on_sclass(node)
|
86
|
+
check_other_alignment(node)
|
87
|
+
end
|
88
|
+
|
85
89
|
def on_module(node)
|
86
90
|
check_other_alignment(node)
|
87
91
|
end
|
@@ -105,6 +109,7 @@ module RuboCop
|
|
105
109
|
check_other_alignment(node)
|
106
110
|
end
|
107
111
|
end
|
112
|
+
alias on_case_match on_case
|
108
113
|
|
109
114
|
private
|
110
115
|
|
@@ -165,7 +170,10 @@ module RuboCop
|
|
165
170
|
end
|
166
171
|
|
167
172
|
def alignment_node_for_variable_style(node)
|
168
|
-
|
173
|
+
if (node.case_type? || node.case_match_type?) && node.argument? &&
|
174
|
+
same_line?(node, node.parent)
|
175
|
+
return node.parent
|
176
|
+
end
|
169
177
|
|
170
178
|
assignment = assignment_or_operator_method(node)
|
171
179
|
|
@@ -22,20 +22,20 @@ module RuboCop
|
|
22
22
|
# # all platforms.
|
23
23
|
#
|
24
24
|
# # bad
|
25
|
-
# puts 'Hello' # Return character is CR+LF on all
|
25
|
+
# puts 'Hello' # Return character is CR+LF on all platforms.
|
26
26
|
#
|
27
27
|
# # good
|
28
|
-
# puts 'Hello' # Return character is LF on all
|
28
|
+
# puts 'Hello' # Return character is LF on all platforms.
|
29
29
|
#
|
30
30
|
# @example EnforcedStyle: crlf
|
31
31
|
# # The `crlf` style means that CR+LF (Carriage Return + Line Feed) is
|
32
32
|
# # enforced on all platforms.
|
33
33
|
#
|
34
34
|
# # bad
|
35
|
-
# puts 'Hello' # Return character is LF on all
|
35
|
+
# puts 'Hello' # Return character is LF on all platforms.
|
36
36
|
#
|
37
37
|
# # good
|
38
|
-
# puts 'Hello' # Return character is CR+LF on all
|
38
|
+
# puts 'Hello' # Return character is CR+LF on all platforms.
|
39
39
|
#
|
40
40
|
class EndOfLine < Base
|
41
41
|
include ConfigurableEnforcedStyle
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
-
def aligned_locations(locs)
|
52
|
+
def aligned_locations(locs) # rubocop:disable Metrics/AbcSize
|
53
53
|
return [] if locs.empty?
|
54
54
|
|
55
55
|
aligned = Set[locs.first.line, locs.last.line]
|
@@ -57,6 +57,11 @@ module RuboCop
|
|
57
57
|
col = loc.column
|
58
58
|
aligned << loc.line if col == before.column || col == after.column
|
59
59
|
end
|
60
|
+
|
61
|
+
# if locs.size > 2 and the size of variable `aligned`
|
62
|
+
# has not increased from its initial value, there are not aligned lines.
|
63
|
+
return [] if locs.size > 2 && aligned.size == 2
|
64
|
+
|
60
65
|
aligned
|
61
66
|
end
|
62
67
|
|
@@ -119,12 +124,16 @@ module RuboCop
|
|
119
124
|
def ignored_ranges(ast)
|
120
125
|
return [] unless ast
|
121
126
|
|
122
|
-
@ignored_ranges ||=
|
123
|
-
|
127
|
+
@ignored_ranges ||= begin
|
128
|
+
ranges = []
|
129
|
+
on_node(:pair, ast) do |pair|
|
130
|
+
next if pair.parent.single_line?
|
124
131
|
|
125
|
-
|
126
|
-
|
127
|
-
|
132
|
+
key, value = *pair
|
133
|
+
ranges << (key.source_range.end_pos...value.source_range.begin_pos)
|
134
|
+
end
|
135
|
+
ranges
|
136
|
+
end
|
128
137
|
end
|
129
138
|
|
130
139
|
def force_equal_sign_alignment?
|
@@ -153,17 +153,24 @@ module RuboCop
|
|
153
153
|
MSG = 'Indent the first argument one step more than %<base>s.'
|
154
154
|
|
155
155
|
def on_send(node)
|
156
|
-
return
|
157
|
-
return if
|
156
|
+
return unless should_check?(node)
|
157
|
+
return if same_line?(node, node.first_argument)
|
158
|
+
return if style != :consistent && enforce_first_argument_with_fixed_indentation? &&
|
159
|
+
!enable_layout_first_method_argument_line_break?
|
158
160
|
|
159
161
|
indent = base_indentation(node) + configured_indentation_width
|
160
162
|
|
161
163
|
check_alignment([node.first_argument], indent)
|
162
164
|
end
|
163
165
|
alias on_csend on_send
|
166
|
+
alias on_super on_send
|
164
167
|
|
165
168
|
private
|
166
169
|
|
170
|
+
def should_check?(node)
|
171
|
+
node.arguments? && !bare_operator?(node) && !node.setter_method?
|
172
|
+
end
|
173
|
+
|
167
174
|
def autocorrect(corrector, node)
|
168
175
|
AlignmentCorrector.correct(corrector, processed_source, node, column_delta)
|
169
176
|
end
|
@@ -177,7 +184,7 @@ module RuboCop
|
|
177
184
|
|
178
185
|
send_node = arg_node.parent
|
179
186
|
text = base_range(send_node, arg_node).source.strip
|
180
|
-
base = if
|
187
|
+
base = if !text.include?("\n") && special_inner_call_indentation?(send_node)
|
181
188
|
"`#{text}`"
|
182
189
|
elsif comment_line?(text.lines.reverse_each.first)
|
183
190
|
'the start of the previous line (not counting the comment)'
|
@@ -253,7 +260,7 @@ module RuboCop
|
|
253
260
|
@comment_lines ||=
|
254
261
|
processed_source
|
255
262
|
.comments
|
256
|
-
.select { |c| begins_its_line?(c.
|
263
|
+
.select { |c| begins_its_line?(c.source_range) }
|
257
264
|
.map { |c| c.loc.line }
|
258
265
|
end
|
259
266
|
|
@@ -267,6 +274,10 @@ module RuboCop
|
|
267
274
|
argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
268
275
|
end
|
269
276
|
|
277
|
+
def enable_layout_first_method_argument_line_break?
|
278
|
+
config.for_cop('Layout/FirstMethodArgumentLineBreak')['Enabled']
|
279
|
+
end
|
280
|
+
|
270
281
|
def argument_alignment_config
|
271
282
|
config.for_cop('Layout/ArgumentAlignment')
|
272
283
|
end
|
@@ -120,14 +120,15 @@ module RuboCop
|
|
120
120
|
check_first(first_elem, left_bracket, left_parenthesis, 0)
|
121
121
|
end
|
122
122
|
|
123
|
-
check_right_bracket(array_node.loc.end, left_bracket, left_parenthesis)
|
123
|
+
check_right_bracket(array_node.loc.end, first_elem, left_bracket, left_parenthesis)
|
124
124
|
end
|
125
125
|
|
126
|
-
def check_right_bracket(right_bracket, left_bracket, left_parenthesis)
|
126
|
+
def check_right_bracket(right_bracket, first_elem, left_bracket, left_parenthesis)
|
127
127
|
# if the right bracket is on the same line as the last value, accept
|
128
128
|
return if /\S/.match?(right_bracket.source_line[0...right_bracket.column])
|
129
129
|
|
130
|
-
expected_column, indent_base_type = indent_base(left_bracket,
|
130
|
+
expected_column, indent_base_type = indent_base(left_bracket, first_elem,
|
131
|
+
left_parenthesis)
|
131
132
|
@column_delta = expected_column - right_bracket.column
|
132
133
|
return if @column_delta.zero?
|
133
134
|
|
@@ -142,7 +143,7 @@ module RuboCop
|
|
142
143
|
case indent_base_type
|
143
144
|
when :left_brace_or_bracket
|
144
145
|
'the position of the opening bracket'
|
145
|
-
when :
|
146
|
+
when :first_column_after_left_parenthesis
|
146
147
|
'the first position after the preceding left parenthesis'
|
147
148
|
when :parent_hash_key
|
148
149
|
'the parent hash key'
|
@@ -163,7 +164,7 @@ module RuboCop
|
|
163
164
|
case indent_base_type
|
164
165
|
when :left_brace_or_bracket
|
165
166
|
'Indent the right bracket the same as the left bracket.'
|
166
|
-
when :
|
167
|
+
when :first_column_after_left_parenthesis
|
167
168
|
'Indent the right bracket the same as the first position ' \
|
168
169
|
'after the preceding left parenthesis.'
|
169
170
|
when :parent_hash_key
|
@@ -8,14 +8,37 @@ module RuboCop
|
|
8
8
|
#
|
9
9
|
# @example
|
10
10
|
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
11
|
+
# # bad
|
12
|
+
# [ :a,
|
13
|
+
# :b]
|
14
14
|
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
15
|
+
# # good
|
16
|
+
# [
|
17
|
+
# :a,
|
18
|
+
# :b]
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# [:a, :b]
|
22
|
+
#
|
23
|
+
# @example AllowMultilineFinalElement: false (default)
|
24
|
+
#
|
25
|
+
# # bad
|
26
|
+
# [ :a, {
|
27
|
+
# :b => :c
|
28
|
+
# }]
|
29
|
+
#
|
30
|
+
# # good
|
31
|
+
# [
|
32
|
+
# :a, {
|
33
|
+
# :b => :c
|
34
|
+
# }]
|
35
|
+
#
|
36
|
+
# @example AllowMultilineFinalElement: true
|
37
|
+
#
|
38
|
+
# # good
|
39
|
+
# [:a, {
|
40
|
+
# :b => :c
|
41
|
+
# }]
|
19
42
|
#
|
20
43
|
class FirstArrayElementLineBreak < Base
|
21
44
|
include FirstElementLineBreak
|
@@ -26,7 +49,7 @@ module RuboCop
|
|
26
49
|
def on_array(node)
|
27
50
|
return if !node.loc.begin && !assignment_on_same_line?(node)
|
28
51
|
|
29
|
-
check_children_line_break(node, node.children)
|
52
|
+
check_children_line_break(node, node.children, ignore_last: ignore_last_element?)
|
30
53
|
end
|
31
54
|
|
32
55
|
private
|
@@ -35,6 +58,10 @@ module RuboCop
|
|
35
58
|
source = node.source_range.source_line[0...node.loc.column]
|
36
59
|
/\s*=\s*$/.match?(source)
|
37
60
|
end
|
61
|
+
|
62
|
+
def ignore_last_element?
|
63
|
+
!!cop_config['AllowMultilineFinalElement']
|
64
|
+
end
|
38
65
|
end
|
39
66
|
end
|
40
67
|
end
|
@@ -158,14 +158,14 @@ module RuboCop
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
-
check_right_brace(hash_node.loc.end, left_brace, left_parenthesis)
|
161
|
+
check_right_brace(hash_node.loc.end, first_pair, left_brace, left_parenthesis)
|
162
162
|
end
|
163
163
|
|
164
|
-
def check_right_brace(right_brace, left_brace, left_parenthesis)
|
164
|
+
def check_right_brace(right_brace, first_pair, left_brace, left_parenthesis)
|
165
165
|
# if the right brace is on the same line as the last value, accept
|
166
166
|
return if /\S/.match?(right_brace.source_line[0...right_brace.column])
|
167
167
|
|
168
|
-
expected_column, indent_base_type = indent_base(left_brace, left_parenthesis)
|
168
|
+
expected_column, indent_base_type = indent_base(left_brace, first_pair, left_parenthesis)
|
169
169
|
@column_delta = expected_column - right_brace.column
|
170
170
|
return if @column_delta.zero?
|
171
171
|
|
@@ -192,7 +192,7 @@ module RuboCop
|
|
192
192
|
case indent_base_type
|
193
193
|
when :left_brace_or_bracket
|
194
194
|
'the position of the opening brace'
|
195
|
-
when :
|
195
|
+
when :first_column_after_left_parenthesis
|
196
196
|
'the first position after the preceding left parenthesis'
|
197
197
|
when :parent_hash_key
|
198
198
|
'the parent hash key'
|
@@ -213,7 +213,7 @@ module RuboCop
|
|
213
213
|
case indent_base_type
|
214
214
|
when :left_brace_or_bracket
|
215
215
|
'Indent the right brace the same as the left brace.'
|
216
|
-
when :
|
216
|
+
when :first_column_after_left_parenthesis
|
217
217
|
'Indent the right brace the same as the first position ' \
|
218
218
|
'after the preceding left parenthesis.'
|
219
219
|
when :parent_hash_key
|
@@ -16,6 +16,33 @@ module RuboCop
|
|
16
16
|
# {
|
17
17
|
# a: 1,
|
18
18
|
# b: 2 }
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# {
|
22
|
+
# a: 1, b: {
|
23
|
+
# c: 3
|
24
|
+
# }}
|
25
|
+
#
|
26
|
+
# @example AllowMultilineFinalElement: false (default)
|
27
|
+
#
|
28
|
+
# # bad
|
29
|
+
# { a: 1, b: {
|
30
|
+
# c: 3
|
31
|
+
# }}
|
32
|
+
#
|
33
|
+
# @example AllowMultilineFinalElement: true
|
34
|
+
#
|
35
|
+
# # bad
|
36
|
+
# { a: 1,
|
37
|
+
# b: {
|
38
|
+
# c: 3
|
39
|
+
# }}
|
40
|
+
#
|
41
|
+
# # good
|
42
|
+
# { a: 1, b: {
|
43
|
+
# c: 3
|
44
|
+
# }}
|
45
|
+
#
|
19
46
|
class FirstHashElementLineBreak < Base
|
20
47
|
include FirstElementLineBreak
|
21
48
|
extend AutoCorrector
|
@@ -25,7 +52,15 @@ module RuboCop
|
|
25
52
|
def on_hash(node)
|
26
53
|
# node.loc.begin tells us whether the hash opens with a {
|
27
54
|
# If it doesn't, Style/FirstMethodArgumentLineBreak will handle it
|
28
|
-
|
55
|
+
return unless node.loc.begin
|
56
|
+
|
57
|
+
check_children_line_break(node, node.children, ignore_last: ignore_last_element?)
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def ignore_last_element?
|
63
|
+
!!cop_config['AllowMultilineFinalElement']
|
29
64
|
end
|
30
65
|
end
|
31
66
|
end
|