ripper_ruby_parser 0.0.8 → 1.0.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.
Files changed (31) hide show
  1. checksums.yaml +7 -0
  2. data/{README.rdoc → README.md} +17 -17
  3. data/Rakefile +3 -1
  4. data/lib/ripper_ruby_parser/{commenting_sexp_builder.rb → commenting_ripper_parser.rb} +22 -6
  5. data/lib/ripper_ruby_parser/parser.rb +3 -18
  6. data/lib/ripper_ruby_parser/sexp_handlers/arrays.rb +2 -1
  7. data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +6 -10
  8. data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +37 -60
  9. data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +31 -25
  10. data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +18 -8
  11. data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +22 -18
  12. data/lib/ripper_ruby_parser/sexp_handlers/loops.rb +12 -23
  13. data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +16 -8
  14. data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +41 -15
  15. data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +40 -23
  16. data/lib/ripper_ruby_parser/sexp_processor.rb +38 -19
  17. data/lib/ripper_ruby_parser/version.rb +1 -1
  18. data/test/pt_testcase/pt_test.rb +15 -1
  19. data/test/test_helper.rb +6 -3
  20. data/test/unit/commenting_ripper_parser_test.rb +121 -0
  21. data/test/unit/parser_assignment_test.rb +23 -24
  22. data/test/unit/parser_blocks_test.rb +207 -35
  23. data/test/unit/parser_conditionals_test.rb +251 -9
  24. data/test/unit/parser_literals_test.rb +348 -8
  25. data/test/unit/parser_loops_test.rb +20 -21
  26. data/test/unit/parser_method_calls_test.rb +132 -8
  27. data/test/unit/parser_operators_test.rb +97 -7
  28. data/test/unit/parser_test.rb +631 -1231
  29. data/test/unit/sexp_processor_test.rb +26 -28
  30. metadata +28 -38
  31. data/test/unit/commenting_sexp_builder_test.rb +0 -113
@@ -6,46 +6,45 @@ describe RipperRubyParser::Parser do
6
6
  it "works in the single-line postfix case" do
7
7
  "foo while bar".
8
8
  must_be_parsed_as s(:while,
9
- s(:call, nil, :bar, s(:arglist)),
10
- s(:call, nil, :foo, s(:arglist)), true)
9
+ s(:call, nil, :bar),
10
+ s(:call, nil, :foo), true)
11
11
  end
12
12
 
13
13
  it "works in the block postfix case" do
14
14
  "begin; foo; end while bar".
15
15
  must_be_parsed_as s(:while,
16
- s(:call, nil, :bar, s(:arglist)),
17
- s(:call, nil, :foo, s(:arglist)), false)
16
+ s(:call, nil, :bar),
17
+ s(:call, nil, :foo), false)
18
18
  end
19
19
 
20
- it "normalizes a negative condition" do
20
+ it "handles a negative condition" do
21
21
  "while not foo; bar; end".
22
- must_be_parsed_as s(:until,
23
- s(:call, nil, :foo, s(:arglist)),
24
- s(:call, nil, :bar, s(:arglist)), true)
22
+ must_be_parsed_as s(:while,
23
+ s(:call, s(:call, nil, :foo), :!),
24
+ s(:call, nil, :bar), true)
25
25
  end
26
26
 
27
- it "normalizes a negative condition in the postfix case" do
27
+ it "handles a negative condition in the postfix case" do
28
28
  "foo while not bar".
29
- must_be_parsed_as s(:until,
30
- s(:call, nil, :bar, s(:arglist)),
31
- s(:call, nil, :foo, s(:arglist)), true)
29
+ must_be_parsed_as s(:while,
30
+ s(:call, s(:call, nil, :bar), :!),
31
+ s(:call, nil, :foo), true)
32
32
  end
33
33
  end
34
34
 
35
35
  describe "for the until statement" do
36
- it "normalizes a negative condition" do
36
+ it "handles a negative condition" do
37
37
  "until not foo; bar; end".
38
- must_be_parsed_as s(:while,
39
- s(:call, nil, :foo, s(:arglist)),
40
- s(:call, nil, :bar, s(:arglist)), true)
41
-
38
+ must_be_parsed_as s(:until,
39
+ s(:call, s(:call, nil, :foo), :!),
40
+ s(:call, nil, :bar), true)
42
41
  end
43
42
 
44
- it "normalizes a negative condition in the postfix case" do
43
+ it "handles a negative condition in the postfix case" do
45
44
  "foo until not bar".
46
- must_be_parsed_as s(:while,
47
- s(:call, nil, :bar, s(:arglist)),
48
- s(:call, nil, :foo, s(:arglist)), true)
45
+ must_be_parsed_as s(:until,
46
+ s(:call, s(:call, nil, :bar), :!),
47
+ s(:call, nil, :foo), true)
49
48
  end
50
49
  end
51
50
  end
@@ -2,25 +2,149 @@ require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
2
2
 
3
3
  describe RipperRubyParser::Parser do
4
4
  describe "#parse" do
5
+ describe "for method calls" do
6
+ describe "without a receiver" do
7
+ it "works without brackets" do
8
+ "foo bar".
9
+ must_be_parsed_as s(:call, nil, :foo,
10
+ s(:call, nil, :bar))
11
+ end
12
+
13
+ it "works with brackets" do
14
+ "foo(bar)".
15
+ must_be_parsed_as s(:call, nil, :foo,
16
+ s(:call, nil, :bar))
17
+ end
18
+
19
+ it "works with an empty parameter list and no brackets" do
20
+ "foo".
21
+ must_be_parsed_as s(:call, nil, :foo)
22
+ end
23
+
24
+ it "works with brackets around an empty parameter list" do
25
+ "foo()".
26
+ must_be_parsed_as s(:call, nil, :foo)
27
+ end
28
+
29
+ it "works for methods ending in a question mark" do
30
+ "foo?".
31
+ must_be_parsed_as s(:call, nil, :foo?)
32
+ end
33
+
34
+ it "works with nested calls without brackets" do
35
+ "foo bar baz".
36
+ must_be_parsed_as s(:call, nil, :foo,
37
+ s(:call, nil, :bar,
38
+ s(:call, nil, :baz)))
39
+ end
40
+
41
+ it "works with a non-final splat argument" do
42
+ "foo(bar, *baz, qux)".
43
+ must_be_parsed_as s(:call,
44
+ nil,
45
+ :foo,
46
+ s(:call, nil, :bar),
47
+ s(:splat, s(:call, nil, :baz)),
48
+ s(:call, nil, :qux))
49
+ end
50
+
51
+ it "works with a splat argument followed by several regular arguments" do
52
+ "foo(bar, *baz, qux, quuz)".
53
+ must_be_parsed_as s(:call,
54
+ nil,
55
+ :foo,
56
+ s(:call, nil, :bar),
57
+ s(:splat, s(:call, nil, :baz)),
58
+ s(:call, nil, :qux),
59
+ s(:call, nil, :quuz))
60
+ end
61
+ end
62
+
63
+ describe "with a receiver" do
64
+ it "works without brackets" do
65
+ "foo.bar baz".
66
+ must_be_parsed_as s(:call,
67
+ s(:call, nil, :foo),
68
+ :bar,
69
+ s(:call, nil, :baz))
70
+ end
71
+
72
+ it "works with brackets" do
73
+ "foo.bar(baz)".
74
+ must_be_parsed_as s(:call,
75
+ s(:call, nil, :foo),
76
+ :bar,
77
+ s(:call, nil, :baz))
78
+ end
79
+
80
+ it "works with brackets around a call with no brackets" do
81
+ "foo.bar(baz qux)".
82
+ must_be_parsed_as s(:call,
83
+ s(:call, nil, :foo),
84
+ :bar,
85
+ s(:call, nil, :baz,
86
+ s(:call, nil, :qux)))
87
+ end
88
+
89
+ it "works with nested calls without brackets" do
90
+ "foo.bar baz qux".
91
+ must_be_parsed_as s(:call,
92
+ s(:call, nil, :foo),
93
+ :bar,
94
+ s(:call, nil, :baz,
95
+ s(:call, nil, :qux)))
96
+ end
97
+ end
98
+
99
+ describe "with blocks" do
100
+ it "works for a do block" do
101
+ "foo.bar do baz; end".
102
+ must_be_parsed_as s(:iter,
103
+ s(:call,
104
+ s(:call, nil, :foo),
105
+ :bar),
106
+ s(:args),
107
+ s(:call, nil, :baz))
108
+ end
109
+
110
+ it "works for a do block with several statements" do
111
+ "foo.bar do baz; qux; end".
112
+ must_be_parsed_as s(:iter,
113
+ s(:call,
114
+ s(:call, nil, :foo),
115
+ :bar),
116
+ s(:args),
117
+ s(:block,
118
+ s(:call, nil, :baz),
119
+ s(:call, nil, :qux)))
120
+ end
121
+ end
122
+ end
123
+
5
124
  describe "for calls to super" do
6
125
  specify { "super".must_be_parsed_as s(:zsuper) }
7
126
  specify { "super foo".must_be_parsed_as s(:super,
8
- s(:call, nil, :foo, s(:arglist))) }
127
+ s(:call, nil, :foo)) }
9
128
  specify {
10
129
  "super foo, bar".must_be_parsed_as s(:super,
11
- s(:call, nil, :foo, s(:arglist)),
12
- s(:call, nil, :bar, s(:arglist))) }
130
+ s(:call, nil, :foo),
131
+ s(:call, nil, :bar)) }
13
132
  specify {
14
133
  "super foo, *bar".must_be_parsed_as s(:super,
15
- s(:call, nil, :foo, s(:arglist)),
134
+ s(:call, nil, :foo),
16
135
  s(:splat,
17
- s(:call, nil, :bar, s(:arglist)))) }
136
+ s(:call, nil, :bar))) }
18
137
  specify {
19
138
  "super foo, *bar, &baz".
20
139
  must_be_parsed_as s(:super,
21
- s(:call, nil, :foo, s(:arglist)),
22
- s(:splat, s(:call, nil, :bar, s(:arglist))),
23
- s(:block_pass, s(:call, nil, :baz, s(:arglist)))) }
140
+ s(:call, nil, :foo),
141
+ s(:splat, s(:call, nil, :bar)),
142
+ s(:block_pass, s(:call, nil, :baz))) }
143
+ end
144
+
145
+ it "handles calling a proc" do
146
+ "foo.()".
147
+ must_be_parsed_as s(:call, s(:call, nil, :foo), :call)
24
148
  end
25
149
  end
26
150
  end
@@ -6,23 +6,113 @@ describe RipperRubyParser::Parser do
6
6
  specify do
7
7
  "foo !~ bar".must_be_parsed_as s(:not,
8
8
  s(:call,
9
- s(:call, nil, :foo, s(:arglist)),
9
+ s(:call, nil, :foo),
10
10
  :=~,
11
- s(:arglist,
12
- s(:call, nil, :bar, s(:arglist)))))
11
+ s(:call, nil, :bar)))
13
12
  end
14
13
  end
15
14
 
16
15
  describe "for boolean operators" do
16
+ it "handles :and" do
17
+ "foo and bar".
18
+ must_be_parsed_as s(:and,
19
+ s(:call, nil, :foo),
20
+ s(:call, nil, :bar))
21
+ end
22
+
23
+ it "handles double :and" do
24
+ "foo and bar and baz".
25
+ must_be_parsed_as s(:and,
26
+ s(:call, nil, :foo),
27
+ s(:and,
28
+ s(:call, nil, :bar),
29
+ s(:call, nil, :baz)))
30
+ end
31
+
32
+ it "handles :or" do
33
+ "foo or bar".
34
+ must_be_parsed_as s(:or,
35
+ s(:call, nil, :foo),
36
+ s(:call, nil, :bar))
37
+ end
38
+
39
+ it "handles double :or" do
40
+ "foo or bar or baz".
41
+ must_be_parsed_as s(:or,
42
+ s(:call, nil, :foo),
43
+ s(:or,
44
+ s(:call, nil, :bar),
45
+ s(:call, nil, :baz)))
46
+ end
47
+
48
+ it "handles :or after :and" do
49
+ "foo and bar or baz".
50
+ must_be_parsed_as s(:or,
51
+ s(:and,
52
+ s(:call, nil, :foo),
53
+ s(:call, nil, :bar)),
54
+ s(:call, nil, :baz))
55
+ end
56
+
57
+ it "handles :and after :or" do
58
+ "foo or bar and baz".
59
+ must_be_parsed_as s(:and,
60
+ s(:or,
61
+ s(:call, nil, :foo),
62
+ s(:call, nil, :bar)),
63
+ s(:call, nil, :baz))
64
+ end
65
+
66
+ it "converts :&& to :and" do
67
+ "foo && bar".
68
+ must_be_parsed_as s(:and,
69
+ s(:call, nil, :foo),
70
+ s(:call, nil, :bar))
71
+ end
72
+
73
+ it "handles :|| after :&&" do
74
+ "foo && bar || baz".
75
+ must_be_parsed_as s(:or,
76
+ s(:and,
77
+ s(:call, nil, :foo),
78
+ s(:call, nil, :bar)),
79
+ s(:call, nil, :baz))
80
+ end
81
+
82
+ it "handles :&& after :||" do
83
+ "foo || bar && baz".
84
+ must_be_parsed_as s(:or,
85
+ s(:call, nil, :foo),
86
+ s(:and,
87
+ s(:call, nil, :bar),
88
+ s(:call, nil, :baz)))
89
+ end
90
+
91
+ it "handles bracketed :||" do
92
+ "(foo || bar) || baz".
93
+ must_be_parsed_as s(:or,
94
+ s(:or,
95
+ s(:call, nil, :foo),
96
+ s(:call, nil, :bar)),
97
+ s(:call, nil, :baz))
98
+ end
99
+
100
+ it "converts :|| to :or" do
101
+ "foo || bar".
102
+ must_be_parsed_as s(:or,
103
+ s(:call, nil, :foo),
104
+ s(:call, nil, :bar))
105
+ end
106
+
17
107
  it "handles triple :and" do
