rubocop 0.12.0 → 0.13.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.
Potentially problematic release.
This version of rubocop might be problematic. Click here for more details.
- data/CHANGELOG.md +40 -0
- data/README.md +49 -8
- data/config/default.yml +40 -0
- data/config/enabled.yml +37 -9
- data/lib/rubocop.rb +24 -10
- data/lib/rubocop/cli.rb +41 -106
- data/lib/rubocop/config.rb +3 -2
- data/lib/rubocop/cop/commissioner.rb +15 -5
- data/lib/rubocop/cop/cop.rb +47 -32
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/block_alignment.rb +30 -9
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/end_alignment.rb +4 -4
- data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/eval.rb +1 -3
- data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_condition.rb +6 -4
- data/lib/rubocop/cop/lint/loop.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +5 -8
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/useless_assignment.rb +57 -60
- data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/useless_setter_call.rb +85 -0
- data/lib/rubocop/cop/lint/void.rb +6 -8
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -1
- data/lib/rubocop/cop/rails/read_attribute.rb +1 -1
- data/lib/rubocop/cop/rails/validation.rb +1 -1
- data/lib/rubocop/cop/style/access_control.rb +4 -6
- data/lib/rubocop/cop/style/alias.rb +1 -3
- data/lib/rubocop/cop/style/align_array.rb +47 -0
- data/lib/rubocop/cop/style/align_hash.rb +145 -0
- data/lib/rubocop/cop/style/align_parameters.rb +9 -3
- data/lib/rubocop/cop/style/and_or.rb +3 -4
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -3
- data/lib/rubocop/cop/style/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +1 -4
- data/lib/rubocop/cop/style/begin_block.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_nesting.rb +2 -2
- data/lib/rubocop/cop/style/blocks.rb +14 -2
- data/lib/rubocop/cop/style/case_equality.rb +1 -3
- data/lib/rubocop/cop/style/case_indentation.rb +1 -1
- data/lib/rubocop/cop/style/character_literal.rb +1 -2
- data/lib/rubocop/cop/style/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/style/class_methods.rb +1 -3
- data/lib/rubocop/cop/style/{avoid_class_vars.rb → class_vars.rb} +6 -2
- data/lib/rubocop/cop/style/collection_methods.rb +7 -9
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -2
- data/lib/rubocop/cop/style/comment_annotation.rb +6 -6
- data/lib/rubocop/cop/style/constant_name.rb +1 -3
- data/lib/rubocop/cop/style/def_parentheses.rb +4 -12
- data/lib/rubocop/cop/style/documentation.rb +2 -2
- data/lib/rubocop/cop/style/dot_position.rb +2 -4
- data/lib/rubocop/cop/style/empty_line_between_defs.rb +21 -6
- data/lib/rubocop/cop/style/empty_lines.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +3 -12
- data/lib/rubocop/cop/style/encoding.rb +6 -6
- data/lib/rubocop/cop/style/end_block.rb +1 -1
- data/lib/rubocop/cop/style/end_of_line.rb +5 -5
- data/lib/rubocop/cop/style/even_odd.rb +2 -2
- data/lib/rubocop/cop/style/favor_join.rb +1 -3
- data/lib/rubocop/cop/style/favor_modifier.rb +7 -3
- data/lib/rubocop/cop/style/favor_sprintf.rb +1 -1
- data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +1 -1
- data/lib/rubocop/cop/style/final_newline.rb +23 -0
- data/lib/rubocop/cop/style/{avoid_for.rb → for.rb} +2 -2
- data/lib/rubocop/cop/style/{avoid_global_vars.rb → global_vars.rb} +19 -6
- data/lib/rubocop/cop/style/hash_methods.rb +3 -5
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -4
- data/lib/rubocop/cop/style/if_then_else.rb +1 -1
- data/lib/rubocop/cop/style/indentation_width.rb +4 -4
- data/lib/rubocop/cop/style/lambda.rb +2 -2
- data/lib/rubocop/cop/style/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/style/line_length.rb +7 -8
- data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +1 -1
- data/lib/rubocop/cop/style/method_call_parentheses.rb +1 -4
- data/lib/rubocop/cop/style/method_length.rb +4 -4
- data/lib/rubocop/cop/style/module_function.rb +1 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -3
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +26 -6
- data/lib/rubocop/cop/style/op_method.rb +2 -2
- data/lib/rubocop/cop/style/parameter_lists.rb +4 -4
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/perl_backrefs.rb +26 -0
- data/lib/rubocop/cop/style/proc.rb +1 -3
- data/lib/rubocop/cop/style/reduce_arguments.rb +7 -5
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +9 -2
- data/lib/rubocop/cop/style/redundant_self.rb +9 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +7 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +10 -10
- data/lib/rubocop/cop/style/signal_exception.rb +2 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +2 -4
- data/lib/rubocop/cop/style/space_after_comma_etc.rb +1 -1
- data/lib/rubocop/cop/style/space_after_control_keyword.rb +1 -1
- data/lib/rubocop/cop/style/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/style/space_before_modifier_keyword.rb +34 -0
- data/lib/rubocop/cop/style/{avoid_perlisms.rb → special_global_vars.rb} +17 -8
- data/lib/rubocop/cop/style/string_literals.rb +1 -2
- data/lib/rubocop/cop/style/surrounding_space.rb +9 -8
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_name.rb +9 -2
- data/lib/rubocop/cop/style/tab.rb +5 -5
- data/lib/rubocop/cop/style/ternary_operator.rb +2 -6
- data/lib/rubocop/cop/style/trailing_blank_lines.rb +32 -0
- data/lib/rubocop/cop/style/trailing_whitespace.rb +5 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
- data/lib/rubocop/cop/style/unless_else.rb +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -3
- data/lib/rubocop/cop/style/when_then.rb +1 -4
- data/lib/rubocop/cop/style/while_until_do.rb +7 -5
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/team.rb +100 -0
- data/lib/rubocop/cop/variable_inspector.rb +323 -235
- data/lib/rubocop/cop/variable_inspector/assignment.rb +103 -0
- data/lib/rubocop/cop/variable_inspector/locatable.rb +162 -0
- data/lib/rubocop/cop/variable_inspector/reference.rb +31 -0
- data/lib/rubocop/cop/variable_inspector/scope.rb +70 -0
- data/lib/rubocop/cop/variable_inspector/variable.rb +87 -0
- data/lib/rubocop/cop/variable_inspector/variable_table.rb +129 -0
- data/lib/rubocop/formatter/json_formatter.rb +8 -8
- data/lib/rubocop/formatter/progress_formatter.rb +4 -4
- data/lib/rubocop/processed_source.rb +22 -1
- data/lib/rubocop/version.rb +1 -1
- data/rubocop.gemspec +1 -1
- data/spec/rubocop/cli_spec.rb +32 -30
- data/spec/rubocop/config_spec.rb +4 -6
- data/spec/rubocop/cop/commissioner_spec.rb +4 -5
- data/spec/rubocop/cop/cop_spec.rb +8 -26
- data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +5 -9
- data/spec/rubocop/cop/lint/block_alignment_spec.rb +105 -57
- data/spec/rubocop/cop/lint/empty_ensure_spec.rb +1 -1
- data/spec/rubocop/cop/lint/end_alignment_spec.rb +1 -1
- data/spec/rubocop/cop/lint/end_in_method_spec.rb +1 -1
- data/spec/rubocop/cop/lint/ensure_return_spec.rb +1 -1
- data/spec/rubocop/cop/lint/eval_spec.rb +3 -3
- data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +2 -2
- data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +1 -1
- data/spec/rubocop/cop/lint/loop_spec.rb +1 -1
- data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +1 -1
- data/spec/rubocop/cop/lint/rescue_exception_spec.rb +5 -5
- data/spec/rubocop/cop/lint/unreachable_code_spec.rb +1 -1
- data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1545 -108
- data/spec/rubocop/cop/lint/useless_comparison_spec.rb +1 -1
- data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +101 -0
- data/spec/rubocop/cop/lint/void_spec.rb +1 -1
- data/spec/rubocop/cop/offence_spec.rb +4 -4
- data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +1 -1
- data/spec/rubocop/cop/rails/read_attribute_spec.rb +1 -1
- data/spec/rubocop/cop/rails/validation_spec.rb +1 -1
- data/spec/rubocop/cop/style/access_control_spec.rb +20 -20
- data/spec/rubocop/cop/style/alias_spec.rb +3 -3
- data/spec/rubocop/cop/style/align_array_spec.rb +62 -0
- data/spec/rubocop/cop/style/align_hash_spec.rb +267 -0
- data/spec/rubocop/cop/style/align_parameters_spec.rb +2 -2
- data/spec/rubocop/cop/style/and_or_spec.rb +1 -1
- data/spec/rubocop/cop/style/ascii_comments_spec.rb +2 -2
- data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +2 -2
- data/spec/rubocop/cop/style/attr_spec.rb +1 -1
- data/spec/rubocop/cop/style/begin_block_spec.rb +1 -1
- data/spec/rubocop/cop/style/block_comments_spec.rb +1 -1
- data/spec/rubocop/cop/style/block_nesting_spec.rb +3 -3
- data/spec/rubocop/cop/style/blocks_spec.rb +25 -1
- data/spec/rubocop/cop/style/case_equality_spec.rb +1 -1
- data/spec/rubocop/cop/style/case_indentation_spec.rb +5 -5
- data/spec/rubocop/cop/style/character_literal_spec.rb +1 -1
- data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +1 -1
- data/spec/rubocop/cop/style/class_methods_spec.rb +1 -1
- data/spec/rubocop/cop/style/class_vars_spec.rb +25 -0
- data/spec/rubocop/cop/style/collection_methods_spec.rb +5 -6
- data/spec/rubocop/cop/style/colon_method_call_spec.rb +0 -3
- data/spec/rubocop/cop/style/comment_annotation_spec.rb +20 -18
- data/spec/rubocop/cop/style/constant_name_spec.rb +1 -1
- data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +1 -1
- data/spec/rubocop/cop/style/def_without_parentheses_spec.rb +1 -1
- data/spec/rubocop/cop/style/documentation_spec.rb +1 -1
- data/spec/rubocop/cop/style/dot_position_spec.rb +5 -5
- data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +35 -4
- data/spec/rubocop/cop/style/empty_lines_spec.rb +1 -1
- data/spec/rubocop/cop/style/empty_literal_spec.rb +7 -7
- data/spec/rubocop/cop/style/encoding_spec.rb +11 -5
- data/spec/rubocop/cop/style/end_block_spec.rb +1 -1
- data/spec/rubocop/cop/style/end_of_line_spec.rb +4 -3
- data/spec/rubocop/cop/style/even_odd_spec.rb +1 -1
- data/spec/rubocop/cop/style/favor_join_spec.rb +2 -2
- data/spec/rubocop/cop/style/favor_modifier_spec.rb +13 -10
- data/spec/rubocop/cop/style/favor_sprintf_spec.rb +4 -4
- data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +1 -1
- data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +4 -4
- data/spec/rubocop/cop/style/final_newline_spec.rb +25 -0
- data/spec/rubocop/cop/style/{avoid_for_spec.rb → for_spec.rb} +8 -12
- data/spec/rubocop/cop/style/{avoid_global_vars_spec.rb → global_vars_spec.rb} +13 -3
- data/spec/rubocop/cop/style/hash_methods_spec.rb +1 -1
- data/spec/rubocop/cop/style/hash_syntax_spec.rb +20 -9
- data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +3 -3
- data/spec/rubocop/cop/style/indentation_width_spec.rb +19 -19
- data/spec/rubocop/cop/style/lambda_spec.rb +6 -6
- data/spec/rubocop/cop/style/leading_comment_space_spec.rb +1 -1
- data/spec/rubocop/cop/style/line_length_spec.rb +3 -3
- data/spec/rubocop/cop/style/method_and_variable_snake_case_spec.rb +8 -9
- data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +1 -1
- data/spec/rubocop/cop/style/method_length_spec.rb +18 -17
- data/spec/rubocop/cop/style/module_function_spec.rb +1 -1
- data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +84 -0
- data/spec/rubocop/cop/style/multiline_if_then_spec.rb +2 -2
- data/spec/rubocop/cop/style/nil_comparison_spec.rb +1 -1
- data/spec/rubocop/cop/style/not_spec.rb +1 -1
- data/spec/rubocop/cop/style/numeric_literals_spec.rb +15 -25
- data/spec/rubocop/cop/style/one_line_conditional_spec.rb +2 -2
- data/spec/rubocop/cop/style/op_method_spec.rb +3 -3
- data/spec/rubocop/cop/style/parameter_lists_spec.rb +5 -5
- data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +4 -8
- data/spec/rubocop/cop/style/perl_backrefs_spec.rb +23 -0
- data/spec/rubocop/cop/style/proc_spec.rb +1 -1
- data/spec/rubocop/cop/style/reduce_arguments_spec.rb +18 -11
- data/spec/rubocop/cop/style/redundant_begin_spec.rb +1 -1
- data/spec/rubocop/cop/style/redundant_return_spec.rb +16 -1
- data/spec/rubocop/cop/style/redundant_self_spec.rb +6 -1
- data/spec/rubocop/cop/style/regexp_literal_spec.rb +19 -23
- data/spec/rubocop/cop/style/rescue_modifier_spec.rb +3 -3
- data/spec/rubocop/cop/style/semicolon_spec.rb +3 -3
- data/spec/rubocop/cop/style/signal_exception_spec.rb +1 -1
- data/spec/rubocop/cop/style/single_line_methods_spec.rb +22 -18
- data/spec/rubocop/cop/style/space_after_colon_spec.rb +4 -4
- data/spec/rubocop/cop/style/space_after_comma_spec.rb +4 -4
- data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +1 -1
- data/spec/rubocop/cop/style/space_after_method_name_spec.rb +1 -1
- data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +3 -3
- data/spec/rubocop/cop/style/space_around_braces_spec.rb +13 -12
- data/spec/rubocop/cop/style/space_around_equals_in_default_parameter_spec.rb +3 -3
- data/spec/rubocop/cop/style/space_around_operators_spec.rb +25 -25
- data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +53 -0
- data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +9 -9
- data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +47 -61
- data/spec/rubocop/cop/style/space_inside_parens_spec.rb +4 -4
- data/spec/rubocop/cop/style/special_global_vars_spec.rb +52 -0
- data/spec/rubocop/cop/style/string_literals_spec.rb +5 -5
- data/spec/rubocop/cop/style/symbol_array_spec.rb +1 -1
- data/spec/rubocop/cop/style/symbol_name_spec.rb +27 -18
- data/spec/rubocop/cop/style/tab_spec.rb +1 -1
- data/spec/rubocop/cop/style/ternary_operator_spec.rb +2 -2
- data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +24 -0
- data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +7 -7
- data/spec/rubocop/cop/style/trivial_accessors_spec.rb +6 -14
- data/spec/rubocop/cop/style/unless_else_spec.rb +3 -3
- data/spec/rubocop/cop/style/variable_interpolation_spec.rb +5 -5
- data/spec/rubocop/cop/style/when_then_spec.rb +15 -15
- data/spec/rubocop/cop/style/while_until_do_spec.rb +3 -3
- data/spec/rubocop/cop/style/word_array_spec.rb +1 -1
- data/spec/rubocop/cop/team_spec.rb +158 -0
- data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +217 -0
- data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +740 -0
- data/spec/rubocop/cop/variable_inspector/scope_spec.rb +191 -0
- data/spec/rubocop/cop/variable_inspector/variable_spec.rb +79 -0
- data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +275 -0
- data/spec/rubocop/cop/variable_inspector_spec.rb +13 -533
- data/spec/rubocop/formatter/clang_style_formatter_spec.rb +4 -4
- data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +1 -1
- data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +3 -3
- data/spec/rubocop/formatter/file_list_formatter_spec.rb +3 -3
- data/spec/rubocop/formatter/progress_formatter_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -1
- data/spec/support/ast_helper.rb +15 -0
- data/spec/support/shared_context.rb +18 -0
- data/spec/support/shared_examples.rb +1 -1
- metadata +95 -32
- checksums.yaml +0 -7
- data/lib/rubocop/cop/lint/unused_local_variable.rb +0 -32
- data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +0 -19
- data/spec/rubocop/cop/lint/unused_local_variable_spec.rb +0 -588
- data/spec/rubocop/cop/style/avoid_class_vars_spec.rb +0 -27
- data/spec/rubocop/cop/style/avoid_perl_backrefs_spec.rb +0 -20
- data/spec/rubocop/cop/style/avoid_perlisms_spec.rb +0 -47
@@ -4,546 +4,26 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
module Rubocop
|
6
6
|
module Cop
|
7
|
-
|
8
|
-
|
9
|
-
include AST::Sexp
|
7
|
+
describe VariableInspector do
|
8
|
+
include AST::Sexp
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
it 'raises error' do
|
14
|
-
node = s(:def)
|
15
|
-
expect { VariableEntry.new(node) }.to raise_error(ArgumentError)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe Scope do
|
22
|
-
include AST::Sexp
|
23
|
-
|
24
|
-
describe '.new' do
|
25
|
-
context 'when non scope node is passed' do
|
26
|
-
it 'raises error' do
|
27
|
-
node = s(:lvasgn)
|
28
|
-
expect { Scope.new(node) }.to raise_error(ArgumentError)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context 'when begin node is passed' do
|
33
|
-
it 'accepts that as pseudo scope for top level scope' do
|
34
|
-
node = s(:begin)
|
35
|
-
expect { Scope.new(node) }.not_to raise_error
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
10
|
+
class ExampleInspector
|
11
|
+
include VariableInspector
|
39
12
|
end
|
40
13
|
|
41
|
-
|
42
|
-
include AST::Sexp
|
43
|
-
|
44
|
-
subject(:variable_table) { VariableTable.new }
|
45
|
-
|
46
|
-
describe '#push_scope' do
|
47
|
-
it 'returns pushed scope object' do
|
48
|
-
node = s(:def)
|
49
|
-
scope = variable_table.push_scope(node)
|
50
|
-
expect(scope).to equal(variable_table.current_scope)
|
51
|
-
expect(scope.node).to equal(node)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
describe '#pop_scope' do
|
56
|
-
before do
|
57
|
-
node = s(:def)
|
58
|
-
variable_table.push_scope(node)
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'returns popped scope object' do
|
62
|
-
last_scope = variable_table.current_scope
|
63
|
-
popped_scope = variable_table.pop_scope
|
64
|
-
expect(popped_scope).to equal(last_scope)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe '#current_scope_level' do
|
69
|
-
before do
|
70
|
-
variable_table.push_scope(s(:def))
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'increases by pushing scope' do
|
74
|
-
last_scope_level = variable_table.current_scope_level
|
75
|
-
variable_table.push_scope(s(:def))
|
76
|
-
expect(variable_table.current_scope_level)
|
77
|
-
.to eq(last_scope_level + 1)
|
78
|
-
end
|
14
|
+
subject(:inspector) { ExampleInspector.new }
|
79
15
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
expect(variable_table.current_scope_level)
|
84
|
-
.to eq(last_scope_level - 1)
|
85
|
-
end
|
16
|
+
describe '#process_node' do
|
17
|
+
before do
|
18
|
+
inspector.variable_table.push_scope(s(:def))
|
86
19
|
end
|
87
20
|
|
88
|
-
|
89
|
-
|
90
|
-
2.times do
|
91
|
-
node = s(:def)
|
92
|
-
variable_table.push_scope(node)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'adds variable entry to current scope with its name as key' do
|
97
|
-
node = s(:lvasgn, :foo)
|
98
|
-
variable_table.add_variable_entry(node)
|
99
|
-
expect(variable_table.current_scope.variable_entries)
|
100
|
-
.to have_key(:foo)
|
101
|
-
expect(variable_table.scope_stack[-2].variable_entries)
|
102
|
-
.to be_empty
|
103
|
-
entry = variable_table.current_scope.variable_entries[:foo]
|
104
|
-
expect(entry.node).to equal(node)
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'returns the added variable entry' do
|
108
|
-
node = s(:lvasgn, :foo)
|
109
|
-
entry = variable_table.add_variable_entry(node)
|
110
|
-
expect(entry.node).to equal(node)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
describe '#find_variable_entry' do
|
115
|
-
before do
|
116
|
-
variable_table.push_scope(s(:class))
|
117
|
-
variable_table.add_variable_entry(s(:lvasgn, :baz))
|
118
|
-
|
119
|
-
variable_table.push_scope(s(:def))
|
120
|
-
variable_table.add_variable_entry(s(:lvasgn, :bar))
|
121
|
-
end
|
122
|
-
|
123
|
-
context 'when current scope is block' do
|
124
|
-
before do
|
125
|
-
variable_table.push_scope(s(:block))
|
126
|
-
end
|
127
|
-
|
128
|
-
context 'when a variable with the target name exists ' +
|
129
|
-
'in current scope' do
|
130
|
-
before do
|
131
|
-
variable_table.add_variable_entry(s(:lvasgn, :foo))
|
132
|
-
end
|
133
|
-
|
134
|
-
context 'and does not exist in outer scope' do
|
135
|
-
it 'returns the current scope variable entry' do
|
136
|
-
found_entry = variable_table.find_variable_entry(:foo)
|
137
|
-
expect(found_entry.name).to eq(:foo)
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
context 'and also exists in outer scope' do
|
142
|
-
before do
|
143
|
-
variable_table.add_variable_entry(s(:lvasgn, :bar))
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'returns the current scope variable entry' do
|
147
|
-
found_entry = variable_table.find_variable_entry(:bar)
|
148
|
-
expect(found_entry.name).to equal(:bar)
|
149
|
-
expect(variable_table.current_scope.variable_entries)
|
150
|
-
.to have_value(found_entry)
|
151
|
-
expect(variable_table.scope_stack[-2].variable_entries)
|
152
|
-
.not_to have_value(found_entry)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
context 'when a variable with the target name does not exist ' +
|
158
|
-
'in current scope' do
|
159
|
-
context 'but exists in the direct outer scope' do
|
160
|
-
it 'returns the direct outer scope variable entry' do
|
161
|
-
found_entry = variable_table.find_variable_entry(:bar)
|
162
|
-
expect(found_entry.name).to equal(:bar)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
context 'but exists in a indirect outer scope' do
|
167
|
-
context 'when the direct outer scope is block' do
|
168
|
-
before do
|
169
|
-
variable_table.pop_scope
|
170
|
-
variable_table.pop_scope
|
171
|
-
|
172
|
-
variable_table.push_scope(s(:block))
|
173
|
-
variable_table.push_scope(s(:block))
|
174
|
-
end
|
175
|
-
|
176
|
-
it 'returns the indirect outer scope variable entry' do
|
177
|
-
found_entry = variable_table.find_variable_entry(:baz)
|
178
|
-
expect(found_entry.name).to equal(:baz)
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
context 'when the direct outer scope is not block' do
|
183
|
-
it 'returns nil' do
|
184
|
-
found_entry = variable_table.find_variable_entry(:baz)
|
185
|
-
expect(found_entry).to be_nil
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
context 'and does not exist in all outer scopes' do
|
191
|
-
it 'returns nil' do
|
192
|
-
found_entry = variable_table.find_variable_entry(:non)
|
193
|
-
expect(found_entry).to be_nil
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
context 'when current scope is not block' do
|
200
|
-
before do
|
201
|
-
variable_table.push_scope(s(:def))
|
202
|
-
end
|
203
|
-
|
204
|
-
context 'when a variable with the target name exists ' +
|
205
|
-
'in current scope' do
|
206
|
-
before do
|
207
|
-
variable_table.add_variable_entry(s(:lvasgn, :foo))
|
208
|
-
end
|
209
|
-
|
210
|
-
context 'and does not exist in outer scope' do
|
211
|
-
it 'returns the current scope variable entry' do
|
212
|
-
found_entry = variable_table.find_variable_entry(:foo)
|
213
|
-
expect(found_entry.name).to eq(:foo)
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
context 'and also exists in outer scope' do
|
218
|
-
it 'returns the current scope variable entry' do
|
219
|
-
found_entry = variable_table.find_variable_entry(:foo)
|
220
|
-
expect(found_entry.name).to equal(:foo)
|
221
|
-
expect(variable_table.current_scope.variable_entries)
|
222
|
-
.to have_value(found_entry)
|
223
|
-
expect(variable_table.scope_stack[-2].variable_entries)
|
224
|
-
.not_to have_value(found_entry)
|
225
|
-
end
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
context 'when a variable with the target name does not exist ' +
|
230
|
-
'in current scope' do
|
231
|
-
context 'but exists in the direct outer scope' do
|
232
|
-
it 'returns nil' do
|
233
|
-
found_entry = variable_table.find_variable_entry(:bar)
|
234
|
-
expect(found_entry).to be_nil
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
context 'and does not exist in all outer scopes' do
|
239
|
-
it 'returns nil' do
|
240
|
-
found_entry = variable_table.find_variable_entry(:non)
|
241
|
-
expect(found_entry).to be_nil
|
242
|
-
end
|
243
|
-
end
|
244
|
-
end
|
245
|
-
end
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
describe NodeScanner do
|
250
|
-
describe '.scan_nodes_in_scope' do
|
251
|
-
let(:ast) do
|
252
|
-
processed_source = Rubocop::SourceParser.parse(source)
|
253
|
-
processed_source.ast
|
254
|
-
end
|
255
|
-
|
256
|
-
let(:source) do
|
257
|
-
<<-END
|
258
|
-
class SomeClass
|
259
|
-
foo = 1.to_s
|
260
|
-
bar = 2.to_s
|
261
|
-
def some_method
|
262
|
-
baz = 3.to_s
|
263
|
-
end
|
264
|
-
end
|
265
|
-
END
|
266
|
-
end
|
267
|
-
|
268
|
-
# (class
|
269
|
-
# (const nil :SomeClass) nil
|
270
|
-
# (begin
|
271
|
-
# (lvasgn :foo
|
272
|
-
# (send
|
273
|
-
# (int 1) :to_s))
|
274
|
-
# (lvasgn :bar
|
275
|
-
# (send
|
276
|
-
# (int 2) :to_s))
|
277
|
-
# (def :some_method
|
278
|
-
# (args)
|
279
|
-
# (lvasgn :baz
|
280
|
-
# (send
|
281
|
-
# (int 3) :to_s)))))
|
282
|
-
|
283
|
-
it 'does not scan children of inner scope node' do
|
284
|
-
scanned_node_count = 0
|
285
|
-
|
286
|
-
NodeScanner.scan_nodes_in_scope(ast) do |node|
|
287
|
-
scanned_node_count += 1
|
288
|
-
fail if node.type == :lvasgn && node.children.first == :baz
|
289
|
-
end
|
290
|
-
|
291
|
-
expect(scanned_node_count).to eq(9)
|
292
|
-
end
|
293
|
-
|
294
|
-
it 'scans nodes with depth first order' do
|
295
|
-
index = 0
|
296
|
-
|
297
|
-
NodeScanner.scan_nodes_in_scope(ast) do |node|
|
298
|
-
case index
|
299
|
-
when 0
|
300
|
-
expect(node.type).to eq(:const)
|
301
|
-
when 1
|
302
|
-
expect(node.type).to eq(:begin)
|
303
|
-
when 2
|
304
|
-
expect(node.type).to eq(:lvasgn)
|
305
|
-
when 3
|
306
|
-
expect(node.type).to eq(:send)
|
307
|
-
when 4
|
308
|
-
expect(node.type).to eq(:int)
|
309
|
-
when 5
|
310
|
-
expect(node.type).to eq(:lvasgn)
|
311
|
-
end
|
312
|
-
|
313
|
-
index += 1
|
314
|
-
end
|
315
|
-
|
316
|
-
expect(index).not_to eq(0)
|
317
|
-
end
|
318
|
-
|
319
|
-
let(:trace) { [] }
|
320
|
-
|
321
|
-
before do
|
322
|
-
NodeScanner.scan_nodes_in_scope(ast) do |node|
|
323
|
-
short_info = node.type.to_s
|
324
|
-
node.children.each do |child|
|
325
|
-
break if child.is_a?(Parser::AST::Node)
|
326
|
-
short_info << " #{child.inspect}"
|
327
|
-
end
|
328
|
-
trace << short_info
|
329
|
-
end
|
330
|
-
end
|
331
|
-
|
332
|
-
context 'when invoking a method ' +
|
333
|
-
'which is taking block and normal arguments' do
|
334
|
-
let(:source) do
|
335
|
-
<<-END
|
336
|
-
some_method(foo = 1) do |block_arg|
|
337
|
-
content_of_block = 2
|
338
|
-
end
|
339
|
-
puts foo
|
340
|
-
END
|
341
|
-
end
|
342
|
-
|
343
|
-
# (begin
|
344
|
-
# (block
|
345
|
-
# (send nil :some_method
|
346
|
-
# (lvasgn :foo
|
347
|
-
# (int 1)))
|
348
|
-
# (args
|
349
|
-
# (arg :block_arg))
|
350
|
-
# (lvasgn :content_of_block
|
351
|
-
# (int 2)))
|
352
|
-
# (send nil :puts
|
353
|
-
# (lvar :foo)))
|
354
|
-
|
355
|
-
it 'scans the method node and its normal argument nodes' do
|
356
|
-
expect(trace).to eq([
|
357
|
-
'block',
|
358
|
-
'send nil :some_method',
|
359
|
-
'lvasgn :foo',
|
360
|
-
'int 1',
|
361
|
-
'send nil :puts',
|
362
|
-
'lvar :foo'
|
363
|
-
])
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
context 'when opening singleton class of an instance' do
|
368
|
-
let(:source) do
|
369
|
-
<<-END
|
370
|
-
instance = Object.new
|
371
|
-
class << instance
|
372
|
-
content_of_singleton_class = 1
|
373
|
-
end
|
374
|
-
p instance
|
375
|
-
END
|
376
|
-
end
|
377
|
-
|
378
|
-
# (begin
|
379
|
-
# (lvasgn :instance
|
380
|
-
# (send
|
381
|
-
# (const nil :Object) :new))
|
382
|
-
# (sclass
|
383
|
-
# (lvar :instance)
|
384
|
-
# (lvasgn :content_of_singleton_class
|
385
|
-
# (int 1)))
|
386
|
-
# (send nil :p
|
387
|
-
# (lvar :instance)))
|
388
|
-
|
389
|
-
it 'scans the subject instance node' do
|
390
|
-
expect(trace).to eq([
|
391
|
-
'lvasgn :instance',
|
392
|
-
'send',
|
393
|
-
'const nil :Object',
|
394
|
-
'sclass',
|
395
|
-
'lvar :instance',
|
396
|
-
'send nil :p',
|
397
|
-
'lvar :instance'
|
398
|
-
])
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
|
-
context 'when defining singleton method' do
|
403
|
-
let(:source) do
|
404
|
-
<<-END
|
405
|
-
instance = Object.new
|
406
|
-
def instance.some_method(method_arg)
|
407
|
-
content_of_method = 2
|
408
|
-
end
|
409
|
-
p instance
|
410
|
-
END
|
411
|
-
end
|
412
|
-
|
413
|
-
# (begin
|
414
|
-
# (lvasgn :instance
|
415
|
-
# (send
|
416
|
-
# (const nil :Object) :new))
|
417
|
-
# (defs
|
418
|
-
# (lvar :instance) :some_method
|
419
|
-
# (args
|
420
|
-
# (arg :method_arg))
|
421
|
-
# (lvasgn :content_of_method
|
422
|
-
# (int 2)))
|
423
|
-
# (send nil :p
|
424
|
-
# (lvar :instance)))
|
425
|
-
|
426
|
-
it 'scans the subject instance node' do
|
427
|
-
expect(trace).to eq([
|
428
|
-
'lvasgn :instance',
|
429
|
-
'send',
|
430
|
-
'const nil :Object',
|
431
|
-
'defs',
|
432
|
-
'lvar :instance',
|
433
|
-
'send nil :p',
|
434
|
-
'lvar :instance'
|
435
|
-
])
|
436
|
-
end
|
437
|
-
end
|
438
|
-
|
439
|
-
context 'when scanning around post while loop' do
|
440
|
-
let(:source) do
|
441
|
-
<<-END
|
442
|
-
begin
|
443
|
-
foo = 1
|
444
|
-
end while foo > 10
|
445
|
-
puts foo
|
446
|
-
END
|
447
|
-
end
|
448
|
-
|
449
|
-
# (begin
|
450
|
-
# (while-post
|
451
|
-
# (send
|
452
|
-
# (lvar :foo) :>
|
453
|
-
# (int 10))
|
454
|
-
# (kwbegin
|
455
|
-
# (lvasgn :foo
|
456
|
-
# (int 1))))
|
457
|
-
# (send nil :puts
|
458
|
-
# (lvar :foo)))
|
459
|
-
|
460
|
-
it 'scans loop body nodes first then condition nodes' do
|
461
|
-
expect(trace).to eq([
|
462
|
-
'while_post',
|
463
|
-
'kwbegin',
|
464
|
-
'lvasgn :foo',
|
465
|
-
'int 1',
|
466
|
-
'send',
|
467
|
-
'lvar :foo',
|
468
|
-
'int 10',
|
469
|
-
'send nil :puts',
|
470
|
-
'lvar :foo'
|
471
|
-
])
|
472
|
-
end
|
473
|
-
end
|
474
|
-
|
475
|
-
context 'when scanning around post until loop' do
|
476
|
-
let(:source) do
|
477
|
-
<<-END
|
478
|
-
begin
|
479
|
-
foo = 1
|
480
|
-
end until foo < 10
|
481
|
-
puts foo
|
482
|
-
END
|
483
|
-
end
|
484
|
-
|
485
|
-
# (begin
|
486
|
-
# (until-post
|
487
|
-
# (send
|
488
|
-
# (lvar :foo) :<
|
489
|
-
# (int 10))
|
490
|
-
# (kwbegin
|
491
|
-
# (lvasgn :foo
|
492
|
-
# (int 1))))
|
493
|
-
# (send nil :puts
|
494
|
-
# (lvar :foo)))
|
495
|
-
|
496
|
-
it 'scans loop body nodes first then condition nodes' do
|
497
|
-
expect(trace).to eq([
|
498
|
-
'until_post',
|
499
|
-
'kwbegin',
|
500
|
-
'lvasgn :foo',
|
501
|
-
'int 1',
|
502
|
-
'send',
|
503
|
-
'lvar :foo',
|
504
|
-
'int 10',
|
505
|
-
'send nil :puts',
|
506
|
-
'lvar :foo'
|
507
|
-
])
|
508
|
-
end
|
509
|
-
end
|
510
|
-
end
|
511
|
-
end
|
512
|
-
|
513
|
-
describe VariableInspector do
|
514
|
-
include AST::Sexp
|
515
|
-
|
516
|
-
class ExampleInspector
|
517
|
-
include VariableInspector
|
518
|
-
end
|
519
|
-
|
520
|
-
subject(:inspector) { ExampleInspector.new }
|
521
|
-
|
522
|
-
describe '#process_node' do
|
523
|
-
before do
|
524
|
-
inspector.variable_table.push_scope(s(:def))
|
525
|
-
end
|
526
|
-
|
527
|
-
context 'when processing lvar node' do
|
528
|
-
let(:node) { s(:lvar, :foo) }
|
529
|
-
|
530
|
-
context 'when the variable is already declared' do
|
531
|
-
before do
|
532
|
-
inspector.variable_table.add_variable_entry(s(:lvasgn, :foo))
|
533
|
-
end
|
534
|
-
|
535
|
-
it 'marks the variable as used' do
|
536
|
-
entry = inspector.variable_table.find_variable_entry(:foo)
|
537
|
-
expect(entry).not_to be_used
|
538
|
-
inspector.process_node(node)
|
539
|
-
expect(entry).to be_used
|
540
|
-
end
|
541
|
-
end
|
21
|
+
context 'when processing lvar node' do
|
22
|
+
let(:node) { s(:lvar, :foo) }
|
542
23
|
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
end
|
24
|
+
context 'when the variable is not yet declared' do
|
25
|
+
it 'does not raise error' do
|
26
|
+
expect { inspector.process_node(node) }.not_to raise_error
|
547
27
|
end
|
548
28
|
end
|
549
29
|
end
|