rubocop 0.13.1 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rubocop might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +42 -0
- data/README.md +59 -54
- data/config/default.yml +124 -95
- data/config/disabled.yml +4 -0
- data/config/enabled.yml +286 -264
- data/lib/rubocop.rb +10 -3
- data/lib/rubocop/cli.rb +10 -171
- data/lib/rubocop/cop/cop.rb +14 -11
- data/lib/rubocop/cop/lint/debugger.rb +35 -0
- data/lib/rubocop/cop/lint/syntax.rb +34 -0
- data/lib/rubocop/cop/offence.rb +15 -23
- data/lib/rubocop/cop/style/align_array.rb +1 -10
- data/lib/rubocop/cop/style/align_hash.rb +14 -2
- data/lib/rubocop/cop/style/align_parameters.rb +1 -11
- data/lib/rubocop/cop/style/and_or.rb +13 -11
- data/lib/rubocop/cop/style/attr.rb +1 -1
- data/lib/rubocop/cop/style/autocorrect_alignment.rb +31 -6
- data/lib/rubocop/cop/style/blocks.rb +14 -6
- data/lib/rubocop/cop/style/character_literal.rb +1 -1
- data/lib/rubocop/cop/style/class_length.rb +38 -0
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
- data/lib/rubocop/cop/style/configurable_naming.rb +47 -0
- data/lib/rubocop/cop/style/def_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +7 -3
- data/lib/rubocop/cop/style/hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +36 -7
- data/lib/rubocop/cop/style/lambda_call.rb +36 -11
- data/lib/rubocop/cop/style/method_call_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +41 -0
- data/lib/rubocop/cop/style/method_length.rb +2 -13
- data/lib/rubocop/cop/style/method_name.rb +42 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +4 -0
- data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +60 -0
- data/lib/rubocop/cop/style/redundant_exception.rb +32 -0
- data/lib/rubocop/cop/style/redundant_return.rb +14 -5
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +13 -4
- data/lib/rubocop/cop/style/signal_exception.rb +63 -14
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_help.rb +4 -1
- data/lib/rubocop/cop/style/string_literals.rb +34 -11
- data/lib/rubocop/cop/style/surrounding_space.rb +64 -17
- data/lib/rubocop/cop/style/tab.rb +1 -1
- data/lib/rubocop/cop/style/variable_name.rb +44 -0
- data/lib/rubocop/cop/style/when_then.rb +1 -1
- data/lib/rubocop/cop/style/while_until_do.rb +1 -1
- data/lib/rubocop/cop/team.rb +4 -7
- data/lib/rubocop/cop/util.rb +12 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/emacs_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/json_formatter.rb +1 -0
- data/lib/rubocop/formatter/progress_formatter.rb +9 -13
- data/lib/rubocop/formatter/simple_text_formatter.rb +63 -15
- data/lib/rubocop/options.rb +184 -0
- data/lib/rubocop/processed_source.rb +4 -0
- data/lib/rubocop/version.rb +1 -1
- data/rubocop.gemspec +1 -1
- data/spec/rubocop/cli_spec.rb +870 -1001
- data/spec/rubocop/config_spec.rb +13 -13
- data/spec/rubocop/config_store_spec.rb +38 -37
- data/spec/rubocop/cop/commissioner_spec.rb +42 -46
- data/spec/rubocop/cop/cop_spec.rb +72 -77
- data/spec/rubocop/cop/corrector_spec.rb +51 -55
- data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +100 -106
- data/spec/rubocop/cop/lint/block_alignment_spec.rb +403 -409
- data/spec/rubocop/cop/lint/debugger_spec.rb +39 -0
- data/spec/rubocop/cop/lint/empty_ensure_spec.rb +19 -25
- data/spec/rubocop/cop/lint/end_alignment_spec.rb +50 -56
- data/spec/rubocop/cop/lint/end_in_method_spec.rb +20 -26
- data/spec/rubocop/cop/lint/ensure_return_spec.rb +30 -36
- data/spec/rubocop/cop/lint/eval_spec.rb +25 -31
- data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +22 -28
- data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +51 -57
- data/spec/rubocop/cop/lint/loop_spec.rb +17 -23
- data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +51 -57
- data/spec/rubocop/cop/lint/rescue_exception_spec.rb +105 -111
- data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +230 -236
- data/spec/rubocop/cop/lint/syntax_spec.rb +33 -0
- data/spec/rubocop/cop/lint/unreachable_code_spec.rb +51 -57
- data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1544 -1550
- data/spec/rubocop/cop/lint/useless_comparison_spec.rb +21 -27
- data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +119 -125
- data/spec/rubocop/cop/lint/void_spec.rb +50 -56
- data/spec/rubocop/cop/offence_spec.rb +101 -131
- data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +6 -12
- data/spec/rubocop/cop/rails/read_attribute_spec.rb +6 -12
- data/spec/rubocop/cop/rails/validation_spec.rb +13 -19
- data/spec/rubocop/cop/style/access_control_spec.rb +146 -152
- data/spec/rubocop/cop/style/alias_spec.rb +30 -36
- data/spec/rubocop/cop/style/align_array_spec.rb +57 -56
- data/spec/rubocop/cop/style/align_hash_spec.rb +256 -237
- data/spec/rubocop/cop/style/align_parameters_spec.rb +216 -202
- data/spec/rubocop/cop/style/and_or_spec.rb +51 -55
- data/spec/rubocop/cop/style/ascii_comments_spec.rb +14 -20
- data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +26 -32
- data/spec/rubocop/cop/style/attr_spec.rb +11 -17
- data/spec/rubocop/cop/style/begin_block_spec.rb +6 -12
- data/spec/rubocop/cop/style/block_comments_spec.rb +13 -19
- data/spec/rubocop/cop/style/block_nesting_spec.rb +134 -140
- data/spec/rubocop/cop/style/blocks_spec.rb +81 -84
- data/spec/rubocop/cop/style/case_equality_spec.rb +5 -11
- data/spec/rubocop/cop/style/case_indentation_spec.rb +71 -77
- data/spec/rubocop/cop/style/character_literal_spec.rb +31 -37
- data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +31 -37
- data/spec/rubocop/cop/style/class_length_spec.rb +65 -0
- data/spec/rubocop/cop/style/class_methods_spec.rb +35 -41
- data/spec/rubocop/cop/style/class_vars_spec.rb +11 -17
- data/spec/rubocop/cop/style/collection_methods_spec.rb +41 -47
- data/spec/rubocop/cop/style/colon_method_call_spec.rb +45 -51
- data/spec/rubocop/cop/style/comment_annotation_spec.rb +79 -85
- data/spec/rubocop/cop/style/constant_name_spec.rb +45 -51
- data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +28 -34
- data/spec/rubocop/cop/style/def_without_parentheses_spec.rb +23 -29
- data/spec/rubocop/cop/style/documentation_spec.rb +60 -66
- data/spec/rubocop/cop/style/dot_position_spec.rb +50 -56
- data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +109 -110
- data/spec/rubocop/cop/style/empty_lines_spec.rb +28 -34
- data/spec/rubocop/cop/style/empty_literal_spec.rb +80 -86
- data/spec/rubocop/cop/style/encoding_spec.rb +50 -56
- data/spec/rubocop/cop/style/end_block_spec.rb +6 -12
- data/spec/rubocop/cop/style/end_of_line_spec.rb +13 -19
- data/spec/rubocop/cop/style/even_odd_spec.rb +69 -41
- data/spec/rubocop/cop/style/favor_join_spec.rb +21 -27
- data/spec/rubocop/cop/style/favor_modifier_spec.rb +180 -176
- data/spec/rubocop/cop/style/favor_sprintf_spec.rb +41 -47
- data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +63 -69
- data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +32 -38
- data/spec/rubocop/cop/style/final_newline_spec.rb +16 -22
- data/spec/rubocop/cop/style/for_spec.rb +18 -24
- data/spec/rubocop/cop/style/global_vars_spec.rb +23 -29
- data/spec/rubocop/cop/style/hash_methods_spec.rb +39 -45
- data/spec/rubocop/cop/style/hash_syntax_spec.rb +93 -65
- data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +11 -17
- data/spec/rubocop/cop/style/indentation_width_spec.rb +377 -383
- data/spec/rubocop/cop/style/lambda_call_spec.rb +40 -22
- data/spec/rubocop/cop/style/lambda_spec.rb +30 -34
- data/spec/rubocop/cop/style/leading_comment_space_spec.rb +44 -50
- data/spec/rubocop/cop/style/line_length_spec.rb +11 -17
- data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +14 -20
- data/spec/rubocop/cop/style/method_called_on_do_end_block_spec.rb +60 -0
- data/spec/rubocop/cop/style/method_length_spec.rb +127 -133
- data/spec/rubocop/cop/style/method_name_spec.rb +103 -0
- data/spec/rubocop/cop/style/module_function_spec.rb +16 -22
- data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +64 -70
- data/spec/rubocop/cop/style/multiline_if_then_spec.rb +74 -80
- data/spec/rubocop/cop/style/nil_comparison_spec.rb +20 -26
- data/spec/rubocop/cop/style/not_spec.rb +13 -19
- data/spec/rubocop/cop/style/numeric_literals_spec.rb +36 -35
- data/spec/rubocop/cop/style/one_line_conditional_spec.rb +5 -11
- data/spec/rubocop/cop/style/op_method_spec.rb +61 -67
- data/spec/rubocop/cop/style/parameter_lists_spec.rb +31 -37
- data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +62 -68
- data/spec/rubocop/cop/style/perl_backrefs_spec.rb +9 -15
- data/spec/rubocop/cop/style/proc_spec.rb +13 -19
- data/spec/rubocop/cop/style/raise_args_spec.rb +55 -0
- data/spec/rubocop/cop/style/reduce_arguments_spec.rb +49 -55
- data/spec/rubocop/cop/style/redundant_begin_spec.rb +47 -53
- data/spec/rubocop/cop/style/redundant_exception_spec.rb +27 -0
- data/spec/rubocop/cop/style/redundant_return_spec.rb +164 -72
- data/spec/rubocop/cop/style/redundant_self_spec.rb +109 -115
- data/spec/rubocop/cop/style/regexp_literal_spec.rb +57 -63
- data/spec/rubocop/cop/style/rescue_modifier_spec.rb +99 -105
- data/spec/rubocop/cop/style/semicolon_spec.rb +95 -90
- data/spec/rubocop/cop/style/signal_exception_spec.rb +248 -95
- data/spec/rubocop/cop/style/single_line_methods_spec.rb +45 -51
- data/spec/rubocop/cop/style/space_after_colon_spec.rb +14 -20
- data/spec/rubocop/cop/style/space_after_comma_spec.rb +16 -22
- data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +48 -54
- data/spec/rubocop/cop/style/space_after_method_name_spec.rb +49 -55
- data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +10 -16
- data/spec/rubocop/cop/style/space_around_block_braces_spec.rb +118 -50
- data/spec/rubocop/cop/style/space_around_equals_in_default_parameter_spec.rb +18 -24
- data/spec/rubocop/cop/style/space_around_operators_spec.rb +204 -210
- data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +36 -42
- data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +39 -45
- data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +62 -68
- data/spec/rubocop/cop/style/space_inside_parens_spec.rb +18 -24
- data/spec/rubocop/cop/style/special_global_vars_spec.rb +40 -46
- data/spec/rubocop/cop/style/string_literals_spec.rb +148 -70
- data/spec/rubocop/cop/style/symbol_array_spec.rb +28 -34
- data/spec/rubocop/cop/style/symbol_name_spec.rb +132 -138
- data/spec/rubocop/cop/style/tab_spec.rb +9 -15
- data/spec/rubocop/cop/style/ternary_operator_spec.rb +25 -31
- data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +10 -16
- data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +14 -20
- data/spec/rubocop/cop/style/trivial_accessors_spec.rb +374 -380
- data/spec/rubocop/cop/style/unless_else_spec.rb +17 -23
- data/spec/rubocop/cop/style/variable_interpolation_spec.rb +36 -42
- data/spec/rubocop/cop/style/variable_name_spec.rb +83 -0
- data/spec/rubocop/cop/style/when_then_spec.rb +31 -37
- data/spec/rubocop/cop/style/while_until_do_spec.rb +47 -53
- data/spec/rubocop/cop/style/word_array_spec.rb +49 -55
- data/spec/rubocop/cop/team_spec.rb +125 -127
- data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +176 -180
- data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +580 -586
- data/spec/rubocop/cop/variable_inspector/scope_spec.rb +140 -146
- data/spec/rubocop/cop/variable_inspector/variable_spec.rb +52 -58
- data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +217 -223
- data/spec/rubocop/cop/variable_inspector_spec.rb +15 -19
- data/spec/rubocop/formatter/clang_style_formatter_spec.rb +35 -36
- data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +2 -2
- data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +24 -1
- data/spec/rubocop/formatter/file_list_formatter_spec.rb +1 -1
- data/spec/rubocop/formatter/formatter_set_spec.rb +3 -3
- data/spec/rubocop/formatter/json_formatter_spec.rb +7 -2
- data/spec/rubocop/formatter/offence_count_formatter_spec.rb +1 -1
- data/spec/rubocop/formatter/progress_formatter_spec.rb +1 -1
- data/spec/rubocop/formatter/simple_text_formatter_spec.rb +55 -6
- data/spec/rubocop/options_spec.rb +233 -0
- data/spec/rubocop/processed_source_spec.rb +85 -42
- data/spec/rubocop/source_parser_spec.rb +108 -110
- data/spec/rubocop/target_finder_spec.rb +125 -127
- data/spec/rubocop/token_spec.rb +15 -17
- metadata +32 -8
- data/lib/rubocop/backports/bsearch.rb +0 -39
- data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +0 -77
- data/spec/rubocop/cop/style/method_and_variable_snake_case_spec.rb +0 -102
@@ -2,272 +2,266 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
module VariableInspector
|
8
|
-
describe VariableTable do
|
9
|
-
include AST::Sexp
|
10
|
-
|
11
|
-
subject(:variable_table) { VariableTable.new }
|
12
|
-
|
13
|
-
describe '#push_scope' do
|
14
|
-
it 'returns pushed scope object' do
|
15
|
-
node = s(:def)
|
16
|
-
scope = variable_table.push_scope(node)
|
17
|
-
expect(scope).to equal(variable_table.current_scope)
|
18
|
-
expect(scope.node).to equal(node)
|
19
|
-
end
|
20
|
-
end
|
5
|
+
describe Rubocop::Cop::VariableInspector::VariableTable do
|
6
|
+
include AST::Sexp
|
21
7
|
|
22
|
-
|
23
|
-
before do
|
24
|
-
node = s(:def)
|
25
|
-
variable_table.push_scope(node)
|
26
|
-
end
|
8
|
+
subject(:variable_table) { described_class.new }
|
27
9
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
10
|
+
describe '#push_scope' do
|
11
|
+
it 'returns pushed scope object' do
|
12
|
+
node = s(:def)
|
13
|
+
scope = variable_table.push_scope(node)
|
14
|
+
expect(scope).to equal(variable_table.current_scope)
|
15
|
+
expect(scope.node).to equal(node)
|
16
|
+
end
|
17
|
+
end
|
34
18
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
19
|
+
describe '#pop_scope' do
|
20
|
+
before do
|
21
|
+
node = s(:def)
|
22
|
+
variable_table.push_scope(node)
|
23
|
+
end
|
39
24
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
25
|
+
it 'returns popped scope object' do
|
26
|
+
last_scope = variable_table.current_scope
|
27
|
+
popped_scope = variable_table.pop_scope
|
28
|
+
expect(popped_scope).to equal(last_scope)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#current_scope_level' do
|
33
|
+
before do
|
34
|
+
variable_table.push_scope(s(:def))
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'increases by pushing scope' do
|
38
|
+
last_scope_level = variable_table.current_scope_level
|
39
|
+
variable_table.push_scope(s(:def))
|
40
|
+
expect(variable_table.current_scope_level)
|
41
|
+
.to eq(last_scope_level + 1)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'decreases by popping scope' do
|
45
|
+
last_scope_level = variable_table.current_scope_level
|
46
|
+
variable_table.pop_scope
|
47
|
+
expect(variable_table.current_scope_level)
|
48
|
+
.to eq(last_scope_level - 1)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#declare_variable' do
|
53
|
+
before do
|
54
|
+
2.times do
|
55
|
+
node = s(:def)
|
56
|
+
variable_table.push_scope(node)
|
57
|
+
end
|
58
|
+
end
|
46
59
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
60
|
+
it 'adds variable to current scope with its name as key' do
|
61
|
+
node = s(:lvasgn, :foo)
|
62
|
+
variable_table.declare_variable(:foo, node)
|
63
|
+
expect(variable_table.current_scope.variables)
|
64
|
+
.to have_key(:foo)
|
65
|
+
expect(variable_table.scope_stack[-2].variables)
|
66
|
+
.to be_empty
|
67
|
+
variable = variable_table.current_scope.variables[:foo]
|
68
|
+
expect(variable.declaration_node).to equal(node)
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'returns the added variable' do
|
72
|
+
node = s(:lvasgn, :foo)
|
73
|
+
variable = variable_table.declare_variable(:foo, node)
|
74
|
+
expect(variable.declaration_node).to equal(node)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '#find_variable' do
|
79
|
+
before do
|
80
|
+
variable_table.push_scope(s(:class))
|
81
|
+
variable_table.declare_variable(:baz, s(:lvasgn, :baz))
|
82
|
+
|
83
|
+
variable_table.push_scope(s(:def))
|
84
|
+
variable_table.declare_variable(:bar, s(:lvasgn, :bar))
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'when current scope is block' do
|
88
|
+
before do
|
89
|
+
variable_table.push_scope(s(:block))
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'when a variable with the target name exists ' +
|
93
|
+
'in current scope' do
|
94
|
+
before do
|
95
|
+
variable_table.declare_variable(:foo, s(:lvasgn, :foo))
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'and does not exist in outer scope' do
|
99
|
+
it 'returns the current scope variable' do
|
100
|
+
found_variable = variable_table.find_variable(:foo)
|
101
|
+
expect(found_variable.name).to eq(:foo)
|
52
102
|
end
|
53
103
|
end
|
54
104
|
|
55
|
-
|
105
|
+
context 'and also exists in outer scope' do
|
56
106
|
before do
|
57
|
-
|
58
|
-
node = s(:def)
|
59
|
-
variable_table.push_scope(node)
|
60
|
-
end
|
107
|
+
variable_table.declare_variable(:bar, s(:lvasgn, :bar))
|
61
108
|
end
|
62
109
|
|
63
|
-
it '
|
64
|
-
|
65
|
-
|
110
|
+
it 'returns the current scope variable' do
|
111
|
+
found_variable = variable_table.find_variable(:bar)
|
112
|
+
expect(found_variable.name).to equal(:bar)
|
66
113
|
expect(variable_table.current_scope.variables)
|
67
|
-
.to
|
114
|
+
.to have_value(found_variable)
|
68
115
|
expect(variable_table.scope_stack[-2].variables)
|
69
|
-
.
|
70
|
-
variable = variable_table.current_scope.variables[:foo]
|
71
|
-
expect(variable.declaration_node).to equal(node)
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'returns the added variable' do
|
75
|
-
node = s(:lvasgn, :foo)
|
76
|
-
variable = variable_table.declare_variable(:foo, node)
|
77
|
-
expect(variable.declaration_node).to equal(node)
|
116
|
+
.not_to have_value(found_variable)
|
78
117
|
end
|
79
118
|
end
|
119
|
+
end
|
80
120
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
variable_table.declare_variable(:bar, s(:lvasgn, :bar))
|
121
|
+
context 'when a variable with the target name does not exist ' +
|
122
|
+
'in current scope' do
|
123
|
+
context 'but exists in the direct outer scope' do
|
124
|
+
it 'returns the direct outer scope variable' do
|
125
|
+
found_variable = variable_table.find_variable(:bar)
|
126
|
+
expect(found_variable.name).to equal(:bar)
|
88
127
|
end
|
128
|
+
end
|
89
129
|
|
90
|
-
|
130
|
+
context 'but exists in a indirect outer scope' do
|
131
|
+
context 'when the direct outer scope is block' do
|
91
132
|
before do
|
133
|
+
variable_table.pop_scope
|
134
|
+
variable_table.pop_scope
|
135
|
+
|
136
|
+
variable_table.push_scope(s(:block))
|
92
137
|
variable_table.push_scope(s(:block))
|
93
138
|
end
|
94
139
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
variable_table.declare_variable(:foo, s(:lvasgn, :foo))
|
99
|
-
end
|
100
|
-
|
101
|
-
context 'and does not exist in outer scope' do
|
102
|
-
it 'returns the current scope variable' do
|
103
|
-
found_variable = variable_table.find_variable(:foo)
|
104
|
-
expect(found_variable.name).to eq(:foo)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
context 'and also exists in outer scope' do
|
109
|
-
before do
|
110
|
-
variable_table.declare_variable(:bar, s(:lvasgn, :bar))
|
111
|
-
end
|
112
|
-
|
113
|
-
it 'returns the current scope variable' do
|
114
|
-
found_variable = variable_table.find_variable(:bar)
|
115
|
-
expect(found_variable.name).to equal(:bar)
|
116
|
-
expect(variable_table.current_scope.variables)
|
117
|
-
.to have_value(found_variable)
|
118
|
-
expect(variable_table.scope_stack[-2].variables)
|
119
|
-
.not_to have_value(found_variable)
|
120
|
-
end
|
121
|
-
end
|
140
|
+
it 'returns the indirect outer scope variable' do
|
141
|
+
found_variable = variable_table.find_variable(:baz)
|
142
|
+
expect(found_variable.name).to equal(:baz)
|
122
143
|
end
|
144
|
+
end
|
123
145
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
found_variable = variable_table.find_variable(:bar)
|
129
|
-
expect(found_variable.name).to equal(:bar)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
context 'but exists in a indirect outer scope' do
|
134
|
-
context 'when the direct outer scope is block' do
|
135
|
-
before do
|
136
|
-
variable_table.pop_scope
|
137
|
-
variable_table.pop_scope
|
138
|
-
|
139
|
-
variable_table.push_scope(s(:block))
|
140
|
-
variable_table.push_scope(s(:block))
|
141
|
-
end
|
142
|
-
|
143
|
-
it 'returns the indirect outer scope variable' do
|
144
|
-
found_variable = variable_table.find_variable(:baz)
|
145
|
-
expect(found_variable.name).to equal(:baz)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
context 'when the direct outer scope is not block' do
|
150
|
-
it 'returns nil' do
|
151
|
-
found_variable = variable_table.find_variable(:baz)
|
152
|
-
expect(found_variable).to be_nil
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
context 'and does not exist in all outer scopes' do
|
158
|
-
it 'returns nil' do
|
159
|
-
found_variable = variable_table.find_variable(:non)
|
160
|
-
expect(found_variable).to be_nil
|
161
|
-
end
|
162
|
-
end
|
146
|
+
context 'when the direct outer scope is not block' do
|
147
|
+
it 'returns nil' do
|
148
|
+
found_variable = variable_table.find_variable(:baz)
|
149
|
+
expect(found_variable).to be_nil
|
163
150
|
end
|
164
151
|
end
|
152
|
+
end
|
165
153
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
154
|
+
context 'and does not exist in all outer scopes' do
|
155
|
+
it 'returns nil' do
|
156
|
+
found_variable = variable_table.find_variable(:non)
|
157
|
+
expect(found_variable).to be_nil
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
170
162
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
end
|
176
|
-
|
177
|
-
context 'and does not exist in outer scope' do
|
178
|
-
it 'returns the current scope variable' do
|
179
|
-
found_variable = variable_table.find_variable(:foo)
|
180
|
-
expect(found_variable.name).to eq(:foo)
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
context 'and also exists in outer scope' do
|
185
|
-
it 'returns the current scope variable' do
|
186
|
-
found_variable = variable_table.find_variable(:foo)
|
187
|
-
expect(found_variable.name).to equal(:foo)
|
188
|
-
expect(variable_table.current_scope.variables)
|
189
|
-
.to have_value(found_variable)
|
190
|
-
expect(variable_table.scope_stack[-2].variables)
|
191
|
-
.not_to have_value(found_variable)
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
163
|
+
context 'when current scope is not block' do
|
164
|
+
before do
|
165
|
+
variable_table.push_scope(s(:def))
|
166
|
+
end
|
195
167
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
it 'returns nil' do
|
207
|
-
found_variable = variable_table.find_variable(:non)
|
208
|
-
expect(found_variable).to be_nil
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
168
|
+
context 'when a variable with the target name exists ' +
|
169
|
+
'in current scope' do
|
170
|
+
before do
|
171
|
+
variable_table.declare_variable(:foo, s(:lvasgn, :foo))
|
172
|
+
end
|
173
|
+
|
174
|
+
context 'and does not exist in outer scope' do
|
175
|
+
it 'returns the current scope variable' do
|
176
|
+
found_variable = variable_table.find_variable(:foo)
|
177
|
+
expect(found_variable.name).to eq(:foo)
|
212
178
|
end
|
213
179
|
end
|
214
180
|
|
215
|
-
|
216
|
-
|
217
|
-
variable_table.
|
181
|
+
context 'and also exists in outer scope' do
|
182
|
+
it 'returns the current scope variable' do
|
183
|
+
found_variable = variable_table.find_variable(:foo)
|
184
|
+
expect(found_variable.name).to equal(:foo)
|
185
|
+
expect(variable_table.current_scope.variables)
|
186
|
+
.to have_value(found_variable)
|
187
|
+
expect(variable_table.scope_stack[-2].variables)
|
188
|
+
.not_to have_value(found_variable)
|
218
189
|
end
|
190
|
+
end
|
191
|
+
end
|
219
192
|
|
220
|
-
|
221
|
-
|
193
|
+
context 'when a variable with the target name does not exist ' +
|
194
|
+
'in current scope' do
|
195
|
+
context 'but exists in the direct outer scope' do
|
196
|
+
it 'returns nil' do
|
197
|
+
found_variable = variable_table.find_variable(:bar)
|
198
|
+
expect(found_variable).to be_nil
|
222
199
|
end
|
200
|
+
end
|
223
201
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
202
|
+
context 'and does not exist in all outer scopes' do
|
203
|
+
it 'returns nil' do
|
204
|
+
found_variable = variable_table.find_variable(:non)
|
205
|
+
expect(found_variable).to be_nil
|
228
206
|
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
229
211
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
end
|
212
|
+
describe '#accessible_variables' do
|
213
|
+
let(:accessible_variable_names) do
|
214
|
+
variable_table.accessible_variables.map(&:name)
|
215
|
+
end
|
235
216
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
end
|
217
|
+
before do
|
218
|
+
variable_table.push_scope(s(:class))
|
219
|
+
end
|
240
220
|
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
221
|
+
context 'when there are no variables' do
|
222
|
+
it 'returns empty array' do
|
223
|
+
expect(variable_table.accessible_variables).to be_empty
|
224
|
+
end
|
225
|
+
end
|
245
226
|
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
end
|
257
|
-
end
|
227
|
+
context 'when the current scope has some variables' do
|
228
|
+
before do
|
229
|
+
variable_table.declare_variable(:foo, s(:lvasgn, :foo))
|
230
|
+
variable_table.declare_variable(:bar, s(:lvasgn, :bar))
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'returns all the variables' do
|
234
|
+
expect(accessible_variable_names).to match_array([:foo, :bar])
|
235
|
+
end
|
236
|
+
end
|
258
237
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
variable_table.declare_variable(:baz, s(:lvasgn, :baz))
|
264
|
-
end
|
238
|
+
context 'when the direct outer scope has some variables' do
|
239
|
+
before do
|
240
|
+
variable_table.declare_variable(:foo, s(:lvasgn, :foo))
|
241
|
+
end
|
265
242
|
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
243
|
+
context 'and the current scope is block' do
|
244
|
+
before do
|
245
|
+
variable_table.push_scope(s(:block))
|
246
|
+
variable_table.declare_variable(:bar, s(:lvasgn, :bar))
|
247
|
+
variable_table.declare_variable(:baz, s(:lvasgn, :baz))
|
248
|
+
end
|
249
|
+
|
250
|
+
it 'returns the current and direct outer scope variables' do
|
251
|
+
expect(accessible_variable_names)
|
252
|
+
.to match_array([:foo, :bar, :baz])
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
context 'and the current scope is not block' do
|
257
|
+
before do
|
258
|
+
variable_table.push_scope(s(:def))
|
259
|
+
variable_table.declare_variable(:bar, s(:lvasgn, :bar))
|
260
|
+
variable_table.declare_variable(:baz, s(:lvasgn, :baz))
|
261
|
+
end
|
262
|
+
|
263
|
+
it 'returns only the current scope variables' do
|
264
|
+
expect(accessible_variable_names).to match_array([:bar, :baz])
|
271
265
|
end
|
272
266
|
end
|
273
267
|
end
|