18
108
  "foo and bar and baz and qux".
19
109
  must_be_parsed_as s(:and,
20
- s(:call, nil, :foo, s(:arglist)),
110
+ s(:call, nil, :foo),
21
111
  s(:and,
22
- s(:call, nil, :bar, s(:arglist)),
112
+ s(:call, nil, :bar),
23
113
  s(:and,
24
- s(:call, nil, :baz, s(:arglist)),
25
- s(:call, nil, :qux, s(:arglist)))))
114
+ s(:call, nil, :baz),
115
+ s(:call, nil, :qux))))
26
116
  end
27
117
  end
28
118
  end
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
2
3
 
3
4
  describe RipperRubyParser::Parser do
@@ -29,1127 +30,543 @@ describe RipperRubyParser::Parser do
29
30
 
30
31
  describe "for a class declaration" do
31
32
  it "works with a namespaced class name" do
32
- result = parser.parse "class Foo::Bar; end"
33
- result.must_equal s(:class,
34
- s(:colon2, s(:const, :Foo), :Bar),
35
- nil,
36
- s(:scope))
33
+ "class Foo::Bar; end".
34
+ must_be_parsed_as s(:class,
35
+ s(:colon2, s(:const, :Foo), :Bar),
36
+ nil)
37
37
  end
38
38
 
39
39
  it "works for singleton classes" do
40
- "class << self; end".must_be_parsed_as s(:sclass, s(:self), s(:scope))
40
+ "class << self; end".must_be_parsed_as s(:sclass, s(:self))
41
41
  end
42
42
  end
43
43
 
44
44
  describe "for a module declaration" do
45
45
  it "works with a namespaced module name" do
46
- result = parser.parse "module Foo::Bar; end"
47
- result.must_equal s(:module,
48
- s(:colon2, s(:const, :Foo), :Bar),
49
- s(:scope))
50
- end
51
- end
52
-
53
- describe "for if" do
54
- it "works in the postfix case" do
55
- result = parser.parse "foo if bar"
56
- result.must_equal s(:if,
57
- s(:call, nil, :bar, s(:arglist)),
58
- s(:call, nil, :foo, s(:arglist)),
59
- nil)
60
- end
61
-
62
- it "works in the block case" do
63
- result = parser.parse "if foo; bar; end"
64
- result.must_equal s(:if,
65
- s(:call, nil, :foo, s(:arglist)),
66
- s(:call, nil, :bar, s(:arglist)),
67
- nil)
68
- end
69
-
70
- it "works with an else clause" do
71
- result = parser.parse "if foo; bar; else; baz; end"
72
- result.must_equal s(:if,
73
- s(:call, nil, :foo, s(:arglist)),
74
- s(:call, nil, :bar, s(:arglist)),
75
- s(:call, nil, :baz, s(:arglist)))
76
- end
77
-
78
- it "works with an elsif clause" do
79
- result = parser.parse "if foo; bar; elsif baz; qux; end"
80
- result.must_equal s(:if,
81
- s(:call, nil, :foo, s(:arglist)),
82
- s(:call, nil, :bar, s(:arglist)),
83
- s(:if,
84
- s(:call, nil, :baz, s(:arglist)),
85
- s(:call, nil, :qux, s(:arglist)),
86
- nil))
87
- end
88
-
89
- it "handles a negative condition correctly" do
90
- result = parser.parse "if not foo; bar; end"
91
- result.must_equal s(:if,
92
- s(:call, nil, :foo, s(:arglist)),
93
- nil,
94
- s(:call, nil, :bar, s(:arglist)))
95
- end
96
-
97
- it "handles a negative condition in elsif correctly" do
98
- result = parser.parse "if foo; bar; elsif not baz; qux; end"
99
- result.must_equal s(:if,
100
- s(:call, nil, :foo, s(:arglist)),
101
- s(:call, nil, :bar, s(:arglist)),
102
- s(:if,
103
- s(:not, s(:call, nil, :baz, s(:arglist))),
104
- s(:call, nil, :qux, s(:arglist)), nil))
105
- end
106
- end
107
-
108
- describe "for unless" do
109
- it "works in the postfix case" do
110
- result = parser.parse "foo unless bar"
111
- result.must_equal s(:if,
112
- s(:call, nil, :bar, s(:arglist)),
113
- nil,
114
- s(:call, nil, :foo, s(:arglist)))
115
- end
116
-
117
- it "works in the block case" do
118
- result = parser.parse "unless bar; foo; end"
119
- result.must_equal s(:if,
120
- s(:call, nil, :bar, s(:arglist)),
121
- nil,
122
- s(:call, nil, :foo, s(:arglist)))
123
- end
124
-
125
- it "works with an else clause" do
126
- result = parser.parse "unless foo; bar; else; baz; end"
127
- result.must_equal s(:if,
128
- s(:call, nil, :foo, s(:arglist)),
129
- s(:call, nil, :baz, s(:arglist)),
130
- s(:call, nil, :bar, s(:arglist)))
46
+ "module Foo::Bar; end".
47
+ must_be_parsed_as s(:module,
48
+ s(:colon2, s(:const, :Foo), :Bar))
131
49
  end
132
50
  end
133
51
 
134
- describe "for a case block" do
135
- it "works with a single when clause" do
136
- result = parser.parse "case foo; when bar; baz; end"
137
- result.must_equal s(:case,
138
- s(:call, nil, :foo, s(:arglist)),
139
- s(:when,
140
- s(:array, s(:call, nil, :bar, s(:arglist))),
141
- s(:call, nil, :baz, s(:arglist))),
142
- nil)
143
- end
144
-
145
- it "works with multiple when clauses" do
146
- result = parser.parse "case foo; when bar; baz; when qux; quux; end"
147
- result.must_equal s(:case,
148
- s(:call, nil, :foo, s(:arglist)),
149
- s(:when,
150
- s(:array, s(:call, nil, :bar, s(:arglist))),
151
- s(:call, nil, :baz, s(:arglist))),
152
- s(:when,
153
- s(:array, s(:call, nil, :qux, s(:arglist))),
154
- s(:call, nil, :quux, s(:arglist))),
155
- nil)
156
- end
157
-
158
- it "works with multiple statements in the when block" do
159
- result = parser.parse "case foo; when bar; baz; qux; end"
160
- result.must_equal s(:case,
161
- s(:call, nil, :foo, s(:arglist)),
162
- s(:when,
163
- s(:array, s(:call, nil, :bar, s(:arglist))),
164
- s(:block,
165
- s(:call, nil, :baz, s(:arglist)),
166
- s(:call, nil, :qux, s(:arglist)))),
167
- nil)
168
- end
169
-
170
- it "works with an else clause" do
171
- result = parser.parse "case foo; when bar; baz; else; qux; end"
172
- result.must_equal s(:case,
173
- s(:call, nil, :foo, s(:arglist)),
174
- s(:when,
175
- s(:array, s(:call, nil, :bar, s(:arglist))),
176
- s(:call, nil, :baz, s(:arglist))),
177
- s(:call, nil, :qux, s(:arglist)))
52
+ describe "for empty brackets" do
53
+ it "works with lone ()" do
54
+ "()".must_be_parsed_as s(:nil)
178
55
  end
179
56
  end
180
57
 
181
58
  describe "for the return statement" do
182
59
  it "works with no arguments" do
183
- result = parser.parse "return"
184
- result.must_equal s(:return)
60
+ "return".
61
+ must_be_parsed_as s(:return)
185
62
  end
186
63
 
187
64
  it "works with one argument" do
188
- result = parser.parse "return foo"
189
- result.must_equal s(:return,
190
- s(:call, nil, :foo, s(:arglist)))
65
+ "return foo".
66
+ must_be_parsed_as s(:return,
67
+ s(:call, nil, :foo))
191
68
  end
192
69
 
193
70
  it "works with a splat argument" do
194
- result = parser.parse "return *foo"
195
- result.must_equal s(:return,
196
- s(:svalue,
197
- s(:splat,
198
- s(:call, nil, :foo, s(:arglist)))))
71
+ "return *foo".
72
+ must_be_parsed_as s(:return,
73
+ s(:svalue,
74
+ s(:splat,
75
+ s(:call, nil, :foo))))
199
76
  end
200
77
 
201
78
  it "works with multiple arguments" do
202
- result = parser.parse "return foo, bar"
203
- result.must_equal s(:return,
204
- s(:array,
205
- s(:call, nil, :foo, s(:arglist)),
206
- s(:call, nil, :bar, s(:arglist))))
79
+ "return foo, bar".
80
+ must_be_parsed_as s(:return,
81
+ s(:array,
82
+ s(:call, nil, :foo),
83
+ s(:call, nil, :bar)))
207
84
  end
208
85
 
209
86
  it "works with a regular argument and a splat argument" do
210
- result = parser.parse "return foo, *bar"
211
- result.must_equal s(:return,
212
- s(:array,
213
- s(:call, nil, :foo, s(:arglist)),
214
- s(:splat,
215
- s(:call, nil, :bar, s(:arglist)))))
87
+ "return foo, *bar".
88
+ must_be_parsed_as s(:return,
89
+ s(:array,
90
+ s(:call, nil, :foo),
91
+ s(:splat,
92
+ s(:call, nil, :bar))))
216
93
  end
217
94
  end
218
95
 
219
96
  describe "for the until statement" do
220
97
  it "works in the prefix block case with do" do
221
- result = parser.parse "until foo do; bar; end"
222
- result.must_equal s(:until,
223
- s(:call, nil, :foo, s(:arglist)),
224
- s(:call, nil, :bar, s(:arglist)), true)
98
+ "until foo do; bar; end".
99
+ must_be_parsed_as s(:until,
100
+ s(:call, nil, :foo),
101
+ s(:call, nil, :bar), true)
225
102
  end
226
103
 
227
104
  it "works in the prefix block case without do" do
228
- result = parser.parse "until foo; bar; end"
229
- result.must_equal s(:until,
230
- s(:call, nil, :foo, s(:arglist)),
231
- s(:call, nil, :bar, s(:arglist)), true)
105
+ "until foo; bar; end".
106
+ must_be_parsed_as s(:until,
107
+ s(:call, nil, :foo),
108
+ s(:call, nil, :bar), true)
232
109
  end
233
110
 
234
111
  it "works in the single-line postfix case" do
235
- result = parser.parse "foo until bar"
236
- result.must_equal s(:until,
237
- s(:call, nil, :bar, s(:arglist)),
238
- s(:call, nil, :foo, s(:arglist)), true)
112
+ "foo until bar".
113
+ must_be_parsed_as s(:until,
114
+ s(:call, nil, :bar),
115
+ s(:call, nil, :foo), true)
239
116
  end
240
117
 
241
118
  it "works in the block postfix case" do
242
- result = parser.parse "begin; foo; end until bar"
243
- result.must_equal s(:until,
244
- s(:call, nil, :bar, s(:arglist)),
245
- s(:call, nil, :foo, s(:arglist)), false)
119
+ "begin; foo; end until bar".
120
+ must_be_parsed_as s(:until,
121
+ s(:call, nil, :bar),
122
+ s(:call, nil, :foo), false)
246
123
  end
247
124
  end
248
125
 
249
126
  describe "for the while statement" do
250
127
  it "works with do" do
251
- result = parser.parse "while foo do; bar; end"
252
- result.must_equal s(:while,
253
- s(:call, nil, :foo, s(:arglist)),
254
- s(:call, nil, :bar, s(:arglist)), true)
128
+ "while foo do; bar; end".
129
+ must_be_parsed_as s(:while,
130
+ s(:call, nil, :foo),
131
+ s(:call, nil, :bar), true)
255
132
  end
256
133
 
257
134
  it "works without do" do
258
- result = parser.parse "while foo; bar; end"
259
- result.must_equal s(:while,
260
- s(:call, nil, :foo, s(:arglist)),
261
- s(:call, nil, :bar, s(:arglist)), true)
135
+ "while foo; bar; end".
136
+ must_be_parsed_as s(:while,
137
+ s(:call, nil, :foo),
138
+ s(:call, nil, :bar), true)
262
139
  end
263
140
  end
264
141
 
265
142
  describe "for the for statement" do
266
143
  it "works with do" do
267
- result = parser.parse "for foo in bar do; baz; end"
268
- result.must_equal s(:for,
269
- s(:call, nil, :bar, s(:arglist)),
270
- s(:lasgn, :foo),
271
- s(:call, nil, :baz, s(:arglist)))
144
+ "for foo in bar do; baz; end".
145
+ must_be_parsed_as s(:for,
146
+ s(:call, nil, :bar),
147
+ s(:lasgn, :foo),
148
+ s(:call, nil, :baz))
272
149
  end
273
150
 
274
151
  it "works without do" do
