rubocop 0.85.1 → 0.89.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/README.md +16 -4
- data/bin/rubocop-profile +32 -0
- data/config/default.yml +227 -26
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +3 -3
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +2 -4
- data/lib/rubocop/comment_config.rb +5 -7
- data/lib/rubocop/config.rb +21 -4
- data/lib/rubocop/config_loader.rb +41 -69
- data/lib/rubocop/config_loader_resolver.rb +4 -4
- data/lib/rubocop/config_obsoletion.rb +6 -2
- data/lib/rubocop/config_store.rb +4 -0
- data/lib/rubocop/config_validator.rb +2 -4
- data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +407 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +47 -50
- data/lib/rubocop/cop/cop.rb +85 -236
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
- data/lib/rubocop/cop/force.rb +1 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +39 -13
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
- data/lib/rubocop/cop/layout/class_structure.rb +5 -44
- data/lib/rubocop/cop/layout/comment_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/debugger.rb +7 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
- data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
- data/lib/rubocop/cop/lint/empty_when.rb +2 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
- data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
- data/lib/rubocop/cop/lint/loop.rb +23 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
- data/lib/rubocop/cop/lint/missing_super.rb +99 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
- data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
- data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
- data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
- data/lib/rubocop/cop/lint/rand_one.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +43 -40
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
- data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
- data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
- data/lib/rubocop/cop/lint/script_permission.rb +10 -7
- data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
- data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
- data/lib/rubocop/cop/lint/syntax.rb +11 -26
- data/lib/rubocop/cop/lint/to_json.rb +4 -6
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
- data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
- data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
- data/lib/rubocop/cop/lint/void.rb +3 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +24 -2
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +26 -3
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
- data/lib/rubocop/cop/metrics/method_length.rb +25 -2
- data/lib/rubocop/cop/metrics/module_length.rb +26 -3
- data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
- data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
- data/lib/rubocop/cop/migration/department_name.rb +14 -16
- data/lib/rubocop/cop/mixin/alignment.rb +2 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/code_length.rb +26 -5
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
- data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
- data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
- data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +19 -5
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -5
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
- data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
- data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
- data/lib/rubocop/cop/naming/variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +16 -2
- data/lib/rubocop/cop/registry.rb +3 -3
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +6 -8
- data/lib/rubocop/cop/security/marshal_load.rb +2 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +6 -6
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
- data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
- data/lib/rubocop/cop/style/alias.rb +41 -36
- data/lib/rubocop/cop/style/and_or.rb +9 -11
- data/lib/rubocop/cop/style/array_coercion.rb +63 -0
- data/lib/rubocop/cop/style/array_join.rb +6 -8
- data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
- data/lib/rubocop/cop/style/attr.rb +11 -9
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
- data/lib/rubocop/cop/style/bare_percent_literals.rb +11 -13
- data/lib/rubocop/cop/style/begin_block.rb +2 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
- data/lib/rubocop/cop/style/block_comments.rb +14 -18
- data/lib/rubocop/cop/style/block_delimiters.rb +25 -27
- data/lib/rubocop/cop/style/case_equality.rb +22 -3
- data/lib/rubocop/cop/style/case_like_if.rb +220 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +15 -12
- data/lib/rubocop/cop/style/class_check.rb +7 -9
- data/lib/rubocop/cop/style/class_methods.rb +7 -11
- data/lib/rubocop/cop/style/class_vars.rb +24 -7
- data/lib/rubocop/cop/style/collection_methods.rb +11 -17
- data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
- data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
- data/lib/rubocop/cop/style/command_literal.rb +24 -25
- data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
- data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
- data/lib/rubocop/cop/style/copyright.rb +15 -15
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
- data/lib/rubocop/cop/style/dir.rb +9 -12
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +8 -10
- data/lib/rubocop/cop/style/documentation.rb +8 -10
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
- data/lib/rubocop/cop/style/double_negation.rb +2 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
- data/lib/rubocop/cop/style/each_with_object.rb +16 -19
- data/lib/rubocop/cop/style/empty_case_condition.rb +27 -26
- data/lib/rubocop/cop/style/empty_else.rb +17 -19
- data/lib/rubocop/cop/style/empty_literal.rb +20 -21
- data/lib/rubocop/cop/style/empty_method.rb +10 -13
- data/lib/rubocop/cop/style/encoding.rb +6 -10
- data/lib/rubocop/cop/style/end_block.rb +4 -6
- data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
- data/lib/rubocop/cop/style/even_odd.rb +7 -11
- data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
- data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
- data/lib/rubocop/cop/style/exponential_notation.rb +9 -11
- data/lib/rubocop/cop/style/float_division.rb +8 -11
- data/lib/rubocop/cop/style/for.rb +11 -15
- data/lib/rubocop/cop/style/format_string.rb +21 -19
- data/lib/rubocop/cop/style/format_string_token.rb +10 -12
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +20 -42
- data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
- data/lib/rubocop/cop/style/global_vars.rb +2 -2
- data/lib/rubocop/cop/style/guard_clause.rb +5 -6
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
- data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
- data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
- data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
- data/lib/rubocop/cop/style/inline_comment.rb +3 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +23 -33
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/lambda.rb +7 -12
- data/lib/rubocop/cop/style/lambda_call.rb +14 -13
- data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
- data/lib/rubocop/cop/style/min_max.rb +8 -12
- data/lib/rubocop/cop/style/missing_else.rb +11 -21
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +10 -13
- data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
- data/lib/rubocop/cop/style/multiline_if_then.rb +5 -11
- data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -8
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
- data/lib/rubocop/cop/style/redundant_self.rb +6 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +3 -1
- data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
- data/lib/rubocop/cop/style/symbol_array.rb +6 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
- data/lib/rubocop/cop/team.rb +98 -82
- data/lib/rubocop/cop/tokens_util.rb +84 -0
- data/lib/rubocop/cop/util.rb +5 -15
- data/lib/rubocop/cop/utils/format_string.rb +2 -3
- data/lib/rubocop/cop/variable_force/branch.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +7 -5
- data/lib/rubocop/cop/variable_force.rb +0 -2
- data/lib/rubocop/cops_documentation_generator.rb +282 -0
- data/lib/rubocop/error.rb +1 -0
- data/lib/rubocop/file_finder.rb +12 -12
- data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -3
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/name_similarity.rb +7 -3
- data/lib/rubocop/options.rb +18 -11
- data/lib/rubocop/path_util.rb +19 -19
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/rake_task.rb +7 -9
- data/lib/rubocop/result_cache.rb +12 -8
- data/lib/rubocop/rspec/cop_helper.rb +4 -4
- data/lib/rubocop/rspec/expect_offense.rb +63 -22
- data/lib/rubocop/rspec/shared_contexts.rb +16 -17
- data/lib/rubocop/runner.rb +35 -34
- data/lib/rubocop/target_finder.rb +14 -11
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +2 -2
- data/lib/rubocop.rb +33 -5
- metadata +49 -11
- data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
- data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
- data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
data/lib/rubocop/cop/cop.rb
CHANGED
|
@@ -1,36 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'uri'
|
|
4
|
+
require_relative 'legacy/corrections_proxy'
|
|
4
5
|
|
|
5
6
|
module RuboCop
|
|
6
7
|
module Cop
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
#
|
|
13
|
-
# A commissioner object is responsible for traversing the AST and invoking
|
|
14
|
-
# the specific callbacks on each cop.
|
|
15
|
-
# If a cop needs to do its own processing of the AST or depends on
|
|
16
|
-
# something else, it should define the `#investigate` method and do
|
|
17
|
-
# the processing there.
|
|
18
|
-
#
|
|
19
|
-
# @example
|
|
20
|
-
#
|
|
21
|
-
# class CustomCop < Cop
|
|
22
|
-
# def investigate(processed_source)
|
|
23
|
-
# # Do custom processing
|
|
24
|
-
# end
|
|
25
|
-
# end
|
|
26
|
-
class Cop # rubocop:disable Metrics/ClassLength
|
|
27
|
-
extend RuboCop::AST::Sexp
|
|
28
|
-
extend NodePattern::Macros
|
|
29
|
-
include RuboCop::AST::Sexp
|
|
30
|
-
include Util
|
|
31
|
-
include IgnoredNode
|
|
32
|
-
include AutocorrectLogic
|
|
8
|
+
# @deprecated Use Cop::Base instead
|
|
9
|
+
# Legacy scaffold for Cops.
|
|
10
|
+
# See https://docs.rubocop.org/rubocop/cop_api_v1_changelog.html
|
|
11
|
+
class Cop < Base
|
|
12
|
+
attr_reader :offenses
|
|
33
13
|
|
|
14
|
+
exclude_from_registry
|
|
15
|
+
|
|
16
|
+
# @deprecated
|
|
34
17
|
Correction = Struct.new(:lambda, :node, :cop) do
|
|
35
18
|
def call(corrector)
|
|
36
19
|
lambda.call(corrector)
|
|
@@ -41,90 +24,16 @@ module RuboCop
|
|
|
41
24
|
end
|
|
42
25
|
end
|
|
43
26
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def self.badge
|
|
56
|
-
@badge ||= Badge.for(name)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def self.cop_name
|
|
60
|
-
badge.to_s
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def self.department
|
|
64
|
-
badge.department
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def self.lint?
|
|
68
|
-
department == :Lint
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Returns true if the cop name or the cop namespace matches any of the
|
|
72
|
-
# given names.
|
|
73
|
-
def self.match?(given_names)
|
|
74
|
-
return false unless given_names
|
|
75
|
-
|
|
76
|
-
given_names.include?(cop_name) ||
|
|
77
|
-
given_names.include?(department.to_s)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# List of cops that should not try to autocorrect at the same
|
|
81
|
-
# time as this cop
|
|
82
|
-
#
|
|
83
|
-
# @return [Array<RuboCop::Cop::Cop>]
|
|
84
|
-
#
|
|
85
|
-
# @api public
|
|
86
|
-
def self.autocorrect_incompatible_with
|
|
87
|
-
[]
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def initialize(config = nil, options = nil)
|
|
91
|
-
@config = config || Config.new
|
|
92
|
-
@options = options || { debug: false }
|
|
93
|
-
|
|
94
|
-
@offenses = []
|
|
95
|
-
@corrections = []
|
|
96
|
-
@corrected_nodes = {}
|
|
97
|
-
@corrected_nodes.compare_by_identity
|
|
98
|
-
@processed_source = nil
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def join_force?(_force_class)
|
|
102
|
-
false
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def cop_config
|
|
106
|
-
# Use department configuration as basis, but let individual cop
|
|
107
|
-
# configuration override.
|
|
108
|
-
@cop_config ||= @config.for_cop(self.class.department.to_s)
|
|
109
|
-
.merge(@config.for_cop(self))
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def message(_node = nil)
|
|
113
|
-
self.class::MSG
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def add_offense(node, location: :expression, message: nil, severity: nil)
|
|
117
|
-
loc = find_location(node, location)
|
|
118
|
-
|
|
119
|
-
return if duplicate_location?(loc)
|
|
120
|
-
|
|
121
|
-
severity = find_severity(node, severity)
|
|
122
|
-
message = find_message(node, message)
|
|
123
|
-
|
|
124
|
-
status = enabled_line?(loc.line) ? correct(node) : :disabled
|
|
125
|
-
|
|
126
|
-
@offenses << Offense.new(severity, loc, message, name, status)
|
|
127
|
-
yield if block_given? && status != :disabled
|
|
27
|
+
def add_offense(node_or_range, location: :expression, message: nil, severity: nil, &block)
|
|
28
|
+
@v0_argument = node_or_range
|
|
29
|
+
range = find_location(node_or_range, location)
|
|
30
|
+
if block.nil? && !autocorrect?
|
|
31
|
+
super(range, message: message, severity: severity)
|
|
32
|
+
else
|
|
33
|
+
super(range, message: message, severity: severity) do |corrector|
|
|
34
|
+
emulate_v0_callsequence(corrector, &block)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
128
37
|
end
|
|
129
38
|
|
|
130
39
|
def find_location(node, loc)
|
|
@@ -132,108 +41,43 @@ module RuboCop
|
|
|
132
41
|
loc.is_a?(Symbol) ? node.loc.public_send(loc) : loc
|
|
133
42
|
end
|
|
134
43
|
|
|
135
|
-
|
|
136
|
-
|
|
44
|
+
# @deprecated Use class method
|
|
45
|
+
def support_autocorrect?
|
|
46
|
+
# warn 'deprecated, use cop.class.support_autocorrect?' TODO
|
|
47
|
+
self.class.support_autocorrect?
|
|
137
48
|
end
|
|
138
49
|
|
|
139
|
-
def
|
|
140
|
-
|
|
141
|
-
return reason if reason
|
|
142
|
-
|
|
143
|
-
@corrected_nodes[node] = true
|
|
144
|
-
|
|
145
|
-
if support_autocorrect?
|
|
146
|
-
correction = autocorrect(node)
|
|
147
|
-
|
|
148
|
-
if correction
|
|
149
|
-
@corrections << Correction.new(correction, node, self)
|
|
150
|
-
:corrected
|
|
151
|
-
elsif disable_uncorrectable?
|
|
152
|
-
disable_uncorrectable(node)
|
|
153
|
-
:corrected_with_todo
|
|
154
|
-
else
|
|
155
|
-
:uncorrected
|
|
156
|
-
end
|
|
157
|
-
elsif disable_uncorrectable?
|
|
158
|
-
disable_uncorrectable(node)
|
|
159
|
-
:corrected_with_todo
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
def reason_to_not_correct(node)
|
|
164
|
-
return :unsupported unless correctable?
|
|
165
|
-
return :uncorrected unless autocorrect?
|
|
166
|
-
return :already_corrected if @corrected_nodes.key?(node)
|
|
167
|
-
|
|
168
|
-
nil
|
|
50
|
+
def self.support_autocorrect?
|
|
51
|
+
method_defined?(:autocorrect)
|
|
169
52
|
end
|
|
170
53
|
|
|
171
|
-
def
|
|
172
|
-
return unless
|
|
173
|
-
|
|
174
|
-
@disabled_lines ||= {}
|
|
175
|
-
line = node.location.line
|
|
176
|
-
return if @disabled_lines.key?(line)
|
|
54
|
+
def self.joining_forces
|
|
55
|
+
return unless method_defined?(:join_force?)
|
|
177
56
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
def config_to_allow_offenses
|
|
183
|
-
Formatter::DisabledConfigFormatter
|
|
184
|
-
.config_to_allow_offenses[cop_name] ||= {}
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
def config_to_allow_offenses=(hash)
|
|
188
|
-
Formatter::DisabledConfigFormatter.config_to_allow_offenses[cop_name] =
|
|
189
|
-
hash
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
def target_ruby_version
|
|
193
|
-
@config.target_ruby_version
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
def target_rails_version
|
|
197
|
-
@config.target_rails_version
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
def parse(source, path = nil)
|
|
201
|
-
ProcessedSource.new(source, target_ruby_version, path)
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
def cop_name
|
|
205
|
-
@cop_name ||= self.class.cop_name
|
|
57
|
+
cop = new
|
|
58
|
+
Force.all.select do |force_class|
|
|
59
|
+
cop.join_force?(force_class)
|
|
60
|
+
end
|
|
206
61
|
end
|
|
207
62
|
|
|
208
|
-
|
|
63
|
+
# @deprecated
|
|
64
|
+
def corrections
|
|
65
|
+
# warn 'Cop#corrections is deprecated' TODO
|
|
66
|
+
return [] unless @last_corrector
|
|
209
67
|
|
|
210
|
-
|
|
211
|
-
file == RuboCop::AST::ProcessedSource::STRING_SOURCE_NAME ||
|
|
212
|
-
file_name_matches_any?(file, 'Include', true) &&
|
|
213
|
-
!file_name_matches_any?(file, 'Exclude', false)
|
|
68
|
+
Legacy::CorrectionsProxy.new(@last_corrector)
|
|
214
69
|
end
|
|
215
70
|
|
|
216
|
-
|
|
217
|
-
|
|
71
|
+
# Called before all on_... have been called
|
|
72
|
+
def on_new_investigation
|
|
73
|
+
investigate(processed_source) if respond_to?(:investigate)
|
|
74
|
+
super
|
|
218
75
|
end
|
|
219
76
|
|
|
220
|
-
#
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
# (2) the cop's source code
|
|
225
|
-
# (3) the config (eg a .rubocop.yml file)
|
|
226
|
-
#
|
|
227
|
-
# For example, some cops may want to look at other parts of
|
|
228
|
-
# the codebase being inspected to find violations. A cop may
|
|
229
|
-
# use the presence or absence of file `foo.rb` to determine
|
|
230
|
-
# whether a certain violation exists in `bar.rb`.
|
|
231
|
-
#
|
|
232
|
-
# Overriding this method allows the cop to indicate to RuboCop's
|
|
233
|
-
# ResultCache system when those external dependencies change,
|
|
234
|
-
# ie when the ResultCache should be invalidated.
|
|
235
|
-
def external_dependency_checksum
|
|
236
|
-
nil
|
|
77
|
+
# Called after all on_... have been called
|
|
78
|
+
def on_investigation_end
|
|
79
|
+
investigate_post_walk(processed_source) if respond_to?(:investigate_post_walk)
|
|
80
|
+
super
|
|
237
81
|
end
|
|
238
82
|
|
|
239
83
|
### Deprecated registry access
|
|
@@ -253,58 +97,63 @@ module RuboCop
|
|
|
253
97
|
Registry.qualified_cop_name(name, origin)
|
|
254
98
|
end
|
|
255
99
|
|
|
100
|
+
# @deprecated
|
|
101
|
+
# Open issue if there's a valid use case to include this in Base
|
|
102
|
+
def parse(source, path = nil)
|
|
103
|
+
ProcessedSource.new(source, target_ruby_version, path)
|
|
104
|
+
end
|
|
105
|
+
|
|
256
106
|
private
|
|
257
107
|
|
|
258
|
-
def
|
|
259
|
-
|
|
108
|
+
def begin_investigation(processed_source)
|
|
109
|
+
super
|
|
110
|
+
@offenses = @current_offenses
|
|
111
|
+
@last_corrector = @current_corrector
|
|
260
112
|
end
|
|
261
113
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
).annotate(message)
|
|
114
|
+
# Override Base
|
|
115
|
+
def callback_argument(_range)
|
|
116
|
+
@v0_argument
|
|
266
117
|
end
|
|
267
118
|
|
|
268
|
-
def
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
path = nil
|
|
273
|
-
patterns.any? do |pattern|
|
|
274
|
-
# Try to match the absolute path, as Exclude properties are absolute.
|
|
275
|
-
next true if match_path?(pattern, file)
|
|
119
|
+
def apply_correction(corrector)
|
|
120
|
+
suppress_clobbering { super }
|
|
121
|
+
end
|
|
276
122
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
123
|
+
# Just for legacy
|
|
124
|
+
def emulate_v0_callsequence(corrector)
|
|
125
|
+
lambda = correction_lambda
|
|
126
|
+
yield corrector if block_given?
|
|
127
|
+
unless corrector.empty?
|
|
128
|
+
raise 'Your cop must inherit from Cop::Base and extend AutoCorrector'
|
|
280
129
|
end
|
|
281
|
-
end
|
|
282
130
|
|
|
283
|
-
|
|
284
|
-
return true if @options[:ignore_disable_comments] || !@processed_source
|
|
131
|
+
return unless lambda
|
|
285
132
|
|
|
286
|
-
|
|
133
|
+
suppress_clobbering do
|
|
134
|
+
lambda.call(corrector)
|
|
135
|
+
end
|
|
287
136
|
end
|
|
288
137
|
|
|
289
|
-
def
|
|
290
|
-
|
|
291
|
-
end
|
|
138
|
+
def correction_lambda
|
|
139
|
+
return unless correction_strategy == :attempt_correction && support_autocorrect?
|
|
292
140
|
|
|
293
|
-
|
|
294
|
-
|
|
141
|
+
dedup_on_node(@v0_argument) do
|
|
142
|
+
autocorrect(@v0_argument)
|
|
143
|
+
end
|
|
295
144
|
end
|
|
296
145
|
|
|
297
|
-
def
|
|
298
|
-
|
|
299
|
-
|
|
146
|
+
def dedup_on_node(node)
|
|
147
|
+
@corrected_nodes ||= {}.compare_by_identity
|
|
148
|
+
yield unless @corrected_nodes.key?(node)
|
|
149
|
+
ensure
|
|
150
|
+
@corrected_nodes[node] = true
|
|
151
|
+
end
|
|
300
152
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
"Valid severities are #{Severity::NAMES.join(', ')}."
|
|
306
|
-
warn(Rainbow(message).red)
|
|
307
|
-
end
|
|
153
|
+
def suppress_clobbering
|
|
154
|
+
yield
|
|
155
|
+
rescue ::Parser::ClobberingError
|
|
156
|
+
# ignore Clobbering errors
|
|
308
157
|
end
|
|
309
158
|
end
|
|
310
159
|
end
|
|
@@ -8,117 +8,25 @@ module RuboCop
|
|
|
8
8
|
# Important!
|
|
9
9
|
# The nodes modified by the corrections should be part of the
|
|
10
10
|
# AST of the source_buffer.
|
|
11
|
-
class Corrector
|
|
11
|
+
class Corrector < ::Parser::Source::TreeRewriter
|
|
12
|
+
# @param source [Parser::Source::Buffer, or anything
|
|
13
|
+
# leading to one via `(processed_source.)buffer`]
|
|
12
14
|
#
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# @example
|
|
19
|
-
#
|
|
20
|
-
# class AndOrCorrector
|
|
21
|
-
# def initialize(node)
|
|
22
|
-
# @node = node
|
|
23
|
-
# end
|
|
24
|
-
#
|
|
25
|
-
# def call(corrector)
|
|
26
|
-
# replacement = (@node.type == :and ? '&&' : '||')
|
|
27
|
-
# corrector.replace(@node.loc.operator, replacement)
|
|
28
|
-
# end
|
|
29
|
-
# end
|
|
30
|
-
#
|
|
31
|
-
# corrections = [AndOrCorrector.new(node)]
|
|
32
|
-
# corrector = Corrector.new(source_buffer, corrections)
|
|
33
|
-
def initialize(source_buffer, corrections = [])
|
|
34
|
-
@source_buffer = source_buffer
|
|
35
|
-
raise 'source_buffer should be a Parser::Source::Buffer' unless \
|
|
36
|
-
source_buffer.is_a? Parser::Source::Buffer
|
|
37
|
-
|
|
38
|
-
@corrections = corrections
|
|
39
|
-
@source_rewriter = Parser::Source::TreeRewriter.new(
|
|
40
|
-
source_buffer,
|
|
15
|
+
# corrector = Corrector.new(cop)
|
|
16
|
+
def initialize(source)
|
|
17
|
+
source = self.class.source_buffer(source)
|
|
18
|
+
super(
|
|
19
|
+
source,
|
|
41
20
|
different_replacements: :raise,
|
|
42
21
|
swallowed_insertions: :raise,
|
|
43
22
|
crossing_deletions: :accept
|
|
44
23
|
)
|
|
45
24
|
|
|
46
|
-
@diagnostics = []
|
|
47
25
|
# Don't print warnings to stderr if corrections conflict with each other
|
|
48
|
-
|
|
49
|
-
@diagnostics << diagnostic
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
attr_reader :corrections, :diagnostics
|
|
54
|
-
|
|
55
|
-
# Does the actual rewrite and returns string corresponding to
|
|
56
|
-
# the rewritten source.
|
|
57
|
-
#
|
|
58
|
-
# @return [String]
|
|
59
|
-
def rewrite
|
|
60
|
-
@corrections.each do |correction|
|
|
61
|
-
begin
|
|
62
|
-
@source_rewriter.transaction do
|
|
63
|
-
correction.call(self)
|
|
64
|
-
end
|
|
65
|
-
rescue ErrorWithAnalyzedFileLocation => e
|
|
66
|
-
raise e unless e.cause.is_a?(::Parser::ClobberingError)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
@source_rewriter.process
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Removes the source range.
|
|
74
|
-
#
|
|
75
|
-
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
|
76
|
-
def remove(node_or_range)
|
|
77
|
-
range = to_range(node_or_range)
|
|
78
|
-
@source_rewriter.remove(range)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Inserts new code before the given source range.
|
|
82
|
-
#
|
|
83
|
-
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
|
84
|
-
# @param [String] content
|
|
85
|
-
def insert_before(node_or_range, content)
|
|
86
|
-
range = to_range(node_or_range)
|
|
87
|
-
# TODO: Fix Cops using bad ranges instead
|
|
88
|
-
if range.end_pos > @source_buffer.source.size
|
|
89
|
-
range = range.with(end_pos: @source_buffer.source.size)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
@source_rewriter.insert_before(range, content)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# Inserts new code after the given source range.
|
|
96
|
-
#
|
|
97
|
-
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
|
98
|
-
# @param [String] content
|
|
99
|
-
def insert_after(node_or_range, content)
|
|
100
|
-
range = to_range(node_or_range)
|
|
101
|
-
@source_rewriter.insert_after(range, content)
|
|
26
|
+
diagnostics.consumer = ->(diagnostic) {}
|
|
102
27
|
end
|
|
103
28
|
|
|
104
|
-
|
|
105
|
-
#
|
|
106
|
-
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
|
107
|
-
# @param [String] before
|
|
108
|
-
# @param [String] after
|
|
109
|
-
def wrap(node_or_range, before, after)
|
|
110
|
-
range = to_range(node_or_range)
|
|
111
|
-
@source_rewriter.wrap(range, before, after)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# Replaces the code of the source range `range` with `content`.
|
|
115
|
-
#
|
|
116
|
-
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
|
117
|
-
# @param [String] content
|
|
118
|
-
def replace(node_or_range, content)
|
|
119
|
-
range = to_range(node_or_range)
|
|
120
|
-
@source_rewriter.replace(range, content)
|
|
121
|
-
end
|
|
29
|
+
alias rewrite process # Legacy
|
|
122
30
|
|
|
123
31
|
# Removes `size` characters prior to the source range.
|
|
124
32
|
#
|
|
@@ -126,10 +34,11 @@ module RuboCop
|
|
|
126
34
|
# @param [Integer] size
|
|
127
35
|
def remove_preceding(node_or_range, size)
|
|
128
36
|
range = to_range(node_or_range)
|
|
129
|
-
to_remove =
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
37
|
+
to_remove = range.with(
|
|
38
|
+
begin_pos: range.begin_pos - size,
|
|
39
|
+
end_pos: range.begin_pos
|
|
40
|
+
)
|
|
41
|
+
remove(to_remove)
|
|
133
42
|
end
|
|
134
43
|
|
|
135
44
|
# Removes `size` characters from the beginning of the given range.
|
|
@@ -140,10 +49,8 @@ module RuboCop
|
|
|
140
49
|
# @param [Integer] size
|
|
141
50
|
def remove_leading(node_or_range, size)
|
|
142
51
|
range = to_range(node_or_range)
|
|
143
|
-
to_remove =
|
|
144
|
-
|
|
145
|
-
range.begin_pos + size)
|
|
146
|
-
@source_rewriter.remove(to_remove)
|
|
52
|
+
to_remove = range.with(end_pos: range.begin_pos + size)
|
|
53
|
+
remove(to_remove)
|
|
147
54
|
end
|
|
148
55
|
|
|
149
56
|
# Removes `size` characters from the end of the given range.
|
|
@@ -154,10 +61,22 @@ module RuboCop
|
|
|
154
61
|
# @param [Integer] size
|
|
155
62
|
def remove_trailing(node_or_range, size)
|
|
156
63
|
range = to_range(node_or_range)
|
|
157
|
-
to_remove =
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
64
|
+
to_remove = range.with(begin_pos: range.end_pos - size)
|
|
65
|
+
remove(to_remove)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Duck typing for get to a ::Parser::Source::Buffer
|
|
69
|
+
def self.source_buffer(source)
|
|
70
|
+
source = source.processed_source if source.respond_to?(:processed_source)
|
|
71
|
+
source = source.buffer if source.respond_to?(:buffer)
|
|
72
|
+
source = source.source_buffer if source.respond_to?(:source_buffer)
|
|
73
|
+
|
|
74
|
+
unless source.is_a? ::Parser::Source::Buffer
|
|
75
|
+
raise TypeError, 'Expected argument to lead to a Parser::Source::Buffer ' \
|
|
76
|
+
"but got #{source.inspect}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
source
|
|
161
80
|
end
|
|
162
81
|
|
|
163
82
|
private
|
|
@@ -178,8 +97,12 @@ module RuboCop
|
|
|
178
97
|
range
|
|
179
98
|
end
|
|
180
99
|
|
|
100
|
+
def check_range_validity(node_or_range)
|
|
101
|
+
super(to_range(node_or_range))
|
|
102
|
+
end
|
|
103
|
+
|
|
181
104
|
def validate_buffer(buffer)
|
|
182
|
-
return if buffer ==
|
|
105
|
+
return if buffer == source_buffer
|
|
183
106
|
|
|
184
107
|
unless buffer.is_a?(::Parser::Source::Buffer)
|
|
185
108
|
# actually this should be enforced by parser gem
|
|
@@ -16,7 +16,7 @@ module RuboCop
|
|
|
16
16
|
processed_source:)
|
|
17
17
|
@processed_source = processed_source
|
|
18
18
|
range = first_part_of(node.to_a.last)
|
|
19
|
-
eol_comment =
|
|
19
|
+
eol_comment = processed_source.comment_at_line(node.source_range.line)
|
|
20
20
|
|
|
21
21
|
break_line_before(range: range, node: node, corrector: corrector,
|
|
22
22
|
configured_width: configured_width)
|
|
@@ -29,8 +29,8 @@ module RuboCop
|
|
|
29
29
|
configured_width:)
|
|
30
30
|
corrector.insert_before(
|
|
31
31
|
range,
|
|
32
|
-
"\n
|
|
33
|
-
indent_steps * configured_width)
|
|
32
|
+
"\n#{' ' * (node.loc.keyword.column +
|
|
33
|
+
indent_steps * configured_width)}"
|
|
34
34
|
)
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
|
39
39
|
|
|
40
40
|
text = eol_comment.loc.expression.source
|
|
41
41
|
corrector.insert_before(node,
|
|
42
|
-
text
|
|
42
|
+
"#{text}\n#{' ' * node.loc.keyword.column}")
|
|
43
43
|
corrector.remove(eol_comment)
|
|
44
44
|
end
|
|
45
45
|
|
|
@@ -42,8 +42,34 @@ module RuboCop
|
|
|
42
42
|
|
|
43
43
|
corrector.insert_before(
|
|
44
44
|
last_element_range_with_trailing_comma(node).end,
|
|
45
|
+
content_if_comment_present(corrector, node)
|
|
46
|
+
)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def content_if_comment_present(corrector, node)
|
|
50
|
+
range = range_with_surrounding_space(
|
|
51
|
+
range: children(node).last.source_range,
|
|
52
|
+
side: :right
|
|
53
|
+
).end.resize(1)
|
|
54
|
+
if range.source == '#'
|
|
55
|
+
select_content_to_be_inserted_after_last_element(corrector, node)
|
|
56
|
+
else
|
|
45
57
|
node.loc.end.source
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def select_content_to_be_inserted_after_last_element(corrector, node)
|
|
62
|
+
range = range_between(
|
|
63
|
+
node.loc.end.begin_pos,
|
|
64
|
+
range_by_whole_lines(node.loc.expression).end.end_pos
|
|
46
65
|
)
|
|
66
|
+
|
|
67
|
+
remove_trailing_content_of_comment(corrector, range)
|
|
68
|
+
range.source
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def remove_trailing_content_of_comment(corrector, range)
|
|
72
|
+
corrector.remove(range)
|
|
47
73
|
end
|
|
48
74
|
|
|
49
75
|
def last_element_range_with_trailing_comma(node)
|
|
@@ -71,7 +71,7 @@ module RuboCop
|
|
|
71
71
|
prev_line_num,
|
|
72
72
|
base_line_num,
|
|
73
73
|
index)
|
|
74
|
-
prev_line_num = word_node.
|
|
74
|
+
prev_line_num = word_node.last_line
|
|
75
75
|
content = fix_escaped_content(word_node, escape, delimiters)
|
|
76
76
|
line_breaks + content
|
|
77
77
|
end
|
|
@@ -110,7 +110,7 @@ module RuboCop
|
|
|
110
110
|
|
|
111
111
|
def end_content(source)
|
|
112
112
|
result = /\A(\s*)\]/.match(source.split("\n").last)
|
|
113
|
-
|
|
113
|
+
"\n#{result[1]}" if result
|
|
114
114
|
end
|
|
115
115
|
end
|
|
116
116
|
end
|