rubocop 0.78.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 +7 -0
- data/LICENSE.txt +20 -0
- data/README.md +217 -0
- data/assets/logo.png +0 -0
- data/assets/output.html.erb +261 -0
- data/bin/console +10 -0
- data/bin/setup +7 -0
- data/config/default.yml +3963 -0
- data/exe/rubocop +17 -0
- data/lib/rubocop.rb +619 -0
- data/lib/rubocop/ast/builder.rb +82 -0
- data/lib/rubocop/ast/node.rb +644 -0
- data/lib/rubocop/ast/node/alias_node.rb +24 -0
- data/lib/rubocop/ast/node/and_node.rb +29 -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 +117 -0
- data/lib/rubocop/ast/node/break_node.rb +17 -0
- data/lib/rubocop/ast/node/case_node.rb +56 -0
- data/lib/rubocop/ast/node/class_node.rb +31 -0
- data/lib/rubocop/ast/node/def_node.rb +71 -0
- data/lib/rubocop/ast/node/defined_node.rb +17 -0
- data/lib/rubocop/ast/node/ensure_node.rb +17 -0
- data/lib/rubocop/ast/node/float_node.rb +12 -0
- data/lib/rubocop/ast/node/for_node.rb +53 -0
- data/lib/rubocop/ast/node/hash_node.rb +109 -0
- data/lib/rubocop/ast/node/if_node.rb +175 -0
- data/lib/rubocop/ast/node/int_node.rb +12 -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 +43 -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 +261 -0
- data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +114 -0
- data/lib/rubocop/ast/node/mixin/modifier_node.rb +17 -0
- data/lib/rubocop/ast/node/mixin/numeric_node.rb +21 -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/module_node.rb +24 -0
- data/lib/rubocop/ast/node/or_node.rb +29 -0
- data/lib/rubocop/ast/node/pair_node.rb +63 -0
- data/lib/rubocop/ast/node/range_node.rb +18 -0
- data/lib/rubocop/ast/node/regexp_node.rb +35 -0
- data/lib/rubocop/ast/node/resbody_node.rb +24 -0
- data/lib/rubocop/ast/node/retry_node.rb +17 -0
- data/lib/rubocop/ast/node/return_node.rb +24 -0
- data/lib/rubocop/ast/node/self_class_node.rb +24 -0
- data/lib/rubocop/ast/node/send_node.rb +13 -0
- data/lib/rubocop/ast/node/str_node.rb +16 -0
- data/lib/rubocop/ast/node/super_node.rb +21 -0
- data/lib/rubocop/ast/node/symbol_node.rb +12 -0
- data/lib/rubocop/ast/node/until_node.rb +35 -0
- data/lib/rubocop/ast/node/when_node.rb +53 -0
- data/lib/rubocop/ast/node/while_node.rb +35 -0
- data/lib/rubocop/ast/node/yield_node.rb +21 -0
- data/lib/rubocop/ast/sexp.rb +16 -0
- data/lib/rubocop/ast/traversal.rb +183 -0
- data/lib/rubocop/cached_data.rb +58 -0
- data/lib/rubocop/cli.rb +127 -0
- data/lib/rubocop/cli/command.rb +21 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
- data/lib/rubocop/cli/command/base.rb +33 -0
- data/lib/rubocop/cli/command/execute_runner.rb +76 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
- data/lib/rubocop/cli/command/show_cops.rb +73 -0
- data/lib/rubocop/cli/command/version.rb +17 -0
- data/lib/rubocop/cli/environment.rb +21 -0
- data/lib/rubocop/comment_config.rb +201 -0
- data/lib/rubocop/config.rb +251 -0
- data/lib/rubocop/config_loader.rb +273 -0
- data/lib/rubocop/config_loader_resolver.rb +195 -0
- data/lib/rubocop/config_obsoletion.rb +275 -0
- data/lib/rubocop/config_store.rb +48 -0
- data/lib/rubocop/config_validator.rb +248 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +103 -0
- data/lib/rubocop/cop/badge.rb +73 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +73 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +64 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +69 -0
- data/lib/rubocop/cop/bundler/ordered_gems.rb +73 -0
- data/lib/rubocop/cop/commissioner.rb +145 -0
- data/lib/rubocop/cop/cop.rb +296 -0
- data/lib/rubocop/cop/corrector.rb +172 -0
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +146 -0
- data/lib/rubocop/cop/correctors/condition_corrector.rb +28 -0
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -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/percent_literal_corrector.rb +117 -0
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
- data/lib/rubocop/cop/correctors/space_corrector.rb +48 -0
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
- data/lib/rubocop/cop/force.rb +42 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +106 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
- data/lib/rubocop/cop/generator.rb +223 -0
- data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
- data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
- data/lib/rubocop/cop/ignored_node.rb +38 -0
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -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 +48 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +73 -0
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +98 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +93 -0
- data/lib/rubocop/cop/layout/array_alignment.rb +39 -0
- data/lib/rubocop/cop/layout/assignment_indentation.rb +55 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +244 -0
- data/lib/rubocop/cop/layout/block_end_newline.rb +62 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +161 -0
- data/lib/rubocop/cop/layout/class_structure.rb +340 -0
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +203 -0
- data/lib/rubocop/cop/layout/comment_indentation.rb +141 -0
- data/lib/rubocop/cop/layout/condition_position.rb +56 -0
- data/lib/rubocop/cop/layout/def_end_alignment.rb +74 -0
- data/lib/rubocop/cop/layout/dot_position.rb +105 -0
- data/lib/rubocop/cop/layout/else_alignment.rb +134 -0
- data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +64 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +151 -0
- data/lib/rubocop/cop/layout/empty_lines.rb +76 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +215 -0
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +45 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +41 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +88 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +136 -0
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +45 -0
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +62 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +189 -0
- data/lib/rubocop/cop/layout/end_of_line.rb +92 -0
- data/lib/rubocop/cop/layout/extra_spacing.rb +201 -0
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +249 -0
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +167 -0
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +45 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +184 -0
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +37 -0
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +55 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +46 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +100 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +362 -0
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +289 -0
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +256 -0
- data/lib/rubocop/cop/layout/indentation_consistency.rb +202 -0
- data/lib/rubocop/cop/layout/indentation_width.rb +364 -0
- data/lib/rubocop/cop/layout/initial_indentation.rb +59 -0
- data/lib/rubocop/cop/layout/leading_comment_space.rb +88 -0
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
- data/lib/rubocop/cop/layout/line_length.rb +248 -0
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +118 -0
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +95 -0
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +146 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +122 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +54 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +134 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +220 -0
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +131 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +114 -0
- data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +191 -0
- data/lib/rubocop/cop/layout/space_after_colon.rb +47 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
- data/lib/rubocop/cop/layout/space_after_method_name.rb +42 -0
- data/lib/rubocop/cop/layout/space_after_not.rb +40 -0
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +32 -0
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +169 -0
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +92 -0
- data/lib/rubocop/cop/layout/space_around_keyword.rb +244 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +207 -0
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +136 -0
- data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
- data/lib/rubocop/cop/layout/space_before_comment.rb +35 -0
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +67 -0
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +82 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +231 -0
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +53 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +248 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +207 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +113 -0
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +65 -0
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +63 -0
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +150 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +65 -0
- data/lib/rubocop/cop/layout/tab.rb +75 -0
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +113 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +77 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +62 -0
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +55 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +43 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +97 -0
- data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +72 -0
- data/lib/rubocop/cop/lint/debugger.rb +77 -0
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +111 -0
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +38 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +239 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +42 -0
- data/lib/rubocop/cop/lint/else_layout.rb +66 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +60 -0
- data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
- data/lib/rubocop/cop/lint/empty_interpolation.rb +36 -0
- data/lib/rubocop/cop/lint/empty_when.rb +38 -0
- data/lib/rubocop/cop/lint/end_in_method.rb +40 -0
- data/lib/rubocop/cop/lint/ensure_return.rb +46 -0
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +164 -0
- data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
- data/lib/rubocop/cop/lint/float_out_of_range.rb +35 -0
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +159 -0
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +101 -0
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +127 -0
- data/lib/rubocop/cop/lint/inherit_exception.rb +100 -0
- data/lib/rubocop/cop/lint/interpolation_check.rb +40 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +138 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +98 -0
- data/lib/rubocop/cop/lint/loop.rb +63 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
- data/lib/rubocop/cop/lint/multiple_comparison.rb +48 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +104 -0
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +50 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +83 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +64 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +73 -0
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +69 -0
- data/lib/rubocop/cop/lint/rand_one.rb +45 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +263 -0
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +114 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +50 -0
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +172 -0
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +59 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +82 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +83 -0
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +66 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +46 -0
- data/lib/rubocop/cop/lint/rescue_type.rb +94 -0
- data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +65 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +38 -0
- data/lib/rubocop/cop/lint/script_permission.rb +70 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +178 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +53 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +95 -0
- data/lib/rubocop/cop/lint/syntax.rb +59 -0
- data/lib/rubocop/cop/lint/to_json.rb +41 -0
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +82 -0
- data/lib/rubocop/cop/lint/unified_integer.rb +45 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +99 -0
- data/lib/rubocop/cop/lint/unused_block_argument.rb +165 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +86 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +76 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +274 -0
- data/lib/rubocop/cop/lint/useless_assignment.rb +129 -0
- data/lib/rubocop/cop/lint/useless_comparison.rb +28 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +49 -0
- data/lib/rubocop/cop/lint/useless_setter_call.rb +164 -0
- data/lib/rubocop/cop/lint/void.rb +151 -0
- data/lib/rubocop/cop/message_annotator.rb +129 -0
- data/lib/rubocop/cop/metrics/abc_size.rb +24 -0
- data/lib/rubocop/cop/metrics/block_length.rb +50 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +65 -0
- data/lib/rubocop/cop/metrics/class_length.rb +36 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +32 -0
- data/lib/rubocop/cop/metrics/method_length.rb +36 -0
- data/lib/rubocop/cop/metrics/module_length.rb +36 -0
- data/lib/rubocop/cop/metrics/parameter_lists.rb +54 -0
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +61 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
- data/lib/rubocop/cop/migration/department_name.rb +44 -0
- data/lib/rubocop/cop/mixin/alignment.rb +74 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +37 -0
- data/lib/rubocop/cop/mixin/array_min_size.rb +59 -0
- data/lib/rubocop/cop/mixin/array_syntax.rb +17 -0
- data/lib/rubocop/cop/mixin/check_assignment.rb +44 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +190 -0
- data/lib/rubocop/cop/mixin/classish_length.rb +37 -0
- data/lib/rubocop/cop/mixin/code_length.rb +38 -0
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +98 -0
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +47 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +23 -0
- data/lib/rubocop/cop/mixin/configurable_naming.rb +16 -0
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
- data/lib/rubocop/cop/mixin/def_node.rb +33 -0
- data/lib/rubocop/cop/mixin/documentation_comment.rb +52 -0
- data/lib/rubocop/cop/mixin/duplication.rb +46 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +172 -0
- data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +67 -0
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +30 -0
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +46 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +53 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +147 -0
- data/lib/rubocop/cop/mixin/heredoc.rb +32 -0
- data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
- data/lib/rubocop/cop/mixin/integer_node.rb +14 -0
- data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
- data/lib/rubocop/cop/mixin/match_range.rb +26 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +57 -0
- data/lib/rubocop/cop/mixin/method_preference.rb +31 -0
- data/lib/rubocop/cop/mixin/min_body_length.rb +21 -0
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +86 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +255 -0
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +141 -0
- data/lib/rubocop/cop/mixin/negative_conditional.rb +32 -0
- data/lib/rubocop/cop/mixin/nil_methods.rb +25 -0
- data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +14 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +56 -0
- data/lib/rubocop/cop/mixin/parentheses.rb +17 -0
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +37 -0
- data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
- data/lib/rubocop/cop/mixin/percent_literal.rb +38 -0
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +181 -0
- data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
- data/lib/rubocop/cop/mixin/range_help.rb +117 -0
- data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +22 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +23 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +55 -0
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +49 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +71 -0
- data/lib/rubocop/cop/mixin/string_help.rb +35 -0
- data/lib/rubocop/cop/mixin/string_literals_help.rb +23 -0
- data/lib/rubocop/cop/mixin/surrounding_space.rb +146 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +16 -0
- data/lib/rubocop/cop/mixin/too_many_lines.rb +35 -0
- data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
- data/lib/rubocop/cop/mixin/trailing_comma.rb +221 -0
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +111 -0
- data/lib/rubocop/cop/mixin/unused_argument.rb +33 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +72 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +43 -0
- data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
- data/lib/rubocop/cop/naming/constant_name.rb +81 -0
- data/lib/rubocop/cop/naming/file_name.rb +212 -0
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +55 -0
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
- data/lib/rubocop/cop/naming/method_name.rb +53 -0
- data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
- data/lib/rubocop/cop/naming/predicate_name.rb +108 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
- data/lib/rubocop/cop/naming/variable_name.rb +52 -0
- data/lib/rubocop/cop/naming/variable_number.rb +61 -0
- data/lib/rubocop/cop/offense.rb +216 -0
- data/lib/rubocop/cop/registry.rb +211 -0
- data/lib/rubocop/cop/security/eval.rb +31 -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/open.rb +71 -0
- data/lib/rubocop/cop/security/yaml_load.rb +37 -0
- data/lib/rubocop/cop/severity.rb +77 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +112 -0
- data/lib/rubocop/cop/style/alias.rb +147 -0
- data/lib/rubocop/cop/style/and_or.rb +146 -0
- data/lib/rubocop/cop/style/array_join.rb +39 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +61 -0
- data/lib/rubocop/cop/style/attr.rb +70 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +51 -0
- data/lib/rubocop/cop/style/bare_percent_literals.rb +78 -0
- data/lib/rubocop/cop/style/begin_block.rb +22 -0
- data/lib/rubocop/cop/style/block_comments.rb +70 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +331 -0
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +209 -0
- data/lib/rubocop/cop/style/case_equality.rb +30 -0
- data/lib/rubocop/cop/style/character_literal.rb +53 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +151 -0
- data/lib/rubocop/cop/style/class_check.rb +59 -0
- data/lib/rubocop/cop/style/class_methods.rb +60 -0
- data/lib/rubocop/cop/style/class_vars.rb +48 -0
- data/lib/rubocop/cop/style/collection_methods.rb +77 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +48 -0
- data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
- data/lib/rubocop/cop/style/command_literal.rb +187 -0
- data/lib/rubocop/cop/style/comment_annotation.rb +97 -0
- data/lib/rubocop/cop/style/commented_keyword.rb +73 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +668 -0
- data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
- data/lib/rubocop/cop/style/copyright.rb +99 -0
- data/lib/rubocop/cop/style/date_time.rb +77 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +57 -0
- data/lib/rubocop/cop/style/dir.rb +48 -0
- data/lib/rubocop/cop/style/documentation.rb +97 -0
- data/lib/rubocop/cop/style/documentation_method.rb +125 -0
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
- data/lib/rubocop/cop/style/double_negation.rb +35 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +58 -0
- data/lib/rubocop/cop/style/each_with_object.rb +110 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +107 -0
- data/lib/rubocop/cop/style/empty_else.rb +175 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
- data/lib/rubocop/cop/style/empty_literal.rb +123 -0
- data/lib/rubocop/cop/style/empty_method.rb +115 -0
- data/lib/rubocop/cop/style/encoding.rb +56 -0
- data/lib/rubocop/cop/style/end_block.rb +25 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
- data/lib/rubocop/cop/style/even_odd.rb +58 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
- data/lib/rubocop/cop/style/float_division.rb +94 -0
- data/lib/rubocop/cop/style/for.rb +88 -0
- data/lib/rubocop/cop/style/format_string.rb +127 -0
- data/lib/rubocop/cop/style/format_string_token.rb +121 -0
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +159 -0
- data/lib/rubocop/cop/style/global_vars.rb +80 -0
- data/lib/rubocop/cop/style/guard_clause.rb +122 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +214 -0
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +130 -0
- data/lib/rubocop/cop/style/if_inside_else.rb +87 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +169 -0
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +39 -0
- data/lib/rubocop/cop/style/if_with_semicolon.rb +30 -0
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +32 -0
- data/lib/rubocop/cop/style/infinite_loop.rb +128 -0
- data/lib/rubocop/cop/style/inline_comment.rb +34 -0
- data/lib/rubocop/cop/style/inverse_methods.rb +193 -0
- data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
- data/lib/rubocop/cop/style/lambda.rb +131 -0
- data/lib/rubocop/cop/style/lambda_call.rb +93 -0
- data/lib/rubocop/cop/style/line_end_concatenation.rb +125 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +388 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +77 -0
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +46 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +166 -0
- data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
- data/lib/rubocop/cop/style/min_max.rb +68 -0
- data/lib/rubocop/cop/style/missing_else.rb +180 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
- data/lib/rubocop/cop/style/mixin_grouping.rb +148 -0
- data/lib/rubocop/cop/style/mixin_usage.rb +90 -0
- data/lib/rubocop/cop/style/module_function.rb +104 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +40 -0
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +50 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +94 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +38 -0
- data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +92 -0
- data/lib/rubocop/cop/style/mutable_constant.rb +174 -0
- data/lib/rubocop/cop/style/negated_if.rb +99 -0
- data/lib/rubocop/cop/style/negated_unless.rb +89 -0
- data/lib/rubocop/cop/style/negated_while.rb +48 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +107 -0
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +67 -0
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +32 -0
- data/lib/rubocop/cop/style/next.rb +244 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +75 -0
- data/lib/rubocop/cop/style/non_nil_check.rb +136 -0
- data/lib/rubocop/cop/style/not.rb +82 -0
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +124 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +114 -0
- data/lib/rubocop/cop/style/numeric_predicate.rb +137 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +101 -0
- data/lib/rubocop/cop/style/option_hash.rb +55 -0
- data/lib/rubocop/cop/style/optional_arguments.rb +58 -0
- data/lib/rubocop/cop/style/or_assignment.rb +95 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +287 -0
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +117 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +127 -0
- data/lib/rubocop/cop/style/percent_q_literals.rb +73 -0
- data/lib/rubocop/cop/style/perl_backrefs.rb +38 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +75 -0
- data/lib/rubocop/cop/style/proc.rb +34 -0
- data/lib/rubocop/cop/style/raise_args.rb +145 -0
- data/lib/rubocop/cop/style/random_with_offset.rb +158 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +91 -0
- data/lib/rubocop/cop/style/redundant_capital_w.rb +51 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +112 -0
- data/lib/rubocop/cop/style/redundant_conditional.rb +97 -0
- data/lib/rubocop/cop/style/redundant_exception.rb +60 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +67 -0
- data/lib/rubocop/cop/style/redundant_interpolation.rb +98 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +231 -0
- data/lib/rubocop/cop/style/redundant_percent_q.rb +112 -0
- data/lib/rubocop/cop/style/redundant_return.rb +171 -0
- data/lib/rubocop/cop/style/redundant_self.rb +171 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
- data/lib/rubocop/cop/style/redundant_sort_by.rb +50 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +228 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +73 -0
- data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
- data/lib/rubocop/cop/style/return_nil.rb +89 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +275 -0
- data/lib/rubocop/cop/style/sample.rb +144 -0
- data/lib/rubocop/cop/style/self_assignment.rb +97 -0
- data/lib/rubocop/cop/style/semicolon.rb +101 -0
- data/lib/rubocop/cop/style/send.rb +31 -0
- data/lib/rubocop/cop/style/signal_exception.rb +211 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +95 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +83 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +211 -0
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +86 -0
- data/lib/rubocop/cop/style/stderr_puts.rb +61 -0
- data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
- data/lib/rubocop/cop/style/string_literals.rb +129 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +49 -0
- data/lib/rubocop/cop/style/string_methods.rb +46 -0
- data/lib/rubocop/cop/style/strip.rb +46 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +39 -0
- data/lib/rubocop/cop/style/symbol_array.rb +119 -0
- data/lib/rubocop/cop/style/symbol_literal.rb +32 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +110 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +223 -0
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +96 -0
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +58 -0
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +56 -0
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +167 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +191 -0
- data/lib/rubocop/cop/style/unless_else.rb +55 -0
- data/lib/rubocop/cop/style/unpack_first.rb +65 -0
- data/lib/rubocop/cop/style/variable_interpolation.rb +48 -0
- data/lib/rubocop/cop/style/when_then.rb +37 -0
- data/lib/rubocop/cop/style/while_until_do.rb +59 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +61 -0
- data/lib/rubocop/cop/style/word_array.rb +102 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +141 -0
- data/lib/rubocop/cop/style/zero_length_predicate.rb +117 -0
- data/lib/rubocop/cop/team.rb +196 -0
- data/lib/rubocop/cop/util.rb +127 -0
- data/lib/rubocop/cop/utils/format_string.rb +120 -0
- data/lib/rubocop/cop/variable_force.rb +466 -0
- data/lib/rubocop/cop/variable_force/assignment.rb +96 -0
- data/lib/rubocop/cop/variable_force/branch.rb +322 -0
- data/lib/rubocop/cop/variable_force/branchable.rb +23 -0
- data/lib/rubocop/cop/variable_force/reference.rb +49 -0
- data/lib/rubocop/cop/variable_force/scope.rb +109 -0
- data/lib/rubocop/cop/variable_force/variable.rb +117 -0
- data/lib/rubocop/cop/variable_force/variable_table.rb +129 -0
- data/lib/rubocop/core_ext/string.rb +23 -0
- data/lib/rubocop/error.rb +34 -0
- data/lib/rubocop/file_finder.rb +42 -0
- data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
- data/lib/rubocop/formatter/base_formatter.rb +123 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +57 -0
- data/lib/rubocop/formatter/colorizable.rb +41 -0
- data/lib/rubocop/formatter/disabled_config_formatter.rb +224 -0
- data/lib/rubocop/formatter/disabled_lines_formatter.rb +57 -0
- data/lib/rubocop/formatter/emacs_style_formatter.rb +37 -0
- data/lib/rubocop/formatter/file_list_formatter.rb +20 -0
- data/lib/rubocop/formatter/formatter_set.rb +106 -0
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +80 -0
- data/lib/rubocop/formatter/html_formatter.rb +141 -0
- data/lib/rubocop/formatter/json_formatter.rb +81 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +74 -0
- data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
- data/lib/rubocop/formatter/progress_formatter.rb +63 -0
- data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +138 -0
- data/lib/rubocop/formatter/tap_formatter.rb +82 -0
- data/lib/rubocop/formatter/text_util.rb +20 -0
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +62 -0
- data/lib/rubocop/magic_comment.rb +214 -0
- data/lib/rubocop/name_similarity.rb +21 -0
- data/lib/rubocop/node_pattern.rb +801 -0
- data/lib/rubocop/options.rb +460 -0
- data/lib/rubocop/path_util.rb +85 -0
- data/lib/rubocop/platform.rb +11 -0
- data/lib/rubocop/processed_source.rb +216 -0
- data/lib/rubocop/rake_task.rb +80 -0
- data/lib/rubocop/remote_config.rb +106 -0
- data/lib/rubocop/result_cache.rb +207 -0
- data/lib/rubocop/rspec/cop_helper.rb +94 -0
- data/lib/rubocop/rspec/expect_offense.rb +240 -0
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +28 -0
- data/lib/rubocop/rspec/shared_contexts.rb +90 -0
- data/lib/rubocop/rspec/support.rb +13 -0
- data/lib/rubocop/runner.rb +379 -0
- data/lib/rubocop/string_interpreter.rb +57 -0
- data/lib/rubocop/string_util.rb +14 -0
- data/lib/rubocop/target_finder.rb +196 -0
- data/lib/rubocop/token.rb +114 -0
- data/lib/rubocop/version.rb +21 -0
- data/lib/rubocop/warning.rb +11 -0
- data/lib/rubocop/yaml_duplication_checker.rb +39 -0
- metadata +782 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Metrics
|
|
6
|
+
# This cop tries to produce a complexity score that's a measure of the
|
|
7
|
+
# complexity the reader experiences when looking at a method. For that
|
|
8
|
+
# reason it considers `when` nodes as something that doesn't add as much
|
|
9
|
+
# complexity as an `if` or a `&&`. Except if it's one of those special
|
|
10
|
+
# `case`/`when` constructs where there's no expression after `case`. Then
|
|
11
|
+
# the cop treats it as an `if`/`elsif`/`elsif`... and lets all the `when`
|
|
12
|
+
# nodes count. In contrast to the CyclomaticComplexity cop, this cop
|
|
13
|
+
# considers `else` nodes as adding complexity.
|
|
14
|
+
#
|
|
15
|
+
# @example
|
|
16
|
+
#
|
|
17
|
+
# def my_method # 1
|
|
18
|
+
# if cond # 1
|
|
19
|
+
# case var # 2 (0.8 + 4 * 0.2, rounded)
|
|
20
|
+
# when 1 then func_one
|
|
21
|
+
# when 2 then func_two
|
|
22
|
+
# when 3 then func_three
|
|
23
|
+
# when 4..10 then func_other
|
|
24
|
+
# end
|
|
25
|
+
# else # 1
|
|
26
|
+
# do_something until a && b # 2
|
|
27
|
+
# end # ===
|
|
28
|
+
# end # 7 complexity points
|
|
29
|
+
class PerceivedComplexity < Cop
|
|
30
|
+
include MethodComplexity
|
|
31
|
+
|
|
32
|
+
MSG = 'Perceived complexity for %<method>s is too high. ' \
|
|
33
|
+
'[%<complexity>d/%<max>d]'
|
|
34
|
+
COUNTED_NODES = %i[if case while until
|
|
35
|
+
for rescue and or].freeze
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def complexity_score_for(node)
|
|
40
|
+
case node.type
|
|
41
|
+
when :case
|
|
42
|
+
# If cond is nil, that means each when has an expression that
|
|
43
|
+
# evaluates to true or false. It's just an alternative to
|
|
44
|
+
# if/elsif/elsif... so the when nodes count.
|
|
45
|
+
if node.condition.nil?
|
|
46
|
+
node.when_branches.length
|
|
47
|
+
else
|
|
48
|
+
# Otherwise, the case node gets 0.8 complexity points and each
|
|
49
|
+
# when gets 0.2.
|
|
50
|
+
(0.8 + 0.2 * node.when_branches.length).round
|
|
51
|
+
end
|
|
52
|
+
when :if
|
|
53
|
+
node.else? && !node.elsif? ? 2 : 1
|
|
54
|
+
else
|
|
55
|
+
1
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Metrics
|
|
6
|
+
module Utils
|
|
7
|
+
# > ABC is .. a software size metric .. computed by counting the number
|
|
8
|
+
# > of assignments, branches and conditions for a section of code.
|
|
9
|
+
# > http://c2.com/cgi/wiki?AbcMetric
|
|
10
|
+
#
|
|
11
|
+
# We separate the *calculator* from the *cop* so that the calculation,
|
|
12
|
+
# the formula itself, is easier to test.
|
|
13
|
+
class AbcSizeCalculator
|
|
14
|
+
# > Branch -- an explicit forward program branch out of scope -- a
|
|
15
|
+
# > function call, class method call ..
|
|
16
|
+
# > http://c2.com/cgi/wiki?AbcMetric
|
|
17
|
+
BRANCH_NODES = %i[send csend].freeze
|
|
18
|
+
|
|
19
|
+
# > Condition -- a logical/Boolean test, == != <= >= < > else case
|
|
20
|
+
# > default try catch ? and unary conditionals.
|
|
21
|
+
# > http://c2.com/cgi/wiki?AbcMetric
|
|
22
|
+
CONDITION_NODES = CyclomaticComplexity::COUNTED_NODES.freeze
|
|
23
|
+
|
|
24
|
+
def self.calculate(node)
|
|
25
|
+
new(node).calculate
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def initialize(node)
|
|
29
|
+
@assignment = 0
|
|
30
|
+
@branch = 0
|
|
31
|
+
@condition = 0
|
|
32
|
+
@node = node
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def calculate
|
|
36
|
+
@node.each_node do |child|
|
|
37
|
+
if child.assignment?
|
|
38
|
+
@assignment += 1
|
|
39
|
+
elsif branch?(child)
|
|
40
|
+
evaluate_branch_nodes(child)
|
|
41
|
+
elsif condition?(child)
|
|
42
|
+
evaluate_condition_node(child)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
[
|
|
47
|
+
Math.sqrt(@assignment**2 + @branch**2 + @condition**2).round(2),
|
|
48
|
+
"<#{@assignment}, #{@branch}, #{@condition}>"
|
|
49
|
+
]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def evaluate_branch_nodes(node)
|
|
53
|
+
if node.comparison_method?
|
|
54
|
+
@condition += 1
|
|
55
|
+
else
|
|
56
|
+
@branch += 1
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def evaluate_condition_node(node)
|
|
61
|
+
@condition += 1 if else_branch?(node)
|
|
62
|
+
@condition += 1
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def else_branch?(node)
|
|
66
|
+
%i[case if].include?(node.type) &&
|
|
67
|
+
node.else? &&
|
|
68
|
+
node.loc.else.is?('else')
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
def branch?(node)
|
|
74
|
+
BRANCH_NODES.include?(node.type)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def condition?(node)
|
|
78
|
+
CONDITION_NODES.include?(node.type)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Migration
|
|
6
|
+
# Check that cop names in rubocop:disable comments are given with
|
|
7
|
+
# department name.
|
|
8
|
+
class DepartmentName < Cop
|
|
9
|
+
include RangeHelp
|
|
10
|
+
|
|
11
|
+
MSG = 'Department name is missing.'
|
|
12
|
+
|
|
13
|
+
def investigate(processed_source)
|
|
14
|
+
processed_source.each_comment do |comment|
|
|
15
|
+
next if comment.text !~ /\A(# *rubocop:((dis|en)able|todo) +)(.*)/
|
|
16
|
+
|
|
17
|
+
offset = Regexp.last_match(1).length
|
|
18
|
+
Regexp.last_match(4).scan(%r{[\w/]+|\W+}) do |name|
|
|
19
|
+
check_cop_name(name, comment, offset)
|
|
20
|
+
offset += name.length
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def autocorrect(range)
|
|
26
|
+
shall_warn = false
|
|
27
|
+
qualified_cop_name = Cop.registry.qualified_cop_name(range.source,
|
|
28
|
+
nil, shall_warn)
|
|
29
|
+
->(corrector) { corrector.replace(range, qualified_cop_name) }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def check_cop_name(name, comment, offset)
|
|
35
|
+
return if name !~ /^[A-Z]/ || name =~ %r{/}
|
|
36
|
+
|
|
37
|
+
start = comment.location.expression.begin_pos + offset
|
|
38
|
+
range = range_between(start, start + name.length)
|
|
39
|
+
add_offense(range, location: range)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# This module checks for nodes that should be aligned to the left or right.
|
|
6
|
+
# This amount is determined by the instance variable @column_delta.
|
|
7
|
+
module Alignment
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
SPACE = ' '
|
|
11
|
+
|
|
12
|
+
attr_reader :column_delta
|
|
13
|
+
|
|
14
|
+
def configured_indentation_width
|
|
15
|
+
cop_config['IndentationWidth'] ||
|
|
16
|
+
config.for_cop('Layout/IndentationWidth')['Width']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def indentation(node)
|
|
20
|
+
offset(node) + (SPACE * configured_indentation_width)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def offset(node)
|
|
24
|
+
SPACE * node.loc.column
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def check_alignment(items, base_column = nil)
|
|
28
|
+
unless items.empty?
|
|
29
|
+
base_column ||= display_column(items.first.source_range)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
each_bad_alignment(items, base_column) do |current|
|
|
33
|
+
expr = current.source_range
|
|
34
|
+
if offenses.any? { |o| within?(expr, o.location) }
|
|
35
|
+
# If this offense is within a line range that is already being
|
|
36
|
+
# realigned by autocorrect, we report the offense without
|
|
37
|
+
# autocorrecting it. Two rewrites in the same area by the same
|
|
38
|
+
# cop cannot be handled. The next iteration will find the
|
|
39
|
+
# offense again and correct it.
|
|
40
|
+
add_offense(nil, location: expr)
|
|
41
|
+
else
|
|
42
|
+
add_offense(current)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def each_bad_alignment(items, base_column)
|
|
48
|
+
prev_line = -1
|
|
49
|
+
items.each do |current|
|
|
50
|
+
if current.loc.line > prev_line &&
|
|
51
|
+
begins_its_line?(current.source_range)
|
|
52
|
+
@column_delta = base_column - display_column(current.source_range)
|
|
53
|
+
|
|
54
|
+
yield current if @column_delta.nonzero?
|
|
55
|
+
end
|
|
56
|
+
prev_line = current.loc.line
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def display_column(range)
|
|
61
|
+
line = processed_source.lines[range.line - 1]
|
|
62
|
+
Unicode::DisplayWidth.of(line[0, range.column])
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def within?(inner, outer)
|
|
66
|
+
inner.begin_pos >= outer.begin_pos && inner.end_pos <= outer.end_pos
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def end_of_line_comment(line)
|
|
70
|
+
processed_source.find_comment { |c| c.loc.line == line }
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Common functionality related to annotation comments.
|
|
7
|
+
module AnnotationComment
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
def annotation?(comment)
|
|
11
|
+
_margin, first_word, colon, space, note = split_comment(comment)
|
|
12
|
+
keyword_appearance?(first_word, colon, space) &&
|
|
13
|
+
!just_first_word_of_sentence?(first_word, colon, space, note)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def split_comment(comment)
|
|
17
|
+
match = comment.text.match(/^(# ?)([A-Za-z]+)(\s*:)?(\s+)?(\S+)?/)
|
|
18
|
+
return false unless match
|
|
19
|
+
|
|
20
|
+
match.captures
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def keyword_appearance?(first_word, colon, space)
|
|
24
|
+
first_word && keyword?(first_word.upcase) && (colon || space)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def just_first_word_of_sentence?(first_word, colon, space, note)
|
|
28
|
+
first_word == first_word.capitalize && !colon && space && note
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def keyword?(word)
|
|
32
|
+
config.for_cop('Style/CommentAnnotation')['Keywords'].include?(word)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# Handles the `MinSize` configuration option for array-based cops
|
|
6
|
+
# `Style/SymbolArray` and `Style/WordArray`, which check for use of the
|
|
7
|
+
# relevant percent literal syntax such as `%i[...]` and `%w[...]`
|
|
8
|
+
module ArrayMinSize
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def below_array_length?(node)
|
|
12
|
+
node.values.length < min_size_config
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def min_size_config
|
|
16
|
+
cop_config['MinSize']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def array_style_detected(style, ary_size)
|
|
20
|
+
cfg = config_to_allow_offenses
|
|
21
|
+
return if cfg['Enabled'] == false
|
|
22
|
+
|
|
23
|
+
largest_brackets = largest_brackets_size(style, ary_size)
|
|
24
|
+
smallest_percent = smallest_percent_size(style, ary_size)
|
|
25
|
+
|
|
26
|
+
if cfg['EnforcedStyle'] == style.to_s
|
|
27
|
+
# do nothing
|
|
28
|
+
elsif cfg['EnforcedStyle'].nil?
|
|
29
|
+
cfg['EnforcedStyle'] = style.to_s
|
|
30
|
+
elsif smallest_percent <= largest_brackets
|
|
31
|
+
self.config_to_allow_offenses = { 'Enabled' => false }
|
|
32
|
+
else
|
|
33
|
+
cfg['EnforcedStyle'] = 'percent'
|
|
34
|
+
cfg['MinSize'] = largest_brackets + 1
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def largest_brackets_size(style, ary_size)
|
|
39
|
+
self.class.largest_brackets ||= -Float::INFINITY
|
|
40
|
+
|
|
41
|
+
if style == :brackets && ary_size > self.class.largest_brackets
|
|
42
|
+
self.class.largest_brackets = ary_size
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
self.class.largest_brackets
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def smallest_percent_size(style, ary_size)
|
|
49
|
+
@smallest_percent ||= Float::INFINITY
|
|
50
|
+
|
|
51
|
+
if style == :percent && ary_size < @smallest_percent
|
|
52
|
+
@smallest_percent = ary_size
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
@smallest_percent
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# Common code for ordinary arrays with [] that can be written with %
|
|
6
|
+
# syntax.
|
|
7
|
+
module ArraySyntax
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
def bracketed_array_of?(element_type, node)
|
|
11
|
+
return false unless node.square_brackets? && !node.values.empty?
|
|
12
|
+
|
|
13
|
+
node.values.all? { |value| value.type == element_type }
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# Common functionality for checking assignment nodes.
|
|
6
|
+
module CheckAssignment
|
|
7
|
+
def on_lvasgn(node)
|
|
8
|
+
check_assignment(node, extract_rhs(node))
|
|
9
|
+
end
|
|
10
|
+
alias on_ivasgn on_lvasgn
|
|
11
|
+
alias on_cvasgn on_lvasgn
|
|
12
|
+
alias on_gvasgn on_lvasgn
|
|
13
|
+
alias on_casgn on_lvasgn
|
|
14
|
+
alias on_masgn on_lvasgn
|
|
15
|
+
alias on_op_asgn on_lvasgn
|
|
16
|
+
alias on_or_asgn on_lvasgn
|
|
17
|
+
alias on_and_asgn on_lvasgn
|
|
18
|
+
|
|
19
|
+
def on_send(node)
|
|
20
|
+
rhs = extract_rhs(node)
|
|
21
|
+
|
|
22
|
+
return unless rhs
|
|
23
|
+
|
|
24
|
+
check_assignment(node, rhs)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module_function
|
|
28
|
+
|
|
29
|
+
def extract_rhs(node)
|
|
30
|
+
if node.casgn_type?
|
|
31
|
+
_scope, _lhs, rhs = *node
|
|
32
|
+
elsif node.op_asgn_type?
|
|
33
|
+
_lhs, _op, rhs = *node
|
|
34
|
+
elsif node.call_type?
|
|
35
|
+
rhs = node.last_argument
|
|
36
|
+
elsif node.assignment?
|
|
37
|
+
_lhs, rhs = *node
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
rhs
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# This mixin detects collections that are safe to "break"
|
|
6
|
+
# by inserting new lines. This is useful for breaking
|
|
7
|
+
# up long lines.
|
|
8
|
+
#
|
|
9
|
+
# Let's look at hashes as an example:
|
|
10
|
+
#
|
|
11
|
+
# We know hash keys are safe to break across lines. We can add
|
|
12
|
+
# linebreaks into hashes on lines longer than the specified maximum.
|
|
13
|
+
# Then in further passes cops can clean up the multi-line hash.
|
|
14
|
+
# For example, say the maximum line length is as indicated below:
|
|
15
|
+
#
|
|
16
|
+
# |
|
|
17
|
+
# v
|
|
18
|
+
# {foo: "0000000000", bar: "0000000000", baz: "0000000000"}
|
|
19
|
+
#
|
|
20
|
+
# In a LineLength autocorrection pass, a line is added before
|
|
21
|
+
# the first key that exceeds the column limit:
|
|
22
|
+
#
|
|
23
|
+
# {foo: "0000000000", bar: "0000000000",
|
|
24
|
+
# baz: "0000000000"}
|
|
25
|
+
#
|
|
26
|
+
# In a MultilineHashKeyLineBreaks pass, lines are inserted
|
|
27
|
+
# before all keys:
|
|
28
|
+
#
|
|
29
|
+
# {foo: "0000000000",
|
|
30
|
+
# bar: "0000000000",
|
|
31
|
+
# baz: "0000000000"}
|
|
32
|
+
#
|
|
33
|
+
# Then in future passes FirstHashElementLineBreak,
|
|
34
|
+
# MultilineHashBraceLayout, and TrailingCommaInHashLiteral will
|
|
35
|
+
# manipulate as well until we get:
|
|
36
|
+
#
|
|
37
|
+
# {
|
|
38
|
+
# foo: "0000000000",
|
|
39
|
+
# bar: "0000000000",
|
|
40
|
+
# baz: "0000000000",
|
|
41
|
+
# }
|
|
42
|
+
#
|
|
43
|
+
# (Note: Passes may not happen exactly in this sequence.)
|
|
44
|
+
module CheckLineBreakable
|
|
45
|
+
def extract_breakable_node(node, max)
|
|
46
|
+
if node.send_type?
|
|
47
|
+
args = process_args(node.arguments)
|
|
48
|
+
return extract_breakable_node_from_elements(node, args, max)
|
|
49
|
+
elsif node.array_type? || node.hash_type?
|
|
50
|
+
return extract_breakable_node_from_elements(node, node.children, max)
|
|
51
|
+
end
|
|
52
|
+
nil
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
def extract_breakable_node_from_elements(node, elements, max)
|
|
58
|
+
return unless breakable_collection?(node, elements)
|
|
59
|
+
return if safe_to_ignore?(node)
|
|
60
|
+
|
|
61
|
+
line = processed_source.lines[node.first_line - 1]
|
|
62
|
+
return if processed_source.commented?(node.loc.begin)
|
|
63
|
+
return if line.length <= max
|
|
64
|
+
|
|
65
|
+
extract_first_element_over_column_limit(node, elements, max)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def extract_first_element_over_column_limit(node, elements, max)
|
|
69
|
+
line = node.first_line
|
|
70
|
+
i = 0
|
|
71
|
+
i += 1 while within_column_limit?(elements[i], max, line)
|
|
72
|
+
return elements.first if i.zero?
|
|
73
|
+
|
|
74
|
+
elements[i - 1]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def within_column_limit?(element, max, line)
|
|
78
|
+
element && element.loc.column < max && element.loc.line == line
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def safe_to_ignore?(node)
|
|
82
|
+
return true unless max
|
|
83
|
+
return true if already_on_multiple_lines?(node)
|
|
84
|
+
|
|
85
|
+
# If there's a containing breakable collection on the same
|
|
86
|
+
# line, we let that one get broken first. In a separate pass,
|
|
87
|
+
# this one might get broken as well, but to avoid conflicting
|
|
88
|
+
# or redundant edits, we only mark one offense at a time.
|
|
89
|
+
return true if contained_by_breakable_collection_on_same_line?(node)
|
|
90
|
+
|
|
91
|
+
if contained_by_multiline_collection_that_could_be_broken_up?(node)
|
|
92
|
+
return true
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
false
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def breakable_collection?(node, elements)
|
|
99
|
+
# For simplicity we only want to insert breaks in normal
|
|
100
|
+
# hashes wrapped in a set of curly braces like {foo: 1}.
|
|
101
|
+
# That is, not a kwargs hash. For method calls, this ensures
|
|
102
|
+
# the method call is made with parens.
|
|
103
|
+
starts_with_bracket = node.loc.begin
|
|
104
|
+
|
|
105
|
+
# If the call has a second argument, we can insert a line
|
|
106
|
+
# break before the second argument and the rest of the
|
|
107
|
+
# argument will get auto-formatted onto separate lines
|
|
108
|
+
# by other cops.
|
|
109
|
+
has_second_element = elements.length >= 2
|
|
110
|
+
|
|
111
|
+
starts_with_bracket && has_second_element
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def contained_by_breakable_collection_on_same_line?(node)
|
|
115
|
+
node.each_ancestor.find do |ancestor|
|
|
116
|
+
# Ignore ancestors on different lines.
|
|
117
|
+
break if ancestor.first_line != node.first_line
|
|
118
|
+
|
|
119
|
+
if ancestor.hash_type? || ancestor.array_type?
|
|
120
|
+
elements = ancestor.children
|
|
121
|
+
elsif ancestor.send_type?
|
|
122
|
+
elements = process_args(ancestor.arguments)
|
|
123
|
+
else
|
|
124
|
+
next
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
return true if breakable_collection?(ancestor, elements)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
false
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def contained_by_multiline_collection_that_could_be_broken_up?(node)
|
|
134
|
+
node.each_ancestor.find do |ancestor|
|
|
135
|
+
if ancestor.hash_type? || ancestor.array_type?
|
|
136
|
+
if breakable_collection?(ancestor, ancestor.children)
|
|
137
|
+
return children_could_be_broken_up?(ancestor.children)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
next unless ancestor.send_type?
|
|
142
|
+
|
|
143
|
+
args = process_args(ancestor.arguments)
|
|
144
|
+
if breakable_collection?(ancestor, args)
|
|
145
|
+
return children_could_be_broken_up?(args)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
false
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def children_could_be_broken_up?(children)
|
|
153
|
+
return false if all_on_same_line?(children)
|
|
154
|
+
|
|
155
|
+
last_seen_line = -1
|
|
156
|
+
children.each do |child|
|
|
157
|
+
return true if last_seen_line >= child.first_line
|
|
158
|
+
|
|
159
|
+
last_seen_line = child.last_line
|
|
160
|
+
end
|
|
161
|
+
false
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def all_on_same_line?(nodes)
|
|
165
|
+
return true if nodes.empty?
|
|
166
|
+
|
|
167
|
+
nodes.first.first_line == nodes.last.last_line
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def process_args(args)
|
|
171
|
+
# If there is a trailing hash arg without explicit braces, like this:
|
|
172
|
+
#
|
|
173
|
+
# method(1, 'key1' => value1, 'key2' => value2)
|
|
174
|
+
#
|
|
175
|
+
# ...then each key/value pair is treated as a method 'argument'
|
|
176
|
+
# when determining where line breaks should appear.
|
|
177
|
+
if (last_arg = args.last)
|
|
178
|
+
if last_arg.hash_type? && !last_arg.braces?
|
|
179
|
+
args = args.concat(args.pop.children)
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
args
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def already_on_multiple_lines?(node)
|
|
186
|
+
node.first_line != node.last_line
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|