275
- result = parser.parse "for foo in bar; baz; end"
276
- result.must_equal s(:for,
277
- s(:call, nil, :bar, s(:arglist)),
278
- s(:lasgn, :foo),
279
- s(:call, nil, :baz, s(:arglist)))
152
+ "for foo in bar; baz; end".
153
+ must_be_parsed_as s(:for,
154
+ s(:call, nil, :bar),
155
+ s(:lasgn, :foo),
156
+ s(:call, nil, :baz))
157
+ end
158
+
159
+ it "works with an empty body" do
160
+ "for foo in bar; end".
161
+ must_be_parsed_as s(:for,
162
+ s(:call, nil, :bar),
163
+ s(:lasgn, :foo))
280
164
  end
281
165
  end
282
166
 
283
167
  describe "for a begin..end block" do
284
168
  it "works with no statements" do
285
- result = parser.parse "begin; end"
286
- result.must_equal s(:nil)
169
+ "begin; end".
170
+ must_be_parsed_as s(:nil)
287
171
  end
288
172
 
289
173
  it "works with one statement" do
290
- result = parser.parse "begin; foo; end"
291
- result.must_equal s(:call, nil, :foo, s(:arglist))
174
+ "begin; foo; end".
175
+ must_be_parsed_as s(:call, nil, :foo)
292
176
  end
293
177
 
294
178
  it "works with multiple statements" do
295
- result = parser.parse "begin; foo; bar; end"
296
- result.must_equal s(:block,
297
- s(:call, nil, :foo, s(:arglist)),
298
- s(:call, nil, :bar, s(:arglist)))
299
- end
300
- end
301
-
302
- describe "for the rescue statement" do
303
- it "works with empty main and rescue bodies" do
304
- result = parser.parse "begin; rescue; end"
305
- result.must_equal s(:rescue,
306
- s(:resbody, s(:array), nil))
307
- end
308
-
309
- it "works with single statement main and rescue bodies" do
310
- result = parser.parse "begin; foo; rescue; bar; end"
311
- result.must_equal s(:rescue,
312
- s(:call, nil, :foo, s(:arglist)),
313
- s(:resbody,
314
- s(:array),
315
- s(:call, nil, :bar, s(:arglist))))
316
- end
317
-
318
- it "works with multi-statement main and rescue bodies" do
319
- result = parser.parse "begin; foo; bar; rescue; baz; qux; end"
320
- result.must_equal s(:rescue,
321
- s(:block,
322
- s(:call, nil, :foo, s(:arglist)),
323
- s(:call, nil, :bar, s(:arglist))),
324
- s(:resbody,
325
- s(:array),
326
- s(:block,
327
- s(:call, nil, :baz, s(:arglist)),
328
- s(:call, nil, :qux, s(:arglist)))))
329
- end
330
-
331
- it "works with assignment to an error variable" do
332
- result = parser.parse "begin; foo; rescue => e; bar; end"
333
- result.must_equal s(:rescue,
334
- s(:call, nil, :foo, s(:arglist)),
335
- s(:resbody,
336
- s(:array, s(:lasgn, :e, s(:gvar, :$!))),
337
- s(:call, nil, :bar, s(:arglist))))
338
- end
339
-
340
- it "works with filtering of the exception type" do
341
- result = parser.parse "begin; foo; rescue Bar; baz; end"
342
- result.must_equal s(:rescue,
343
- s(:call, nil, :foo, s(:arglist)),
344
- s(:resbody,
345
- s(:array, s(:const, :Bar)),
346
- s(:call, nil, :baz, s(:arglist))))
347
- end
348
-
349
- it "works with filtering of the exception type and assignment to an error variable" do
350
- result = parser.parse "begin; foo; rescue Bar => e; baz; end"
351
- result.must_equal s(:rescue,
352
- s(:call, nil, :foo, s(:arglist)),
353
- s(:resbody,
354
- s(:array,
355
- s(:const, :Bar),
356
- s(:lasgn, :e, s(:gvar, :$!))),
357
- s(:call, nil, :baz, s(:arglist))))
358
- end
359
-
360
- it "works rescuing multiple exception types" do
361
- result = parser.parse "begin; foo; rescue Bar, Baz; qux; end"
362
- result.must_equal s(:rescue,
363
- s(:call, nil, :foo, s(:arglist)),
364
- s(:resbody,
365
- s(:array, s(:const, :Bar), s(:const, :Baz)),
366
- s(:call, nil, :qux, s(:arglist))))
367
- end
368
-
369
- it "works in the postfix case" do
370
- result = parser.parse "foo rescue bar"
371
- result.must_equal s(:rescue,
372
- s(:call, nil, :foo, s(:arglist)),
373
- s(:resbody,
374
- s(:array),
375
- s(:call, nil, :bar, s(:arglist))))
376
- end
377
-
378
- it "works in a plain method body" do
379
- result = parser.parse "def foo; bar; rescue; baz; end"
380
- result.must_equal s(:defn,
381
- :foo,
382
- s(:args),
383
- s(:scope,
384
- s(:block,
385
- s(:rescue,
386
- s(:call, nil, :bar, s(:arglist)),
387
- s(:resbody,
388
- s(:array),
389
- s(:call, nil, :baz, s(:arglist)))))))
390
- end
391
- end
392
-
393
- describe "for the ensure statement" do
394
- it "works with single statement main and ensure bodies" do
395
- result = parser.parse "begin; foo; ensure; bar; end"
396
- result.must_equal s(:ensure,
397
- s(:call, nil, :foo, s(:arglist)),
398
- s(:call, nil, :bar, s(:arglist)))
399
- end
400
-
401
- it "works with multi-statement main and ensure bodies" do
402
- result = parser.parse "begin; foo; bar; ensure; baz; qux; end"
403
- result.must_equal s(:ensure,
404
- s(:block,
405
- s(:call, nil, :foo, s(:arglist)),
406
- s(:call, nil, :bar, s(:arglist))),
407
- s(:block,
408
- s(:call, nil, :baz, s(:arglist)),
409
- s(:call, nil, :qux, s(:arglist))))
410
- end
411
-
412
- it "works together with rescue" do
413
- result = parser.parse "begin; foo; rescue; bar; ensure; baz; end"
414
- result.must_equal s(:ensure,
415
- s(:rescue,
416
- s(:call, nil, :foo, s(:arglist)),
417
- s(:resbody,
418
- s(:array),
419
- s(:call, nil, :bar, s(:arglist)))),
420
- s(:call, nil, :baz, s(:arglist)))
179
+ "begin; foo; bar; end".
180
+ must_be_parsed_as s(:block,
181
+ s(:call, nil, :foo),
182
+ s(:call, nil, :bar))
421
183
  end
422
184
  end
423
185
 
424
186
  describe "for the undef statement" do
425
187
  it "works with a single bareword identifier" do
426
- result = parser.parse "undef foo"
427
- result.must_equal s(:undef, s(:lit, :foo))
188
+ "undef foo".
189
+ must_be_parsed_as s(:undef, s(:lit, :foo))
428
190
  end
429
191
 
430
192
  it "works with a single symbol" do
431
- result = parser.parse "undef :foo"
432
- result.must_equal s(:undef, s(:lit, :foo))
193
+ "undef :foo".
194
+ must_be_parsed_as s(:undef, s(:lit, :foo))
433
195
  end
434
196
 
435
197
  it "works with multiple bareword identifiers" do
436
- result = parser.parse "undef foo, bar"
437
- result.must_equal s(:block,
438
- s(:undef, s(:lit, :foo)),
439
- s(:undef, s(:lit, :bar)))
198
+ "undef foo, bar".
199
+ must_be_parsed_as s(:block,
200
+ s(:undef, s(:lit, :foo)),
201
+ s(:undef, s(:lit, :bar)))
440
202
  end
441
203
 
442
204
  it "works with multiple bareword symbols" do
443
- result = parser.parse "undef :foo, :bar"
444
- result.must_equal s(:block,
445
- s(:undef, s(:lit, :foo)),
446
- s(:undef, s(:lit, :bar)))
205
+ "undef :foo, :bar".
206
+ must_be_parsed_as s(:block,
207
+ s(:undef, s(:lit, :foo)),
208
+ s(:undef, s(:lit, :bar)))
447
209
  end
448
210
  end
449
211
 
450
212
  describe "for the alias statement" do
451
213
  it "works with regular barewords" do
452
- result = parser.parse "alias foo bar"
453
- result.must_equal s(:alias,
454
- s(:lit, :foo), s(:lit, :bar))
214
+ "alias foo bar".
215
+ must_be_parsed_as s(:alias,
216
+ s(:lit, :foo), s(:lit, :bar))
455
217
  end
456
218
 
457
219
  it "works with symbols" do
458
- result = parser.parse "alias :foo :bar"
459
- result.must_equal s(:alias,
460
- s(:lit, :foo), s(:lit, :bar))
220
+ "alias :foo :bar".
221
+ must_be_parsed_as s(:alias,
222
+ s(:lit, :foo), s(:lit, :bar))
461
223
  end
462
224
 
463
225
  it "works with operator barewords" do
464
- result = parser.parse "alias + -"
465
- result.must_equal s(:alias,
466
- s(:lit, :+), s(:lit, :-))
226
+ "alias + -".
227
+ must_be_parsed_as s(:alias,
228
+ s(:lit, :+), s(:lit, :-))
229
+ end
230
+
231
+ it "works with global variables" do
232
+ "alias $foo $bar".
233
+ must_be_parsed_as s(:valias, :$foo, :$bar)
467
234
  end
468
235
  end
469
236
 
470
237
  describe "for arguments" do
471
238
  it "works for a simple case with splat" do
472
- result = parser.parse "foo *bar"
473
- result.must_equal s(:call,
474
- nil,
475
- :foo,
476
- s(:arglist,
477
- s(:splat, s(:call, nil, :bar, s(:arglist)))))
239
+ "foo *bar".
240
+ must_be_parsed_as s(:call,
241
+ nil,
242
+ :foo,
243
+ s(:splat, s(:call, nil, :bar)))
478
244
  end
479
245
 
480
246
  it "works for a multi-argument case with splat" do
481
- result = parser.parse "foo bar, *baz"
482
- result.must_equal s(:call,
483
- nil,
484
- :foo,
485
- s(:arglist,
486
- s(:call, nil, :bar, s(:arglist)),
487
- s(:splat, s(:call, nil, :baz, s(:arglist)))))
247
+ "foo bar, *baz".
248
+ must_be_parsed_as s(:call,
249
+ nil,
250
+ :foo,
251
+ s(:call, nil, :bar),
252
+ s(:splat, s(:call, nil, :baz)))
488
253
  end
489
254
 
490
255
  it "works for a simple case passing a block" do
491
- result = parser.parse "foo &bar"
492
- result.must_equal s(:call, nil, :foo,
493
- s(:arglist,
256
+ "foo &bar".
257
+ must_be_parsed_as s(:call, nil, :foo,
494
258
  s(:block_pass,
495
- s(:call, nil, :bar, s(:arglist)))))
259
+ s(:call, nil, :bar)))
496
260
  end
497
261
 
498
262
  it "works for a bare hash" do
499
- result = parser.parse "foo bar => baz"
500
- result.must_equal s(:call, nil, :foo,
501
- s(:arglist,
263
+ "foo bar => baz".
264
+ must_be_parsed_as s(:call, nil, :foo,
502
265
  s(:hash,
503
- s(:call, nil, :bar, s(:arglist)),
504
- s(:call, nil, :baz, s(:arglist)))))
505
- end
506
- end
507
-
508
- describe "for array literals" do
509
- it "works for an empty array" do
510
- result = parser.parse "[]"
511
- result.must_equal s(:array)
512
- end
513
-
514
- it "works for a simple case with splat" do
515
- result = parser.parse "[*foo]"
516
- result.must_equal s(:array,
517
- s(:splat, s(:call, nil, :foo, s(:arglist))))
518
- end
519
-
520
- it "works for a multi-element case with splat" do
521
- result = parser.parse "[foo, *bar]"
522
- result.must_equal s(:array,
523
- s(:call, nil, :foo, s(:arglist)),
524
- s(:splat, s(:call, nil, :bar, s(:arglist))))
525
- end
526
-
527
- it "works for an array created with %W" do
528
- result = parser.parse "%W(foo bar)"
529
- result.must_equal s(:array, s(:str, "foo"), s(:str, "bar"))
530
- end
531
- end
532
-
533
- describe "for hash literals" do
534
- it "works for an empty hash" do
535
- result = parser.parse "{}"
536
- result.must_equal s(:hash)
537
- end
538
-
539
- it "works for a hash with one pair" do
540
- result = parser.parse "{foo => bar}"
541
- result.must_equal s(:hash,
542
- s(:call, nil, :foo, s(:arglist)),
543
- s(:call, nil, :bar, s(:arglist)))
544
- end
545
-
546
- it "works for a hash with multiple pairs" do
547
- result = parser.parse "{foo => bar, baz => qux}"
548
- result.must_equal s(:hash,
549
- s(:call, nil, :foo, s(:arglist)),
550
- s(:call, nil, :bar, s(:arglist)),
551
- s(:call, nil, :baz, s(:arglist)),
552
- s(:call, nil, :qux, s(:arglist)))
553
- end
554
-
555
- it "works for a hash with label keys (Ruby 1.9 only)" do
556
- result = parser.parse "{foo: bar, baz: qux}"
557
- result.must_equal s(:hash,
558
- s(:lit, :foo),
559
- s(:call, nil, :bar, s(:arglist)),
560
- s(:lit, :baz),
561
- s(:call, nil, :qux, s(:arglist)))
562
- end
563
- end
564
-
565
- describe "for number literals" do
566
- it "works for floats" do
567
- result = parser.parse "3.14"
568
- result.must_equal s(:lit, 3.14)
569
- end
570
-
571
- it "works for octal integer literals" do
572
- result = parser.parse "0700"
573
- result.must_equal s(:lit, 448)
266
+ s(:call, nil, :bar),
267
+ s(:call, nil, :baz)))
574
268
  end
