rubbycop 0.49.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 +21 -0
- data/README.md +211 -0
- data/assets/logo.png +0 -0
- data/assets/output.html.erb +261 -0
- data/bin/rubbycop +17 -0
- data/config/default.yml +1548 -0
- data/config/disabled.yml +119 -0
- data/config/enabled.yml +1734 -0
- data/lib/rubbycop.rb +510 -0
- data/lib/rubbycop/ast/builder.rb +64 -0
- data/lib/rubbycop/ast/node.rb +610 -0
- data/lib/rubbycop/ast/node/and_node.rb +37 -0
- data/lib/rubbycop/ast/node/array_node.rb +48 -0
- data/lib/rubbycop/ast/node/case_node.rb +64 -0
- data/lib/rubbycop/ast/node/ensure_node.rb +25 -0
- data/lib/rubbycop/ast/node/for_node.rb +53 -0
- data/lib/rubbycop/ast/node/hash_node.rb +109 -0
- data/lib/rubbycop/ast/node/if_node.rb +138 -0
- data/lib/rubbycop/ast/node/keyword_splat_node.rb +45 -0
- data/lib/rubbycop/ast/node/mixin/binary_operator_node.rb +23 -0
- data/lib/rubbycop/ast/node/mixin/conditional_node.rb +45 -0
- data/lib/rubbycop/ast/node/mixin/hash_element_node.rb +125 -0
- data/lib/rubbycop/ast/node/mixin/modifier_node.rb +17 -0
- data/lib/rubbycop/ast/node/mixin/predicate_operator_node.rb +35 -0
- data/lib/rubbycop/ast/node/or_node.rb +37 -0
- data/lib/rubbycop/ast/node/pair_node.rb +64 -0
- data/lib/rubbycop/ast/node/resbody_node.rb +25 -0
- data/lib/rubbycop/ast/node/send_node.rb +209 -0
- data/lib/rubbycop/ast/node/until_node.rb +43 -0
- data/lib/rubbycop/ast/node/when_node.rb +61 -0
- data/lib/rubbycop/ast/node/while_node.rb +43 -0
- data/lib/rubbycop/ast/sexp.rb +16 -0
- data/lib/rubbycop/ast/traversal.rb +171 -0
- data/lib/rubbycop/cached_data.rb +63 -0
- data/lib/rubbycop/cli.rb +199 -0
- data/lib/rubbycop/comment_config.rb +155 -0
- data/lib/rubbycop/config.rb +444 -0
- data/lib/rubbycop/config_loader.rb +244 -0
- data/lib/rubbycop/config_loader_resolver.rb +43 -0
- data/lib/rubbycop/config_store.rb +48 -0
- data/lib/rubbycop/cop/autocorrect_logic.rb +26 -0
- data/lib/rubbycop/cop/badge.rb +73 -0
- data/lib/rubbycop/cop/bundler/duplicated_gem.rb +69 -0
- data/lib/rubbycop/cop/bundler/ordered_gems.rb +113 -0
- data/lib/rubbycop/cop/commissioner.rb +118 -0
- data/lib/rubbycop/cop/cop.rb +222 -0
- data/lib/rubbycop/cop/corrector.rb +135 -0
- data/lib/rubbycop/cop/force.rb +41 -0
- data/lib/rubbycop/cop/ignored_node.rb +38 -0
- data/lib/rubbycop/cop/layout/access_modifier_indentation.rb +109 -0
- data/lib/rubbycop/cop/layout/align_array.rb +35 -0
- data/lib/rubbycop/cop/layout/align_hash.rb +235 -0
- data/lib/rubbycop/cop/layout/align_parameters.rb +97 -0
- data/lib/rubbycop/cop/layout/block_end_newline.rb +56 -0
- data/lib/rubbycop/cop/layout/case_indentation.rb +163 -0
- data/lib/rubbycop/cop/layout/closing_parenthesis_indentation.rb +88 -0
- data/lib/rubbycop/cop/layout/comment_indentation.rb +71 -0
- data/lib/rubbycop/cop/layout/dot_position.rb +84 -0
- data/lib/rubbycop/cop/layout/else_alignment.rb +105 -0
- data/lib/rubbycop/cop/layout/empty_line_after_magic_comment.rb +63 -0
- data/lib/rubbycop/cop/layout/empty_line_between_defs.rb +143 -0
- data/lib/rubbycop/cop/layout/empty_lines.rb +60 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_access_modifier.rb +90 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_begin_body.rb +42 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_block_body.rb +41 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_class_body.rb +39 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_exception_handling_keywords.rb +127 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_method_body.rb +41 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_module_body.rb +44 -0
- data/lib/rubbycop/cop/layout/end_of_line.rb +52 -0
- data/lib/rubbycop/cop/layout/extra_spacing.rb +237 -0
- data/lib/rubbycop/cop/layout/first_array_element_line_break.rb +41 -0
- data/lib/rubbycop/cop/layout/first_hash_element_line_break.rb +33 -0
- data/lib/rubbycop/cop/layout/first_method_argument_line_break.rb +49 -0
- data/lib/rubbycop/cop/layout/first_method_parameter_line_break.rb +42 -0
- data/lib/rubbycop/cop/layout/first_parameter_indentation.rb +109 -0
- data/lib/rubbycop/cop/layout/indent_array.rb +114 -0
- data/lib/rubbycop/cop/layout/indent_assignment.rb +42 -0
- data/lib/rubbycop/cop/layout/indent_hash.rb +134 -0
- data/lib/rubbycop/cop/layout/indent_heredoc.rb +173 -0
- data/lib/rubbycop/cop/layout/indentation_consistency.rb +51 -0
- data/lib/rubbycop/cop/layout/indentation_width.rb +303 -0
- data/lib/rubbycop/cop/layout/initial_indentation.rb +42 -0
- data/lib/rubbycop/cop/layout/leading_comment_space.rb +43 -0
- data/lib/rubbycop/cop/layout/multiline_array_brace_layout.rb +81 -0
- data/lib/rubbycop/cop/layout/multiline_assignment_layout.rb +88 -0
- data/lib/rubbycop/cop/layout/multiline_block_layout.rb +134 -0
- data/lib/rubbycop/cop/layout/multiline_hash_brace_layout.rb +81 -0
- data/lib/rubbycop/cop/layout/multiline_method_call_brace_layout.rb +97 -0
- data/lib/rubbycop/cop/layout/multiline_method_call_indentation.rb +215 -0
- data/lib/rubbycop/cop/layout/multiline_method_definition_brace_layout.rb +82 -0
- data/lib/rubbycop/cop/layout/multiline_operation_indentation.rb +89 -0
- data/lib/rubbycop/cop/layout/rescue_ensure_alignment.rb +86 -0
- data/lib/rubbycop/cop/layout/space_after_colon.rb +40 -0
- data/lib/rubbycop/cop/layout/space_after_comma.rb +21 -0
- data/lib/rubbycop/cop/layout/space_after_method_name.rb +37 -0
- data/lib/rubbycop/cop/layout/space_after_not.rb +38 -0
- data/lib/rubbycop/cop/layout/space_after_semicolon.rb +21 -0
- data/lib/rubbycop/cop/layout/space_around_block_parameters.rb +109 -0
- data/lib/rubbycop/cop/layout/space_around_equals_in_parameter_default.rb +68 -0
- data/lib/rubbycop/cop/layout/space_around_keyword.rb +224 -0
- data/lib/rubbycop/cop/layout/space_around_operators.rb +142 -0
- data/lib/rubbycop/cop/layout/space_before_block_braces.rb +54 -0
- data/lib/rubbycop/cop/layout/space_before_comma.rb +16 -0
- data/lib/rubbycop/cop/layout/space_before_comment.rb +27 -0
- data/lib/rubbycop/cop/layout/space_before_first_arg.rb +64 -0
- data/lib/rubbycop/cop/layout/space_before_semicolon.rb +16 -0
- data/lib/rubbycop/cop/layout/space_in_lambda_literal.rb +87 -0
- data/lib/rubbycop/cop/layout/space_inside_array_percent_literal.rb +53 -0
- data/lib/rubbycop/cop/layout/space_inside_block_braces.rb +158 -0
- data/lib/rubbycop/cop/layout/space_inside_brackets.rb +20 -0
- data/lib/rubbycop/cop/layout/space_inside_hash_literal_braces.rb +150 -0
- data/lib/rubbycop/cop/layout/space_inside_parens.rb +16 -0
- data/lib/rubbycop/cop/layout/space_inside_percent_literal_delimiters.rb +64 -0
- data/lib/rubbycop/cop/layout/space_inside_range_literal.rb +63 -0
- data/lib/rubbycop/cop/layout/space_inside_string_interpolation.rb +65 -0
- data/lib/rubbycop/cop/layout/tab.rb +57 -0
- data/lib/rubbycop/cop/layout/trailing_blank_lines.rb +78 -0
- data/lib/rubbycop/cop/layout/trailing_whitespace.rb +28 -0
- data/lib/rubbycop/cop/lint/ambiguous_block_association.rb +66 -0
- data/lib/rubbycop/cop/lint/ambiguous_operator.rb +55 -0
- data/lib/rubbycop/cop/lint/ambiguous_regexp_literal.rb +43 -0
- data/lib/rubbycop/cop/lint/assignment_in_condition.rb +80 -0
- data/lib/rubbycop/cop/lint/block_alignment.rb +229 -0
- data/lib/rubbycop/cop/lint/circular_argument_reference.rb +83 -0
- data/lib/rubbycop/cop/lint/condition_position.rb +52 -0
- data/lib/rubbycop/cop/lint/debugger.rb +72 -0
- data/lib/rubbycop/cop/lint/def_end_alignment.rb +78 -0
- data/lib/rubbycop/cop/lint/deprecated_class_methods.rb +90 -0
- data/lib/rubbycop/cop/lint/duplicate_case_condition.rb +53 -0
- data/lib/rubbycop/cop/lint/duplicate_methods.rb +151 -0
- data/lib/rubbycop/cop/lint/duplicated_key.rb +38 -0
- data/lib/rubbycop/cop/lint/each_with_object_argument.rb +39 -0
- data/lib/rubbycop/cop/lint/else_layout.rb +65 -0
- data/lib/rubbycop/cop/lint/empty_ensure.rb +60 -0
- data/lib/rubbycop/cop/lint/empty_expression.rb +42 -0
- data/lib/rubbycop/cop/lint/empty_interpolation.rb +36 -0
- data/lib/rubbycop/cop/lint/empty_when.rb +38 -0
- data/lib/rubbycop/cop/lint/end_alignment.rb +157 -0
- data/lib/rubbycop/cop/lint/end_in_method.rb +40 -0
- data/lib/rubbycop/cop/lint/ensure_return.rb +43 -0
- data/lib/rubbycop/cop/lint/float_out_of_range.rb +35 -0
- data/lib/rubbycop/cop/lint/format_parameter_mismatch.rb +182 -0
- data/lib/rubbycop/cop/lint/handle_exceptions.rb +56 -0
- data/lib/rubbycop/cop/lint/implicit_string_concatenation.rb +95 -0
- data/lib/rubbycop/cop/lint/ineffective_access_modifier.rb +143 -0
- data/lib/rubbycop/cop/lint/inherit_exception.rb +83 -0
- data/lib/rubbycop/cop/lint/invalid_character_literal.rb +41 -0
- data/lib/rubbycop/cop/lint/literal_in_condition.rb +127 -0
- data/lib/rubbycop/cop/lint/literal_in_interpolation.rb +76 -0
- data/lib/rubbycop/cop/lint/loop.rb +63 -0
- data/lib/rubbycop/cop/lint/multiple_compare.rb +48 -0
- data/lib/rubbycop/cop/lint/nested_method_definition.rb +105 -0
- data/lib/rubbycop/cop/lint/next_without_accumulator.rb +50 -0
- data/lib/rubbycop/cop/lint/non_local_exit_from_iterator.rb +85 -0
- data/lib/rubbycop/cop/lint/parentheses_as_grouped_expression.rb +60 -0
- data/lib/rubbycop/cop/lint/percent_string_array.rb +84 -0
- data/lib/rubbycop/cop/lint/percent_symbol_array.rb +66 -0
- data/lib/rubbycop/cop/lint/rand_one.rb +39 -0
- data/lib/rubbycop/cop/lint/require_parentheses.rb +61 -0
- data/lib/rubbycop/cop/lint/rescue_exception.rb +45 -0
- data/lib/rubbycop/cop/lint/safe_navigation_chain.rb +70 -0
- data/lib/rubbycop/cop/lint/shadowed_exception.rb +132 -0
- data/lib/rubbycop/cop/lint/shadowing_outer_local_variable.rb +53 -0
- data/lib/rubbycop/cop/lint/string_conversion_in_interpolation.rb +58 -0
- data/lib/rubbycop/cop/lint/syntax.rb +55 -0
- data/lib/rubbycop/cop/lint/underscore_prefixed_variable_name.rb +62 -0
- data/lib/rubbycop/cop/lint/unified_integer.rb +42 -0
- data/lib/rubbycop/cop/lint/unneeded_disable.rb +231 -0
- data/lib/rubbycop/cop/lint/unneeded_splat_expansion.rb +141 -0
- data/lib/rubbycop/cop/lint/unreachable_code.rb +52 -0
- data/lib/rubbycop/cop/lint/unused_block_argument.rb +145 -0
- data/lib/rubbycop/cop/lint/unused_method_argument.rb +61 -0
- data/lib/rubbycop/cop/lint/useless_access_modifier.rb +229 -0
- data/lib/rubbycop/cop/lint/useless_assignment.rb +132 -0
- data/lib/rubbycop/cop/lint/useless_comparison.rb +28 -0
- data/lib/rubbycop/cop/lint/useless_else_without_rescue.rb +46 -0
- data/lib/rubbycop/cop/lint/useless_setter_call.rb +162 -0
- data/lib/rubbycop/cop/lint/void.rb +108 -0
- data/lib/rubbycop/cop/message_annotator.rb +116 -0
- data/lib/rubbycop/cop/metrics/abc_size.rb +39 -0
- data/lib/rubbycop/cop/metrics/block_length.rb +32 -0
- data/lib/rubbycop/cop/metrics/block_nesting.rb +64 -0
- data/lib/rubbycop/cop/metrics/class_length.rb +24 -0
- data/lib/rubbycop/cop/metrics/cyclomatic_complexity.rb +31 -0
- data/lib/rubbycop/cop/metrics/line_length.rb +168 -0
- data/lib/rubbycop/cop/metrics/method_length.rb +27 -0
- data/lib/rubbycop/cop/metrics/module_length.rb +24 -0
- data/lib/rubbycop/cop/metrics/parameter_lists.rb +45 -0
- data/lib/rubbycop/cop/metrics/perceived_complexity.rb +61 -0
- data/lib/rubbycop/cop/mixin/access_modifier_node.rb +41 -0
- data/lib/rubbycop/cop/mixin/annotation_comment.rb +36 -0
- data/lib/rubbycop/cop/mixin/array_hash_indentation.rb +82 -0
- data/lib/rubbycop/cop/mixin/array_min_size.rb +59 -0
- data/lib/rubbycop/cop/mixin/array_syntax.rb +15 -0
- data/lib/rubbycop/cop/mixin/autocorrect_alignment.rb +149 -0
- data/lib/rubbycop/cop/mixin/check_assignment.rb +40 -0
- data/lib/rubbycop/cop/mixin/classish_length.rb +36 -0
- data/lib/rubbycop/cop/mixin/code_length.rb +32 -0
- data/lib/rubbycop/cop/mixin/configurable_enforced_style.rb +97 -0
- data/lib/rubbycop/cop/mixin/configurable_formatting.rb +48 -0
- data/lib/rubbycop/cop/mixin/configurable_max.rb +19 -0
- data/lib/rubbycop/cop/mixin/configurable_naming.rb +16 -0
- data/lib/rubbycop/cop/mixin/configurable_numbering.rb +17 -0
- data/lib/rubbycop/cop/mixin/def_node.rb +27 -0
- data/lib/rubbycop/cop/mixin/documentation_comment.rb +46 -0
- data/lib/rubbycop/cop/mixin/duplication.rb +46 -0
- data/lib/rubbycop/cop/mixin/empty_lines_around_body.rb +161 -0
- data/lib/rubbycop/cop/mixin/end_keyword_alignment.rb +85 -0
- data/lib/rubbycop/cop/mixin/enforce_superclass.rb +36 -0
- data/lib/rubbycop/cop/mixin/first_element_line_break.rb +41 -0
- data/lib/rubbycop/cop/mixin/frozen_string_literal.rb +37 -0
- data/lib/rubbycop/cop/mixin/hash_alignment.rb +116 -0
- data/lib/rubbycop/cop/mixin/ignored_pattern.rb +27 -0
- data/lib/rubbycop/cop/mixin/integer_node.rb +12 -0
- data/lib/rubbycop/cop/mixin/match_range.rb +22 -0
- data/lib/rubbycop/cop/mixin/method_complexity.rb +30 -0
- data/lib/rubbycop/cop/mixin/method_preference.rb +30 -0
- data/lib/rubbycop/cop/mixin/min_body_length.rb +19 -0
- data/lib/rubbycop/cop/mixin/multiline_expression_indentation.rb +183 -0
- data/lib/rubbycop/cop/mixin/multiline_literal_brace_layout.rb +152 -0
- data/lib/rubbycop/cop/mixin/negative_conditional.rb +43 -0
- data/lib/rubbycop/cop/mixin/on_method_def.rb +44 -0
- data/lib/rubbycop/cop/mixin/on_normal_if_unless.rb +14 -0
- data/lib/rubbycop/cop/mixin/parentheses.rb +22 -0
- data/lib/rubbycop/cop/mixin/parser_diagnostic.rb +34 -0
- data/lib/rubbycop/cop/mixin/percent_literal.rb +100 -0
- data/lib/rubbycop/cop/mixin/preceding_following_alignment.rb +89 -0
- data/lib/rubbycop/cop/mixin/rescue_node.rb +21 -0
- data/lib/rubbycop/cop/mixin/safe_assignment.rb +20 -0
- data/lib/rubbycop/cop/mixin/safe_mode.rb +22 -0
- data/lib/rubbycop/cop/mixin/space_after_punctuation.rb +55 -0
- data/lib/rubbycop/cop/mixin/space_before_punctuation.rb +48 -0
- data/lib/rubbycop/cop/mixin/space_inside.rb +76 -0
- data/lib/rubbycop/cop/mixin/statement_modifier.rb +69 -0
- data/lib/rubbycop/cop/mixin/string_help.rb +33 -0
- data/lib/rubbycop/cop/mixin/string_literals_help.rb +33 -0
- data/lib/rubbycop/cop/mixin/surrounding_space.rb +40 -0
- data/lib/rubbycop/cop/mixin/target_rails_version.rb +16 -0
- data/lib/rubbycop/cop/mixin/target_ruby_version.rb +16 -0
- data/lib/rubbycop/cop/mixin/too_many_lines.rb +39 -0
- data/lib/rubbycop/cop/mixin/trailing_comma.rb +161 -0
- data/lib/rubbycop/cop/mixin/unused_argument.rb +42 -0
- data/lib/rubbycop/cop/offense.rb +188 -0
- data/lib/rubbycop/cop/performance/caller.rb +41 -0
- data/lib/rubbycop/cop/performance/case_when_splat.rb +176 -0
- data/lib/rubbycop/cop/performance/casecmp.rb +107 -0
- data/lib/rubbycop/cop/performance/compare_with_block.rb +107 -0
- data/lib/rubbycop/cop/performance/count.rb +98 -0
- data/lib/rubbycop/cop/performance/detect.rb +107 -0
- data/lib/rubbycop/cop/performance/double_start_end_with.rb +102 -0
- data/lib/rubbycop/cop/performance/end_with.rb +55 -0
- data/lib/rubbycop/cop/performance/fixed_size.rb +56 -0
- data/lib/rubbycop/cop/performance/flat_map.rb +73 -0
- data/lib/rubbycop/cop/performance/hash_each_methods.rb +84 -0
- data/lib/rubbycop/cop/performance/lstrip_rstrip.rb +41 -0
- data/lib/rubbycop/cop/performance/range_include.rb +41 -0
- data/lib/rubbycop/cop/performance/redundant_block_call.rb +93 -0
- data/lib/rubbycop/cop/performance/redundant_match.rb +55 -0
- data/lib/rubbycop/cop/performance/redundant_merge.rb +149 -0
- data/lib/rubbycop/cop/performance/redundant_sort_by.rb +45 -0
- data/lib/rubbycop/cop/performance/regexp_match.rb +215 -0
- data/lib/rubbycop/cop/performance/reverse_each.rb +40 -0
- data/lib/rubbycop/cop/performance/sample.rb +140 -0
- data/lib/rubbycop/cop/performance/size.rb +71 -0
- data/lib/rubbycop/cop/performance/start_with.rb +58 -0
- data/lib/rubbycop/cop/performance/string_replacement.rb +170 -0
- data/lib/rubbycop/cop/performance/times_map.rb +61 -0
- data/lib/rubbycop/cop/rails/action_filter.rb +96 -0
- data/lib/rubbycop/cop/rails/active_support_aliases.rb +68 -0
- data/lib/rubbycop/cop/rails/application_job.rb +32 -0
- data/lib/rubbycop/cop/rails/application_record.rb +32 -0
- data/lib/rubbycop/cop/rails/blank.rb +138 -0
- data/lib/rubbycop/cop/rails/date.rb +127 -0
- data/lib/rubbycop/cop/rails/delegate.rb +106 -0
- data/lib/rubbycop/cop/rails/delegate_allow_blank.rb +51 -0
- data/lib/rubbycop/cop/rails/dynamic_find_by.rb +81 -0
- data/lib/rubbycop/cop/rails/enum_uniqueness.rb +43 -0
- data/lib/rubbycop/cop/rails/exit.rb +61 -0
- data/lib/rubbycop/cop/rails/file_path.rb +75 -0
- data/lib/rubbycop/cop/rails/find_by.rb +51 -0
- data/lib/rubbycop/cop/rails/find_each.rb +47 -0
- data/lib/rubbycop/cop/rails/has_and_belongs_to_many.rb +18 -0
- data/lib/rubbycop/cop/rails/http_positional_arguments.rb +106 -0
- data/lib/rubbycop/cop/rails/not_null_column.rb +67 -0
- data/lib/rubbycop/cop/rails/output.rb +23 -0
- data/lib/rubbycop/cop/rails/output_safety.rb +58 -0
- data/lib/rubbycop/cop/rails/pluralization_grammar.rb +106 -0
- data/lib/rubbycop/cop/rails/present.rb +143 -0
- data/lib/rubbycop/cop/rails/read_write_attribute.rb +65 -0
- data/lib/rubbycop/cop/rails/relative_date_constant.rb +88 -0
- data/lib/rubbycop/cop/rails/request_referer.rb +56 -0
- data/lib/rubbycop/cop/rails/reversible_migration.rb +216 -0
- data/lib/rubbycop/cop/rails/safe_navigation.rb +91 -0
- data/lib/rubbycop/cop/rails/save_bang.rb +160 -0
- data/lib/rubbycop/cop/rails/scope_args.rb +29 -0
- data/lib/rubbycop/cop/rails/skips_model_validations.rb +63 -0
- data/lib/rubbycop/cop/rails/time_zone.rb +197 -0
- data/lib/rubbycop/cop/rails/uniq_before_pluck.rb +93 -0
- data/lib/rubbycop/cop/rails/validation.rb +64 -0
- data/lib/rubbycop/cop/registry.rb +171 -0
- data/lib/rubbycop/cop/security/eval.rb +30 -0
- data/lib/rubbycop/cop/security/json_load.rb +44 -0
- data/lib/rubbycop/cop/security/marshal_load.rb +37 -0
- data/lib/rubbycop/cop/security/yaml_load.rb +37 -0
- data/lib/rubbycop/cop/severity.rb +76 -0
- data/lib/rubbycop/cop/style/accessor_method_name.rb +45 -0
- data/lib/rubbycop/cop/style/alias.rb +119 -0
- data/lib/rubbycop/cop/style/and_or.rb +125 -0
- data/lib/rubbycop/cop/style/array_join.rb +30 -0
- data/lib/rubbycop/cop/style/ascii_comments.rb +38 -0
- data/lib/rubbycop/cop/style/ascii_identifiers.rb +36 -0
- data/lib/rubbycop/cop/style/attr.rb +50 -0
- data/lib/rubbycop/cop/style/auto_resource_cleanup.rb +42 -0
- data/lib/rubbycop/cop/style/bare_percent_literals.rb +57 -0
- data/lib/rubbycop/cop/style/begin_block.rb +16 -0
- data/lib/rubbycop/cop/style/block_comments.rb +46 -0
- data/lib/rubbycop/cop/style/block_delimiters.rb +228 -0
- data/lib/rubbycop/cop/style/braces_around_hash_parameters.rb +138 -0
- data/lib/rubbycop/cop/style/case_equality.rb +18 -0
- data/lib/rubbycop/cop/style/character_literal.rb +43 -0
- data/lib/rubbycop/cop/style/class_and_module_camel_case.rb +29 -0
- data/lib/rubbycop/cop/style/class_and_module_children.rb +69 -0
- data/lib/rubbycop/cop/style/class_check.rb +40 -0
- data/lib/rubbycop/cop/style/class_methods.rb +67 -0
- data/lib/rubbycop/cop/style/class_vars.rb +23 -0
- data/lib/rubbycop/cop/style/collection_methods.rb +51 -0
- data/lib/rubbycop/cop/style/colon_method_call.rb +33 -0
- data/lib/rubbycop/cop/style/command_literal.rb +119 -0
- data/lib/rubbycop/cop/style/comment_annotation.rb +62 -0
- data/lib/rubbycop/cop/style/conditional_assignment.rb +691 -0
- data/lib/rubbycop/cop/style/constant_name.rb +29 -0
- data/lib/rubbycop/cop/style/copyright.rb +89 -0
- data/lib/rubbycop/cop/style/def_with_parentheses.rb +31 -0
- data/lib/rubbycop/cop/style/documentation.rb +79 -0
- data/lib/rubbycop/cop/style/documentation_method.rb +80 -0
- data/lib/rubbycop/cop/style/double_negation.rb +35 -0
- data/lib/rubbycop/cop/style/each_for_simple_loop.rb +57 -0
- data/lib/rubbycop/cop/style/each_with_object.rb +91 -0
- data/lib/rubbycop/cop/style/empty_case_condition.rb +84 -0
- data/lib/rubbycop/cop/style/empty_else.rb +138 -0
- data/lib/rubbycop/cop/style/empty_literal.rb +108 -0
- data/lib/rubbycop/cop/style/empty_method.rb +102 -0
- data/lib/rubbycop/cop/style/encoding.rb +92 -0
- data/lib/rubbycop/cop/style/end_block.rb +17 -0
- data/lib/rubbycop/cop/style/even_odd.rb +56 -0
- data/lib/rubbycop/cop/style/file_name.rb +183 -0
- data/lib/rubbycop/cop/style/flip_flop.rb +20 -0
- data/lib/rubbycop/cop/style/for.rb +50 -0
- data/lib/rubbycop/cop/style/format_string.rb +46 -0
- data/lib/rubbycop/cop/style/format_string_token.rb +141 -0
- data/lib/rubbycop/cop/style/frozen_string_literal_comment.rb +96 -0
- data/lib/rubbycop/cop/style/global_vars.rb +70 -0
- data/lib/rubbycop/cop/style/guard_clause.rb +90 -0
- data/lib/rubbycop/cop/style/hash_syntax.rb +214 -0
- data/lib/rubbycop/cop/style/identical_conditional_branches.rb +130 -0
- data/lib/rubbycop/cop/style/if_inside_else.rb +45 -0
- data/lib/rubbycop/cop/style/if_unless_modifier.rb +80 -0
- data/lib/rubbycop/cop/style/if_unless_modifier_of_if_unless.rb +38 -0
- data/lib/rubbycop/cop/style/if_with_semicolon.rb +20 -0
- data/lib/rubbycop/cop/style/implicit_runtime_error.rb +31 -0
- data/lib/rubbycop/cop/style/infinite_loop.rb +91 -0
- data/lib/rubbycop/cop/style/inline_comment.rb +32 -0
- data/lib/rubbycop/cop/style/inverse_methods.rb +130 -0
- data/lib/rubbycop/cop/style/lambda.rb +209 -0
- data/lib/rubbycop/cop/style/lambda_call.rb +66 -0
- data/lib/rubbycop/cop/style/line_end_concatenation.rb +115 -0
- data/lib/rubbycop/cop/style/method_call_with_args_parentheses.rb +107 -0
- data/lib/rubbycop/cop/style/method_call_without_args_parentheses.rb +75 -0
- data/lib/rubbycop/cop/style/method_called_on_do_end_block.rb +44 -0
- data/lib/rubbycop/cop/style/method_def_parentheses.rb +83 -0
- data/lib/rubbycop/cop/style/method_missing.rb +81 -0
- data/lib/rubbycop/cop/style/method_name.rb +28 -0
- data/lib/rubbycop/cop/style/missing_else.rb +100 -0
- data/lib/rubbycop/cop/style/mixin_grouping.rb +135 -0
- data/lib/rubbycop/cop/style/module_function.rb +64 -0
- data/lib/rubbycop/cop/style/multiline_block_chain.rb +42 -0
- data/lib/rubbycop/cop/style/multiline_if_modifier.rb +63 -0
- data/lib/rubbycop/cop/style/multiline_if_then.rb +47 -0
- data/lib/rubbycop/cop/style/multiline_memoization.rb +77 -0
- data/lib/rubbycop/cop/style/multiline_ternary_operator.rb +19 -0
- data/lib/rubbycop/cop/style/mutable_constant.rb +68 -0
- data/lib/rubbycop/cop/style/negated_if.rb +103 -0
- data/lib/rubbycop/cop/style/negated_while.rb +32 -0
- data/lib/rubbycop/cop/style/nested_modifier.rb +87 -0
- data/lib/rubbycop/cop/style/nested_parenthesized_calls.rb +61 -0
- data/lib/rubbycop/cop/style/nested_ternary_operator.rb +21 -0
- data/lib/rubbycop/cop/style/next.rb +225 -0
- data/lib/rubbycop/cop/style/nil_comparison.rb +35 -0
- data/lib/rubbycop/cop/style/non_nil_check.rb +121 -0
- data/lib/rubbycop/cop/style/not.rb +69 -0
- data/lib/rubbycop/cop/style/numeric_literal_prefix.rb +97 -0
- data/lib/rubbycop/cop/style/numeric_literals.rb +101 -0
- data/lib/rubbycop/cop/style/numeric_predicate.rb +140 -0
- data/lib/rubbycop/cop/style/one_line_conditional.rb +75 -0
- data/lib/rubbycop/cop/style/op_method.rb +41 -0
- data/lib/rubbycop/cop/style/option_hash.rb +58 -0
- data/lib/rubbycop/cop/style/optional_arguments.rb +62 -0
- data/lib/rubbycop/cop/style/parallel_assignment.rb +287 -0
- data/lib/rubbycop/cop/style/parentheses_around_condition.rb +56 -0
- data/lib/rubbycop/cop/style/percent_literal_delimiters.rb +100 -0
- data/lib/rubbycop/cop/style/percent_q_literals.rb +52 -0
- data/lib/rubbycop/cop/style/perl_backrefs.rb +31 -0
- data/lib/rubbycop/cop/style/predicate_name.rb +67 -0
- data/lib/rubbycop/cop/style/preferred_hash_methods.rb +78 -0
- data/lib/rubbycop/cop/style/proc.rb +26 -0
- data/lib/rubbycop/cop/style/raise_args.rb +140 -0
- data/lib/rubbycop/cop/style/redundant_begin.rb +47 -0
- data/lib/rubbycop/cop/style/redundant_exception.rb +55 -0
- data/lib/rubbycop/cop/style/redundant_freeze.rb +45 -0
- data/lib/rubbycop/cop/style/redundant_parentheses.rb +199 -0
- data/lib/rubbycop/cop/style/redundant_return.rb +121 -0
- data/lib/rubbycop/cop/style/redundant_self.rb +144 -0
- data/lib/rubbycop/cop/style/regexp_literal.rb +114 -0
- data/lib/rubbycop/cop/style/rescue_modifier.rb +37 -0
- data/lib/rubbycop/cop/style/safe_navigation.rb +145 -0
- data/lib/rubbycop/cop/style/self_assignment.rb +93 -0
- data/lib/rubbycop/cop/style/semicolon.rb +70 -0
- data/lib/rubbycop/cop/style/send.rb +21 -0
- data/lib/rubbycop/cop/style/signal_exception.rb +109 -0
- data/lib/rubbycop/cop/style/single_line_block_params.rb +68 -0
- data/lib/rubbycop/cop/style/single_line_methods.rb +77 -0
- data/lib/rubbycop/cop/style/special_global_vars.rb +156 -0
- data/lib/rubbycop/cop/style/stabby_lambda_parentheses.rb +113 -0
- data/lib/rubbycop/cop/style/string_literals.rb +102 -0
- data/lib/rubbycop/cop/style/string_literals_in_interpolation.rb +30 -0
- data/lib/rubbycop/cop/style/string_methods.rb +34 -0
- data/lib/rubbycop/cop/style/struct_inheritance.rb +32 -0
- data/lib/rubbycop/cop/style/symbol_array.rb +109 -0
- data/lib/rubbycop/cop/style/symbol_literal.rb +32 -0
- data/lib/rubbycop/cop/style/symbol_proc.rb +143 -0
- data/lib/rubbycop/cop/style/ternary_parentheses.rb +200 -0
- data/lib/rubbycop/cop/style/trailing_comma_in_arguments.rb +64 -0
- data/lib/rubbycop/cop/style/trailing_comma_in_literal.rb +56 -0
- data/lib/rubbycop/cop/style/trailing_underscore_variable.rb +113 -0
- data/lib/rubbycop/cop/style/trivial_accessors.rb +176 -0
- data/lib/rubbycop/cop/style/unless_else.rb +39 -0
- data/lib/rubbycop/cop/style/unneeded_capital_w.rb +41 -0
- data/lib/rubbycop/cop/style/unneeded_interpolation.rb +98 -0
- data/lib/rubbycop/cop/style/unneeded_percent_q.rb +96 -0
- data/lib/rubbycop/cop/style/variable_interpolation.rb +44 -0
- data/lib/rubbycop/cop/style/variable_name.rb +39 -0
- data/lib/rubbycop/cop/style/variable_number.rb +78 -0
- data/lib/rubbycop/cop/style/when_then.rb +24 -0
- data/lib/rubbycop/cop/style/while_until_do.rb +36 -0
- data/lib/rubbycop/cop/style/while_until_modifier.rb +41 -0
- data/lib/rubbycop/cop/style/word_array.rb +114 -0
- data/lib/rubbycop/cop/style/zero_length_predicate.rb +90 -0
- data/lib/rubbycop/cop/team.rb +193 -0
- data/lib/rubbycop/cop/util.rb +309 -0
- data/lib/rubbycop/cop/variable_force.rb +458 -0
- data/lib/rubbycop/cop/variable_force/assignment.rb +90 -0
- data/lib/rubbycop/cop/variable_force/branch.rb +318 -0
- data/lib/rubbycop/cop/variable_force/branchable.rb +21 -0
- data/lib/rubbycop/cop/variable_force/reference.rb +49 -0
- data/lib/rubbycop/cop/variable_force/scope.rb +107 -0
- data/lib/rubbycop/cop/variable_force/variable.rb +103 -0
- data/lib/rubbycop/cop/variable_force/variable_table.rb +128 -0
- data/lib/rubbycop/error.rb +11 -0
- data/lib/rubbycop/formatter/base_formatter.rb +123 -0
- data/lib/rubbycop/formatter/clang_style_formatter.rb +54 -0
- data/lib/rubbycop/formatter/colorizable.rb +41 -0
- data/lib/rubbycop/formatter/disabled_config_formatter.rb +181 -0
- data/lib/rubbycop/formatter/disabled_lines_formatter.rb +57 -0
- data/lib/rubbycop/formatter/emacs_style_formatter.rb +24 -0
- data/lib/rubbycop/formatter/file_list_formatter.rb +19 -0
- data/lib/rubbycop/formatter/formatter_set.rb +102 -0
- data/lib/rubbycop/formatter/fuubar_style_formatter.rb +80 -0
- data/lib/rubbycop/formatter/html_formatter.rb +134 -0
- data/lib/rubbycop/formatter/json_formatter.rb +74 -0
- data/lib/rubbycop/formatter/offense_count_formatter.rb +55 -0
- data/lib/rubbycop/formatter/progress_formatter.rb +63 -0
- data/lib/rubbycop/formatter/simple_text_formatter.rb +136 -0
- data/lib/rubbycop/formatter/text_util.rb +20 -0
- data/lib/rubbycop/formatter/worst_offenders_formatter.rb +60 -0
- data/lib/rubbycop/magic_comment.rb +210 -0
- data/lib/rubbycop/name_similarity.rb +21 -0
- data/lib/rubbycop/node_pattern.rb +543 -0
- data/lib/rubbycop/options.rb +355 -0
- data/lib/rubbycop/path_util.rb +36 -0
- data/lib/rubbycop/platform.rb +11 -0
- data/lib/rubbycop/processed_source.rb +151 -0
- data/lib/rubbycop/rake_task.rb +86 -0
- data/lib/rubbycop/remote_config.rb +78 -0
- data/lib/rubbycop/result_cache.rb +176 -0
- data/lib/rubbycop/rspec/cop_helper.rb +98 -0
- data/lib/rubbycop/rspec/host_environment_simulation_helper.rb +32 -0
- data/lib/rubbycop/rspec/shared_contexts.rb +98 -0
- data/lib/rubbycop/rspec/shared_examples.rb +92 -0
- data/lib/rubbycop/rspec/support.rb +8 -0
- data/lib/rubbycop/runner.rb +338 -0
- data/lib/rubbycop/string_interpreter.rb +57 -0
- data/lib/rubbycop/string_util.rb +156 -0
- data/lib/rubbycop/target_finder.rb +201 -0
- data/lib/rubbycop/token.rb +25 -0
- data/lib/rubbycop/version.rb +19 -0
- data/lib/rubbycop/warning.rb +11 -0
- metadata +663 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
class VariableForce
|
6
|
+
# A Scope represents a context of local variable visibility.
|
7
|
+
# This is a place where local variables belong to.
|
8
|
+
# A scope instance holds a scope node and variable entries.
|
9
|
+
class Scope
|
10
|
+
OUTER_SCOPE_CHILD_INDICES = {
|
11
|
+
defs: 0..0,
|
12
|
+
module: 0..0,
|
13
|
+
class: 0..1,
|
14
|
+
sclass: 0..0,
|
15
|
+
block: 0..0
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
attr_reader :node, :variables, :naked_top_level
|
19
|
+
alias naked_top_level? naked_top_level
|
20
|
+
|
21
|
+
def initialize(node)
|
22
|
+
unless SCOPE_TYPES.include?(node.type)
|
23
|
+
# Accept any node type for top level scope
|
24
|
+
if node.parent
|
25
|
+
raise ArgumentError,
|
26
|
+
"Node type must be any of #{SCOPE_TYPES}, " \
|
27
|
+
"passed #{node.type}"
|
28
|
+
end
|
29
|
+
@naked_top_level = true
|
30
|
+
end
|
31
|
+
@node = node
|
32
|
+
@variables = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
def ==(other)
|
36
|
+
@node.equal?(other.node)
|
37
|
+
end
|
38
|
+
|
39
|
+
def name
|
40
|
+
# TODO: Add an else clause
|
41
|
+
case @node.type
|
42
|
+
when :def then @node.children[0]
|
43
|
+
when :defs then @node.children[1]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def body_node
|
48
|
+
if naked_top_level?
|
49
|
+
node
|
50
|
+
else
|
51
|
+
child_index = case node.type
|
52
|
+
when :module, :sclass then 1
|
53
|
+
when :def, :class, :block then 2
|
54
|
+
when :defs then 3
|
55
|
+
end
|
56
|
+
|
57
|
+
node.children[child_index]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def include?(target_node)
|
62
|
+
!belong_to_outer_scope?(target_node) &&
|
63
|
+
!belong_to_inner_scope?(target_node)
|
64
|
+
end
|
65
|
+
|
66
|
+
def each_node(&block)
|
67
|
+
return to_enum(__method__) unless block_given?
|
68
|
+
yield node if naked_top_level?
|
69
|
+
scan_node(node, &block)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def scan_node(node, &block)
|
75
|
+
node.each_child_node do |child_node|
|
76
|
+
next unless include?(child_node)
|
77
|
+
yield child_node
|
78
|
+
scan_node(child_node, &block)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def belong_to_outer_scope?(target_node)
|
83
|
+
return true if !naked_top_level? && target_node.equal?(node)
|
84
|
+
return true if ancestor_node?(target_node)
|
85
|
+
return false unless target_node.parent.equal?(node)
|
86
|
+
indices = OUTER_SCOPE_CHILD_INDICES[target_node.parent.type]
|
87
|
+
return false unless indices
|
88
|
+
indices.include?(target_node.sibling_index)
|
89
|
+
end
|
90
|
+
|
91
|
+
def belong_to_inner_scope?(target_node)
|
92
|
+
return false if !target_node.parent || target_node.parent.equal?(node)
|
93
|
+
return false unless SCOPE_TYPES.include?(target_node.parent.type)
|
94
|
+
indices = OUTER_SCOPE_CHILD_INDICES[target_node.parent.type]
|
95
|
+
return true unless indices
|
96
|
+
!indices.include?(target_node.sibling_index)
|
97
|
+
end
|
98
|
+
|
99
|
+
def ancestor_node?(target_node)
|
100
|
+
node.each_ancestor.any? do |ancestor_node|
|
101
|
+
ancestor_node.equal?(target_node)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
class VariableForce
|
6
|
+
# A Variable represents existence of a local variable.
|
7
|
+
# This holds a variable declaration node,
|
8
|
+
# and some states of the variable.
|
9
|
+
class Variable
|
10
|
+
VARIABLE_DECLARATION_TYPES =
|
11
|
+
(VARIABLE_ASSIGNMENT_TYPES + ARGUMENT_DECLARATION_TYPES).freeze
|
12
|
+
|
13
|
+
attr_reader :name, :declaration_node, :scope,
|
14
|
+
:assignments, :references, :captured_by_block
|
15
|
+
alias captured_by_block? captured_by_block
|
16
|
+
|
17
|
+
def initialize(name, declaration_node, scope)
|
18
|
+
unless VARIABLE_DECLARATION_TYPES.include?(declaration_node.type)
|
19
|
+
raise ArgumentError,
|
20
|
+
"Node type must be any of #{VARIABLE_DECLARATION_TYPES}, " \
|
21
|
+
"passed #{declaration_node.type}"
|
22
|
+
end
|
23
|
+
|
24
|
+
@name = name.to_sym
|
25
|
+
@declaration_node = declaration_node
|
26
|
+
@scope = scope
|
27
|
+
|
28
|
+
@assignments = []
|
29
|
+
@references = []
|
30
|
+
@captured_by_block = false
|
31
|
+
end
|
32
|
+
|
33
|
+
def assign(node)
|
34
|
+
@assignments << Assignment.new(node, self)
|
35
|
+
end
|
36
|
+
|
37
|
+
def referenced?
|
38
|
+
!@references.empty?
|
39
|
+
end
|
40
|
+
|
41
|
+
def reference!(node)
|
42
|
+
reference = Reference.new(node, @scope)
|
43
|
+
@references << reference
|
44
|
+
consumed_branches = Set.new
|
45
|
+
|
46
|
+
@assignments.reverse_each do |assignment|
|
47
|
+
next if consumed_branches.include?(assignment.branch)
|
48
|
+
|
49
|
+
unless assignment.run_exclusively_with?(reference)
|
50
|
+
assignment.reference!
|
51
|
+
end
|
52
|
+
|
53
|
+
break if !assignment.branch || assignment.branch == reference.branch
|
54
|
+
|
55
|
+
unless assignment.branch.may_run_incompletely?
|
56
|
+
consumed_branches << assignment.branch
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def capture_with_block!
|
62
|
+
@captured_by_block = true
|
63
|
+
end
|
64
|
+
|
65
|
+
# This is a convenient way to check whether the variable is used
|
66
|
+
# in its entire variable lifetime.
|
67
|
+
# For more precise usage check, refer Assignment#used?.
|
68
|
+
#
|
69
|
+
# Once the variable is captured by a block, we have no idea
|
70
|
+
# when, where and how many times the block would be invoked
|
71
|
+
# and it means we cannot track the usage of the variable.
|
72
|
+
# So we consider it's used to suppress false positive offenses.
|
73
|
+
def used?
|
74
|
+
@captured_by_block || referenced?
|
75
|
+
end
|
76
|
+
|
77
|
+
def should_be_unused?
|
78
|
+
name.to_s.start_with?('_')
|
79
|
+
end
|
80
|
+
|
81
|
+
def argument?
|
82
|
+
ARGUMENT_DECLARATION_TYPES.include?(@declaration_node.type)
|
83
|
+
end
|
84
|
+
|
85
|
+
def method_argument?
|
86
|
+
argument? && %i[def defs].include?(@scope.node.type)
|
87
|
+
end
|
88
|
+
|
89
|
+
def block_argument?
|
90
|
+
argument? && @scope.node.block_type?
|
91
|
+
end
|
92
|
+
|
93
|
+
def keyword_argument?
|
94
|
+
%i[kwarg kwoptarg].include?(@declaration_node.type)
|
95
|
+
end
|
96
|
+
|
97
|
+
def explicit_block_local_variable?
|
98
|
+
@declaration_node.shadowarg_type?
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
class VariableForce
|
6
|
+
# A VariableTable manages the lifetime of all scopes and local variables
|
7
|
+
# in a program.
|
8
|
+
# This holds scopes as stack structure, and provides a way to add local
|
9
|
+
# variables to current scope and find local variables by considering
|
10
|
+
# variable visibility of the current scope.
|
11
|
+
class VariableTable
|
12
|
+
def initialize(hook_receiver = nil)
|
13
|
+
@hook_receiver = hook_receiver
|
14
|
+
end
|
15
|
+
|
16
|
+
def invoke_hook(hook_name, *args)
|
17
|
+
@hook_receiver.send(hook_name, *args) if @hook_receiver
|
18
|
+
end
|
19
|
+
|
20
|
+
def scope_stack
|
21
|
+
@scope_stack ||= []
|
22
|
+
end
|
23
|
+
|
24
|
+
def push_scope(scope_node)
|
25
|
+
scope = Scope.new(scope_node)
|
26
|
+
invoke_hook(:before_entering_scope, scope)
|
27
|
+
scope_stack.push(scope)
|
28
|
+
invoke_hook(:after_entering_scope, scope)
|
29
|
+
scope
|
30
|
+
end
|
31
|
+
|
32
|
+
def pop_scope
|
33
|
+
scope = current_scope
|
34
|
+
invoke_hook(:before_leaving_scope, scope)
|
35
|
+
scope_stack.pop
|
36
|
+
invoke_hook(:after_leaving_scope, scope)
|
37
|
+
scope
|
38
|
+
end
|
39
|
+
|
40
|
+
def current_scope
|
41
|
+
scope_stack.last
|
42
|
+
end
|
43
|
+
|
44
|
+
def current_scope_level
|
45
|
+
scope_stack.count
|
46
|
+
end
|
47
|
+
|
48
|
+
def declare_variable(name, node)
|
49
|
+
variable = Variable.new(name, node, current_scope)
|
50
|
+
invoke_hook(:before_declaring_variable, variable)
|
51
|
+
current_scope.variables[variable.name] = variable
|
52
|
+
invoke_hook(:after_declaring_variable, variable)
|
53
|
+
variable
|
54
|
+
end
|
55
|
+
|
56
|
+
def assign_to_variable(name, node)
|
57
|
+
variable = find_variable(name)
|
58
|
+
|
59
|
+
unless variable
|
60
|
+
raise "Assigning to undeclared local variable \"#{name}\" " \
|
61
|
+
"at #{node.source_range}, #{node.inspect}"
|
62
|
+
end
|
63
|
+
|
64
|
+
variable.assign(node)
|
65
|
+
mark_variable_as_captured_by_block_if_so(variable)
|
66
|
+
end
|
67
|
+
|
68
|
+
def reference_variable(name, node)
|
69
|
+
variable = find_variable(name)
|
70
|
+
|
71
|
+
# In this code:
|
72
|
+
#
|
73
|
+
# foo = 1 unless foo
|
74
|
+
#
|
75
|
+
# (if
|
76
|
+
# (lvar :foo) nil
|
77
|
+
# (lvasgn :foo
|
78
|
+
# (int 1)))
|
79
|
+
#
|
80
|
+
# Parser knows whether the foo is a variable or method invocation.
|
81
|
+
# This means that if a :lvar node is shown in AST, the variable is
|
82
|
+
# assumed to be already declared, even if we haven't seen any :lvasgn
|
83
|
+
# or :arg node before the :lvar node.
|
84
|
+
#
|
85
|
+
# We don't invoke #declare_variable here otherwise
|
86
|
+
# Variable#declaration_node will be :lvar node, that is actually not.
|
87
|
+
# So just skip.
|
88
|
+
return unless variable
|
89
|
+
|
90
|
+
variable.reference!(node)
|
91
|
+
mark_variable_as_captured_by_block_if_so(variable)
|
92
|
+
end
|
93
|
+
|
94
|
+
def find_variable(name)
|
95
|
+
name = name.to_sym
|
96
|
+
|
97
|
+
scope_stack.reverse_each do |scope|
|
98
|
+
variable = scope.variables[name]
|
99
|
+
return variable if variable
|
100
|
+
# Only block scope allows referencing outer scope variables.
|
101
|
+
return nil unless scope.node.block_type?
|
102
|
+
end
|
103
|
+
|
104
|
+
nil
|
105
|
+
end
|
106
|
+
|
107
|
+
def variable_exist?(name)
|
108
|
+
find_variable(name)
|
109
|
+
end
|
110
|
+
|
111
|
+
def accessible_variables
|
112
|
+
scope_stack.reverse_each.each_with_object([]) do |scope, variables|
|
113
|
+
variables.concat(scope.variables.values)
|
114
|
+
break variables unless scope.node.block_type?
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
def mark_variable_as_captured_by_block_if_so(variable)
|
121
|
+
return unless current_scope.node.block_type?
|
122
|
+
return if variable.scope == current_scope
|
123
|
+
variable.capture_with_block!
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
# An Error exception is different from an Offense with severity 'error'
|
5
|
+
# When this exception is raised, it means that RubbyCop is unable to perform
|
6
|
+
# a requested action (probably due to misconfiguration) and must stop
|
7
|
+
# immediately, rather than carrying on
|
8
|
+
class Error < StandardError; end
|
9
|
+
|
10
|
+
class ValidationError < Error; end
|
11
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubbycop:disable Metrics/LineLength
|
4
|
+
|
5
|
+
module RubbyCop
|
6
|
+
module Formatter
|
7
|
+
# Abstract base class for formatter, implements all public API methods.
|
8
|
+
#
|
9
|
+
# ## Creating Custom Formatter
|
10
|
+
#
|
11
|
+
# You can create a custom formatter by subclassing
|
12
|
+
# `RubbyCop::Formatter::BaseFormatter` and overriding some methods,
|
13
|
+
# or by implementing all the methods by duck typing.
|
14
|
+
#
|
15
|
+
# ## Using Custom Formatter in Command Line
|
16
|
+
#
|
17
|
+
# You can tell RubbyCop to use your custom formatter with a combination of
|
18
|
+
# `--format` and `--require` option.
|
19
|
+
# For example, when you have defined `MyCustomFormatter` in
|
20
|
+
# `./path/to/my_custom_formatter.rb`, you would type this command:
|
21
|
+
#
|
22
|
+
# rubbycop --require ./path/to/my_custom_formatter --format MyCustomFormatter
|
23
|
+
#
|
24
|
+
# Note: The path passed to `--require` is directly passed to
|
25
|
+
# `Kernel.require`.
|
26
|
+
# If your custom formatter file is not in `$LOAD_PATH`,
|
27
|
+
# you need to specify the path as relative path prefixed with `./`
|
28
|
+
# explicitly, or absolute path.
|
29
|
+
#
|
30
|
+
# ## Method Invocation Order
|
31
|
+
#
|
32
|
+
# For example, when RubbyCop inspects 2 files,
|
33
|
+
# the invocation order should be like this:
|
34
|
+
#
|
35
|
+
# * `#initialize`
|
36
|
+
# * `#started`
|
37
|
+
# * `#file_started`
|
38
|
+
# * `#file_finished`
|
39
|
+
# * `#file_started`
|
40
|
+
# * `#file_finished`
|
41
|
+
# * `#finished`
|
42
|
+
#
|
43
|
+
class BaseFormatter
|
44
|
+
# rubbycop:enable Metrics/LineLength
|
45
|
+
|
46
|
+
# @api public
|
47
|
+
#
|
48
|
+
# @!attribute [r] output
|
49
|
+
#
|
50
|
+
# @return [IO]
|
51
|
+
# the IO object passed to `#initialize`
|
52
|
+
#
|
53
|
+
# @see #initialize
|
54
|
+
attr_reader :output
|
55
|
+
|
56
|
+
# @api public
|
57
|
+
#
|
58
|
+
# @!attribute [r] options
|
59
|
+
#
|
60
|
+
# @return [Hash]
|
61
|
+
attr_reader :options
|
62
|
+
|
63
|
+
# @api public
|
64
|
+
#
|
65
|
+
# @param output [IO]
|
66
|
+
# `$stdout` or opened file
|
67
|
+
def initialize(output, options = {})
|
68
|
+
@output = output
|
69
|
+
@options = options
|
70
|
+
end
|
71
|
+
|
72
|
+
# @api public
|
73
|
+
#
|
74
|
+
# Invoked once before any files are inspected.
|
75
|
+
#
|
76
|
+
# @param target_files [Array(String)]
|
77
|
+
# all target file paths to be inspected
|
78
|
+
#
|
79
|
+
# @return [void]
|
80
|
+
def started(target_files); end
|
81
|
+
|
82
|
+
# @api public
|
83
|
+
#
|
84
|
+
# Invoked at the beginning of inspecting each files.
|
85
|
+
#
|
86
|
+
# @param file [String]
|
87
|
+
# the file path
|
88
|
+
#
|
89
|
+
# @param options [Hash]
|
90
|
+
# file specific information, currently this is always empty.
|
91
|
+
#
|
92
|
+
# @return [void]
|
93
|
+
def file_started(file, options); end
|
94
|
+
|
95
|
+
# @api public
|
96
|
+
#
|
97
|
+
# Invoked at the end of inspecting each files.
|
98
|
+
#
|
99
|
+
# @param file [String]
|
100
|
+
# the file path
|
101
|
+
#
|
102
|
+
# @param offenses [Array(RubbyCop::Cop::Offense)]
|
103
|
+
# all detected offenses for the file
|
104
|
+
#
|
105
|
+
# @return [void]
|
106
|
+
#
|
107
|
+
# @see RubbyCop::Cop::Offense
|
108
|
+
def file_finished(file, offenses); end
|
109
|
+
|
110
|
+
# @api public
|
111
|
+
#
|
112
|
+
# Invoked after all files are inspected, or interrupted by user.
|
113
|
+
#
|
114
|
+
# @param inspected_files [Array(String)]
|
115
|
+
# the inspected file paths.
|
116
|
+
# This would be same as `target_files` passed to `#started`
|
117
|
+
# unless RubbyCop is interrupted by user.
|
118
|
+
#
|
119
|
+
# @return [void]
|
120
|
+
def finished(inspected_files); end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|