rubocop 0.42.0 → 0.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +106 -20
- data/assets/output.html.erb +21 -10
- data/bin/rubocop +1 -2
- data/config/default.yml +914 -483
- data/config/disabled.yml +61 -41
- data/config/enabled.yml +1396 -878
- data/lib/rubocop/ast/builder.rb +72 -0
- data/lib/rubocop/ast/node/and_node.rb +37 -0
- data/lib/rubocop/ast/node/args_node.rb +29 -0
- data/lib/rubocop/ast/node/array_node.rb +57 -0
- data/lib/rubocop/ast/node/block_node.rb +116 -0
- data/lib/rubocop/ast/node/case_node.rb +64 -0
- data/lib/rubocop/ast/node/def_node.rb +71 -0
- data/lib/rubocop/ast/node/ensure_node.rb +25 -0
- data/lib/rubocop/ast/node/for_node.rb +61 -0
- data/lib/rubocop/ast/node/hash_node.rb +109 -0
- data/lib/rubocop/ast/node/if_node.rb +146 -0
- data/lib/rubocop/ast/node/keyword_splat_node.rb +45 -0
- data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
- data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +23 -0
- data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
- data/lib/rubocop/ast/node/mixin/conditional_node.rb +45 -0
- data/lib/rubocop/ast/node/mixin/hash_element_node.rb +125 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
- data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
- data/lib/rubocop/ast/node/mixin/modifier_node.rb +17 -0
- data/lib/rubocop/ast/node/mixin/parameterized_node.rb +61 -0
- data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +35 -0
- data/lib/rubocop/ast/node/or_node.rb +37 -0
- data/lib/rubocop/ast/node/pair_node.rb +64 -0
- data/lib/rubocop/ast/node/regexp_node.rb +35 -0
- data/lib/rubocop/ast/node/resbody_node.rb +25 -0
- data/lib/rubocop/ast/node/send_node.rb +45 -0
- data/lib/rubocop/ast/node/str_node.rb +14 -0
- data/lib/rubocop/ast/node/super_node.rb +21 -0
- data/lib/rubocop/ast/node/symbol_node.rb +20 -0
- data/lib/rubocop/ast/node/until_node.rb +43 -0
- data/lib/rubocop/ast/node/when_node.rb +61 -0
- data/lib/rubocop/ast/node/while_node.rb +43 -0
- data/lib/rubocop/ast/node/yield_node.rb +21 -0
- data/lib/rubocop/ast/node.rb +634 -0
- data/lib/rubocop/ast/sexp.rb +16 -0
- data/lib/rubocop/{ast_node → ast}/traversal.rb +23 -24
- data/lib/rubocop/cached_data.rb +11 -31
- data/lib/rubocop/cli.rb +116 -33
- data/lib/rubocop/comment_config.rb +4 -10
- data/lib/rubocop/config.rb +355 -102
- data/lib/rubocop/config_loader.rb +93 -78
- data/lib/rubocop/config_loader_resolver.rb +106 -7
- data/lib/rubocop/config_store.rb +4 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
- data/lib/rubocop/cop/badge.rb +73 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +71 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
- data/lib/rubocop/cop/bundler/ordered_gems.rb +71 -0
- data/lib/rubocop/cop/commissioner.rb +27 -10
- data/lib/rubocop/cop/cop.rb +62 -107
- data/lib/rubocop/cop/corrector.rb +0 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +121 -0
- data/lib/rubocop/cop/correctors/condition_corrector.rb +28 -0
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +62 -0
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
- data/lib/rubocop/cop/correctors/space_corrector.rb +34 -0
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +31 -0
- data/lib/rubocop/cop/force.rb +0 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +106 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
- data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
- data/lib/rubocop/cop/generator.rb +191 -0
- data/lib/rubocop/cop/ignored_node.rb +0 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +44 -0
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
- data/lib/rubocop/cop/internal_affairs.rb +8 -0
- data/lib/rubocop/cop/{style → layout}/access_modifier_indentation.rb +39 -10
- data/lib/rubocop/cop/layout/align_array.rb +39 -0
- data/lib/rubocop/cop/layout/align_hash.rb +235 -0
- data/lib/rubocop/cop/{style → layout}/align_parameters.rb +38 -19
- data/lib/rubocop/cop/{style → layout}/block_end_newline.rb +26 -8
- data/lib/rubocop/cop/layout/case_indentation.rb +160 -0
- data/lib/rubocop/cop/layout/class_structure.rb +306 -0
- data/lib/rubocop/cop/{style → layout}/closing_parenthesis_indentation.rb +18 -13
- data/lib/rubocop/cop/{style → layout}/comment_indentation.rb +48 -6
- data/lib/rubocop/cop/{style → layout}/dot_position.rb +34 -21
- data/lib/rubocop/cop/{style → layout}/else_alignment.rb +55 -37
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +147 -0
- data/lib/rubocop/cop/{style → layout}/empty_lines.rb +17 -4
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_access_modifier.rb +40 -24
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +87 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +46 -0
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_block_body.rb +9 -12
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +68 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +135 -0
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_method_body.rb +10 -7
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_module_body.rb +27 -9
- data/lib/rubocop/cop/layout/end_of_line.rb +52 -0
- data/lib/rubocop/cop/{style → layout}/extra_spacing.rb +63 -53
- data/lib/rubocop/cop/{style → layout}/first_array_element_line_break.rb +5 -2
- data/lib/rubocop/cop/{style → layout}/first_hash_element_line_break.rb +5 -2
- data/lib/rubocop/cop/{style → layout}/first_method_argument_line_break.rb +7 -4
- data/lib/rubocop/cop/{style → layout}/first_method_parameter_line_break.rb +8 -5
- data/lib/rubocop/cop/{style → layout}/first_parameter_indentation.rb +32 -26
- data/lib/rubocop/cop/{style → layout}/indent_array.rb +75 -25
- data/lib/rubocop/cop/{style → layout}/indent_assignment.rb +9 -6
- data/lib/rubocop/cop/{style → layout}/indent_hash.rb +80 -31
- data/lib/rubocop/cop/layout/indent_heredoc.rb +208 -0
- data/lib/rubocop/cop/{style → layout}/indentation_consistency.rb +7 -5
- data/lib/rubocop/cop/{style → layout}/indentation_width.rb +151 -117
- data/lib/rubocop/cop/layout/initial_indentation.rb +45 -0
- data/lib/rubocop/cop/layout/leading_comment_space.rb +58 -0
- data/lib/rubocop/cop/{style → layout}/multiline_array_brace_layout.rb +52 -16
- data/lib/rubocop/cop/{style → layout}/multiline_assignment_layout.rb +18 -21
- data/lib/rubocop/cop/{style → layout}/multiline_block_layout.rb +37 -43
- data/lib/rubocop/cop/{style → layout}/multiline_hash_brace_layout.rb +55 -15
- data/lib/rubocop/cop/{style → layout}/multiline_method_call_brace_layout.rb +15 -4
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +221 -0
- data/lib/rubocop/cop/{style → layout}/multiline_method_definition_brace_layout.rb +12 -5
- data/lib/rubocop/cop/{style → layout}/multiline_operation_indentation.rb +23 -13
- data/lib/rubocop/cop/{style → layout}/rescue_ensure_alignment.rb +24 -13
- data/lib/rubocop/cop/{style → layout}/space_after_colon.rb +17 -13
- data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
- data/lib/rubocop/cop/{style → layout}/space_after_method_name.rb +11 -11
- data/lib/rubocop/cop/layout/space_after_not.rb +38 -0
- data/lib/rubocop/cop/{style → layout}/space_after_semicolon.rb +14 -4
- data/lib/rubocop/cop/{style → layout}/space_around_block_parameters.rb +52 -28
- data/lib/rubocop/cop/{style → layout}/space_around_equals_in_parameter_default.rb +29 -21
- data/lib/rubocop/cop/{style → layout}/space_around_keyword.rb +33 -29
- data/lib/rubocop/cop/layout/space_around_operators.rb +159 -0
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +107 -0
- data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
- data/lib/rubocop/cop/{style → layout}/space_before_comment.rb +11 -7
- data/lib/rubocop/cop/{style → layout}/space_before_first_arg.rb +23 -20
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +85 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +236 -0
- data/lib/rubocop/cop/{style → layout}/space_inside_array_percent_literal.rb +8 -8
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +228 -0
- data/lib/rubocop/cop/{style → layout}/space_inside_hash_literal_braces.rb +91 -51
- data/lib/rubocop/cop/layout/space_inside_parens.rb +53 -0
- data/lib/rubocop/cop/{style → layout}/space_inside_percent_literal_delimiters.rb +14 -13
- data/lib/rubocop/cop/{style → layout}/space_inside_range_literal.rb +16 -17
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +90 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +80 -0
- data/lib/rubocop/cop/{style → layout}/tab.rb +8 -6
- data/lib/rubocop/cop/{style → layout}/trailing_blank_lines.rb +14 -15
- data/lib/rubocop/cop/{style → layout}/trailing_whitespace.rb +3 -4
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +59 -0
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +13 -9
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +7 -1
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +55 -25
- data/lib/rubocop/cop/lint/block_alignment.rb +75 -34
- data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +17 -15
- data/lib/rubocop/cop/lint/condition_position.rb +16 -15
- data/lib/rubocop/cop/lint/debugger.rb +57 -23
- data/lib/rubocop/cop/lint/def_end_alignment.rb +28 -14
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +19 -10
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +108 -14
- data/lib/rubocop/cop/lint/duplicated_key.rb +16 -9
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +15 -6
- data/lib/rubocop/cop/lint/else_layout.rb +27 -31
- data/lib/rubocop/cop/lint/empty_ensure.rb +44 -3
- data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
- data/lib/rubocop/cop/lint/empty_interpolation.rb +16 -3
- data/lib/rubocop/cop/lint/empty_when.rb +38 -0
- data/lib/rubocop/cop/lint/end_alignment.rb +57 -39
- data/lib/rubocop/cop/lint/end_in_method.rb +24 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +23 -3
- data/lib/rubocop/cop/lint/float_out_of_range.rb +10 -6
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +67 -46
- data/lib/rubocop/cop/lint/handle_exceptions.rb +41 -4
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +9 -5
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +42 -29
- data/lib/rubocop/cop/lint/inherit_exception.rb +34 -23
- data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
- data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +51 -40
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -8
- data/lib/rubocop/cop/lint/loop.rb +37 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
- data/lib/rubocop/cop/lint/multiple_compare.rb +48 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +54 -12
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +7 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +32 -23
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +22 -14
- data/lib/rubocop/cop/lint/percent_string_array.rb +42 -27
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +28 -19
- data/lib/rubocop/cop/lint/rand_one.rb +17 -8
- data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +24 -30
- data/lib/rubocop/cop/lint/rescue_exception.rb +21 -2
- data/lib/rubocop/cop/lint/rescue_type.rb +90 -0
- data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +70 -0
- data/lib/rubocop/cop/lint/script_permission.rb +49 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +78 -57
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +25 -2
- data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +18 -12
- data/lib/rubocop/cop/lint/syntax.rb +23 -21
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +26 -4
- data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
- data/lib/rubocop/cop/lint/unneeded_disable.rb +117 -56
- data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +167 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +72 -8
- data/lib/rubocop/cop/lint/unused_block_argument.rb +87 -27
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +75 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +40 -18
- data/lib/rubocop/cop/lint/useless_assignment.rb +45 -14
- data/lib/rubocop/cop/lint/useless_comparison.rb +8 -10
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +16 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +57 -43
- data/lib/rubocop/cop/lint/void.rb +83 -23
- data/lib/rubocop/cop/message_annotator.rb +118 -0
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -4
- data/lib/rubocop/cop/metrics/block_length.rb +32 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +21 -10
- data/lib/rubocop/cop/metrics/class_length.rb +3 -2
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +4 -4
- data/lib/rubocop/cop/metrics/line_length.rb +67 -14
- data/lib/rubocop/cop/metrics/method_length.rb +10 -10
- data/lib/rubocop/cop/metrics/module_length.rb +3 -2
- data/lib/rubocop/cop/metrics/parameter_lists.rb +15 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +5 -6
- data/lib/rubocop/cop/mixin/alignment.rb +70 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -1
- data/lib/rubocop/cop/mixin/array_hash_indentation.rb +26 -22
- data/lib/rubocop/cop/mixin/array_min_size.rb +59 -0
- data/lib/rubocop/cop/mixin/array_syntax.rb +4 -12
- data/lib/rubocop/cop/mixin/check_assignment.rb +6 -7
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -1
- data/lib/rubocop/cop/mixin/code_length.rb +4 -3
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +21 -16
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +48 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -4
- data/lib/rubocop/cop/mixin/configurable_naming.rb +5 -35
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
- data/lib/rubocop/cop/mixin/def_node.rb +29 -0
- data/lib/rubocop/cop/mixin/documentation_comment.rb +46 -0
- data/lib/rubocop/cop/mixin/duplication.rb +46 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +119 -27
- data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +11 -27
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +30 -0
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +15 -11
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +15 -13
- data/lib/rubocop/cop/mixin/hash_alignment.rb +116 -0
- data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
- data/lib/rubocop/cop/mixin/integer_node.rb +2 -1
- data/lib/rubocop/cop/mixin/match_range.rb +4 -6
- data/lib/rubocop/cop/mixin/method_complexity.rb +33 -8
- data/lib/rubocop/cop/mixin/method_preference.rb +2 -1
- data/lib/rubocop/cop/mixin/min_body_length.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +100 -66
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +49 -51
- data/lib/rubocop/cop/mixin/negative_conditional.rb +18 -13
- data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +1 -25
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +48 -0
- data/lib/rubocop/cop/mixin/parentheses.rb +2 -8
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
- data/lib/rubocop/cop/mixin/percent_literal.rb +69 -6
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +16 -5
- data/lib/rubocop/cop/mixin/rescue_node.rb +23 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +3 -1
- data/lib/rubocop/cop/mixin/safe_mode.rb +22 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -10
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -14
- data/lib/rubocop/cop/mixin/statement_modifier.rb +29 -32
- data/lib/rubocop/cop/mixin/string_help.rb +3 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +3 -15
- data/lib/rubocop/cop/mixin/surrounding_space.rb +78 -9
- data/lib/rubocop/cop/mixin/target_rails_version.rb +16 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +16 -0
- data/lib/rubocop/cop/mixin/too_many_lines.rb +39 -0
- data/lib/rubocop/cop/mixin/trailing_comma.rb +37 -38
- data/lib/rubocop/cop/mixin/unused_argument.rb +6 -16
- data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
- data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +36 -5
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +42 -0
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
- data/lib/rubocop/cop/naming/constant_name.rb +58 -0
- data/lib/rubocop/cop/{style → naming}/file_name.rb +72 -29
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
- data/lib/rubocop/cop/naming/method_name.rb +40 -0
- data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
- data/lib/rubocop/cop/naming/variable_name.rb +50 -0
- data/lib/rubocop/cop/naming/variable_number.rb +61 -0
- data/lib/rubocop/cop/offense.rb +9 -5
- data/lib/rubocop/cop/performance/caller.rb +69 -0
- data/lib/rubocop/cop/performance/case_when_splat.rb +65 -89
- data/lib/rubocop/cop/performance/casecmp.rb +37 -25
- data/lib/rubocop/cop/performance/compare_with_block.rb +117 -0
- data/lib/rubocop/cop/performance/count.rb +33 -43
- data/lib/rubocop/cop/performance/detect.rb +30 -31
- data/lib/rubocop/cop/performance/double_start_end_with.rb +55 -26
- data/lib/rubocop/cop/performance/end_with.rb +9 -9
- data/lib/rubocop/cop/performance/fixed_size.rb +21 -17
- data/lib/rubocop/cop/performance/flat_map.rb +30 -33
- data/lib/rubocop/cop/performance/hash_each_methods.rb +129 -0
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +14 -14
- data/lib/rubocop/cop/performance/range_include.rb +5 -4
- data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -29
- data/lib/rubocop/cop/performance/redundant_match.rb +19 -15
- data/lib/rubocop/cop/performance/redundant_merge.rb +100 -52
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +17 -14
- data/lib/rubocop/cop/performance/regexp_match.rb +224 -0
- data/lib/rubocop/cop/performance/reverse_each.rb +3 -6
- data/lib/rubocop/cop/performance/sample.rb +84 -83
- data/lib/rubocop/cop/performance/size.rb +22 -15
- data/lib/rubocop/cop/performance/start_with.rb +9 -9
- data/lib/rubocop/cop/performance/string_replacement.rb +35 -70
- data/lib/rubocop/cop/performance/times_map.rb +33 -24
- data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
- data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
- data/lib/rubocop/cop/rails/action_filter.rb +67 -47
- data/lib/rubocop/cop/rails/active_support_aliases.rb +68 -0
- data/lib/rubocop/cop/rails/application_job.rb +40 -0
- data/lib/rubocop/cop/rails/application_record.rb +40 -0
- data/lib/rubocop/cop/rails/blank.rb +142 -0
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
- data/lib/rubocop/cop/rails/date.rb +47 -42
- data/lib/rubocop/cop/rails/delegate.rb +55 -33
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +51 -0
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +82 -0
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +45 -0
- data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
- data/lib/rubocop/cop/rails/exit.rb +17 -11
- data/lib/rubocop/cop/rails/file_path.rb +72 -0
- data/lib/rubocop/cop/rails/find_by.rb +14 -20
- data/lib/rubocop/cop/rails/find_each.rb +8 -21
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +9 -2
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +84 -0
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +102 -0
- data/lib/rubocop/cop/rails/inverse_of.rb +218 -0
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
- data/lib/rubocop/cop/rails/not_null_column.rb +67 -0
- data/lib/rubocop/cop/rails/output.rb +15 -13
- data/lib/rubocop/cop/rails/output_safety.rb +65 -17
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +30 -29
- data/lib/rubocop/cop/rails/presence.rb +118 -0
- data/lib/rubocop/cop/rails/present.rb +143 -0
- data/lib/rubocop/cop/rails/read_write_attribute.rb +20 -26
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +133 -0
- data/lib/rubocop/cop/rails/relative_date_constant.rb +88 -0
- data/lib/rubocop/cop/rails/request_referer.rb +28 -13
- data/lib/rubocop/cop/rails/reversible_migration.rb +281 -0
- data/lib/rubocop/cop/rails/safe_navigation.rb +90 -0
- data/lib/rubocop/cop/rails/save_bang.rb +104 -19
- data/lib/rubocop/cop/rails/scope_args.rb +5 -10
- data/lib/rubocop/cop/rails/skips_model_validations.rb +70 -0
- data/lib/rubocop/cop/rails/time_zone.rb +34 -21
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +17 -14
- data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
- data/lib/rubocop/cop/rails/validation.rb +16 -20
- data/lib/rubocop/cop/registry.rb +172 -0
- data/lib/rubocop/cop/security/eval.rb +30 -0
- data/lib/rubocop/cop/security/json_load.rb +46 -0
- data/lib/rubocop/cop/security/marshal_load.rb +39 -0
- data/lib/rubocop/cop/security/yaml_load.rb +37 -0
- data/lib/rubocop/cop/severity.rb +1 -2
- data/lib/rubocop/cop/style/alias.rb +54 -33
- data/lib/rubocop/cop/style/and_or.rb +77 -63
- data/lib/rubocop/cop/style/array_join.rb +13 -9
- data/lib/rubocop/cop/style/ascii_comments.rb +25 -7
- data/lib/rubocop/cop/style/attr.rb +24 -11
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -16
- data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -11
- data/lib/rubocop/cop/style/begin_block.rb +1 -2
- data/lib/rubocop/cop/style/block_comments.rb +20 -11
- data/lib/rubocop/cop/style/block_delimiters.rb +122 -51
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +142 -54
- data/lib/rubocop/cop/style/case_equality.rb +15 -4
- data/lib/rubocop/cop/style/character_literal.rb +12 -5
- data/lib/rubocop/cop/style/class_and_module_children.rb +85 -6
- data/lib/rubocop/cop/style/class_check.rb +35 -19
- data/lib/rubocop/cop/style/class_methods.rb +13 -14
- data/lib/rubocop/cop/style/class_vars.rb +5 -5
- data/lib/rubocop/cop/style/collection_methods.rb +12 -13
- data/lib/rubocop/cop/style/colon_method_call.rb +24 -16
- data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
- data/lib/rubocop/cop/style/command_literal.rb +98 -32
- data/lib/rubocop/cop/style/comment_annotation.rb +41 -15
- data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +161 -112
- data/lib/rubocop/cop/style/copyright.rb +32 -34
- data/lib/rubocop/cop/style/date_time.rb +44 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +32 -9
- data/lib/rubocop/cop/style/dir.rb +48 -0
- data/lib/rubocop/cop/style/documentation.rb +44 -58
- data/lib/rubocop/cop/style/documentation_method.rb +76 -0
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +14 -13
- data/lib/rubocop/cop/style/each_with_object.rb +28 -25
- data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +18 -30
- data/lib/rubocop/cop/style/empty_else.rb +82 -51
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
- data/lib/rubocop/cop/style/empty_literal.rb +76 -48
- data/lib/rubocop/cop/style/empty_method.rb +112 -0
- data/lib/rubocop/cop/style/encoding.rb +10 -40
- data/lib/rubocop/cop/style/end_block.rb +1 -2
- data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
- data/lib/rubocop/cop/style/even_odd.rb +25 -44
- data/lib/rubocop/cop/style/flip_flop.rb +13 -3
- data/lib/rubocop/cop/style/for.rb +19 -15
- data/lib/rubocop/cop/style/format_string.rb +88 -42
- data/lib/rubocop/cop/style/format_string_token.rb +163 -0
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +90 -15
- data/lib/rubocop/cop/style/global_vars.rb +14 -5
- data/lib/rubocop/cop/style/guard_clause.rb +22 -62
- data/lib/rubocop/cop/style/hash_syntax.rb +109 -59
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +73 -32
- data/lib/rubocop/cop/style/if_inside_else.rb +16 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +48 -39
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +6 -12
- data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -2
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -7
- data/lib/rubocop/cop/style/infinite_loop.rb +33 -32
- data/lib/rubocop/cop/style/inline_comment.rb +17 -5
- data/lib/rubocop/cop/style/inverse_methods.rb +149 -0
- data/lib/rubocop/cop/style/lambda.rb +66 -63
- data/lib/rubocop/cop/style/lambda_call.rb +50 -20
- data/lib/rubocop/cop/style/line_end_concatenation.rb +38 -17
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +90 -0
- data/lib/rubocop/cop/style/{method_call_parentheses.rb → method_call_without_args_parentheses.rb} +32 -25
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +9 -9
- data/lib/rubocop/cop/style/method_def_parentheses.rb +101 -29
- data/lib/rubocop/cop/style/method_missing.rb +14 -20
- data/lib/rubocop/cop/style/min_max.rb +68 -0
- data/lib/rubocop/cop/style/missing_else.rb +61 -21
- data/lib/rubocop/cop/style/mixin_grouping.rb +145 -0
- data/lib/rubocop/cop/style/mixin_usage.rb +82 -0
- data/lib/rubocop/cop/style/module_function.rb +44 -18
- data/lib/rubocop/cop/style/multiline_block_chain.rb +8 -15
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +21 -14
- data/lib/rubocop/cop/style/multiline_memoization.rb +93 -0
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +77 -0
- data/lib/rubocop/cop/style/mutable_constant.rb +17 -9
- data/lib/rubocop/cop/style/negated_if.rb +76 -25
- data/lib/rubocop/cop/style/negated_while.rb +4 -22
- data/lib/rubocop/cop/style/nested_modifier.rb +17 -47
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +32 -28
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -6
- data/lib/rubocop/cop/style/next.rb +72 -53
- data/lib/rubocop/cop/style/nil_comparison.rb +10 -14
- data/lib/rubocop/cop/style/non_nil_check.rb +69 -62
- data/lib/rubocop/cop/style/not.rb +19 -13
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +16 -7
- data/lib/rubocop/cop/style/numeric_literals.rb +33 -12
- data/lib/rubocop/cop/style/numeric_predicate.rb +30 -32
- data/lib/rubocop/cop/style/one_line_conditional.rb +21 -17
- data/lib/rubocop/cop/style/option_hash.rb +11 -37
- data/lib/rubocop/cop/style/optional_arguments.rb +20 -9
- data/lib/rubocop/cop/style/or_assignment.rb +88 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +83 -64
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +37 -19
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +50 -15
- data/lib/rubocop/cop/style/percent_q_literals.rb +40 -17
- data/lib/rubocop/cop/style/perl_backrefs.rb +9 -3
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +48 -14
- data/lib/rubocop/cop/style/proc.rb +13 -10
- data/lib/rubocop/cop/style/raise_args.rb +46 -50
- data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +16 -6
- data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
- data/lib/rubocop/cop/style/redundant_exception.rb +4 -5
- data/lib/rubocop/cop/style/redundant_freeze.rb +7 -10
- data/lib/rubocop/cop/style/redundant_parentheses.rb +70 -31
- data/lib/rubocop/cop/style/redundant_return.rb +61 -23
- data/lib/rubocop/cop/style/redundant_self.rb +62 -60
- data/lib/rubocop/cop/style/regexp_literal.rb +100 -34
- data/lib/rubocop/cop/style/rescue_modifier.rb +15 -17
- data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
- data/lib/rubocop/cop/style/return_nil.rb +89 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +197 -0
- data/lib/rubocop/cop/style/self_assignment.rb +20 -17
- data/lib/rubocop/cop/style/semicolon.rb +25 -17
- data/lib/rubocop/cop/style/send.rb +14 -4
- data/lib/rubocop/cop/style/signal_exception.rb +105 -7
- data/lib/rubocop/cop/style/single_line_block_params.rb +27 -21
- data/lib/rubocop/cop/style/single_line_methods.rb +45 -31
- data/lib/rubocop/cop/style/special_global_vars.rb +32 -28
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +24 -53
- data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
- data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
- data/lib/rubocop/cop/style/string_literals.rb +31 -5
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +20 -2
- data/lib/rubocop/cop/style/string_methods.rb +22 -9
- data/lib/rubocop/cop/style/struct_inheritance.rb +5 -17
- data/lib/rubocop/cop/style/symbol_array.rb +39 -65
- data/lib/rubocop/cop/style/symbol_literal.rb +1 -2
- data/lib/rubocop/cop/style/symbol_proc.rb +35 -52
- data/lib/rubocop/cop/style/ternary_parentheses.rb +143 -42
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +31 -20
- data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +26 -8
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +97 -37
- data/lib/rubocop/cop/style/trivial_accessors.rb +72 -66
- data/lib/rubocop/cop/style/unless_else.rb +19 -13
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +24 -10
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +22 -24
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +28 -22
- data/lib/rubocop/cop/style/variable_interpolation.rb +23 -10
- data/lib/rubocop/cop/style/when_then.rb +18 -4
- data/lib/rubocop/cop/style/while_until_do.rb +34 -16
- data/lib/rubocop/cop/style/while_until_modifier.rb +32 -12
- data/lib/rubocop/cop/style/word_array.rb +45 -102
- data/lib/rubocop/cop/style/yoda_condition.rb +107 -0
- data/lib/rubocop/cop/style/zero_length_predicate.rb +55 -32
- data/lib/rubocop/cop/team.rb +33 -35
- data/lib/rubocop/cop/util.rb +120 -54
- data/lib/rubocop/cop/variable_force/assignment.rb +5 -9
- data/lib/rubocop/cop/variable_force/branch.rb +318 -0
- data/lib/rubocop/cop/variable_force/branchable.rb +21 -0
- data/lib/rubocop/cop/variable_force/reference.rb +1 -2
- data/lib/rubocop/cop/variable_force/scope.rb +37 -26
- data/lib/rubocop/cop/variable_force/variable.rb +12 -12
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -4
- data/lib/rubocop/cop/variable_force.rb +72 -39
- data/lib/rubocop/error.rb +0 -1
- data/lib/rubocop/formatter/base_formatter.rb +4 -9
- data/lib/rubocop/formatter/clang_style_formatter.rb +2 -3
- data/lib/rubocop/formatter/colorizable.rb +9 -10
- data/lib/rubocop/formatter/disabled_config_formatter.rb +48 -35
- data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -1
- data/lib/rubocop/formatter/emacs_style_formatter.rb +0 -1
- data/lib/rubocop/formatter/file_list_formatter.rb +0 -1
- data/lib/rubocop/formatter/formatter_set.rb +16 -13
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +6 -1
- data/lib/rubocop/formatter/html_formatter.rb +5 -5
- data/lib/rubocop/formatter/json_formatter.rb +9 -4
- data/lib/rubocop/formatter/offense_count_formatter.rb +2 -1
- data/lib/rubocop/formatter/progress_formatter.rb +0 -1
- data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +7 -17
- data/lib/rubocop/formatter/tap_formatter.rb +71 -0
- data/lib/rubocop/formatter/text_util.rb +0 -1
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +6 -5
- data/lib/rubocop/magic_comment.rb +210 -0
- data/lib/rubocop/name_similarity.rb +0 -1
- data/lib/rubocop/node_pattern.rb +181 -118
- data/lib/rubocop/options.rb +154 -88
- data/lib/rubocop/path_util.rb +38 -4
- data/lib/rubocop/platform.rb +11 -0
- data/lib/rubocop/processed_source.rb +23 -20
- data/lib/rubocop/rake_task.rb +16 -24
- data/lib/rubocop/remote_config.rb +40 -13
- data/lib/rubocop/result_cache.rb +33 -24
- data/lib/rubocop/rspec/cop_helper.rb +21 -7
- data/lib/rubocop/rspec/expect_offense.rb +165 -0
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +1 -2
- data/lib/rubocop/rspec/shared_contexts.rb +24 -9
- data/lib/rubocop/rspec/shared_examples.rb +10 -19
- data/lib/rubocop/rspec/support.rb +5 -5
- data/lib/rubocop/runner.rb +74 -39
- data/lib/rubocop/string_interpreter.rb +0 -1
- data/lib/rubocop/string_util.rb +11 -6
- data/lib/rubocop/target_finder.rb +70 -8
- data/lib/rubocop/token.rb +79 -2
- data/lib/rubocop/version.rb +2 -5
- data/lib/rubocop/warning.rb +0 -1
- data/lib/rubocop.rb +569 -398
- metadata +301 -112
- data/lib/rubocop/ast_node/builder.rb +0 -31
- data/lib/rubocop/ast_node/sexp.rb +0 -14
- data/lib/rubocop/ast_node.rb +0 -623
- data/lib/rubocop/cop/lint/eval.rb +0 -23
- data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -39
- data/lib/rubocop/cop/lint/useless_array_splat.rb +0 -56
- data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -42
- data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -152
- data/lib/rubocop/cop/mixin/hash_node.rb +0 -15
- data/lib/rubocop/cop/mixin/if_node.rb +0 -37
- data/lib/rubocop/cop/mixin/on_method_def.rb +0 -31
- data/lib/rubocop/cop/mixin/space_inside.rb +0 -79
- data/lib/rubocop/cop/performance/hash_each.rb +0 -86
- data/lib/rubocop/cop/performance/push_splat.rb +0 -47
- data/lib/rubocop/cop/style/accessor_method_name.rb +0 -46
- data/lib/rubocop/cop/style/align_array.rb +0 -21
- data/lib/rubocop/cop/style/align_hash.rb +0 -256
- data/lib/rubocop/cop/style/case_indentation.rb +0 -92
- data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -30
- data/lib/rubocop/cop/style/constant_name.rb +0 -30
- data/lib/rubocop/cop/style/empty_line_between_defs.rb +0 -76
- data/lib/rubocop/cop/style/empty_lines_around_class_body.rb +0 -40
- data/lib/rubocop/cop/style/end_of_line.rb +0 -31
- data/lib/rubocop/cop/style/initial_indentation.rb +0 -38
- data/lib/rubocop/cop/style/leading_comment_space.rb +0 -33
- data/lib/rubocop/cop/style/method_name.rb +0 -29
- data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +0 -176
- data/lib/rubocop/cop/style/op_method.rb +0 -44
- data/lib/rubocop/cop/style/predicate_name.rb +0 -68
- data/lib/rubocop/cop/style/space_after_comma.rb +0 -22
- data/lib/rubocop/cop/style/space_after_not.rb +0 -42
- data/lib/rubocop/cop/style/space_around_operators.rb +0 -132
- data/lib/rubocop/cop/style/space_before_block_braces.rb +0 -65
- data/lib/rubocop/cop/style/space_before_comma.rb +0 -17
- data/lib/rubocop/cop/style/space_before_semicolon.rb +0 -17
- data/lib/rubocop/cop/style/space_inside_block_braces.rb +0 -166
- data/lib/rubocop/cop/style/space_inside_brackets.rb +0 -21
- data/lib/rubocop/cop/style/space_inside_parens.rb +0 -17
- data/lib/rubocop/cop/style/space_inside_string_interpolation.rb +0 -52
- data/lib/rubocop/cop/style/variable_name.rb +0 -40
- data/lib/rubocop/cop/variable_force/locatable.rb +0 -197
@@ -0,0 +1,146 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `if` nodes. This will be used in place of a plain
|
6
|
+
# node when the builder constructs the AST, making its methods available
|
7
|
+
# to all `if` nodes within RuboCop.
|
8
|
+
class IfNode < Node
|
9
|
+
include ConditionalNode
|
10
|
+
include ModifierNode
|
11
|
+
|
12
|
+
# Checks whether this node is an `if` statement. (This is not true of
|
13
|
+
# ternary operators and `unless` statements.)
|
14
|
+
#
|
15
|
+
# @return [Boolean] whether the node is an `if` statement
|
16
|
+
def if?
|
17
|
+
keyword == 'if'
|
18
|
+
end
|
19
|
+
|
20
|
+
# Checks whether this node is an `unless` statement. (This is not true
|
21
|
+
# of ternary operators and `if` statements.)
|
22
|
+
#
|
23
|
+
# @return [Boolean] whether the node is an `unless` statement
|
24
|
+
def unless?
|
25
|
+
keyword == 'unless'
|
26
|
+
end
|
27
|
+
|
28
|
+
# Checks whether the `if` is an `elsif`. Parser handles these by nesting
|
29
|
+
# `if` nodes in the `else` branch.
|
30
|
+
#
|
31
|
+
# @return [Boolean] whether the node is an `elsif`
|
32
|
+
def elsif?
|
33
|
+
keyword == 'elsif'
|
34
|
+
end
|
35
|
+
|
36
|
+
# Checks whether the `if` node has an `else` clause.
|
37
|
+
#
|
38
|
+
# @note This returns `true` for nodes containing an `elsif` clause.
|
39
|
+
# This is legacy behavior, and many cops rely on it.
|
40
|
+
#
|
41
|
+
# @return [Boolean] whether the node has an `else` clause
|
42
|
+
def else?
|
43
|
+
loc.respond_to?(:else) && loc.else
|
44
|
+
end
|
45
|
+
|
46
|
+
# Checks whether the `if` node is a ternary operator.
|
47
|
+
#
|
48
|
+
# @return [Boolean] whether the `if` node is a ternary operator
|
49
|
+
def ternary?
|
50
|
+
loc.respond_to?(:question)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Returns the keyword of the `if` statement as a string. Returns an empty
|
54
|
+
# string for ternary operators.
|
55
|
+
#
|
56
|
+
# @return [String] the keyword of the `if` statement
|
57
|
+
def keyword
|
58
|
+
ternary? ? '' : loc.keyword.source
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns the inverse keyword of the `if` node as a string. Returns `if`
|
62
|
+
# for `unless` nodes and vice versa. Returns an empty string for ternary
|
63
|
+
# operators.
|
64
|
+
#
|
65
|
+
# @return [String] the inverse keyword of the `if` statement
|
66
|
+
def inverse_keyword
|
67
|
+
if keyword == 'if'
|
68
|
+
'unless'
|
69
|
+
elsif keyword == 'unless'
|
70
|
+
'if'
|
71
|
+
else
|
72
|
+
''
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Checks whether the `if` node is in a modifier form, i.e. a condition
|
77
|
+
# trailing behind an expression. Only `if` and `unless` nodes without
|
78
|
+
# other branches can be modifiers.
|
79
|
+
#
|
80
|
+
# @return [Boolean] whether the `if` node is a modifier
|
81
|
+
def modifier_form?
|
82
|
+
(if? || unless?) && super
|
83
|
+
end
|
84
|
+
|
85
|
+
# Chacks whether the `if` node has nested `if` nodes in any of its
|
86
|
+
# branches.
|
87
|
+
#
|
88
|
+
# @note This performs a shallow search.
|
89
|
+
#
|
90
|
+
# @return [Boolean] whether the `if` node contains nested conditionals
|
91
|
+
def nested_conditional?
|
92
|
+
node_parts[1..2].compact.each do |branch|
|
93
|
+
branch.each_node(:if) do |nested|
|
94
|
+
return true unless nested.elsif?
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
false
|
99
|
+
end
|
100
|
+
|
101
|
+
# Checks whether the `if` node has at least one `elsif` branch. Returns
|
102
|
+
# true if this `if` node itself is an `elsif`.
|
103
|
+
#
|
104
|
+
# @return [Boolean] whether the `if` node has at least one `elsif` branch
|
105
|
+
def elsif_conditional?
|
106
|
+
else_branch && else_branch.if_type? && else_branch.elsif?
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns the branch of the `if` node that gets evaluated when its
|
110
|
+
# condition is truthy.
|
111
|
+
#
|
112
|
+
# @note This is normalized for `unless` nodes.
|
113
|
+
#
|
114
|
+
# @return [Node] the truthy branch node of the `if` node
|
115
|
+
# @return [nil] if the truthy branch is empty
|
116
|
+
def if_branch
|
117
|
+
node_parts[1]
|
118
|
+
end
|
119
|
+
|
120
|
+
# Returns the branch of the `if` node that gets evaluated when its
|
121
|
+
# condition is falsey.
|
122
|
+
#
|
123
|
+
# @note This is normalized for `unless` nodes.
|
124
|
+
#
|
125
|
+
# @return [Node] the falsey branch node of the `if` node
|
126
|
+
# @return [nil] when there is no else branch
|
127
|
+
def else_branch
|
128
|
+
node_parts[2]
|
129
|
+
end
|
130
|
+
|
131
|
+
# Custom destructuring method. This is used to normalize the branches
|
132
|
+
# for `if` and `unless` nodes, to aid comparisons and conversions.
|
133
|
+
#
|
134
|
+
# @return [Array<Node>] the different parts of the `if` statement
|
135
|
+
def node_parts
|
136
|
+
if unless?
|
137
|
+
condition, false_branch, true_branch = *self
|
138
|
+
else
|
139
|
+
condition, true_branch, false_branch = *self
|
140
|
+
end
|
141
|
+
|
142
|
+
[condition, true_branch, false_branch]
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `kwsplat` nodes. This will be used in place of a
|
6
|
+
# plain node when the builder constructs the AST, making its methods
|
7
|
+
# available to all `kwsplat` nodes within RuboCop.
|
8
|
+
class KeywordSplatNode < Node
|
9
|
+
include HashElementNode
|
10
|
+
|
11
|
+
DOUBLE_SPLAT = '**'.freeze
|
12
|
+
|
13
|
+
# This is used for duck typing with `pair` nodes which also appear as
|
14
|
+
# `hash` elements.
|
15
|
+
#
|
16
|
+
# @return [false]
|
17
|
+
def hash_rocket?
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
# This is used for duck typing with `pair` nodes which also appear as
|
22
|
+
# `hash` elements.
|
23
|
+
#
|
24
|
+
# @return [false]
|
25
|
+
def colon?
|
26
|
+
false
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the operator for the `kwsplat` as a string.
|
30
|
+
#
|
31
|
+
# @return [String] the double splat operator
|
32
|
+
def operator
|
33
|
+
DOUBLE_SPLAT
|
34
|
+
end
|
35
|
+
|
36
|
+
# Custom destructuring method. This is used to normalize the branches
|
37
|
+
# for `pair` and `kwsplat` nodes, to add duck typing to `hash` elements.
|
38
|
+
#
|
39
|
+
# @return [Array<KeywordSplatNode>] the different parts of the `kwsplat`
|
40
|
+
def node_parts
|
41
|
+
[self, self]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# Common functionality for primitive literal nodes: `sym`, `str`,
|
6
|
+
# `int`, `float`, ...
|
7
|
+
module BasicLiteralNode
|
8
|
+
# Returns the value of the literal.
|
9
|
+
#
|
10
|
+
# @return [mixed] the value of the literal
|
11
|
+
def value
|
12
|
+
node_parts[0]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# Common functionality for nodes that are binary operations:
|
6
|
+
# `or`, `and` ...
|
7
|
+
module BinaryOperatorNode
|
8
|
+
# Returns the left hand side node of the binary operation.
|
9
|
+
#
|
10
|
+
# @return [Node] the left hand side of the binary operation
|
11
|
+
def lhs
|
12
|
+
node_parts[0]
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns the right hand side node of the binary operation.
|
16
|
+
#
|
17
|
+
# @return [Node] the right hand side of the binary operation
|
18
|
+
def rhs
|
19
|
+
node_parts[1]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# A mixin that helps give collection nodes array polymorphism.
|
6
|
+
module CollectionNode
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
ARRAY_METHODS =
|
10
|
+
(Array.instance_methods - Object.instance_methods - [:to_a]).freeze
|
11
|
+
|
12
|
+
def_delegators :to_a, *ARRAY_METHODS
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# Common functionality for nodes that have conditions:
|
6
|
+
# `if`, `while`, `until`, `case`.
|
7
|
+
# This currently doesn't include `when` nodes, because they have multiple
|
8
|
+
# conditions, and need to be checked for that.
|
9
|
+
module ConditionalNode
|
10
|
+
# Checks whether the condition of the node is written on a single line.
|
11
|
+
#
|
12
|
+
# @return [Boolean] whether the condition is on a single line
|
13
|
+
def single_line_condition?
|
14
|
+
loc.keyword.line == condition.source_range.line
|
15
|
+
end
|
16
|
+
|
17
|
+
# Checks whether the condition of the node is written on more than
|
18
|
+
# one line.
|
19
|
+
#
|
20
|
+
# @return [Boolean] whether the condition is on more than one line
|
21
|
+
def multiline_condition?
|
22
|
+
!single_line_condition?
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the condition of the node. This works together with each node's
|
26
|
+
# custom destructuring method to select the correct part of the node.
|
27
|
+
#
|
28
|
+
# @return [Node, nil] the condition of the node
|
29
|
+
def condition
|
30
|
+
node_parts[0]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns the body associated with the condition. This works together with
|
34
|
+
# each node's custom destructuring method to select the correct part of
|
35
|
+
# the node.
|
36
|
+
#
|
37
|
+
# @note For `if` nodes, this is the truthy branch.
|
38
|
+
#
|
39
|
+
# @return [Node, nil] the body of the node
|
40
|
+
def body
|
41
|
+
node_parts[1]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# Common functionality for nodes that can be used as hash elements:
|
6
|
+
# `pair`, `kwsplat`
|
7
|
+
module HashElementNode
|
8
|
+
# Returns the key of this `hash` element.
|
9
|
+
#
|
10
|
+
# @note For keyword splats, this returns the whole node
|
11
|
+
#
|
12
|
+
# @return [Node] the key of the hash element
|
13
|
+
def key
|
14
|
+
node_parts[0]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns the value of this `hash` element.
|
18
|
+
#
|
19
|
+
# @note For keyword splats, this returns the whole node
|
20
|
+
#
|
21
|
+
# @return [Node] the value of the hash element
|
22
|
+
def value
|
23
|
+
node_parts[1]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Checks whether this `hash` element is on the same line as `other`.
|
27
|
+
#
|
28
|
+
# @note A multiline element is considered to be on the same line if it
|
29
|
+
# shares any of its lines with `other`
|
30
|
+
#
|
31
|
+
# @return [Boolean] whether this element is on the same line as `other`
|
32
|
+
def same_line?(other)
|
33
|
+
loc.last_line == other.loc.line || loc.line == other.loc.last_line
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns the delta between this pair's key and the argument pair's.
|
37
|
+
#
|
38
|
+
# @note Keys on the same line always return a delta of 0
|
39
|
+
# @note Keyword splats always return a delta of 0 for right alignment
|
40
|
+
#
|
41
|
+
# @param [Symbol] alignment whether to check the left or right side
|
42
|
+
# @return [Integer] the delta between the two keys
|
43
|
+
def key_delta(other, alignment = :left)
|
44
|
+
HashElementDelta.new(self, other).key_delta(alignment)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns the delta between this element's value and the argument's.
|
48
|
+
#
|
49
|
+
# @note Keyword splats always return a delta of 0
|
50
|
+
#
|
51
|
+
# @return [Integer] the delta between the two values
|
52
|
+
def value_delta(other)
|
53
|
+
HashElementDelta.new(self, other).value_delta
|
54
|
+
end
|
55
|
+
|
56
|
+
# Returns the delta between this element's delimiter and the argument's.
|
57
|
+
#
|
58
|
+
# @note Pairs with different delimiter styles return a delta of 0
|
59
|
+
#
|
60
|
+
# @return [Integer] the delta between the two delimiters
|
61
|
+
def delimiter_delta(other)
|
62
|
+
HashElementDelta.new(self, other).delimiter_delta
|
63
|
+
end
|
64
|
+
|
65
|
+
# A helper class for comparing the positions of different parts of a
|
66
|
+
# `pair` node.
|
67
|
+
class HashElementDelta
|
68
|
+
def initialize(first, second)
|
69
|
+
@first = first
|
70
|
+
@second = second
|
71
|
+
|
72
|
+
raise ArgumentError unless valid_argument_types?
|
73
|
+
end
|
74
|
+
|
75
|
+
def key_delta(alignment = :left)
|
76
|
+
return 0 if first.same_line?(second)
|
77
|
+
return 0 if keyword_splat? && alignment == :right
|
78
|
+
|
79
|
+
delta(first.key.loc, second.key.loc, alignment)
|
80
|
+
end
|
81
|
+
|
82
|
+
def value_delta
|
83
|
+
return 0 if first.same_line?(second)
|
84
|
+
return 0 if keyword_splat?
|
85
|
+
|
86
|
+
delta(first.value.loc, second.value.loc)
|
87
|
+
end
|
88
|
+
|
89
|
+
def delimiter_delta
|
90
|
+
return 0 if first.same_line?(second)
|
91
|
+
return 0 if first.delimiter != second.delimiter
|
92
|
+
|
93
|
+
delta(first.loc.operator, second.loc.operator)
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
attr_reader :first, :second
|
99
|
+
|
100
|
+
def valid_argument_types?
|
101
|
+
[first, second].all? do |argument|
|
102
|
+
argument.pair_type? || argument.kwsplat_type?
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def delta(first, second, alignment = :left)
|
107
|
+
case alignment
|
108
|
+
when :left
|
109
|
+
first.column - second.column
|
110
|
+
when :right
|
111
|
+
first.last_column - second.last_column
|
112
|
+
else
|
113
|
+
0
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def keyword_splat?
|
118
|
+
[first, second].any?(&:kwsplat_type?)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
private_constant :HashElementDelta
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# Common functionality for nodes that are a kind of method dispatch:
|
6
|
+
# `send`, `csend`, `super`, `zsuper`, `yield`
|
7
|
+
module MethodDispatchNode
|
8
|
+
extend NodePattern::Macros
|
9
|
+
include MethodIdentifierPredicates
|
10
|
+
|
11
|
+
# The receiving node of the method dispatch.
|
12
|
+
#
|
13
|
+
# @return [Node, nil] the receiver of the dispatched method or `nil`
|
14
|
+
def receiver
|
15
|
+
node_parts[0]
|
16
|
+
end
|
17
|
+
|
18
|
+
# The name of the dispatched method as a symbol.
|
19
|
+
#
|
20
|
+
# @return [Symbol] the name of the dispatched method
|
21
|
+
def method_name
|
22
|
+
node_parts[1]
|
23
|
+
end
|
24
|
+
|
25
|
+
# An array containing the arguments of the dispatched method.
|
26
|
+
#
|
27
|
+
# @return [Array<Node>] the arguments of the dispatched method
|
28
|
+
def arguments
|
29
|
+
node_parts[2..-1]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Checks whether the dispatched method is a macro method. A macro method
|
33
|
+
# is defined as a method that sits in a class, module, or block body and
|
34
|
+
# has an implicit receiver.
|
35
|
+
#
|
36
|
+
# @note This does not include DSLs that use nested blocks, like RSpec
|
37
|
+
#
|
38
|
+
# @return [Boolean] whether the dispatched method is a macro method
|
39
|
+
def macro?
|
40
|
+
!receiver && macro_scope?
|
41
|
+
end
|
42
|
+
|
43
|
+
# Checks whether the dispatched method is a bare access modifier affects
|
44
|
+
# all methods defined after the macro.
|
45
|
+
#
|
46
|
+
# @return [Boolean] whether the dispatched method is access modifier
|
47
|
+
def access_modifier?
|
48
|
+
macro? && bare_access_modifier?
|
49
|
+
end
|
50
|
+
|
51
|
+
# Checks whether the name of the dispatched method matches the argument
|
52
|
+
# and has an implicit receiver.
|
53
|
+
#
|
54
|
+
# @param [Symbol, String] name the method name to check for
|
55
|
+
# @return [Boolean] whether the method name matches the argument
|
56
|
+
def command?(name)
|
57
|
+
!receiver && method?(name)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Checks whether the dispatched method is a setter method.
|
61
|
+
#
|
62
|
+
# @return [Boolean] whether the dispatched method is a setter
|
63
|
+
def setter_method?
|
64
|
+
loc.respond_to?(:operator) && loc.operator
|
65
|
+
end
|
66
|
+
|
67
|
+
# Checks whether the dispatched method uses a dot to connect the
|
68
|
+
# receiver and the method name.
|
69
|
+
#
|
70
|
+
# This is useful for comparison operators, which can be called either
|
71
|
+
# with or without a dot, i.e. `foo == bar` or `foo.== bar`.
|
72
|
+
#
|
73
|
+
# @return [Boolean] whether the method was called with a connecting dot
|
74
|
+
def dot?
|
75
|
+
loc.respond_to?(:dot) && loc.dot && loc.dot.is?('.')
|
76
|
+
end
|
77
|
+
|
78
|
+
# Checks whether the dispatched method uses a double colon to connect the
|
79
|
+
# receiver and the method name.
|
80
|
+
#
|
81
|
+
# @return [Boolean] whether the method was called with a connecting dot
|
82
|
+
def double_colon?
|
83
|
+
loc.respond_to?(:dot) && loc.dot && loc.dot.is?('::')
|
84
|
+
end
|
85
|
+
|
86
|
+
# Checks whether the *explicit* receiver of this method dispatch is
|
87
|
+
# `self`.
|
88
|
+
#
|
89
|
+
# @return [Boolean] whether the receiver of this method dispatch is `self`
|
90
|
+
def self_receiver?
|
91
|
+
receiver && receiver.self_type?
|
92
|
+
end
|
93
|
+
|
94
|
+
# Checks whether the *explicit* receiver of this method dispatch is a
|
95
|
+
# `const` node.
|
96
|
+
#
|
97
|
+
# @return [Boolean] whether the receiver of this method dispatch
|
98
|
+
# is a `const` node
|
99
|
+
def const_receiver?
|
100
|
+
receiver && receiver.const_type?
|
101
|
+
end
|
102
|
+
|
103
|
+
# Checks whether the method dispatch is the implicit form of `#call`,
|
104
|
+
# e.g. `foo.(bar)`.
|
105
|
+
#
|
106
|
+
# @return [Boolean] whether the method is the implicit form of `#call`
|
107
|
+
def implicit_call?
|
108
|
+
method?(:call) && !loc.selector
|
109
|
+
end
|
110
|
+
|
111
|
+
# Whether this method dispatch has an explicit block.
|
112
|
+
#
|
113
|
+
# @return [Boolean] whether the dispatched method has a block
|
114
|
+
def block_literal?
|
115
|
+
parent && parent.block_type? && eql?(parent.send_node)
|
116
|
+
end
|
117
|
+
|
118
|
+
# The `block` node associated with this method dispatch, if any.
|
119
|
+
#
|
120
|
+
# @return [BlockNode, nil] the `block` node associated with this method
|
121
|
+
# call or `nil`
|
122
|
+
def block_node
|
123
|
+
parent if block_literal?
|
124
|
+
end
|
125
|
+
|
126
|
+
# Checks if this node is part of a chain of `def` modifiers.
|
127
|
+
#
|
128
|
+
# @example
|
129
|
+
#
|
130
|
+
# private def foo; end
|
131
|
+
#
|
132
|
+
# @return [Boolean] whether the dispatched method is a `def` modifier
|
133
|
+
def def_modifier?
|
134
|
+
send_type? &&
|
135
|
+
[self, *each_descendant(:send)].any?(&:adjacent_def_modifier?)
|
136
|
+
end
|
137
|
+
|
138
|
+
private
|
139
|
+
|
140
|
+
def_node_matcher :macro_scope?, <<-PATTERN
|
141
|
+
{^{({sclass class module block} ...) class_constructor?}
|
142
|
+
^^{({sclass class module block} ... (begin ...)) class_constructor?}
|
143
|
+
^#macro_kwbegin_wrapper?
|
144
|
+
#root_node?}
|
145
|
+
PATTERN
|
146
|
+
|
147
|
+
# Check if a node's parent is a kwbegin wrapper within a macro scope
|
148
|
+
#
|
149
|
+
# @param parent [Node] parent of the node being checked
|
150
|
+
#
|
151
|
+
# @return [Boolean] true if the parent is a kwbegin in a macro scope
|
152
|
+
def macro_kwbegin_wrapper?(parent)
|
153
|
+
parent.kwbegin_type? && macro_scope?(parent)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Check if a node does not have a parent
|
157
|
+
#
|
158
|
+
# @param node [Node]
|
159
|
+
#
|
160
|
+
# @return [Boolean] if the parent is nil
|
161
|
+
def root_node?(node)
|
162
|
+
node.parent.nil?
|
163
|
+
end
|
164
|
+
|
165
|
+
def_node_matcher :adjacent_def_modifier?, <<-PATTERN
|
166
|
+
(send nil? _ ({def defs} ...))
|
167
|
+
PATTERN
|
168
|
+
|
169
|
+
def_node_matcher :bare_access_modifier?, <<-PATTERN
|
170
|
+
(send nil? {:public :protected :private :module_function})
|
171
|
+
PATTERN
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# Common predicates for nodes that reference method identifiers:
|
6
|
+
# `send`, `csend`, `def`, `defs`, `super`, `zsuper`
|
7
|
+
#
|
8
|
+
# @note this mixin expects `#method_name` and `#receiver` to be implemented
|
9
|
+
module MethodIdentifierPredicates
|
10
|
+
ENUMERATOR_METHODS = %i[collect collect_concat detect downto each
|
11
|
+
find find_all find_index inject loop map!
|
12
|
+
map reduce reject reject! reverse_each select
|
13
|
+
select! times upto].freeze
|
14
|
+
|
15
|
+
# Checks whether the method name matches the argument.
|
16
|
+
#
|
17
|
+
# @param [Symbol, String] name the method name to check for
|
18
|
+
# @return [Boolean] whether the method name matches the argument
|
19
|
+
def method?(name)
|
20
|
+
method_name == name.to_sym
|
21
|
+
end
|
22
|
+
|
23
|
+
# Checks whether the method is an operator method.
|
24
|
+
#
|
25
|
+
# @return [Boolean] whether the method is an operator
|
26
|
+
def operator_method?
|
27
|
+
RuboCop::Cop::Util::OPERATOR_METHODS.include?(method_name)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Checks whether the method is a comparison method.
|
31
|
+
#
|
32
|
+
# @return [Boolean] whether the method is a comparison
|
33
|
+
def comparison_method?
|
34
|
+
Node::COMPARISON_OPERATORS.include?(method_name)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Checks whether the method is an assignment method.
|
38
|
+
#
|
39
|
+
# @return [Boolean] whether the method is an assignment
|
40
|
+
def assignment_method?
|
41
|
+
!comparison_method? && method_name.to_s.end_with?('=')
|
42
|
+
end
|
43
|
+
|
44
|
+
# Checks whether the method is an enumerator method.
|
45
|
+
#
|
46
|
+
# @return [Boolean] whether the method is an enumerator
|
47
|
+
def enumerator_method?
|
48
|
+
ENUMERATOR_METHODS.include?(method_name) ||
|
49
|
+
method_name.to_s.start_with?('each_')
|
50
|
+
end
|
51
|
+
|
52
|
+
# Checks whether the method is a predicate method.
|
53
|
+
#
|
54
|
+
# @return [Boolean] whether the method is a predicate method
|
55
|
+
def predicate_method?
|
56
|
+
method_name.to_s.end_with?('?')
|
57
|
+
end
|
58
|
+
|
59
|
+
# Checks whether the method is a bang method.
|
60
|
+
#
|
61
|
+
# @return [Boolean] whether the method is a bang method
|
62
|
+
def bang_method?
|
63
|
+
method_name.to_s.end_with?('!')
|
64
|
+
end
|
65
|
+
|
66
|
+
# Checks whether the method is a camel case method,
|
67
|
+
# e.g. `Integer()`.
|
68
|
+
#
|
69
|
+
# @return [Boolean] whether the method is a camel case method
|
70
|
+
def camel_case_method?
|
71
|
+
method_name.to_s =~ /\A[A-Z]/
|
72
|
+
end
|
73
|
+
|
74
|
+
# Checks whether the *explicit* receiver of this node is `self`.
|
75
|
+
#
|
76
|
+
# @return [Boolean] whether the receiver of this node is `self`
|
77
|
+
def self_receiver?
|
78
|
+
receiver && receiver.self_type?
|
79
|
+
end
|
80
|
+
|
81
|
+
# Checks whether the *explicit* receiver of node is a `const` node.
|
82
|
+
#
|
83
|
+
# @return [Boolean] whether the receiver of this node is a `const` node
|
84
|
+
def const_receiver?
|
85
|
+
receiver && receiver.const_type?
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# Common functionality for nodes that can be used as modifiers:
|
6
|
+
# `if`, `while`, `until`
|
7
|
+
module ModifierNode
|
8
|
+
# Checks whether the node is in a modifier form, i.e. a condition
|
9
|
+
# trailing behind an expression.
|
10
|
+
#
|
11
|
+
# @return [Boolean] whether the node is a modifier
|
12
|
+
def modifier_form?
|
13
|
+
loc.end.nil?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|