575
269
  end
576
270
 
577
271
  describe "for collection indexing" do
578
272
  it "works in the simple case" do
579
- result = parser.parse "foo[bar]"
580
- result.must_equal s(:call,
581
- s(:call, nil, :foo, s(:arglist)),
582
- :[],
583
- s(:arglist, s(:call, nil, :bar, s(:arglist))))
273
+ "foo[bar]".
274
+ must_be_parsed_as s(:call,
275
+ s(:call, nil, :foo),
276
+ :[],
277
+ s(:call, nil, :bar))
584
278
  end
585
279
 
586
280
  it "works without any indexes" do
587
- "foo[]".must_be_parsed_as s(:call, s(:call, nil, :foo, s(:arglist)),
588
- :[], s(:arglist))
281
+ "foo[]".must_be_parsed_as s(:call, s(:call, nil, :foo),
282
+ :[])
589
283
  end
590
284
 
591
285
  it "drops self from self[]" do
592
286
  "self[foo]".must_be_parsed_as s(:call, nil, :[],
593
- s(:arglist,
594
- s(:call, nil, :foo, s(:arglist))))
287
+ s(:call, nil, :foo))
595
288
  end
596
289
  end
597
290
 
598
291
  describe "for method definitions" do
599
292
  it "works with def with receiver" do
600
- result = parser.parse "def foo.bar; end"
601
- result.must_equal s(:defs,
602
- s(:call, nil, :foo, s(:arglist)),
603
- :bar,
604
- s(:args),
605
- s(:scope, s(:block)))
293
+ "def foo.bar; end".
294
+ must_be_parsed_as s(:defs,
295
+ s(:call, nil, :foo),
296
+ :bar,
297
+ s(:args))
298
+ end
299
+
300
+ it "works with def with receiver and multiple statements" do
301
+ "def foo.bar; baz; qux; end".
302
+ must_be_parsed_as s(:defs,
303
+ s(:call, nil, :foo),
304
+ :bar,
305
+ s(:args),
306
+ s(:call, nil, :baz),
307
+ s(:call, nil, :qux))
606
308
  end
607
309
 
608
310
  it "works with a method argument with a default value" do
609
- result = parser.parse "def foo bar=nil; end"
610
- result.must_equal s(:defn,
611
- :foo,
612
- s(:args, :bar, s(:block, s(:lasgn, :bar, s(:nil)))),
613
- s(:scope, s(:block, s(:nil))))
311
+ "def foo bar=nil; end".
312
+ must_be_parsed_as s(:defn,
313
+ :foo,
314
+ s(:args, s(:lasgn, :bar, s(:nil))),
315
+ s(:nil))
614
316
  end
615
317
 
616
318
  it "works with several method arguments with default values" do
617
- result = parser.parse "def foo bar=1, baz=2; end"
618
- result.must_equal s(:defn,
619
- :foo,
620
- s(:args,
621
- :bar, :baz,
622
- s(:block,
319
+ "def foo bar=1, baz=2; end".
320
+ must_be_parsed_as s(:defn,
321
+ :foo,
322
+ s(:args,
623
323
  s(:lasgn, :bar, s(:lit, 1)),
624
- s(:lasgn, :baz, s(:lit, 2)))),
625
- s(:scope, s(:block, s(:nil))))
324
+ s(:lasgn, :baz, s(:lit, 2))),
325
+ s(:nil))
626
326
  end
627
327
 
628
328
  it "works with brackets around the parameter list" do
629
- result = parser.parse "def foo(bar); end"
630
- result.must_equal s(:defn,
631
- :foo,
632
- s(:args, :bar),
633
- s(:scope, s(:block, s(:nil))))
329
+ "def foo(bar); end".
330
+ must_be_parsed_as s(:defn, :foo, s(:args, :bar), s(:nil))
634
331
  end
635
332
 
636
333
  it "works with a simple splat" do
637
- result = parser.parse "def foo *bar; end"
638
- result.must_equal s(:defn,
639
- :foo,
640
- s(:args, :"*bar"),
641
- s(:scope, s(:block, s(:nil))))
334
+ "def foo *bar; end".
335
+ must_be_parsed_as s(:defn, :foo, s(:args, :"*bar"), s(:nil))
642
336
  end
643
337
 
644
338
  it "works with a regular argument plus splat" do
645
- result = parser.parse "def foo bar, *baz; end"
646
- result.must_equal s(:defn,
647
- :foo,
648
- s(:args, :bar, :"*baz"),
649
- s(:scope, s(:block, s(:nil))))
339
+ "def foo bar, *baz; end".
340
+ must_be_parsed_as s(:defn, :foo, s(:args, :bar, :"*baz"), s(:nil))
650
341
  end
651
342
 
652
343
  it "works with a nameless splat" do
653
- result = parser.parse "def foo *; end"
654
- result.must_equal s(:defn,
655
- :foo,
656
- s(:args, :"*"),
657
- s(:scope, s(:block, s(:nil))))
344
+ "def foo *; end".
345
+ must_be_parsed_as s(:defn,
346
+ :foo,
347
+ s(:args, :"*"),
348
+ s(:nil))
658
349
  end
659
350
 
660
351
  it "works for a simple case with explicit block parameter" do
661
- result = parser.parse "def foo &bar; end"
662
- result.must_equal s(:defn,
663
- :foo,
664
- s(:args, :"&bar"),
665
- s(:scope, s(:block, s(:nil))))
352
+ "def foo &bar; end".
353
+ must_be_parsed_as s(:defn,
354
+ :foo,
355
+ s(:args, :"&bar"),
356
+ s(:nil))
666
357
  end
667
358
 
668
359
  it "works with a regular argument plus explicit block parameter" do
669
- result = parser.parse "def foo bar, &baz; end"
670
- result.must_equal s(:defn,
671
- :foo,
672
- s(:args, :bar, :"&baz"),
673
- s(:scope, s(:block, s(:nil))))
360
+ "def foo bar, &baz; end".
361
+ must_be_parsed_as s(:defn,
362
+ :foo,
363
+ s(:args, :bar, :"&baz"),
364
+ s(:nil))
674
365
  end
675
366
 
676
367
  it "works with a argument with default value plus explicit block parameter" do
677
- result = parser.parse "def foo bar=1, &baz; end"
678
- result.must_equal s(:defn,
679
- :foo,
680
- s(:args,
681
- :bar, :"&baz",
682
- s(:block,
683
- s(:lasgn, :bar, s(:lit, 1)))),
684
- s(:scope, s(:block, s(:nil))))
685
- end
686
-
687
- it "works with a splat plus explicit block parameter" do
688
- result = parser.parse "def foo *bar, &baz; end"
689
- result.must_equal s(:defn,
690
- :foo,
691
- s(:args, :"*bar", :"&baz"),
692
- s(:scope, s(:block, s(:nil))))
368
+ "def foo bar=1, &baz; end".
369
+ must_be_parsed_as s(:defn,
370
+ :foo,
371
+ s(:args,
372
+ s(:lasgn, :bar, s(:lit, 1)),
373
+ :"&baz"),
374
+ s(:nil))
693
375
  end
694
376
 
695
- it "works with an argument with default value plus splat" do
696
- result = parser.parse "def foo bar=1, *baz; end"
697
- result.must_equal s(:defn,
698
- :foo,
699
- s(:args, :bar, :"*baz",
700
- s(:block,
701
- s(:lasgn, :bar, s(:lit, 1)))),
702
- s(:scope, s(:block, s(:nil))))
377
+ it "works with a argument with default value followed by a mandatory argument" do
378
+ "def foo bar=1, baz; end".
379
+ must_be_parsed_as s(:defn,
380
+ :foo,
381
+ s(:args,
382
+ s(:lasgn, :bar, s(:lit, 1)),
383
+ :baz),
384
+ s(:nil))
703
385
  end
704
386
 
705
- it "works when the method name is an operator" do
706
- result = parser.parse "def +; end"
707
- result.must_equal s(:defn, :+, s(:args),
708
- s(:scope, s(:block, s(:nil))))
387
+ it "works with a splat plus explicit block parameter" do
388
+ "def foo *bar, &baz; end".
389
+ must_be_parsed_as s(:defn,
390
+ :foo,
391
+ s(:args, :"*bar", :"&baz"),
392
+ s(:nil))
709
393
  end
710
- end
711
-
712
- describe "for method calls" do
713
- describe "without a receiver" do
714
- it "works without brackets" do
715
- result = parser.parse "foo bar"
716
- result.must_equal s(:call, nil, :foo,
717
- s(:arglist, s(:call, nil, :bar, s(:arglist))))
718
- end
719
-
720
- it "works with brackets" do
721
- result = parser.parse "foo(bar)"
722
- result.must_equal s(:call, nil, :foo,
723
- s(:arglist, s(:call, nil, :bar, s(:arglist))))
724
- end
725
-
726
- it "works with an empty parameter list and no brackets" do
727
- result = parser.parse "foo"
728
- result.must_equal s(:call, nil, :foo, s(:arglist))
729
- end
730
-
731
- it "works with brackets around an empty parameter list" do
732
- result = parser.parse "foo()"
733
- result.must_equal s(:call, nil, :foo, s(:arglist))
734
- end
735
-
736
- it "works for methods ending in a question mark" do
737
- result = parser.parse "foo?"
738
- result.must_equal s(:call, nil, :foo?, s(:arglist))
739
- end
740
394
 
741
- it "works with nested calls without brackets" do
742
- result = parser.parse "foo bar baz"
743
- result.must_equal s(:call, nil, :foo,
744
- s(:arglist,
745
- s(:call, nil, :bar,
746
- s(:arglist,
747
- s(:call, nil, :baz, s(:arglist))))))
748
- end
395
+ it "works with an argument with default value plus splat" do
396
+ "def foo bar=1, *baz; end".
397
+ must_be_parsed_as s(:defn,
398
+ :foo,
399
+ s(:args,
400
+ s(:lasgn, :bar, s(:lit, 1)),
401
+ :"*baz"),
402
+ s(:nil))
749
403
  end
750
404
 
751
- describe "with a receiver" do
752
- it "works without brackets" do
753
- result = parser.parse "foo.bar baz"
754
- result.must_equal s(:call,
755
- s(:call, nil, :foo, s(:arglist)),
756
- :bar,
757
- s(:arglist, s(:call, nil, :baz, s(:arglist))))
758
- end
759
-
760
- it "works with brackets" do
761
- result = parser.parse "foo.bar(baz)"
762
- result.must_equal s(:call,
763
- s(:call, nil, :foo, s(:arglist)),
764
- :bar,
765
- s(:arglist, s(:call, nil, :baz, s(:arglist))))
766
- end
767
-
768
- it "works with brackets around a call with no brackets" do
769
- result = parser.parse "foo.bar(baz qux)"
770
- result.must_equal s(:call,
771
- s(:call, nil, :foo, s(:arglist)),
772
- :bar,
773
- s(:arglist,
774
- s(:call, nil, :baz,
775
- s(:arglist,
776
- s(:call, nil, :qux, s(:arglist))))))
777
- end
778
-
779
- it "works with nested calls without brackets" do
780
- result = parser.parse "foo.bar baz qux"
781
- result.must_equal s(:call,
782
- s(:call, nil, :foo, s(:arglist)),
783
- :bar,
784
- s(:arglist,
785
- s(:call, nil, :baz,
786
- s(:arglist,
787
- s(:call, nil, :qux, s(:arglist))))))
788
- end
405
+ it "works with an argument with default value plus splat plus final mandatory arguments" do
406
+ "def foo bar=1, *baz, qux, quuz; end".
407
+ must_be_parsed_as s(:defn,
408
+ :foo,
409
+ s(:args,
410
+ s(:lasgn, :bar, s(:lit, 1)),
411
+ :"*baz", :qux, :quuz),
412
+ s(:nil))
789
413
  end
790
414
 
791
- describe "with blocks" do
792
- it "works for a do block" do
793
- result = parser.parse "foo.bar do baz; end"
794
- result.must_equal s(:iter,
795
- s(:call,
796
- s(:call, nil, :foo, s(:arglist)),
797
- :bar,
798
- s(:arglist)),
799
- nil,
800
- s(:call, nil, :baz, s(:arglist)))
801
- end
802
-
803
- it "works for a do block with several statements" do
804
- result = parser.parse "foo.bar do baz; qux; end"
805
- result.must_equal s(:iter,
806
- s(:call,
807
- s(:call, nil, :foo, s(:arglist)),
808
- :bar,
809
- s(:arglist)),
810
- nil,
811
- s(:block,
812
- s(:call, nil, :baz, s(:arglist)),
813
- s(:call, nil, :qux, s(:arglist))))
814
- end
415
+ it "works when the method name is an operator" do
416
+ "def +; end".
417
+ must_be_parsed_as s(:defn, :+, s(:args),
418
+ s(:nil))
815
419
  end
816
420
  end
817
421
 
818
422
  describe "for blocks" do
819
423
  it "works with no statements in the block body" do
