rubocop 0.51.0 → 0.52.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/README.md +1 -2
- data/config/default.yml +86 -10
- data/config/disabled.yml +9 -4
- data/config/enabled.yml +1105 -1006
- data/lib/rubocop.rb +30 -3
- data/lib/rubocop/ast/builder.rb +2 -0
- data/lib/rubocop/ast/node.rb +24 -2
- data/lib/rubocop/ast/node/args_node.rb +17 -0
- data/lib/rubocop/ast/node/array_node.rb +1 -1
- data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
- data/lib/rubocop/ast/node/send_node.rb +20 -0
- data/lib/rubocop/ast/node/str_node.rb +14 -0
- data/lib/rubocop/ast/node/symbol_node.rb +20 -0
- data/lib/rubocop/ast/traversal.rb +4 -4
- data/lib/rubocop/cli.rb +45 -4
- data/lib/rubocop/comment_config.rb +2 -5
- data/lib/rubocop/config.rb +42 -8
- data/lib/rubocop/config_loader.rb +39 -100
- data/lib/rubocop/config_loader_resolver.rb +99 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +7 -7
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -3
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
- data/lib/rubocop/cop/cop.rb +16 -46
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
- data/lib/rubocop/cop/generator.rb +23 -4
- data/lib/rubocop/cop/internal_affairs.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
- 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/layout/access_modifier_indentation.rb +4 -7
- data/lib/rubocop/cop/layout/align_hash.rb +16 -16
- data/lib/rubocop/cop/layout/align_parameters.rb +6 -12
- data/lib/rubocop/cop/layout/block_end_newline.rb +19 -5
- data/lib/rubocop/cop/layout/case_indentation.rb +14 -17
- data/lib/rubocop/cop/layout/class_structure.rb +306 -0
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -0
- data/lib/rubocop/cop/layout/comment_indentation.rb +39 -2
- data/lib/rubocop/cop/layout/dot_position.rb +22 -13
- data/lib/rubocop/cop/layout/else_alignment.rb +6 -6
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +17 -17
- data/lib/rubocop/cop/layout/empty_lines.rb +15 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -2
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +21 -24
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indent_array.rb +67 -20
- data/lib/rubocop/cop/layout/indent_hash.rb +70 -25
- data/lib/rubocop/cop/layout/indent_heredoc.rb +51 -11
- data/lib/rubocop/cop/layout/indentation_width.rb +24 -17
- data/lib/rubocop/cop/layout/initial_indentation.rb +7 -5
- data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -9
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -10
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -3
- data/lib/rubocop/cop/layout/space_after_colon.rb +4 -4
- data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
- data/lib/rubocop/cop/layout/space_after_method_name.rb +4 -4
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +16 -19
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +27 -16
- data/lib/rubocop/cop/layout/space_around_keyword.rb +13 -11
- data/lib/rubocop/cop/layout/space_around_operators.rb +26 -13
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +10 -10
- data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
- data/lib/rubocop/cop/layout/space_before_comment.rb +2 -4
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -3
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -12
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +87 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +57 -34
- data/lib/rubocop/cop/layout/space_inside_parens.rb +31 -3
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -13
- data/lib/rubocop/cop/layout/tab.rb +2 -2
- data/lib/rubocop/cop/layout/trailing_blank_lines.rb +7 -7
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +11 -20
- data/lib/rubocop/cop/lint/block_alignment.rb +26 -23
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/def_end_alignment.rb +5 -10
- data/lib/rubocop/cop/lint/else_layout.rb +2 -2
- data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -4
- data/lib/rubocop/cop/lint/inherit_exception.rb +10 -14
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +14 -14
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +11 -11
- data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
- data/lib/rubocop/cop/lint/script_permission.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
- data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
- data/lib/rubocop/cop/lint/unneeded_disable.rb +29 -11
- data/lib/rubocop/cop/lint/unneeded_require_statement.rb +2 -1
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +43 -17
- data/lib/rubocop/cop/message_annotator.rb +4 -2
- data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +3 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
- data/lib/rubocop/cop/metrics/line_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +3 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -5
- data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +7 -3
- data/lib/rubocop/cop/mixin/heredoc.rb +19 -19
- data/lib/rubocop/cop/mixin/method_complexity.rb +32 -8
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +6 -4
- data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +16 -12
- data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -8
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -10
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
- data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
- data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -14
- data/lib/rubocop/cop/mixin/unused_argument.rb +3 -40
- data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +33 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +5 -4
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +16 -12
- data/lib/rubocop/cop/naming/constant_name.rb +32 -3
- data/lib/rubocop/cop/naming/file_name.rb +19 -8
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
- data/lib/rubocop/cop/naming/method_name.rb +20 -14
- data/lib/rubocop/cop/naming/predicate_name.rb +7 -3
- data/lib/rubocop/cop/naming/variable_name.rb +17 -2
- data/lib/rubocop/cop/naming/variable_number.rb +10 -27
- data/lib/rubocop/cop/offense.rb +6 -1
- data/lib/rubocop/cop/performance/case_when_splat.rb +2 -6
- data/lib/rubocop/cop/performance/casecmp.rb +5 -4
- data/lib/rubocop/cop/performance/compare_with_block.rb +13 -7
- data/lib/rubocop/cop/performance/count.rb +5 -4
- data/lib/rubocop/cop/performance/detect.rb +7 -4
- data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -7
- data/lib/rubocop/cop/performance/end_with.rb +2 -2
- data/lib/rubocop/cop/performance/flat_map.rb +3 -2
- data/lib/rubocop/cop/performance/hash_each_methods.rb +41 -40
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +5 -4
- data/lib/rubocop/cop/performance/redundant_block_call.rb +22 -22
- data/lib/rubocop/cop/performance/redundant_match.rb +2 -2
- data/lib/rubocop/cop/performance/redundant_merge.rb +6 -4
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -4
- data/lib/rubocop/cop/performance/regexp_match.rb +3 -2
- data/lib/rubocop/cop/performance/size.rb +2 -2
- data/lib/rubocop/cop/performance/start_with.rb +2 -2
- data/lib/rubocop/cop/performance/string_replacement.rb +4 -4
- data/lib/rubocop/cop/performance/times_map.rb +14 -15
- data/lib/rubocop/cop/performance/uri_default_parser.rb +3 -3
- data/lib/rubocop/cop/rails/action_filter.rb +22 -0
- data/lib/rubocop/cop/rails/active_support_aliases.rb +2 -2
- data/lib/rubocop/cop/rails/application_job.rb +4 -2
- data/lib/rubocop/cop/rails/application_record.rb +4 -2
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
- data/lib/rubocop/cop/rails/delegate.rb +20 -25
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +2 -2
- data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
- data/lib/rubocop/cop/rails/exit.rb +7 -0
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +7 -0
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +36 -41
- data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
- data/lib/rubocop/cop/rails/output.rb +9 -0
- data/lib/rubocop/cop/rails/output_safety.rb +14 -20
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +8 -8
- data/lib/rubocop/cop/rails/presence.rb +105 -0
- data/lib/rubocop/cop/rails/read_write_attribute.rb +10 -10
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
- data/lib/rubocop/cop/rails/relative_date_constant.rb +9 -9
- data/lib/rubocop/cop/rails/reversible_migration.rb +3 -4
- data/lib/rubocop/cop/rails/safe_navigation.rb +5 -6
- data/lib/rubocop/cop/rails/save_bang.rb +2 -2
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +1 -1
- data/lib/rubocop/cop/rails/validation.rb +7 -7
- data/lib/rubocop/cop/security/json_load.rb +4 -2
- data/lib/rubocop/cop/security/marshal_load.rb +4 -2
- data/lib/rubocop/cop/style/alias.rb +24 -26
- data/lib/rubocop/cop/style/and_or.rb +34 -28
- data/lib/rubocop/cop/style/array_join.rb +9 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
- data/lib/rubocop/cop/style/attr.rb +14 -4
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -3
- data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
- data/lib/rubocop/cop/style/block_comments.rb +14 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +80 -15
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +81 -48
- data/lib/rubocop/cop/style/case_equality.rb +12 -0
- data/lib/rubocop/cop/style/character_literal.rb +10 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -2
- data/lib/rubocop/cop/style/class_check.rb +28 -9
- data/lib/rubocop/cop/style/class_methods.rb +8 -8
- data/lib/rubocop/cop/style/class_vars.rb +4 -3
- data/lib/rubocop/cop/style/collection_methods.rb +4 -2
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -0
- data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
- data/lib/rubocop/cop/style/command_literal.rb +70 -21
- data/lib/rubocop/cop/style/comment_annotation.rb +35 -10
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +10 -12
- data/lib/rubocop/cop/style/copyright.rb +19 -20
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +27 -2
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +17 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
- data/lib/rubocop/cop/style/each_with_object.rb +5 -5
- data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
- data/lib/rubocop/cop/style/empty_else.rb +52 -22
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
- data/lib/rubocop/cop/style/empty_literal.rb +17 -5
- data/lib/rubocop/cop/style/empty_method.rb +4 -10
- data/lib/rubocop/cop/style/encoding.rb +2 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
- data/lib/rubocop/cop/style/even_odd.rb +4 -2
- data/lib/rubocop/cop/style/extend_self.rb +92 -0
- data/lib/rubocop/cop/style/flip_flop.rb +11 -0
- data/lib/rubocop/cop/style/format_string.rb +29 -2
- data/lib/rubocop/cop/style/format_string_token.rb +15 -14
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -3
- data/lib/rubocop/cop/style/global_vars.rb +11 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +44 -43
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -10
- data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -7
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +9 -0
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
- data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +23 -31
- data/lib/rubocop/cop/style/lambda_call.rb +15 -9
- data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -3
- data/lib/rubocop/cop/style/method_missing.rb +8 -8
- data/lib/rubocop/cop/style/min_max.rb +12 -12
- data/lib/rubocop/cop/style/missing_else.rb +5 -4
- data/lib/rubocop/cop/style/mixin_grouping.rb +29 -19
- data/lib/rubocop/cop/style/mixin_usage.rb +8 -10
- data/lib/rubocop/cop/style/module_function.rb +17 -5
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -4
- data/lib/rubocop/cop/style/multiline_if_then.rb +14 -13
- data/lib/rubocop/cop/style/multiline_memoization.rb +8 -14
- data/lib/rubocop/cop/style/mutable_constant.rb +12 -12
- data/lib/rubocop/cop/style/negated_if.rb +22 -30
- data/lib/rubocop/cop/style/negated_while.rb +1 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +18 -17
- data/lib/rubocop/cop/style/next.rb +39 -11
- data/lib/rubocop/cop/style/nil_comparison.rb +6 -6
- data/lib/rubocop/cop/style/non_nil_check.rb +25 -22
- data/lib/rubocop/cop/style/not.rb +14 -4
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -7
- data/lib/rubocop/cop/style/numeric_predicate.rb +14 -18
- data/lib/rubocop/cop/style/one_line_conditional.rb +4 -4
- data/lib/rubocop/cop/style/option_hash.rb +11 -14
- data/lib/rubocop/cop/style/or_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +13 -13
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +19 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +24 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +27 -6
- data/lib/rubocop/cop/style/perl_backrefs.rb +7 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +6 -10
- data/lib/rubocop/cop/style/proc.rb +8 -0
- data/lib/rubocop/cop/style/raise_args.rb +8 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +14 -4
- data/lib/rubocop/cop/style/redundant_conditional.rb +9 -8
- data/lib/rubocop/cop/style/redundant_return.rb +5 -4
- data/lib/rubocop/cop/style/redundant_self.rb +25 -26
- data/lib/rubocop/cop/style/regexp_literal.rb +74 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +11 -0
- data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
- data/lib/rubocop/cop/style/return_nil.rb +4 -8
- data/lib/rubocop/cop/style/safe_navigation.rb +20 -2
- data/lib/rubocop/cop/style/self_assignment.rb +13 -13
- data/lib/rubocop/cop/style/semicolon.rb +18 -8
- data/lib/rubocop/cop/style/send.rb +9 -0
- data/lib/rubocop/cop/style/signal_exception.rb +100 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +20 -8
- data/lib/rubocop/cop/style/special_global_vars.rb +16 -11
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +7 -12
- data/lib/rubocop/cop/style/stderr_puts.rb +5 -3
- data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
- data/lib/rubocop/cop/style/string_literals.rb +22 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -8
- data/lib/rubocop/cop/style/string_methods.rb +18 -7
- data/lib/rubocop/cop/style/symbol_array.rb +5 -9
- data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
- data/lib/rubocop/cop/style/ternary_parentheses.rb +31 -40
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
- data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +32 -10
- data/lib/rubocop/cop/style/unless_else.rb +15 -0
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +17 -7
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +14 -18
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -12
- data/lib/rubocop/cop/style/variable_interpolation.rb +20 -9
- data/lib/rubocop/cop/style/when_then.rb +13 -0
- data/lib/rubocop/cop/style/while_until_do.rb +26 -4
- data/lib/rubocop/cop/style/while_until_modifier.rb +25 -6
- data/lib/rubocop/cop/style/word_array.rb +4 -8
- data/lib/rubocop/cop/style/yoda_condition.rb +10 -16
- data/lib/rubocop/cop/style/zero_length_predicate.rb +23 -15
- data/lib/rubocop/cop/util.rb +42 -33
- data/lib/rubocop/cop/variable_force.rb +1 -1
- data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
- data/lib/rubocop/cop/variable_force/scope.rb +1 -5
- data/lib/rubocop/cop/variable_force/variable.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -3
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/json_formatter.rb +9 -3
- data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
- data/lib/rubocop/node_pattern.rb +2 -3
- data/lib/rubocop/options.rb +8 -8
- data/lib/rubocop/path_util.rb +15 -3
- data/lib/rubocop/processed_source.rb +5 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -0
- data/lib/rubocop/runner.rb +1 -1
- data/lib/rubocop/token.rb +74 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +37 -10
- data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
- data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
- data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
- data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
# node.send_type?
|
15
15
|
#
|
16
16
|
class NodeTypePredicate < Cop
|
17
|
-
MSG = 'Use
|
17
|
+
MSG = 'Use `#%<type>s_type?` to check node type.'.freeze
|
18
18
|
|
19
19
|
def_node_matcher :node_type_check, <<-PATTERN
|
20
20
|
(send (send $_ :type) :== (sym $_))
|
@@ -24,7 +24,7 @@ module RuboCop
|
|
24
24
|
node_type_check(node) do |_receiver, node_type|
|
25
25
|
return unless Parser::Meta::NODE_TYPES.include?(node_type)
|
26
26
|
|
27
|
-
add_offense(node, message: format(MSG, node_type))
|
27
|
+
add_offense(node, message: format(MSG, type: node_type))
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -14,16 +14,23 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# add_offense(node, location: :selector)
|
16
16
|
class OffenseLocationKeyword < Cop
|
17
|
-
MSG = 'Use
|
17
|
+
MSG = 'Use `:%<keyword>s` as the location argument to ' \
|
18
|
+
'`#add_offense`.'.freeze
|
18
19
|
|
19
20
|
def on_send(node)
|
20
21
|
node_type_check(node) do |node_arg, kwargs|
|
21
22
|
find_offending_argument(node_arg, kwargs) do |location, keyword|
|
22
|
-
add_offense(location, message: format(MSG, keyword))
|
23
|
+
add_offense(location, message: format(MSG, keyword: keyword))
|
23
24
|
end
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
28
|
+
def autocorrect(node)
|
29
|
+
(*, keyword) = offending_location_argument(node.parent)
|
30
|
+
|
31
|
+
->(corrector) { corrector.replace(node.source_range, ":#{keyword}") }
|
32
|
+
end
|
33
|
+
|
27
34
|
private
|
28
35
|
|
29
36
|
def_node_matcher :node_type_check, <<-PATTERN
|
@@ -34,12 +41,6 @@ module RuboCop
|
|
34
41
|
(pair (sym :location) $(send (send $_node :loc) $_keyword))
|
35
42
|
PATTERN
|
36
43
|
|
37
|
-
def autocorrect(node)
|
38
|
-
(*, keyword) = offending_location_argument(node.parent)
|
39
|
-
|
40
|
-
->(corrector) { corrector.replace(node.source_range, ":#{keyword}") }
|
41
|
-
end
|
42
|
-
|
43
44
|
def find_offending_argument(searched_node, kwargs)
|
44
45
|
kwargs.pairs.each do |pair|
|
45
46
|
offending_location_argument(pair) do |location, node, keyword|
|
@@ -6,9 +6,7 @@ module RuboCop
|
|
6
6
|
# Modifiers should be indented as deep as method definitions, or as deep
|
7
7
|
# as the class/module keyword, depending on configuration.
|
8
8
|
#
|
9
|
-
# @example
|
10
|
-
# # EnforcedStyle: indent (default)
|
11
|
-
#
|
9
|
+
# @example EnforcedStyle: indent (default)
|
12
10
|
# # bad
|
13
11
|
# class Plumbus
|
14
12
|
# private
|
@@ -21,8 +19,7 @@ module RuboCop
|
|
21
19
|
# def smooth; end
|
22
20
|
# end
|
23
21
|
#
|
24
|
-
#
|
25
|
-
#
|
22
|
+
# @example EnforcedStyle: outdent
|
26
23
|
# # bad
|
27
24
|
# class Plumbus
|
28
25
|
# private
|
@@ -38,7 +35,7 @@ module RuboCop
|
|
38
35
|
include AutocorrectAlignment
|
39
36
|
include ConfigurableEnforcedStyle
|
40
37
|
|
41
|
-
MSG = '
|
38
|
+
MSG = '%<style>s access modifiers like `%<node>s`.'.freeze
|
42
39
|
|
43
40
|
def on_class(node)
|
44
41
|
_name, _base_class, body = *node
|
@@ -91,7 +88,7 @@ module RuboCop
|
|
91
88
|
end
|
92
89
|
|
93
90
|
def message(node)
|
94
|
-
format(MSG, style.capitalize, node.loc.selector.source)
|
91
|
+
format(MSG, style: style.capitalize, node: node.loc.selector.source)
|
95
92
|
end
|
96
93
|
|
97
94
|
def expected_indent_offset
|
@@ -116,7 +116,7 @@ module RuboCop
|
|
116
116
|
|
117
117
|
def on_hash(node)
|
118
118
|
return if ignored_node?(node)
|
119
|
-
return if node.
|
119
|
+
return if node.empty? || node.single_line?
|
120
120
|
|
121
121
|
return unless alignment_for_hash_rockets.checkable_layout?(node) &&
|
122
122
|
alignment_for_colons.checkable_layout?(node)
|
@@ -124,6 +124,21 @@ module RuboCop
|
|
124
124
|
check_pairs(node)
|
125
125
|
end
|
126
126
|
|
127
|
+
def autocorrect(node)
|
128
|
+
# We can't use the instance variable inside the lambda. That would
|
129
|
+
# just give each lambda the same reference and they would all get the
|
130
|
+
# last value of each. A local variable fixes the problem.
|
131
|
+
key_delta = column_deltas[:key] || 0
|
132
|
+
|
133
|
+
if !node.value
|
134
|
+
correct_no_value(key_delta, node.source_range)
|
135
|
+
else
|
136
|
+
correct_key_value(key_delta, node.key.source_range,
|
137
|
+
node.value.source_range,
|
138
|
+
node.loc.operator)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
127
142
|
private
|
128
143
|
|
129
144
|
attr_accessor :column_deltas
|
@@ -172,21 +187,6 @@ module RuboCop
|
|
172
187
|
new_alignment('EnforcedColonStyle')
|
173
188
|
end
|
174
189
|
|
175
|
-
def autocorrect(node)
|
176
|
-
# We can't use the instance variable inside the lambda. That would
|
177
|
-
# just give each lambda the same reference and they would all get the
|
178
|
-
# last value of each. A local variable fixes the problem.
|
179
|
-
key_delta = column_deltas[:key] || 0
|
180
|
-
|
181
|
-
if !node.value
|
182
|
-
correct_no_value(key_delta, node.source_range)
|
183
|
-
else
|
184
|
-
correct_key_value(key_delta, node.key.source_range,
|
185
|
-
node.value.source_range,
|
186
|
-
node.loc.operator)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
190
|
def correct_no_value(key_delta, key)
|
191
191
|
->(corrector) { adjust(corrector, key_delta, key) }
|
192
192
|
end
|
@@ -6,10 +6,7 @@ module RuboCop
|
|
6
6
|
# Here we check if the parameters on a multi-line method call or
|
7
7
|
# definition are aligned.
|
8
8
|
#
|
9
|
-
# @example
|
10
|
-
#
|
11
|
-
# # EnforcedStyle: with_first_parameter
|
12
|
-
#
|
9
|
+
# @example EnforcedStyle: with_first_parameter (default)
|
13
10
|
# # good
|
14
11
|
#
|
15
12
|
# foo :bar,
|
@@ -20,10 +17,7 @@ module RuboCop
|
|
20
17
|
# foo :bar,
|
21
18
|
# :baz
|
22
19
|
#
|
23
|
-
# @example
|
24
|
-
#
|
25
|
-
# # EnforcedStyle: with_fixed_indentation
|
26
|
-
#
|
20
|
+
# @example EnforcedStyle: with_fixed_indentation
|
27
21
|
# # good
|
28
22
|
#
|
29
23
|
# foo :bar,
|
@@ -36,11 +30,11 @@ module RuboCop
|
|
36
30
|
class AlignParameters < Cop
|
37
31
|
include AutocorrectAlignment
|
38
32
|
|
39
|
-
ALIGN_PARAMS_MSG = 'Align the parameters of a method
|
40
|
-
'more than one line.'.freeze
|
33
|
+
ALIGN_PARAMS_MSG = 'Align the parameters of a method %<type>s if ' \
|
34
|
+
'they span more than one line.'.freeze
|
41
35
|
|
42
36
|
FIXED_INDENT_MSG = 'Use one level of indentation for parameters ' \
|
43
|
-
'following the first line of a multi-line method
|
37
|
+
'following the first line of a multi-line method %<type>s.'.freeze
|
44
38
|
|
45
39
|
def on_send(node)
|
46
40
|
return if node.arguments.size < 2 ||
|
@@ -57,7 +51,7 @@ module RuboCop
|
|
57
51
|
type = node && node.parent.send_type? ? 'call' : 'definition'
|
58
52
|
msg = fixed_indentation? ? FIXED_INDENT_MSG : ALIGN_PARAMS_MSG
|
59
53
|
|
60
|
-
format(msg, type)
|
54
|
+
format(msg, type: type)
|
61
55
|
end
|
62
56
|
|
63
57
|
def fixed_indentation?
|
@@ -25,7 +25,8 @@ module RuboCop
|
|
25
25
|
# foo(i)
|
26
26
|
# }
|
27
27
|
class BlockEndNewline < Cop
|
28
|
-
MSG = 'Expression at
|
28
|
+
MSG = 'Expression at %<line>d, %<column>d should be on its own line.'
|
29
|
+
.freeze
|
29
30
|
|
30
31
|
def on_block(node)
|
31
32
|
return if node.single_line?
|
@@ -38,23 +39,36 @@ module RuboCop
|
|
38
39
|
add_offense(node, location: end_loc)
|
39
40
|
end
|
40
41
|
|
41
|
-
private
|
42
|
-
|
43
42
|
def autocorrect(node)
|
44
43
|
lambda do |corrector|
|
45
44
|
indentation = indentation_of_block_start_line(node)
|
46
|
-
|
45
|
+
new_block_end = "\n" + node.loc.end.source + (' ' * indentation)
|
46
|
+
corrector.replace(delimiter_range(node), new_block_end)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
private
|
51
|
+
|
50
52
|
def message(node)
|
51
|
-
format(MSG, node.loc.end.line, node.loc.end.column + 1)
|
53
|
+
format(MSG, line: node.loc.end.line, column: node.loc.end.column + 1)
|
52
54
|
end
|
53
55
|
|
54
56
|
def indentation_of_block_start_line(node)
|
55
57
|
match = /\S.*/.match(node.loc.begin.source_line)
|
56
58
|
match.begin(0)
|
57
59
|
end
|
60
|
+
|
61
|
+
def delimiter_range(node)
|
62
|
+
Parser::Source::Range.new(
|
63
|
+
node.loc.end.source_buffer,
|
64
|
+
index_of_delimiter_with_whitespaces(node),
|
65
|
+
node.source.length
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
def index_of_delimiter_with_whitespaces(node)
|
70
|
+
node.source =~ /\s*#{node.closing_delimiter}/
|
71
|
+
end
|
58
72
|
end
|
59
73
|
end
|
60
74
|
end
|
@@ -30,13 +30,11 @@ module RuboCop
|
|
30
30
|
# y / 3
|
31
31
|
# end
|
32
32
|
#
|
33
|
-
# @example
|
33
|
+
# @example EnforcedStyle: case (default)
|
34
34
|
# # if EndAlignment is set to other style such as
|
35
35
|
# # start_of_line (as shown below), then *when* alignment
|
36
36
|
# # configuration does have an effect.
|
37
37
|
#
|
38
|
-
# # EnforcedStyle: case (default)
|
39
|
-
#
|
40
38
|
# # bad
|
41
39
|
# a = case n
|
42
40
|
# when 0
|
@@ -53,8 +51,7 @@ module RuboCop
|
|
53
51
|
# y / 3
|
54
52
|
# end
|
55
53
|
#
|
56
|
-
#
|
57
|
-
#
|
54
|
+
# @example EnforcedStyle: end
|
58
55
|
# # bad
|
59
56
|
# a = case n
|
60
57
|
# when 0
|
@@ -74,7 +71,7 @@ module RuboCop
|
|
74
71
|
include AutocorrectAlignment
|
75
72
|
include ConfigurableEnforcedStyle
|
76
73
|
|
77
|
-
MSG = 'Indent `when`
|
74
|
+
MSG = 'Indent `when` %<depth>s `%<base>s`.'.freeze
|
78
75
|
|
79
76
|
def on_case(case_node)
|
80
77
|
return if case_node.single_line?
|
@@ -84,6 +81,16 @@ module RuboCop
|
|
84
81
|
end
|
85
82
|
end
|
86
83
|
|
84
|
+
def autocorrect(node)
|
85
|
+
whitespace = whitespace_range(node)
|
86
|
+
|
87
|
+
return false unless whitespace.source.strip.empty?
|
88
|
+
|
89
|
+
lambda do |corrector|
|
90
|
+
corrector.replace(whitespace, replacement(node))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
87
94
|
private
|
88
95
|
|
89
96
|
def check_when(when_node)
|
@@ -121,7 +128,7 @@ module RuboCop
|
|
121
128
|
def message(base)
|
122
129
|
depth = indent_one_step? ? 'one step more than' : 'as deep as'
|
123
130
|
|
124
|
-
format(MSG, depth, base)
|
131
|
+
format(MSG, depth: depth, base: base)
|
125
132
|
end
|
126
133
|
|
127
134
|
def base_column(case_node, base)
|
@@ -131,16 +138,6 @@ module RuboCop
|
|
131
138
|
end
|
132
139
|
end
|
133
140
|
|
134
|
-
def autocorrect(node)
|
135
|
-
whitespace = whitespace_range(node)
|
136
|
-
|
137
|
-
return false unless whitespace.source.strip.empty?
|
138
|
-
|
139
|
-
lambda do |corrector|
|
140
|
-
corrector.replace(whitespace, replacement(node))
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
141
|
def whitespace_range(node)
|
145
142
|
when_column = node.location.keyword.column
|
146
143
|
begin_pos = node.loc.keyword.begin_pos
|
@@ -0,0 +1,306 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# Checks if the code style follows the ExpectedOrder configuration:
|
7
|
+
#
|
8
|
+
# `Categories` allows us to map macro names into a category.
|
9
|
+
#
|
10
|
+
# Consider an example of code style that covers the following order:
|
11
|
+
# - Constants
|
12
|
+
# - Associations (has_one, has_many)
|
13
|
+
# - Attributes (attr_accessor, attr_writer, attr_reader)
|
14
|
+
# - Initializer
|
15
|
+
# - Instance methods
|
16
|
+
# - Protected methods
|
17
|
+
# - Private methods
|
18
|
+
#
|
19
|
+
# You can configure the following order:
|
20
|
+
#
|
21
|
+
# ```yaml
|
22
|
+
# Layout/ClassStructure:
|
23
|
+
# Categories:
|
24
|
+
# module_inclusion:
|
25
|
+
# - include
|
26
|
+
# - prepend
|
27
|
+
# - extend
|
28
|
+
# ExpectedOrder:
|
29
|
+
# - module_inclusion
|
30
|
+
# - constants
|
31
|
+
# - public_class_methods
|
32
|
+
# - initializer
|
33
|
+
# - public_methods
|
34
|
+
# - protected_methods
|
35
|
+
# - private_methods
|
36
|
+
#
|
37
|
+
# ```
|
38
|
+
# Instead of putting all literals in the expected order, is also
|
39
|
+
# possible to group categories of macros.
|
40
|
+
#
|
41
|
+
# ```yaml
|
42
|
+
# Layout/ClassStructure:
|
43
|
+
# Categories:
|
44
|
+
# association:
|
45
|
+
# - has_many
|
46
|
+
# - has_one
|
47
|
+
# attribute:
|
48
|
+
# - attr_accessor
|
49
|
+
# - attr_reader
|
50
|
+
# - attr_writer
|
51
|
+
# ```
|
52
|
+
#
|
53
|
+
# @example
|
54
|
+
# # bad
|
55
|
+
# # Expect extend be before constant
|
56
|
+
# class Person < ApplicationRecord
|
57
|
+
# has_many :orders
|
58
|
+
# ANSWER = 42
|
59
|
+
#
|
60
|
+
# extend SomeModule
|
61
|
+
# include AnotherModule
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# # good
|
65
|
+
# class Person
|
66
|
+
# # extend and include go first
|
67
|
+
# extend SomeModule
|
68
|
+
# include AnotherModule
|
69
|
+
#
|
70
|
+
# # inner classes
|
71
|
+
# CustomError = Class.new(StandardError)
|
72
|
+
#
|
73
|
+
# # constants are next
|
74
|
+
# SOME_CONSTANT = 20
|
75
|
+
#
|
76
|
+
# # afterwards we have attribute macros
|
77
|
+
# attr_reader :name
|
78
|
+
#
|
79
|
+
# # followed by other macros (if any)
|
80
|
+
# validates :name
|
81
|
+
#
|
82
|
+
# # public class methods are next in line
|
83
|
+
# def self.some_method
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# # initialization goes between class methods and instance methods
|
87
|
+
# def initialize
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
# # followed by other public instance methods
|
91
|
+
# def some_method
|
92
|
+
# end
|
93
|
+
#
|
94
|
+
# # protected and private methods are grouped near the end
|
95
|
+
# protected
|
96
|
+
#
|
97
|
+
# def some_protected_method
|
98
|
+
# end
|
99
|
+
#
|
100
|
+
# private
|
101
|
+
#
|
102
|
+
# def some_private_method
|
103
|
+
# end
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# @see https://github.com/bbatsov/ruby-style-guide#consistent-classes
|
107
|
+
class ClassStructure < Cop
|
108
|
+
HUMANIZED_NODE_TYPE = {
|
109
|
+
casgn: :constants,
|
110
|
+
defs: :class_methods,
|
111
|
+
def: :public_methods
|
112
|
+
}.freeze
|
113
|
+
|
114
|
+
VISIBILITY_SCOPES = %i[private protected public].freeze
|
115
|
+
MSG = '`%s` is supposed to appear before `%s`.'.freeze
|
116
|
+
|
117
|
+
def_node_matcher :visibility_block?, <<-PATTERN
|
118
|
+
(send nil? { :private :protected :public })
|
119
|
+
PATTERN
|
120
|
+
|
121
|
+
# Validates code style on class declaration.
|
122
|
+
# Add offense when find a node out of expected order.
|
123
|
+
def on_class(class_node)
|
124
|
+
previous = -1
|
125
|
+
walk_over_nested_class_definition(class_node) do |node, category|
|
126
|
+
index = expected_order.index(category)
|
127
|
+
if index < previous
|
128
|
+
message = format(MSG, category, expected_order[previous])
|
129
|
+
add_offense(node, message: message)
|
130
|
+
end
|
131
|
+
previous = index
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# Autocorrect by swapping between two nodes autocorrecting them
|
136
|
+
def autocorrect(node)
|
137
|
+
node_classification = classify(node)
|
138
|
+
previous = left_siblings_of(node).find do |sibling|
|
139
|
+
classification = classify(sibling)
|
140
|
+
!ignore?(classification) && node_classification != classification
|
141
|
+
end
|
142
|
+
|
143
|
+
current_range = source_range_with_comment(node)
|
144
|
+
previous_range = source_range_with_comment(previous)
|
145
|
+
|
146
|
+
lambda do |corrector|
|
147
|
+
corrector.insert_before(previous_range, current_range.source)
|
148
|
+
corrector.remove(current_range)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
private
|
153
|
+
|
154
|
+
# Classifies a node to match with something in the {expected_order}
|
155
|
+
# @param node to be analysed
|
156
|
+
# @return String when the node type is a `:block` then
|
157
|
+
# {classify} recursively with the first children
|
158
|
+
# @return String when the node type is a `:send` then {find_category}
|
159
|
+
# by method name
|
160
|
+
# @return String otherwise trying to {humanize_node} of the current node
|
161
|
+
def classify(node)
|
162
|
+
return node.to_s unless node.respond_to?(:type)
|
163
|
+
case node.type
|
164
|
+
when :block
|
165
|
+
classify(node.send_node)
|
166
|
+
when :send
|
167
|
+
find_category(node.method_name)
|
168
|
+
else
|
169
|
+
humanize_node(node)
|
170
|
+
end.to_s
|
171
|
+
end
|
172
|
+
|
173
|
+
# Categorize a method_name according to the {expected_order}
|
174
|
+
# @param method_name try to match {categories} values
|
175
|
+
# @return [String] with the key category or the `method_name` as string
|
176
|
+
def find_category(method_name)
|
177
|
+
name = method_name.to_s
|
178
|
+
category, = categories.find { |_, names| names.include?(name) }
|
179
|
+
category || name
|
180
|
+
end
|
181
|
+
|
182
|
+
def walk_over_nested_class_definition(class_node)
|
183
|
+
class_elements(class_node).each do |node|
|
184
|
+
classification = classify(node)
|
185
|
+
next if ignore?(classification)
|
186
|
+
yield node, classification
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def class_elements(class_node)
|
191
|
+
*, class_def = class_node.children
|
192
|
+
return [] unless class_def
|
193
|
+
if class_def.def_type? || class_def.send_type?
|
194
|
+
[class_def]
|
195
|
+
else
|
196
|
+
class_def.children.compact
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def ignore?(classification)
|
201
|
+
classification.nil? ||
|
202
|
+
classification.to_s.end_with?('=') ||
|
203
|
+
expected_order.index(classification).nil?
|
204
|
+
end
|
205
|
+
|
206
|
+
def node_visibility(node)
|
207
|
+
_, method_name, = *find_visibility_start(node)
|
208
|
+
method_name || :public
|
209
|
+
end
|
210
|
+
|
211
|
+
def find_visibility_start(node)
|
212
|
+
left_siblings_of(node)
|
213
|
+
.reverse
|
214
|
+
.find(&method(:visibility_block?))
|
215
|
+
end
|
216
|
+
|
217
|
+
# Navigate to find the last protected method
|
218
|
+
def find_visibility_end(node)
|
219
|
+
possible_visibilities = VISIBILITY_SCOPES - [node_visibility(node)]
|
220
|
+
right = right_siblings_of(node)
|
221
|
+
right.find do |child_node|
|
222
|
+
possible_visibilities.include?(node_visibility(child_node))
|
223
|
+
end || right.last
|
224
|
+
end
|
225
|
+
|
226
|
+
def siblings_of(node)
|
227
|
+
node.parent.children
|
228
|
+
end
|
229
|
+
|
230
|
+
def right_siblings_of(node)
|
231
|
+
siblings_of(node)[node.sibling_index..-1]
|
232
|
+
end
|
233
|
+
|
234
|
+
def left_siblings_of(node)
|
235
|
+
siblings_of(node)[0, node.sibling_index]
|
236
|
+
end
|
237
|
+
|
238
|
+
def humanize_node(node)
|
239
|
+
method_name, = *node
|
240
|
+
if node.def_type?
|
241
|
+
return :initializer if method_name == :initialize
|
242
|
+
return "#{node_visibility(node)}_methods"
|
243
|
+
end
|
244
|
+
HUMANIZED_NODE_TYPE[node.type] || node.type
|
245
|
+
end
|
246
|
+
|
247
|
+
def source_range_with_comment(node)
|
248
|
+
begin_pos, end_pos =
|
249
|
+
if node.def_type?
|
250
|
+
start_node = find_visibility_start(node) || node
|
251
|
+
end_node = find_visibility_end(node) || node
|
252
|
+
[begin_pos_with_comment(start_node),
|
253
|
+
end_position_for(end_node) + 1]
|
254
|
+
else
|
255
|
+
[begin_pos_with_comment(node), end_position_for(node)]
|
256
|
+
end
|
257
|
+
|
258
|
+
Parser::Source::Range.new(buffer, begin_pos, end_pos)
|
259
|
+
end
|
260
|
+
|
261
|
+
def end_position_for(node)
|
262
|
+
end_line = buffer.line_for_position(node.loc.expression.end_pos)
|
263
|
+
buffer.line_range(end_line).end_pos
|
264
|
+
end
|
265
|
+
|
266
|
+
def begin_pos_with_comment(node)
|
267
|
+
annotation_line = node.loc.line - 1
|
268
|
+
first_comment = nil
|
269
|
+
|
270
|
+
comments_before_line(annotation_line).reverse_each do |comment|
|
271
|
+
if comment.location.line == annotation_line
|
272
|
+
first_comment = comment
|
273
|
+
annotation_line -= 1
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
start_line_position(first_comment || node)
|
278
|
+
end
|
279
|
+
|
280
|
+
def start_line_position(node)
|
281
|
+
buffer.line_range(node.loc.line).begin_pos - 1
|
282
|
+
end
|
283
|
+
|
284
|
+
def comments_before_line(line)
|
285
|
+
processed_source.comments.select { |c| c.location.line <= line }
|
286
|
+
end
|
287
|
+
|
288
|
+
def buffer
|
289
|
+
processed_source.buffer
|
290
|
+
end
|
291
|
+
|
292
|
+
# Load expected order from `ExpectedOrder` config.
|
293
|
+
# Define new terms in the expected order by adding new {categories}.
|
294
|
+
def expected_order
|
295
|
+
cop_config['ExpectedOrder']
|
296
|
+
end
|
297
|
+
|
298
|
+
# Setting categories hash allow you to group methods in group to match
|
299
|
+
# in the {expected_order}.
|
300
|
+
def categories
|
301
|
+
cop_config['Categories']
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|