820
- result = parser.parse "foo do; end"
821
- result.must_equal s(:iter,
822
- s(:call, nil, :foo, s(:arglist)),
823
- nil)
424
+ "foo do; end".
425
+ must_be_parsed_as s(:iter,
426
+ s(:call, nil, :foo),
427
+ s(:args))
824
428
  end
825
429
 
826
430
  it "works with next with no arguments" do
827
- result = parser.parse "foo do; next; end"
828
- result.must_equal s(:iter,
829
- s(:call, nil, :foo, s(:arglist)),
830
- nil,
831
- s(:next))
431
+ "foo do; next; end".
432
+ must_be_parsed_as s(:iter,
433
+ s(:call, nil, :foo),
434
+ s(:args),
435
+ s(:next))
832
436
  end
833
437
 
834
438
  it "works with next with one argument" do
835
- result = parser.parse "foo do; next bar; end"
836
- result.must_equal s(:iter,
837
- s(:call, nil, :foo, s(:arglist)),
838
- nil,
839
- s(:next, s(:call, nil, :bar, s(:arglist))))
439
+ "foo do; next bar; end".
440
+ must_be_parsed_as s(:iter,
441
+ s(:call, nil, :foo),
442
+ s(:args),
443
+ s(:next, s(:call, nil, :bar)))
840
444
  end
841
445
 
842
446
  it "works with next with several arguments" do
843
- result = parser.parse "foo do; next bar, baz; end"
844
- result.must_equal s(:iter,
845
- s(:call, nil, :foo, s(:arglist)),
846
- nil,
847
- s(:next,
848
- s(:array,
849
- s(:call, nil, :bar, s(:arglist)),
850
- s(:call, nil, :baz, s(:arglist)))))
447
+ "foo do; next bar, baz; end".
448
+ must_be_parsed_as s(:iter,
449
+ s(:call, nil, :foo),
450
+ s(:args),
451
+ s(:next,
452
+ s(:array,
453
+ s(:call, nil, :bar),
454
+ s(:call, nil, :baz))))
851
455
  end
852
456
 
853
457
  it "works with break with no arguments" do
854
- result = parser.parse "foo do; break; end"
855
- result.must_equal s(:iter,
856
- s(:call, nil, :foo, s(:arglist)),
857
- nil,
858
- s(:break))
458
+ "foo do; break; end".
459
+ must_be_parsed_as s(:iter,
460
+ s(:call, nil, :foo),
461
+ s(:args),
462
+ s(:break))
859
463
  end
860
464
 
861
465
  it "works with break with one argument" do
862
- result = parser.parse "foo do; break bar; end"
863
- result.must_equal s(:iter,
864
- s(:call, nil, :foo, s(:arglist)),
865
- nil,
866
- s(:break, s(:call, nil, :bar, s(:arglist))))
466
+ "foo do; break bar; end".
467
+ must_be_parsed_as s(:iter,
468
+ s(:call, nil, :foo),
469
+ s(:args),
470
+ s(:break, s(:call, nil, :bar)))
867
471
  end
868
472
 
869
473
  it "works with break with several arguments" do
870
- result = parser.parse "foo do; break bar, baz; end"
871
- result.must_equal s(:iter,
872
- s(:call, nil, :foo, s(:arglist)),
873
- nil,
874
- s(:break,
875
- s(:array,
876
- s(:call, nil, :bar, s(:arglist)),
877
- s(:call, nil, :baz, s(:arglist)))))
474
+ "foo do; break bar, baz; end".
475
+ must_be_parsed_as s(:iter,
476
+ s(:call, nil, :foo),
477
+ s(:args),
478
+ s(:break,
479
+ s(:array,
480
+ s(:call, nil, :bar),
481
+ s(:call, nil, :baz))))
878
482
  end
879
483
 
880
484
  it "works with redo" do
881
- result = parser.parse "foo do; redo; end"
882
- result.must_equal s(:iter,
883
- s(:call, nil, :foo, s(:arglist)),
884
- nil,
885
- s(:redo))
485
+ "foo do; redo; end".
486
+ must_be_parsed_as s(:iter,
487
+ s(:call, nil, :foo),
488
+ s(:args),
489
+ s(:redo))
886
490
  end
887
491
 
888
492
  it "works with one argument" do
889
- result = parser.parse "foo do |bar|; end"
890
- result.must_equal s(:iter,
891
- s(:call, nil, :foo, s(:arglist)),
892
- s(:lasgn, :bar))
493
+ "foo do |bar|; end".
494
+ must_be_parsed_as s(:iter,
495
+ s(:call, nil, :foo),
496
+ s(:args, :bar))
893
497
  end
894
498
 
895
499
  it "works with multiple arguments" do
896
- result = parser.parse "foo do |bar, baz|; end"
897
- result.must_equal s(:iter,
898
- s(:call, nil, :foo, s(:arglist)),
899
- s(:masgn,
900
- s(:array,
901
- s(:lasgn, :bar),
902
- s(:lasgn, :baz))))
500
+ "foo do |bar, baz|; end".
501
+ must_be_parsed_as s(:iter,
502
+ s(:call, nil, :foo),
503
+ s(:args, :bar, :baz))
903
504
  end
904
505
 
905
506
  it "works with a single splat argument" do
906
- result = parser.parse "foo do |*bar|; end"
907
- result.must_equal s(:iter,
908
- s(:call, nil, :foo, s(:arglist)),
909
- s(:masgn,
910
- s(:array,
911
- s(:splat, s(:lasgn, :bar)))))
507
+ "foo do |*bar|; end".
508
+ must_be_parsed_as s(:iter,
509
+ s(:call, nil, :foo),
510
+ s(:args, :"*bar"))
912
511
  end
913
512
 
914
513
  it "works with a combination of regular arguments and a splat argument" do
915
- result = parser.parse "foo do |bar, *baz|; end"
916
- result.must_equal s(:iter,
917
- s(:call, nil, :foo, s(:arglist)),
918
- s(:masgn,
919
- s(:array,
920
- s(:lasgn, :bar),
921
- s(:splat, s(:lasgn, :baz)))))
514
+ "foo do |bar, *baz|; end".
515
+ must_be_parsed_as s(:iter,
516
+ s(:call, nil, :foo),
517
+ s(:args, :bar, :"*baz"))
922
518
  end
923
519
 
924
520
  end
925
521
 
926
522
  describe "for yield" do
927
523
  it "works with no arguments and no brackets" do
928
- result = parser.parse "yield"
929
- result.must_equal s(:yield)
524
+ "yield".
525
+ must_be_parsed_as s(:yield)
930
526
  end
931
527
 
932
528
  it "works with brackets but no arguments" do
933
- result = parser.parse "yield()"
934
- result.must_equal s(:yield)
529
+ "yield()".
530
+ must_be_parsed_as s(:yield)
935
531
  end
936
532
 
937
533
  it "works with one argument and no brackets" do
938
- result = parser.parse "yield foo"
939
- result.must_equal s(:yield, s(:call, nil, :foo, s(:arglist)))
534
+ "yield foo".
535
+ must_be_parsed_as s(:yield, s(:call, nil, :foo))
940
536
  end
941
537
 
942
538
  it "works with one argument and brackets" do
943
- result = parser.parse "yield(foo)"
944
- result.must_equal s(:yield, s(:call, nil, :foo, s(:arglist)))
539
+ "yield(foo)".
540
+ must_be_parsed_as s(:yield, s(:call, nil, :foo))
945
541
  end
946
542
 
947
543
  it "works with multiple arguments and no brackets" do
948
- result = parser.parse "yield foo, bar"
949
- result.must_equal s(:yield,
950
- s(:call, nil, :foo, s(:arglist)),
951
- s(:call, nil, :bar, s(:arglist)))
544
+ "yield foo, bar".
545
+ must_be_parsed_as s(:yield,
546
+ s(:call, nil, :foo),
547
+ s(:call, nil, :bar))
952
548
  end
953
549
 
954
550
  it "works with multiple arguments and brackets" do
955
- result = parser.parse "yield(foo, bar)"
956
- result.must_equal s(:yield,
957
- s(:call, nil, :foo, s(:arglist)),
958
- s(:call, nil, :bar, s(:arglist)))
551
+ "yield(foo, bar)".
552
+ must_be_parsed_as s(:yield,
553
+ s(:call, nil, :foo),
554
+ s(:call, nil, :bar))
959
555
  end
960
556
 
961
557
  it "works with splat" do
962
- result = parser.parse "yield foo, *bar"
963
- result.must_equal s(:yield,
964
- s(:call, nil, :foo, s(:arglist)),
965
- s(:splat, s(:call, nil, :bar, s(:arglist))))
966
- end
967
- end
968
-
969
- describe "for literals" do
970
- it "works for symbols" do
971
- result = parser.parse ":foo"
972
- result.must_equal s(:lit, :foo)
973
- end
974
-
975
- it "works for symbols that look like instance variable names" do
976
- result = parser.parse ":@foo"
977
- result.must_equal s(:lit, :@foo)
978
- end
979
-
980
- it "works for empty strings" do
981
- result = parser.parse "''"
982
- result.must_equal s(:str, "")
983
- end
984
-
985
- it "works for strings with escape sequences" do
986
- result = parser.parse "\"\\n\""
987
- result.must_equal s(:str, "\n")
988
- end
989
-
990
- it "works for strings with useless escape sequences" do
991
- result = parser.parse "\"F\\OO\""
992
- result.must_equal s(:str, "FOO")
993
- end
994
-
995
- it "works for strings with escaped backslashes" do
996
- result = parser.parse "\"\\\\n\""
997
- result.must_equal s(:str, "\\n")
998
- end
999
-
1000
- it "works for a double-quoted string representing a regex literal with escaped right bracket" do
1001
- result = parser.parse "\"/\\\\)/\""
1002
- result.must_equal s(:str, "/\\)/")
1003
- end
1004
-
1005
- it "works for a double-quoted string containing a uselessly escaped right bracket" do
1006
- result = parser.parse "\"/\\)/\""
1007
- result.must_equal s(:str, "/)/")
1008
- end
1009
-
1010
- it "works for a string containing escaped quotes" do
1011
- result = parser.parse "\"\\\"\""
1012
- result.must_equal s(:str, "\"")
1013
- end
1014
-
1015
- it "works for trivial interpolated strings" do
1016
- result = parser.parse '"#{foo}"'
1017
- result.must_equal s(:dstr,
1018
- "",
1019
- s(:evstr,
1020
- s(:call, nil, :foo, s(:arglist))))
1021
- end
1022
-
1023
- it "works for basic interpolated strings" do
1024
- result = parser.parse '"foo#{bar}"'
1025
- result.must_equal s(:dstr,
1026
- "foo",
1027
- s(:evstr,
1028
- s(:call, nil, :bar, s(:arglist))))
1029
- end
1030
-
1031
- it "works for strings with several interpolations" do
1032
- result = parser.parse '"foo#{bar}baz#{qux}"'
1033
- result.must_equal s(:dstr,
1034
- "foo",
1035
- s(:evstr, s(:call, nil, :bar, s(:arglist))),
1036
- s(:str, "baz"),
1037
- s(:evstr, s(:call, nil, :qux, s(:arglist))))
1038
- end
1039
-
1040
- it "works for strings with interpolations followed by escape sequences" do
1041
- result = parser.parse '"#{foo}\\n"'
1042
- result.must_equal s(:dstr,
1043
- "",
1044
- s(:evstr, s(:call, nil, :foo, s(:arglist))),
1045
- s(:str, "\n"))
1046
- end
1047
-
1048
- it "works for a simple regex literal" do
1049
- result = parser.parse "/foo/"
1050
- result.must_equal s(:lit, /foo/)
1051
- end
1052
-
1053
- it "works for regex literals with escaped right bracket" do
1054
- result = parser.parse '/\\)/'
1055
- result.must_equal s(:lit, /\)/)
1056
- end
1057
-
1058
- it "works for regex literals with escape sequences" do
1059
- result = parser.parse '/\\)\\n\\\\/'
1060
- result.must_equal s(:lit, /\)\n\\/)
1061
- end
1062
-
1063
- it "works for regexes with interpolations" do
1064
- result = parser.parse '/foo#{bar}baz/'
1065
- result.must_equal s(:dregx,
1066
- "foo",
1067
- s(:evstr, s(:call, nil, :bar, s(:arglist))),
1068
- s(:str, "baz"))
1069
- end
1070
-
1071
- it "works for a regex literal with the multiline flag" do
1072
- result = parser.parse "/foo/m"
1073
- result.must_equal s(:lit, /foo/m)
1074
- end
1075
-
1076
- it "works for a regex literal with the extended flag" do
1077
- result = parser.parse "/foo/x"
1078
- result.must_equal s(:lit, /foo/x)
1079
- end
1080
-
1081
- it "works for a regex literal with the ignorecase flag" do
1082
- result = parser.parse "/foo/i"
1083
- result.must_equal s(:lit, /foo/i)
1084
- end
1085
-
1086
- it "works for a regex literal with a combination of flags" do
1087
- result = parser.parse "/foo/ixm"
1088
- result.must_equal s(:lit, /foo/ixm)
1089
- end
1090
-
1091
- it "works for a regex literal with flags and interpolation" do
1092
- result = parser.parse '/foo#{bar}/ixm'
1093
- result.must_equal s(:dregx,
1094
- "foo",
1095
- s(:evstr, s(:call, nil, :bar, s(:arglist))),
1096
- 7)
1097
- end
1098
-
1099
- it "works for a regex literal with interpolate-once flag" do
1100
- result = parser.parse '/foo#{bar}/o'
1101
- result.must_equal s(:dregx_once,
1102
- "foo",
1103
- s(:evstr, s(:call, nil, :bar, s(:arglist))))
1104
- end
1105
-
1106
- it "works for simple dsyms" do
1107
- result = parser.parse ':"foo"'
1108
- result.must_equal s(:lit, :foo)
1109
- end
1110
-
1111
- it "works for dsyms with interpolations" do
1112
- result = parser.parse ':"foo#{bar}"'
1113
- result.must_equal s(:dsym,
1114
- "foo",
1115
- s(:evstr, s(:call, nil, :bar, s(:arglist))))
1116
- end
1117
-
1118
- it "works for character literals (which are string literals in Ruby 1.9.3)" do
1119
- result = parser.parse "?a"
1120
- result.must_equal s(:lit, "a")
1121
- end
1122
-
1123
- it "works for character literals in extra compatible mode" do
1124
- parser.extra_compatible = true
1125
- result = parser.parse "?a"
1126
- result.must_equal s(:lit, 97)
1127
- end
1128
-
1129
- it "works for basic backtick strings" do
1130
- result = parser.parse '`foo`'
1131
- result.must_equal s(:xstr, "foo")
558
+ "yield foo, *bar".
559
+ must_be_parsed_as s(:yield,
560
+ s(:call, nil, :foo),
561
+ s(:splat, s(:call, nil, :bar)))
1132
562
  end
1133
-
1134
- it "works for interpolated backtick strings" do
1135
- result = parser.parse '`foo#{bar}`'
1136
- result.must_equal s(:dxstr,
1137
- "foo",
1138
- s(:evstr, s(:call, nil, :bar, s(:arglist))))
1139
- end
1140
-
1141
- it "works for backtick strings with escape sequences" do
1142
- result = parser.parse '`foo\\n`'
1143
- result.must_equal s(:xstr, "foo\n")
1144
- end
1145
-
1146
563
  end
1147
564
 
1148
565
  describe "for the __FILE__ keyword" do
1149
566
  describe "when not passing a file name" do
1150
567
  it "creates a string sexp with value '(string)'" do
1151
- result = parser.parse "__FILE__"
1152
- result.must_equal s(:str, "(string)")
568
+ "__FILE__".
569
+ must_be_parsed_as s(:str, "(string)")
1153
570
  end
1154
571
  end
1155
572
 
@@ -1163,505 +580,466 @@ describe RipperRubyParser::Parser do
1163
580
 
1164
581
  describe "for the __LINE__ keyword" do
1165
582
  it "creates a literal sexp with value of the line number" do
1166
- result = parser.parse "__LINE__"
1167
- result.must_equal s(:lit, 1)
1168
- result = parser.parse "\n__LINE__"
1169
- result.must_equal s(:lit, 2)
583
+ "__LINE__".
584
+ must_be_parsed_as s(:lit, 1)
585
+ "\n__LINE__".
586
+ must_be_parsed_as s(:lit, 2)
587
+ end
588
+ end
589
+
590
+ describe "for the END keyword" do
591
+ it "converts to a :postexe iterator" do
592
+ "END { foo }".
593
+ must_be_parsed_as s(:iter, s(:postexe), s(:args), s(:call, nil, :foo))
594
+ end
595
+ end
596
+
597
+ describe "for the BEGIN keyword" do
598
+ it "converts to a :preexe iterator" do
599
+ "BEGIN { foo }".
600
+ must_be_parsed_as s(:iter, s(:preexe), s(:args), s(:call, nil, :foo))
1170
601
  end
1171
602
  end
1172
603
 
1173
604
  describe "for constant lookups" do
1174
605
  it "works when explicitely starting from the root namespace" do
1175
- result = parser.parse "::Foo"
1176
- result.must_equal s(:colon3, :Foo)
606
+ "::Foo".
607
+ must_be_parsed_as s(:colon3, :Foo)
1177
608
  end
1178
609
 
1179
610
  it "works with a three-level constant lookup" do
1180
- result = parser.parse "Foo::Bar::Baz"
1181
- result.must_equal s(:colon2,
1182
- s(:colon2, s(:const, :Foo), :Bar),
1183
- :Baz)
611
+ "Foo::Bar::Baz".
612
+ must_be_parsed_as s(:colon2,
613
+ s(:colon2, s(:const, :Foo), :Bar),
614
+ :Baz)
1184
615
  end
1185
616
 
1186
617
  it "works looking up a constant in a non-constant" do
1187
618
  "foo::Bar".must_be_parsed_as s(:colon2,
1188
- s(:call, nil, :foo, s(:arglist)),
619
+ s(:call, nil, :foo),
1189
620
  :Bar)
1190
621
  end
1191
622
  end
1192
623
 
1193
624
  describe "for variable references" do
1194
625
  it "works for self" do
1195
- result = parser.parse "self"
1196
- result.must_equal s(:self)
626
+ "self".
627
+ must_be_parsed_as s(:self)
1197
628
  end
1198
629
 
1199
630
  it "works for instance variables" do
1200
- result = parser.parse "@foo"
1201
- result.must_equal s(:ivar, :@foo)
631
+ "@foo".
632
+ must_be_parsed_as s(:ivar, :@foo)
1202
633
  end
1203
634
 
1204
635
  it "works for global variables" do
1205
- result = parser.parse "$foo"
1206
- result.must_equal s(:gvar, :$foo)
636
+ "$foo".
637
+ must_be_parsed_as s(:gvar, :$foo)
1207
638
  end
1208
639
 
1209
640
  it "works for regexp match references" do
1210
- result = parser.parse "$1"
1211
- result.must_equal s(:nth_ref, 1)
641
+ "$1".
642
+ must_be_parsed_as s(:nth_ref, 1)
1212
643
  end
1213
644
 
1214
645
  specify { "$'".must_be_parsed_as s(:back_ref, :"'") }
1215
646
  specify { "$&".must_be_parsed_as s(:back_ref, :"&") }
1216
647
 
1217
648
  it "works for class variables" do
1218
- result = parser.parse "@@foo"
1219
- result.must_equal s(:cvar, :@@foo)
649
+ "@@foo".
650
+ must_be_parsed_as s(:cvar, :@@foo)
1220
651
  end
1221
652
  end
1222
653
 
1223
654
  describe "for single assignment" do
1224
655
  it "works when assigning to an instance variable" do
1225
- result = parser.parse "@foo = bar"
1226
- result.must_equal s(:iasgn,
1227
- :@foo,
1228
- s(:call, nil, :bar, s(:arglist)))
656
+ "@foo = bar".
657
+ must_be_parsed_as s(:iasgn,
658
+ :@foo,
659
+ s(:call, nil, :bar))
1229
660
  end
1230
661
 
1231
662
  it "works when assigning to a constant" do
1232
- result = parser.parse "FOO = bar"
1233
- result.must_equal s(:cdecl,
1234
- :FOO,
1235
- s(:call, nil, :bar, s(:arglist)))
663
+ "FOO = bar".
664
+ must_be_parsed_as s(:cdecl,
665
+ :FOO,
666
+ s(:call, nil, :bar))
1236
667
  end
1237
668
 
1238
669
  it "works when assigning to a collection element" do
1239
- result = parser.parse "foo[bar] = baz"
1240
- result.must_equal s(:attrasgn,
1241
- s(:call, nil, :foo, s(:arglist)),
1242
- :[]=,
1243
- s(:arglist,
1244
- s(:call, nil, :bar, s(:arglist)),
1245
- s(:call, nil, :baz, s(:arglist))))
670
+ "foo[bar] = baz".
671
+ must_be_parsed_as s(:attrasgn,
672
+ s(:call, nil, :foo),
673
+ :[]=,
674
+ s(:call, nil, :bar),
675
+ s(:call, nil, :baz))
1246
676
  end
1247
677
 
1248
678
  it "works when assigning to an attribute" do
1249
- result = parser.parse "foo.bar = baz"
1250
- result.must_equal s(:attrasgn,
1251
- s(:call, nil, :foo, s(:arglist)),
1252
- :bar=,
1253
- s(:arglist, s(:call, nil, :baz, s(:arglist))))
679
+ "foo.bar = baz".
680
+ must_be_parsed_as s(:attrasgn,
681
+ s(:call, nil, :foo),
682
+ :bar=,
683
+ s(:call, nil, :baz))
1254
684
  end
1255
685
 
1256
686
  it "works when assigning to a class variable" do
1257
- result = parser.parse "@@foo = bar"
1258
- result.must_equal s(:cvdecl,
1259
- :@@foo,
1260
- s(:call, nil, :bar, s(:arglist)))
687
+ "@@foo = bar".
688
+ must_be_parsed_as s(:cvdecl,
689
+ :@@foo,
690
+ s(:call, nil, :bar))
1261
691
  end
1262
692
 
1263
693
  it "works when assigning to a class variable inside a method" do
1264
- result = parser.parse "def foo; @@bar = baz; end"
1265
- result.must_equal s(:defn,
1266
- :foo, s(:args),
1267
- s(:scope,
1268
- s(:block,
1269
- s(:cvasgn, :@@bar, s(:call, nil, :baz, s(:arglist))))))
694
+ "def foo; @@bar = baz; end".
695
+ must_be_parsed_as s(:defn,
696
+ :foo, s(:args),
697
+ s(:cvasgn, :@@bar, s(:call, nil, :baz)))
1270
698
  end
1271
699
 
1272
700
  it "works when assigning to a class variable inside a method with a receiver" do
1273
- result = parser.parse "def self.foo; @@bar = baz; end"
1274
- result.must_equal s(:defs,
1275
- s(:self),
1276
- :foo, s(:args),
1277
- s(:scope,
1278
- s(:block,
1279
- s(:cvasgn, :@@bar, s(:call, nil, :baz, s(:arglist))))))
701
+ "def self.foo; @@bar = baz; end".
702
+ must_be_parsed_as s(:defs,
703
+ s(:self),
704
+ :foo, s(:args),
705
+ s(:cvasgn, :@@bar, s(:call, nil, :baz)))
1280
706
  end
1281
707
 
1282
708
  it "works when assigning to a global variable" do
1283
- result = parser.parse "$foo = bar"
1284
- result.must_equal s(:gasgn,
1285
- :$foo,
1286
- s(:call, nil, :bar, s(:arglist)))
709
+ "$foo = bar".
710
+ must_be_parsed_as s(:gasgn,
711
+ :$foo,
712
+ s(:call, nil, :bar))
1287
713
  end
1288
714
  end
1289
715
 
1290
716
  describe "for operator assignment" do
1291
717
  it "works with +=" do
1292
- result = parser.parse "foo += bar"
1293
- result.must_equal s(:lasgn,
1294
- :foo,
1295
- s(:call,
1296
- s(:lvar, :foo),
1297
- :+,
1298
- s(:arglist, s(:call, nil, :bar, s(:arglist)))))
718
+ "foo += bar".
719
+ must_be_parsed_as s(:lasgn,
720
+ :foo,
721
+ s(:call,
722
+ s(:lvar, :foo),
723
+ :+,
724
+ s(:call, nil, :bar)))
1299
725
  end
1300
726
 
1301
727
  it "works with -=" do
1302
- result = parser.parse "foo -= bar"
1303
- result.must_equal s(:lasgn,
1304
- :foo,
1305
- s(:call,
1306
- s(:lvar, :foo),
1307
- :-,
1308
- s(:arglist, s(:call, nil, :bar, s(:arglist)))))
728
+ "foo -= bar".
729
+ must_be_parsed_as s(:lasgn,
730
+ :foo,
731
+ s(:call,
732
+ s(:lvar, :foo),
733
+ :-,
734
+ s(:call, nil, :bar)))
1309
735
  end
1310
736
 
1311
737
  it "works with ||=" do
1312
- result = parser.parse "foo ||= bar"
1313
- result.must_equal s(:op_asgn_or,
1314
- s(:lvar, :foo),
1315
- s(:lasgn, :foo,
1316
- s(:call, nil, :bar, s(:arglist))))
738
+ "foo ||= bar".
739
+ must_be_parsed_as s(:op_asgn_or,
740
+ s(:lvar, :foo),
741
+ s(:lasgn, :foo,
742
+ s(:call, nil, :bar)))
1317
743
  end
1318
744
 
1319
745
  it "works when assigning to an instance variable" do
1320
- result = parser.parse "@foo += bar"
1321
- result.must_equal s(:iasgn,
1322
- :@foo,
1323
- s(:call,
1324
- s(:ivar, :@foo),
1325
- :+,
1326
- s(:arglist, s(:call, nil, :bar, s(:arglist)))))
746
+ "@foo += bar".
747
+ must_be_parsed_as s(:iasgn,
748
+ :@foo,
749
+ s(:call,
750
+ s(:ivar, :@foo),
751
+ :+,
752
+ s(:call, nil, :bar)))
1327
753
  end
1328
754
 
1329
755
  it "works when assigning to a collection element" do
1330
- result = parser.parse "foo[bar] += baz"
1331
- result.must_equal s(:op_asgn1,
1332
- s(:call, nil, :foo, s(:arglist)),
1333
- s(:arglist, s(:call, nil, :bar, s(:arglist))),
1334
- :+,
1335
- s(:call, nil, :baz, s(:arglist)))
756
+ "foo[bar] += baz".
757
+ must_be_parsed_as s(:op_asgn1,
758
+ s(:call, nil, :foo),
759
+ s(:arglist, s(:call, nil, :bar)),
760
+ :+,
761
+ s(:call, nil, :baz))
1336
762
  end
1337
763
 
1338
764
  it "works with ||= when assigning to a collection element" do
1339
- result = parser.parse "foo[bar] ||= baz"
1340
- result.must_equal s(:op_asgn1,
1341
- s(:call, nil, :foo, s(:arglist)),
1342
- s(:arglist, s(:call, nil, :bar, s(:arglist))),
1343
- :"||",
1344
- s(:call, nil, :baz, s(:arglist)))
765
+ "foo[bar] ||= baz".
766
+ must_be_parsed_as s(:op_asgn1,
767
+ s(:call, nil, :foo),
768
+ s(:arglist, s(:call, nil, :bar)),
769
+ :"||",
770
+ s(:call, nil, :baz))
1345
771
  end
1346
772
 
1347
773
  it "works when assigning to an attribute" do
1348
- result = parser.parse "foo.bar += baz"
1349
- result.must_equal s(:op_asgn2,
1350
- s(:call, nil, :foo, s(:arglist)),
1351
- :bar=,
1352
- :+,
1353
- s(:call, nil, :baz, s(:arglist)))
774
+ "foo.bar += baz".
775
+ must_be_parsed_as s(:op_asgn2,
776
+ s(:call, nil, :foo),
777
+ :bar=,
778
+ :+,
779
+ s(:call, nil, :baz))
1354
780
  end
1355
781
 
1356
782
  it "works with ||= when assigning to an attribute" do
1357
- result = parser.parse "foo.bar ||= baz"
1358
- result.must_equal s(:op_asgn2,
1359
- s(:call, nil, :foo, s(:arglist)),
1360
- :bar=,
1361
- :"||",
1362
- s(:call, nil, :baz, s(:arglist)))
783
+ "foo.bar ||= baz".
784
+ must_be_parsed_as s(:op_asgn2,
785
+ s(:call, nil, :foo),
786
+ :bar=,
787
+ :"||",
788
+ s(:call, nil, :baz))
1363
789
  end
1364
790
  end
1365
791
 
1366
792
  describe "for multiple assignment" do
1367
793
  it "works the same number of items on each side" do
1368
- result = parser.parse "foo, bar = baz, qux"
1369
- result.must_equal s(:masgn,
1370
- s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
1371
- s(:array,
1372
- s(:call, nil, :baz, s(:arglist)),
1373
- s(:call, nil, :qux, s(:arglist))))
794
+ "foo, bar = baz, qux".
795
+ must_be_parsed_as s(:masgn,
796
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
797
+ s(:array,
798
+ s(:call, nil, :baz),
799
+ s(:call, nil, :qux)))
1374
800
  end
1375
801
 
1376
802
  it "works with a single item on the right-hand side" do
1377
- result = parser.parse "foo, bar = baz"
1378
- result.must_equal s(:masgn,
1379
- s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
1380
- s(:to_ary,
1381
- s(:call, nil, :baz, s(:arglist))))
803
+ "foo, bar = baz".
804
+ must_be_parsed_as s(:masgn,
805
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
806
+ s(:to_ary,
807
+ s(:call, nil, :baz)))
1382
808
  end
1383
809
 
1384
810
  it "works with left-hand splat" do
1385
- result = parser.parse "foo, *bar = baz, qux"
1386
- result.must_equal s(:masgn,
1387
- s(:array, s(:lasgn, :foo), s(:splat, s(:lasgn, :bar))),
1388
- s(:array,
1389
- s(:call, nil, :baz, s(:arglist)),
1390
- s(:call, nil, :qux, s(:arglist))))
811
+ "foo, *bar = baz, qux".
812
+ must_be_parsed_as s(:masgn,
813
+ s(:array, s(:lasgn, :foo), s(:splat, s(:lasgn, :bar))),
814
+ s(:array,
815
+ s(:call, nil, :baz),
816
+ s(:call, nil, :qux)))
1391
817
  end
1392
818
 
1393
819
  it "works with brackets around the left-hand side" do
1394
- result = parser.parse "(foo, bar) = baz"
1395
- result.must_equal s(:masgn,
1396
- s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
1397
- s(:to_ary,
1398
- s(:call, nil, :baz, s(:arglist))))
820
+ "(foo, bar) = baz".
821
+ must_be_parsed_as s(:masgn,
822
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
823
+ s(:to_ary, s(:call, nil, :baz)))
1399
824
  end
1400
825
 
1401
826
  it "works with complex destructuring" do
1402
- result = parser.parse "foo, (bar, baz) = qux"
1403
- result.must_equal s(:masgn,
1404
- s(:array,
1405
- s(:lasgn, :foo),
1406
- s(:masgn,
827
+ "foo, (bar, baz) = qux".
828
+ must_be_parsed_as s(:masgn,
829
+ s(:array,
830
+ s(:lasgn, :foo),
831
+ s(:masgn,
832
+ s(:array, s(:lasgn, :bar), s(:lasgn, :baz)))),
833
+ s(:to_ary, s(:call, nil, :qux)))
834
+ end
835
+
836
+ it "works with complex destructuring of the value" do
837
+ "foo, (bar, baz) = [qux, [quz, quuz]]".
838
+ must_be_parsed_as s(:masgn,
839
+ s(:array,
840
+ s(:lasgn, :foo),
841
+ s(:masgn, s(:array, s(:lasgn, :bar), s(:lasgn, :baz)))),
842
+ s(:to_ary,
1407
843
  s(:array,
1408
- s(:lasgn, :bar),
1409
- s(:lasgn, :baz)))),
1410
- s(:to_ary,
1411
- s(:call, nil, :qux, s(:arglist))))
844
+ s(:call, nil, :qux),
845
+ s(:array, s(:call, nil, :quz), s(:call, nil, :quuz)))))
1412
846
  end
1413
847
 
1414
848
  it "works with instance variables" do
1415
- result = parser.parse "@foo, @bar = baz"
1416
- result.must_equal s(:masgn,
1417
- s(:array, s(:iasgn, :@foo), s(:iasgn, :@bar)),
1418
- s(:to_ary,
1419
- s(:call, nil, :baz, s(:arglist))))
849
+ "@foo, @bar = baz".
850
+ must_be_parsed_as s(:masgn,
851
+ s(:array, s(:iasgn, :@foo), s(:iasgn, :@bar)),
852
+ s(:to_ary, s(:call, nil, :baz)))
1420
853
  end
1421
854
 
1422
855
  it "works with class variables" do
1423
- result = parser.parse "@@foo, @@bar = baz"
1424
- result.must_equal s(:masgn,
1425
- s(:array, s(:cvdecl, :@@foo), s(:cvdecl, :@@bar)),
1426
- s(:to_ary,
1427
- s(:call, nil, :baz, s(:arglist))))
856
+ "@@foo, @@bar = baz".
857
+ must_be_parsed_as s(:masgn,
858
+ s(:array, s(:cvdecl, :@@foo), s(:cvdecl, :@@bar)),
859
+ s(:to_ary, s(:call, nil, :baz)))
1428
860
  end
1429
861
 
1430
862
  it "works with attributes" do
1431
- result = parser.parse "foo.bar, foo.baz = qux"
1432
- result.must_equal s(:masgn,
1433
- s(:array,
1434
- s(:attrasgn,
1435
- s(:call, nil, :foo, s(:arglist)),
1436
- :bar=,
1437
- s(:arglist)),
1438
- s(:attrasgn,
1439
- s(:call, nil, :foo, s(:arglist)),
1440
- :baz=,
1441
- s(:arglist))),
1442
- s(:to_ary,
1443
- s(:call, nil, :qux, s(:arglist))))
863
+ "foo.bar, foo.baz = qux".
864
+ must_be_parsed_as s(:masgn,
865
+ s(:array,
866
+ s(:attrasgn, s(:call, nil, :foo), :bar=),
867
+ s(:attrasgn, s(:call, nil, :foo), :baz=)),
868
+ s(:to_ary, s(:call, nil, :qux)))
1444
869
  end
1445
870
 
1446
871
  it "works with collection elements" do
1447
- result = parser.parse "foo[1], bar[2] = baz"
1448
- result.must_equal s(:masgn,
1449
- s(:array,
1450
- s(:attrasgn,
1451
- s(:call, nil, :foo, s(:arglist)),
1452
- :[]=,
1453
- s(:arglist, s(:lit, 1))),
1454
- s(:attrasgn,
1455
- s(:call, nil, :bar, s(:arglist)),
1456
- :[]=,
1457
- s(:arglist, s(:lit, 2)))),
1458
- s(:to_ary, s(:call, nil, :baz, s(:arglist))))
872
+ "foo[1], bar[2] = baz".
873
+ must_be_parsed_as s(:masgn,
874
+ s(:array,
875
+ s(:attrasgn,
876
+ s(:call, nil, :foo), :[]=, s(:lit, 1)),
877
+ s(:attrasgn,
878
+ s(:call, nil, :bar), :[]=, s(:lit, 2))),
879
+ s(:to_ary, s(:call, nil, :baz)))
1459
880
  end
1460
881
 
1461
882
  it "works with constants" do
1462
- result = parser.parse "Foo, Bar = baz"
1463
- result.must_equal s(:masgn,
1464
- s(:array, s(:cdecl, :Foo), s(:cdecl, :Bar)),
1465
- s(:to_ary,
1466
- s(:call, nil, :baz, s(:arglist))))
883
+ "Foo, Bar = baz".
884
+ must_be_parsed_as s(:masgn,
885
+ s(:array, s(:cdecl, :Foo), s(:cdecl, :Bar)),
886
+ s(:to_ary, s(:call, nil, :baz)))
1467
887
  end
1468
888
 
1469
889
  it "works with instance variables and splat" do
1470
- result = parser.parse "@foo, *@bar = baz"
1471
- result.must_equal s(:masgn,
1472
- s(:array,
1473
- s(:iasgn, :@foo),
1474
- s(:splat, s(:iasgn, :@bar))),
1475
- s(:to_ary,
1476
- s(:call, nil, :baz, s(:arglist))))
890
+ "@foo, *@bar = baz".
891
+ must_be_parsed_as s(:masgn,
892
+ s(:array,
893
+ s(:iasgn, :@foo),
894
+ s(:splat, s(:iasgn, :@bar))),
895
+ s(:to_ary,
896
+ s(:call, nil, :baz)))
1477
897
  end
1478
-
1479
898
  end
1480
899
 
1481
900
  describe "for operators" do
1482
- it "handles :and" do
1483
- result = parser.parse "foo and bar"
1484
- result.must_equal s(:and,
1485
- s(:call, nil, :foo, s(:arglist)),
1486
- s(:call, nil, :bar, s(:arglist)))
1487
- end
1488
-
1489
- it "handles double :and" do
1490
- result = parser.parse "foo and bar and baz"
1491
- result.must_equal s(:and,
1492
- s(:call, nil, :foo, s(:arglist)),
1493
- s(:and,
1494
- s(:call, nil, :bar, s(:arglist)),
1495
- s(:call, nil, :baz, s(:arglist))))
1496
- end
1497
-
1498
- it "handles :or" do
1499
- result = parser.parse "foo or bar"
1500
- result.must_equal s(:or,
1501
- s(:call, nil, :foo, s(:arglist)),
1502
- s(:call, nil, :bar, s(:arglist)))
1503
- end
1504
-
1505
- it "handles double :or" do
1506
- result = parser.parse "foo or bar or baz"
1507
- result.must_equal s(:or,
1508
- s(:call, nil, :foo, s(:arglist)),
1509
- s(:or,
1510
- s(:call, nil, :bar, s(:arglist)),
1511
- s(:call, nil, :baz, s(:arglist))))
1512
- end
1513
-
1514
- it "handles :or after :and" do
1515
- result = parser.parse "foo and bar or baz"
1516
- result.must_equal s(:or,
1517
- s(:and,
1518
- s(:call, nil, :foo, s(:arglist)),
1519
- s(:call, nil, :bar, s(:arglist))),
1520
- s(:call, nil, :baz, s(:arglist)))
1521
- end
1522
-
1523
- it "handles :and after :or" do
1524
- result = parser.parse "foo or bar and baz"
1525
- result.must_equal s(:and,
1526
- s(:or,
1527
- s(:call, nil, :foo, s(:arglist)),
1528
- s(:call, nil, :bar, s(:arglist))),
1529
- s(:call, nil, :baz, s(:arglist)))
1530
- end
1531
-
1532
- it "converts :&& to :and" do
1533
- result = parser.parse "foo && bar"
1534
- result.must_equal s(:and,
1535
- s(:call, nil, :foo, s(:arglist)),
1536
- s(:call, nil, :bar, s(:arglist)))
1537
- end
1538
-
1539
- it "converts :|| to :or" do
1540
- result = parser.parse "foo || bar"
1541
- result.must_equal s(:or,
1542
- s(:call, nil, :foo, s(:arglist)),
1543
- s(:call, nil, :bar, s(:arglist)))
1544
- end
1545
-
1546
901
  it "handles :!=" do
1547
- result = parser.parse "foo != bar"
1548
- result.must_equal s(:not,
1549
- s(:call,
1550
- s(:call, nil, :foo, s(:arglist)),
1551
- :==,
1552
- s(:arglist,
1553
- s(:call, nil, :bar, s(:arglist)))))
902
+ "foo != bar".
903
+ must_be_parsed_as s(:call,
904
+ s(:call, nil, :foo),
905
+ :!=,
906
+ s(:call, nil, :bar))
1554
907
  end
1555
908
 
1556
909
  it "handles :=~ with two non-literals" do
1557
- result = parser.parse "foo =~ bar"
1558
- result.must_equal s(:call,
1559
- s(:call, nil, :foo, s(:arglist)),
1560
- :=~,
1561
- s(:arglist, s(:call, nil, :bar, s(:arglist))))
910
+ "foo =~ bar".
911
+ must_be_parsed_as s(:call,
912
+ s(:call, nil, :foo),
913
+ :=~,
914
+ s(:call, nil, :bar))
1562
915
  end
1563
916
 
1564
917
  it "handles :=~ with literal regexp on the left hand side" do
1565
- result = parser.parse "/foo/ =~ bar"
1566
- result.must_equal s(:match2,
1567
- s(:lit, /foo/),
1568
- s(:call, nil, :bar, s(:arglist)))
918
+ "/foo/ =~ bar".
919
+ must_be_parsed_as s(:match2,
920
+ s(:lit, /foo/),
921
+ s(:call, nil, :bar))
1569
922
  end
1570
923
 
1571
924
  it "handles :=~ with literal regexp on the right hand side" do
1572
- result = parser.parse "foo =~ /bar/"
1573
- result.must_equal s(:match3,
1574
- s(:lit, /bar/),
1575
- s(:call, nil, :foo, s(:arglist)))
925
+ "foo =~ /bar/".
926
+ must_be_parsed_as s(:match3,
927
+ s(:lit, /bar/),
928
+ s(:call, nil, :foo))
1576
929
  end
1577
930
 
1578
931
  it "handles unary minus with a number literal" do
1579
- result = parser.parse "-1"
1580
- result.must_equal s(:lit, -1)
932
+ "-1".
933
+ must_be_parsed_as s(:lit, -1)
1581
934
  end
1582
935
 
1583
936
  it "handles unary minus with a non-literal" do
1584
- result = parser.parse "-foo"
1585
- result.must_equal s(:call,
1586
- s(:call, nil, :foo, s(:arglist)),
1587
- :-@,
1588
- s(:arglist))
937
+ "-foo".
938
+ must_be_parsed_as s(:call,
939
+ s(:call, nil, :foo),
940
+ :-@)
1589
941
  end
1590
942
 
1591
943
  it "handles unary plus with a number literal" do
1592
- result = parser.parse "+ 1"
1593
- result.must_equal s(:lit, 1)
944
+ "+ 1".
945
+ must_be_parsed_as s(:lit, 1)
1594
946
  end
1595
947
 
1596
948
  it "handles unary plus with a non-literal" do
1597
- result = parser.parse "+ foo"
1598
- result.must_equal s(:call,
1599
- s(:call, nil, :foo, s(:arglist)),
1600
- :+@,
1601
- s(:arglist))
949
+ "+ foo".
950
+ must_be_parsed_as s(:call,
951
+ s(:call, nil, :foo),
952
+ :+@)
953
+ end
954
+
955
+ it "handles unary !" do
956
+ "!foo".
957
+ must_be_parsed_as s(:call, s(:call, nil, :foo), :!)
1602
958
  end
1603
959
 
1604
- it "handles unary not" do
1605
- result = parser.parse "not foo"
1606
- result.must_equal s(:not, s(:call, nil, :foo, s(:arglist)))
960
+ it "converts :not to :!" do
961
+ "not foo".
962
+ must_be_parsed_as s(:call, s(:call, nil, :foo), :!)
1607
963
  end
1608
964
 
1609
- it "converts :! to :not" do
1610
- result = parser.parse "!foo"
1611
- result.must_equal s(:not, s(:call, nil, :foo, s(:arglist)))
965
+ it "handles unary ! with a number literal" do
966
+ "!1".
967
+ must_be_parsed_as s(:call, s(:lit, 1), :!)
1612
968
  end
1613
969
 
1614
970
  it "handles the range operator with positive number literals" do
1615
- result = parser.parse "1..2"
1616
- result.must_equal s(:lit, 1..2)
971
+ "1..2".
972
+ must_be_parsed_as s(:lit, 1..2)
1617
973
  end
1618
974
 
1619
975
  it "handles the range operator with negative number literals" do
1620
- result = parser.parse "-1..-2"
1621
- result.must_equal s(:lit, -1..-2)
976
+ "-1..-2".
977
+ must_be_parsed_as s(:lit, -1..-2)
1622
978
  end
1623
979
 
1624
980
  it "handles the range operator with string literals" do
1625
- result = parser.parse "'a'..'z'"
1626
- result.must_equal s(:dot2,
1627
- s(:str, "a"),
1628
- s(:str, "z"))
981
+ "'a'..'z'".
982
+ must_be_parsed_as s(:dot2,
983
+ s(:str, "a"),
984
+ s(:str, "z"))
1629
985
  end
1630
986
 
1631
987
  it "handles the range operator with non-literals" do
1632
- result = parser.parse "foo..bar"
1633
- result.must_equal s(:dot2,
1634
- s(:call, nil, :foo, s(:arglist)),
1635
- s(:call, nil, :bar, s(:arglist)))
988
+ "foo..bar".
989
+ must_be_parsed_as s(:dot2,
990
+ s(:call, nil, :foo),
991
+ s(:call, nil, :bar))
992
+ end
993
+
994
+ it "handles the exclusive range operator with positive number literals" do
995
+ "1...2".
996
+ must_be_parsed_as s(:lit, 1...2)
997
+ end
998
+
999
+ it "handles the exclusive range operator with negative number literals" do
1000
+ "-1...-2".
1001
+ must_be_parsed_as s(:lit, -1...-2)
1002
+ end
1003
+
1004
+ it "handles the exclusive range operator with string literals" do
1005
+ "'a'...'z'".
1006
+ must_be_parsed_as s(:dot3,
1007
+ s(:str, "a"),
1008
+ s(:str, "z"))
1009
+ end
1010
+
1011
+ it "handles the exclusive range operator with non-literals" do
1012
+ "foo...bar".
1013
+ must_be_parsed_as s(:dot3,
1014
+ s(:call, nil, :foo),
1015
+ s(:call, nil, :bar))
1636
1016
  end
1637
1017
 
1638
1018
  it "handles the ternary operator" do
1639
- result = parser.parse "foo ? bar : baz"
1640
- result.must_equal s(:if,
1641
- s(:call, nil, :foo, s(:arglist)),
1642
- s(:call, nil, :bar, s(:arglist)),
1643
- s(:call, nil, :baz, s(:arglist)))
1019
+ "foo ? bar : baz".
1020
+ must_be_parsed_as s(:if,
1021
+ s(:call, nil, :foo),
1022
+ s(:call, nil, :bar),
1023
+ s(:call, nil, :baz))
1644
1024
  end
1645
1025
  end
1646
1026
 
1647
1027
  describe "for expressions" do
1648
1028
  it "handles assignment inside binary operator expressions" do
1649
- result = parser.parse "foo + (bar = baz)"
1650
- result.must_equal s(:call,
1651
- s(:call, nil, :foo, s(:arglist)),
1652
- :+,
1653
- s(:arglist,
1029
+ "foo + (bar = baz)".
1030
+ must_be_parsed_as s(:call,
1031
+ s(:call, nil, :foo),
1032
+ :+,
1654
1033
  s(:lasgn,
1655
1034
  :bar,
1656
- s(:call, nil, :baz, s(:arglist)))))
1035
+ s(:call, nil, :baz)))
1657
1036
  end
1658
1037
 
1659
1038
  it "handles assignment inside unary operator expressions" do
1660
- result = parser.parse "+(foo = bar)"
1661
- result.must_equal s(:call,
1662
- s(:lasgn, :foo, s(:call, nil, :bar, s(:arglist))),
1663
- :+@,
1664
- s(:arglist))
1039
+ "+(foo = bar)".
1040
+ must_be_parsed_as s(:call,
1041
+ s(:lasgn, :foo, s(:call, nil, :bar)),
1042
+ :+@)
1665
1043
  end
1666
1044
  end
1667
1045
 
@@ -1672,27 +1050,26 @@ describe RipperRubyParser::Parser do
1672
1050
  result = parser.parse "# Foo\ndef foo; end"
1673
1051
  result.must_equal s(:defn,
1674
1052
  :foo,
1675
- s(:args), s(:scope, s(:block, s(:nil))))
1053
+ s(:args), s(:nil))
1676
1054
  result.comments.must_equal "# Foo\n"
1677
1055
  end
1678
1056
 
1679
1057
  it "handles comments for methods with explicit receiver" do
1680
1058
  result = parser.parse "# Foo\ndef foo.bar; end"
1681
1059
  result.must_equal s(:defs,
1682
- s(:call, nil, :foo, s(:arglist)),
1060
+ s(:call, nil, :foo),
1683
1061
  :bar,
1684
- s(:args), s(:scope, s(:block)))
1062
+ s(:args))
1685
1063
  result.comments.must_equal "# Foo\n"
1686
1064
  end
1687
1065
 
1688
1066
  it "matches comments to the correct entity" do
1689
1067
  result = parser.parse "# Foo\nclass Foo\n# Bar\ndef bar\nend\nend"
1690
1068
  result.must_equal s(:class, :Foo, nil,
1691
- s(:scope,
1692
- s(:defn, :bar,
1693
- s(:args), s(:scope, s(:block, s(:nil))))))
1069
+ s(:defn, :bar,
1070
+ s(:args), s(:nil)))
1694
1071
  result.comments.must_equal "# Foo\n"
1695
- defn = result[3][1]
1072
+ defn = result[3]
1696
1073
  defn.sexp_type.must_equal :defn
1697
1074
  defn.comments.must_equal "# Bar\n"
1698
1075
  end
@@ -1701,16 +1078,41 @@ describe RipperRubyParser::Parser do
1701
1078
  result = parser.parse "# Foo\n# Bar\ndef foo; end"
1702
1079
  result.must_equal s(:defn,
1703
1080
  :foo,
1704
- s(:args), s(:scope, s(:block, s(:nil))))
1081
+ s(:args), s(:nil))
1705
1082
  result.comments.must_equal "# Foo\n# Bar\n"
1706
1083
  end
1707
1084
 
1085
+ it "drops comments inside method bodies" do
1086
+ result = parser.parse <<-END
1087
+ # Foo
1088
+ class Foo
1089
+ # foo
1090
+ def foo
1091
+ bar # this is dropped
1092
+ end
1093
+
1094
+ # bar
1095
+ def bar
1096
+ baz
1097
+ end
1098
+ end
1099
+ END
1100
+ result.must_equal s(:class,
1101
+ :Foo,
1102
+ nil,
1103
+ s(:defn, :foo, s(:args), s(:call, nil, :bar)),
1104
+ s(:defn, :bar, s(:args), s(:call, nil, :baz)))
1105
+ result.comments.must_equal "# Foo\n"
1106
+ result[3].comments.must_equal "# foo\n"
1107
+ result[4].comments.must_equal "# bar\n"
1108
+ end
1109
+
1708
1110
  it "handles the use of symbols that are keywords" do
1709
1111
  result = parser.parse "# Foo\ndef bar\n:class\nend"
1710
1112
  result.must_equal s(:defn,
1711
1113
  :bar,
1712
1114
  s(:args),
1713
- s(:scope, s(:block, s(:lit, :class))))
1115
+ s(:lit, :class))
1714
1116
  result.comments.must_equal "# Foo\n"
1715
1117
  end
1716
1118
 
@@ -1719,10 +1121,8 @@ describe RipperRubyParser::Parser do
1719
1121
  result.must_equal s(:defn,
1720
1122
  :bar,
1721
1123
  s(:args),
1722
- s(:scope,
1723
- s(:block,
1724
- s(:sclass, s(:self),
1725
- s(:scope, s(:call, nil, :baz, s(:arglist)))))))
1124
+ s(:sclass, s(:self),
1125
+ s(:call, nil, :baz)))
1726
1126
  result.comments.must_equal "# Foo\n"
1727
1127
  end
1728
1128
  end
@@ -1852,23 +1252,23 @@ describe RipperRubyParser::Parser do
1852
1252
  end
1853
1253
 
1854
1254
  it "assigns line numbers to nested sexps that don't generate their own line numbers" do
1855
- result = parser.parse "foo() do\nnext\nend\n"
1255
+ result = parser.parse "foo(bar) do\nnext baz\nend\n"
1856
1256
  result.must_equal s(:iter,
1857
- s(:call, nil, :foo, s(:arglist)),
1858
- nil,
1859
- s(:next))
1257
+ s(:call, nil, :foo, s(:call, nil, :bar)),
1258
+ s(:args),
1259
+ s(:next, s(:call, nil, :baz)))
1860
1260
  arglist = result[1][3]
1861
1261
  block = result[3]
1862
1262
  nums = [ arglist.line, block.line ]
1863
- nums.must_equal [1, 1]
1263
+ nums.must_equal [1, 2]
1864
1264
  end
1865
1265
 
1866
1266
  describe "when a line number is passed" do
1867
1267
  it "shifts all line numbers as appropriate" do
1868
1268
  result = parser.parse "foo\nbar\n", '(string)', 3
1869
1269
  result.must_equal s(:block,
1870
- s(:call, nil, :foo, s(:arglist)),
1871
- s(:call, nil, :bar, s(:arglist)))
1270
+ s(:call, nil, :foo),
1271
+ s(:call, nil, :bar))
1872
1272
  result.line.must_equal 3
1873
1273
  result[1].line.must_equal 3
1874
1274
  result[2].line.must_equal 4