ripper_ruby_parser 0.0.4 → 0.0.5
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.
- data/Rakefile +2 -2
- data/lib/ripper_ruby_parser/commenting_sexp_builder.rb +34 -8
- data/lib/ripper_ruby_parser/parser.rb +15 -1
- data/lib/ripper_ruby_parser/sexp_handlers/arguments.rb +5 -0
- data/lib/ripper_ruby_parser/sexp_handlers/arrays.rb +1 -9
- data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +29 -11
- data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +61 -31
- data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +11 -3
- data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +15 -22
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +7 -0
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +27 -3
- data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +16 -14
- data/lib/ripper_ruby_parser/sexp_processor.rb +13 -1
- data/lib/ripper_ruby_parser/version.rb +1 -1
- data/test/end_to_end/comments_test.rb +0 -16
- data/test/end_to_end/samples_comparison_test.rb +13 -3
- data/test/test_helper.rb +27 -7
- data/test/unit/parser_assignment_test.rb +70 -0
- data/test/unit/parser_blocks_test.rb +72 -0
- data/test/unit/parser_conditionals_test.rb +29 -0
- data/test/unit/parser_method_calls_test.rb +27 -0
- data/test/unit/parser_operators_test.rb +16 -0
- data/test/unit/parser_test.rb +53 -20
- data/test/unit/sexp_processor_test.rb +3 -3
- metadata +22 -12
data/Rakefile
CHANGED
@@ -5,13 +5,13 @@ namespace :test do
|
|
5
5
|
Rake::TestTask.new(:unit) do |t|
|
6
6
|
t.libs = ['lib']
|
7
7
|
t.test_files = FileList['test/unit/*_test.rb']
|
8
|
-
t.
|
8
|
+
t.warning = true
|
9
9
|
end
|
10
10
|
|
11
11
|
Rake::TestTask.new(:end_to_end) do |t|
|
12
12
|
t.libs = ['lib']
|
13
13
|
t.test_files = FileList['test/end_to_end/*_test.rb']
|
14
|
-
t.
|
14
|
+
t.warning = true
|
15
15
|
end
|
16
16
|
|
17
17
|
task :run => [:unit, :end_to_end]
|
@@ -7,6 +7,7 @@ module RipperRubyParser
|
|
7
7
|
super
|
8
8
|
@comment = nil
|
9
9
|
@comment_stack = []
|
10
|
+
@in_symbol = false
|
10
11
|
end
|
11
12
|
|
12
13
|
def on_comment tok
|
@@ -18,22 +19,42 @@ module RipperRubyParser
|
|
18
19
|
def on_kw tok
|
19
20
|
case tok
|
20
21
|
when "class", "def", "module"
|
21
|
-
|
22
|
-
|
22
|
+
unless @in_symbol
|
23
|
+
@comment_stack.push [tok.to_sym, @comment]
|
24
|
+
@comment = nil
|
25
|
+
end
|
23
26
|
end
|
24
27
|
super
|
25
28
|
end
|
26
29
|
|
30
|
+
def on_module *args
|
31
|
+
commentize(:module, super)
|
32
|
+
end
|
33
|
+
|
27
34
|
def on_class *args
|
28
|
-
commentize(super)
|
35
|
+
commentize(:class, super)
|
36
|
+
end
|
37
|
+
|
38
|
+
def on_sclass *args
|
39
|
+
commentize(:class, super)
|
29
40
|
end
|
30
41
|
|
31
42
|
def on_def *args
|
32
|
-
commentize(super)
|
43
|
+
commentize(:def, super)
|
33
44
|
end
|
34
45
|
|
35
|
-
def
|
36
|
-
commentize(super)
|
46
|
+
def on_defs *args
|
47
|
+
commentize(:def, super)
|
48
|
+
end
|
49
|
+
|
50
|
+
def on_symbeg *args
|
51
|
+
@in_symbol = true
|
52
|
+
super
|
53
|
+
end
|
54
|
+
|
55
|
+
def on_symbol *args
|
56
|
+
@in_symbol = false
|
57
|
+
super
|
37
58
|
end
|
38
59
|
|
39
60
|
def on_parse_error *args
|
@@ -58,8 +79,13 @@ module RipperRubyParser
|
|
58
79
|
|
59
80
|
private
|
60
81
|
|
61
|
-
def commentize exp
|
62
|
-
comment = @comment_stack.pop
|
82
|
+
def commentize name, exp
|
83
|
+
tok, comment = @comment_stack.pop
|
84
|
+
unless tok == name
|
85
|
+
p @comment_stack
|
86
|
+
p [tok, comment]
|
87
|
+
raise "Expected on_#{tok} event, got on_#{name}"
|
88
|
+
end
|
63
89
|
if comment.nil?
|
64
90
|
[:comment, "", exp]
|
65
91
|
else
|
@@ -13,14 +13,28 @@ module RipperRubyParser
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def parse source, filename='(string)', lineno=1
|
16
|
+
# FIXME: Allow parser class to be passed to #initialize also.
|
16
17
|
parser = CommentingSexpBuilder.new(source, filename, lineno)
|
17
|
-
|
18
|
+
|
19
|
+
result = suppress_warnings { parser.parse }
|
18
20
|
raise "Ripper parse failed." if result.nil?
|
21
|
+
|
19
22
|
exp = Sexp.from_array(result)
|
23
|
+
|
20
24
|
@processor.filename = filename
|
21
25
|
@processor.extra_compatible = extra_compatible
|
22
26
|
@processor.process exp
|
23
27
|
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def suppress_warnings
|
32
|
+
old_verbose = $VERBOSE
|
33
|
+
$VERBOSE = nil
|
34
|
+
result = yield
|
35
|
+
$VERBOSE = old_verbose
|
36
|
+
result
|
37
|
+
end
|
24
38
|
end
|
25
39
|
end
|
26
40
|
|
@@ -3,15 +3,7 @@ module RipperRubyParser
|
|
3
3
|
module Arrays
|
4
4
|
def process_array exp
|
5
5
|
_, elems = exp.shift 2
|
6
|
-
|
7
|
-
elems.map! do |elem|
|
8
|
-
if elem.first.is_a? Symbol
|
9
|
-
elem
|
10
|
-
else
|
11
|
-
elem.first
|
12
|
-
end
|
13
|
-
end
|
14
|
-
s(:array, *elems)
|
6
|
+
s(:array, *handle_array_elements(elems))
|
15
7
|
end
|
16
8
|
|
17
9
|
def process_aref exp
|
@@ -21,11 +21,11 @@ module RipperRubyParser
|
|
21
21
|
left.shift
|
22
22
|
end
|
23
23
|
|
24
|
-
left =
|
24
|
+
left = create_multiple_assignment_sub_types left
|
25
25
|
|
26
26
|
right = process(right)
|
27
27
|
|
28
|
-
unless right.sexp_type
|
28
|
+
unless [:array, :splat].include? right.sexp_type
|
29
29
|
right = s(:to_ary, right)
|
30
30
|
end
|
31
31
|
|
@@ -35,21 +35,30 @@ module RipperRubyParser
|
|
35
35
|
def process_mrhs_new_from_args exp
|
36
36
|
_, inner, last = exp.shift 3
|
37
37
|
inner.map! {|item| process(item)}
|
38
|
-
inner.push process(last)
|
38
|
+
inner.push process(last) unless last.nil?
|
39
39
|
s(:array, *inner)
|
40
40
|
end
|
41
41
|
|
42
|
+
def process_mrhs_add_star exp
|
43
|
+
exp = generic_add_star exp
|
44
|
+
unless exp.first.is_a? Symbol
|
45
|
+
exp = exp.first
|
46
|
+
end
|
47
|
+
exp
|
48
|
+
end
|
49
|
+
|
42
50
|
def process_mlhs_add_star exp
|
43
51
|
generic_add_star exp
|
44
52
|
end
|
45
53
|
|
46
54
|
def process_mlhs_paren exp
|
47
55
|
_, contents = exp.shift 2
|
56
|
+
|
48
57
|
items = handle_potentially_typeless_sexp(contents)
|
49
58
|
|
50
|
-
items
|
59
|
+
return items if items.first.is_a? Symbol
|
51
60
|
|
52
|
-
s(:masgn, s(:array, *items))
|
61
|
+
s(:masgn, s(:array, *create_multiple_assignment_sub_types(items)))
|
53
62
|
end
|
54
63
|
|
55
64
|
def process_opassign exp
|
@@ -64,10 +73,14 @@ module RipperRubyParser
|
|
64
73
|
|
65
74
|
private
|
66
75
|
|
67
|
-
def
|
76
|
+
def create_multiple_assignment_sub_types sexp_list
|
68
77
|
sexp_list.map! do |item|
|
69
78
|
if item.sexp_type == :splat
|
70
|
-
|
79
|
+
if item[1].nil?
|
80
|
+
s(:splat)
|
81
|
+
else
|
82
|
+
s(:splat, create_valueless_assignment_sub_type(item[1]))
|
83
|
+
end
|
71
84
|
else
|
72
85
|
create_valueless_assignment_sub_type item
|
73
86
|
end
|
@@ -88,9 +101,11 @@ module RipperRubyParser
|
|
88
101
|
def create_operator_assignment_sub_type lvalue, value, operator
|
89
102
|
case lvalue.sexp_type
|
90
103
|
when :aref_field
|
91
|
-
|
104
|
+
_, arr, arglist = lvalue
|
105
|
+
s(:op_asgn1, arr, arglist, operator, value)
|
92
106
|
when :field
|
93
|
-
|
107
|
+
_, obj, _, (_, field) = lvalue
|
108
|
+
s(:op_asgn2, obj, :"#{field}=", operator, value)
|
94
109
|
else
|
95
110
|
if operator == :"||"
|
96
111
|
s(:op_asgn_or, lvalue, create_assignment_sub_type(lvalue, value))
|
@@ -104,9 +119,12 @@ module RipperRubyParser
|
|
104
119
|
def create_regular_assignment_sub_type lvalue, value
|
105
120
|
case lvalue.sexp_type
|
106
121
|
when :aref_field
|
107
|
-
|
122
|
+
_, arr, arglist = lvalue
|
123
|
+
arglist << value
|
124
|
+
s(:attrasgn, arr, :[]=, arglist)
|
108
125
|
when :field
|
109
|
-
|
126
|
+
_, obj, _, (_, field) = lvalue
|
127
|
+
s(:attrasgn, obj, :"#{field}=", s(:arglist, value))
|
110
128
|
else
|
111
129
|
create_assignment_sub_type lvalue, value
|
112
130
|
end
|
@@ -4,7 +4,7 @@ module RipperRubyParser
|
|
4
4
|
def process_method_add_block exp
|
5
5
|
_, call, block = exp.shift 3
|
6
6
|
block = process(block)
|
7
|
-
args =
|
7
|
+
args = block[1]
|
8
8
|
stmt = block[2].first
|
9
9
|
if stmt.nil?
|
10
10
|
s(:iter, process(call), args)
|
@@ -25,27 +25,36 @@ module RipperRubyParser
|
|
25
25
|
_, normal, defaults, rest, _, block = exp.shift 6
|
26
26
|
|
27
27
|
args = [*normal].map do |id|
|
28
|
-
|
28
|
+
process(id)
|
29
29
|
end
|
30
30
|
|
31
31
|
assigns = [*defaults].map do |pair|
|
32
|
-
sym =
|
32
|
+
sym = process(pair[0])
|
33
33
|
args << sym
|
34
|
-
val = process
|
35
|
-
s(:lasgn, sym, val)
|
34
|
+
val = process(pair[1])
|
35
|
+
s(:lasgn, sym[1], val)
|
36
36
|
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
args << process(rest) unless rest.nil?
|
39
|
+
args << process(block) unless block.nil?
|
40
|
+
args << s(:block, *assigns) if assigns.length > 0
|
41
41
|
|
42
|
-
|
42
|
+
s(:args, *args)
|
43
|
+
end
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
end
|
45
|
+
def process_block_var exp
|
46
|
+
_, args, _ = exp.shift 3
|
47
47
|
|
48
|
-
|
48
|
+
names = process(args)
|
49
|
+
names.shift
|
50
|
+
|
51
|
+
if names.length == 1 and names.first.sexp_type == :lvar
|
52
|
+
s(:lasgn, names.first[1])
|
53
|
+
elsif names.length == 1 and names.first.sexp_type == :masgn
|
54
|
+
names.first
|
55
|
+
else
|
56
|
+
s(:masgn, s(:array, *names.map { |name| arg_name_to_lasgn(name) }))
|
57
|
+
end
|
49
58
|
end
|
50
59
|
|
51
60
|
def process_begin exp
|
@@ -57,7 +66,7 @@ module RipperRubyParser
|
|
57
66
|
end
|
58
67
|
|
59
68
|
def process_rescue exp
|
60
|
-
_, eclass, evar, block,
|
69
|
+
_, eclass, evar, block, after = exp.shift 5
|
61
70
|
rescue_block = map_body(block)
|
62
71
|
|
63
72
|
arr = []
|
@@ -76,34 +85,46 @@ module RipperRubyParser
|
|
76
85
|
arr << easgn
|
77
86
|
end
|
78
87
|
|
79
|
-
s(
|
80
|
-
wrap_in_block(rescue_block))
|
88
|
+
s(
|
89
|
+
s(:resbody, s(:array, *arr), wrap_in_block(rescue_block)),
|
90
|
+
*process(after))
|
81
91
|
end
|
82
92
|
|
83
93
|
def process_bodystmt exp
|
84
|
-
_, body, rescue_block,
|
94
|
+
_, body, rescue_block, else_block, ensure_block = exp.shift 5
|
85
95
|
|
86
96
|
body = map_body body
|
87
97
|
|
88
|
-
unless rescue_block or ensure_block
|
89
|
-
|
90
|
-
end
|
98
|
+
#unless rescue_block or ensure_block
|
99
|
+
# return s(:scope, s(:block, *body))
|
100
|
+
#end
|
91
101
|
|
92
102
|
body = wrap_in_block(body)
|
93
103
|
|
104
|
+
body = if body.nil?
|
105
|
+
s()
|
106
|
+
else
|
107
|
+
s(body)
|
108
|
+
end
|
109
|
+
|
94
110
|
if rescue_block
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
111
|
+
body.push(*process(rescue_block))
|
112
|
+
body << process(else_block) if else_block
|
113
|
+
body = s(s(:rescue, *body))
|
114
|
+
elsif else_block
|
115
|
+
body << process(else_block)
|
100
116
|
end
|
101
117
|
|
102
118
|
if ensure_block
|
103
|
-
body
|
119
|
+
body << process(ensure_block)
|
120
|
+
body = s(s(:ensure, *body))
|
104
121
|
end
|
105
122
|
|
106
|
-
|
123
|
+
if body.length == 1 and body.first.sexp_type == :block
|
124
|
+
s(:scope, *body)
|
125
|
+
else
|
126
|
+
s(:scope, s(:block, *body))
|
127
|
+
end
|
107
128
|
end
|
108
129
|
|
109
130
|
def process_rescue_mod exp
|
@@ -154,12 +175,21 @@ module RipperRubyParser
|
|
154
175
|
end
|
155
176
|
end
|
156
177
|
|
157
|
-
def
|
158
|
-
|
159
|
-
|
160
|
-
|
178
|
+
def arg_name_to_lasgn(name)
|
179
|
+
case name.sexp_type
|
180
|
+
when :lvar
|
181
|
+
s(:lasgn, name[1])
|
182
|
+
when :splat
|
183
|
+
if name[1].nil?
|
184
|
+
s(:splat)
|
185
|
+
else
|
186
|
+
s(:splat, s(:lasgn, name[1][1]))
|
187
|
+
end
|
188
|
+
else
|
189
|
+
name
|
161
190
|
end
|
162
191
|
end
|
192
|
+
|
163
193
|
end
|
164
194
|
end
|
165
195
|
end
|
@@ -26,7 +26,7 @@ module RipperRubyParser
|
|
26
26
|
|
27
27
|
def process_if_mod exp
|
28
28
|
_, cond, truepart = exp.shift 3
|
29
|
-
s(:if,
|
29
|
+
process_if s(:if, cond, s(truepart), nil)
|
30
30
|
end
|
31
31
|
|
32
32
|
def process_unless_mod exp
|
@@ -59,8 +59,16 @@ module RipperRubyParser
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
|
63
|
-
|
62
|
+
values = handle_array_elements values
|
63
|
+
values = values.map do |val|
|
64
|
+
if val.sexp_type == :splat
|
65
|
+
s(:when, val[1], nil)
|
66
|
+
else
|
67
|
+
val
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
s(s(:when, s(:array, *values),
|
64
72
|
handle_statement_list(truepart)),
|
65
73
|
*falsepart)
|
66
74
|
end
|
@@ -23,25 +23,6 @@ module RipperRubyParser
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
def convert_block_args(args)
|
27
|
-
if args
|
28
|
-
names = args[1][1..-1]
|
29
|
-
if names.length > 1 or names.first =~ /^\*/
|
30
|
-
s(:masgn, s(:array, *names.map { |name| arg_name_to_lasgn(name) }))
|
31
|
-
else
|
32
|
-
s(:lasgn, names.first)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def arg_name_to_lasgn(name)
|
38
|
-
if name =~ /^\*(.*)/
|
39
|
-
s(:splat, s(:lasgn, $1.to_sym))
|
40
|
-
else
|
41
|
-
s(:lasgn, name)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
26
|
def handle_statement_list exp
|
46
27
|
statements = map_body exp
|
47
28
|
|
@@ -60,8 +41,9 @@ module RipperRubyParser
|
|
60
41
|
ident.to_sym
|
61
42
|
end
|
62
43
|
|
63
|
-
def with_position pos, exp
|
44
|
+
def with_position pos, exp=nil
|
64
45
|
(line, _) = pos
|
46
|
+
exp = yield if exp.nil?
|
65
47
|
with_line_number line, exp
|
66
48
|
end
|
67
49
|
|
@@ -77,9 +59,9 @@ module RipperRubyParser
|
|
77
59
|
|
78
60
|
def generic_add_star exp
|
79
61
|
_, args, splatarg = exp.shift 3
|
80
|
-
items = args
|
62
|
+
items = handle_potentially_typeless_sexp args
|
81
63
|
items << s(:splat, process(splatarg))
|
82
|
-
|
64
|
+
items
|
83
65
|
end
|
84
66
|
|
85
67
|
def is_literal? exp
|
@@ -118,6 +100,17 @@ module RipperRubyParser
|
|
118
100
|
s(:array, *args)
|
119
101
|
end
|
120
102
|
end
|
103
|
+
|
104
|
+
def handle_array_elements elems
|
105
|
+
elems = handle_potentially_typeless_sexp(elems)
|
106
|
+
elems.map do |elem|
|
107
|
+
if elem.first.is_a? Symbol
|
108
|
+
elem
|
109
|
+
else
|
110
|
+
elem.first
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
121
114
|
end
|
122
115
|
end
|
123
116
|
end
|
@@ -41,6 +41,13 @@ module RipperRubyParser
|
|
41
41
|
with_position_from_node_symbol(ident) {|method|
|
42
42
|
s(:call, nil, method, s(:arglist)) }
|
43
43
|
end
|
44
|
+
|
45
|
+
def process_super exp
|
46
|
+
_, args = exp.shift 2
|
47
|
+
args = process(args)
|
48
|
+
args.shift
|
49
|
+
s(:super, *args)
|
50
|
+
end
|
44
51
|
end
|
45
52
|
end
|
46
53
|
end
|
@@ -4,15 +4,17 @@ module RipperRubyParser
|
|
4
4
|
def process_def exp
|
5
5
|
_, ident, params, body = exp.shift 4
|
6
6
|
ident, pos = extract_node_symbol_with_position ident
|
7
|
+
params = convert_special_args(process(params))
|
7
8
|
with_position(pos,
|
8
|
-
s(:defn, ident,
|
9
|
+
s(:defn, ident, params, method_body(body)))
|
9
10
|
end
|
10
11
|
|
11
12
|
def process_defs exp
|
12
|
-
_, receiver, _, method,
|
13
|
+
_, receiver, _, method, params, body = exp.shift 6
|
14
|
+
params = convert_special_args(process(params))
|
13
15
|
s(:defs, process(receiver),
|
14
16
|
extract_node_symbol(method),
|
15
|
-
|
17
|
+
params, in_method { process(body) })
|
16
18
|
end
|
17
19
|
|
18
20
|
def process_return exp
|
@@ -81,6 +83,28 @@ module RipperRubyParser
|
|
81
83
|
end
|
82
84
|
scope
|
83
85
|
end
|
86
|
+
|
87
|
+
SPECIAL_ARG_MARKER = {
|
88
|
+
:splat => "*",
|
89
|
+
:blockarg => "&"
|
90
|
+
}
|
91
|
+
|
92
|
+
def convert_special_args args
|
93
|
+
args.map! do |item|
|
94
|
+
if item.is_a? Symbol
|
95
|
+
item
|
96
|
+
else
|
97
|
+
if (marker = SPECIAL_ARG_MARKER[item.sexp_type])
|
98
|
+
name = extract_node_symbol item[1]
|
99
|
+
:"#{marker}#{name}"
|
100
|
+
elsif item.sexp_type == :lvar
|
101
|
+
item[1]
|
102
|
+
else
|
103
|
+
item
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
84
108
|
end
|
85
109
|
end
|
86
110
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module RipperRubyParser
|
2
2
|
module SexpHandlers
|
3
3
|
module Operators
|
4
|
-
|
4
|
+
BINARY_OPERATOR_MAP = {
|
5
5
|
"&&".to_sym => :and,
|
6
6
|
"||".to_sym => :or,
|
7
7
|
:and => :and,
|
@@ -13,6 +13,11 @@ module RipperRubyParser
|
|
13
13
|
:not => :not
|
14
14
|
}
|
15
15
|
|
16
|
+
NEGATED_BINARY_OPERATOR_MAP = {
|
17
|
+
:"!~" => :=~,
|
18
|
+
:"!=" => :==
|
19
|
+
}
|
20
|
+
|
16
21
|
def process_binary exp
|
17
22
|
_, left, op, right = exp.shift 4
|
18
23
|
if op == :=~
|
@@ -23,21 +28,18 @@ module RipperRubyParser
|
|
23
28
|
else
|
24
29
|
s(:call, process(left), op, s(:arglist, process(right)))
|
25
30
|
end
|
26
|
-
elsif
|
27
|
-
s(:not, s(:
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
if mapped == left.sexp_type
|
34
|
-
s(left.sexp_type, left[1], s(mapped, left[2], right))
|
35
|
-
else
|
36
|
-
s(mapped, left, right)
|
37
|
-
end
|
31
|
+
elsif (mapped = NEGATED_BINARY_OPERATOR_MAP[op])
|
32
|
+
s(:not, process(s(:binary, left, mapped, right)))
|
33
|
+
elsif (mapped = BINARY_OPERATOR_MAP[op])
|
34
|
+
left = process(left)
|
35
|
+
right = process(right)
|
36
|
+
if mapped == left.sexp_type
|
37
|
+
s(left.sexp_type, left[1], s(mapped, left[2], right))
|
38
38
|
else
|
39
|
-
s(
|
39
|
+
s(mapped, left, right)
|
40
40
|
end
|
41
|
+
else
|
42
|
+
s(:call, process(left), op, s(:arglist, process(right)))
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
@@ -71,6 +71,11 @@ module RipperRubyParser
|
|
71
71
|
s(:class, const, parent, class_or_module_body(body)))
|
72
72
|
end
|
73
73
|
|
74
|
+
def process_sclass exp
|
75
|
+
_, klass, block = exp.shift 3
|
76
|
+
s(:sclass, process(klass), class_or_module_body(block))
|
77
|
+
end
|
78
|
+
|
74
79
|
def process_var_ref exp
|
75
80
|
_, contents = exp.shift 2
|
76
81
|
process(contents)
|
@@ -178,7 +183,14 @@ module RipperRubyParser
|
|
178
183
|
|
179
184
|
def process_at_backref exp
|
180
185
|
_, str, pos = exp.shift 3
|
181
|
-
|
186
|
+
name = str[1..-1]
|
187
|
+
with_position pos do
|
188
|
+
if name =~ /[0-9]/
|
189
|
+
s(:nth_ref, name.to_i)
|
190
|
+
else
|
191
|
+
s(:back_ref, name.to_sym)
|
192
|
+
end
|
193
|
+
end
|
182
194
|
end
|
183
195
|
|
184
196
|
private
|
@@ -2,22 +2,6 @@ require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
|
|
2
2
|
require 'ruby_parser'
|
3
3
|
|
4
4
|
describe "Using RipperRubyParser and RubyParser" do
|
5
|
-
def to_comments exp
|
6
|
-
inner = exp.map do |sub_exp|
|
7
|
-
if sub_exp.is_a? Sexp
|
8
|
-
to_comments sub_exp
|
9
|
-
else
|
10
|
-
sub_exp
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
if exp.comments.nil?
|
15
|
-
s(*inner)
|
16
|
-
else
|
17
|
-
s(:comment, exp.comments, s(*inner))
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
5
|
let :newparser do
|
22
6
|
RipperRubyParser::Parser.new
|
23
7
|
end
|
@@ -16,13 +16,23 @@ describe "Using RipperRubyParser and RubyParser" do
|
|
16
16
|
File.read file
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
let :original do
|
20
|
+
oldparser.parse program
|
21
|
+
end
|
22
|
+
|
23
|
+
let :imitation do
|
20
24
|
newparser.extra_compatible = true
|
21
|
-
|
22
|
-
|
25
|
+
newparser.parse program
|
26
|
+
end
|
23
27
|
|
28
|
+
it "gives the same result" do
|
24
29
|
formatted(imitation).must_equal formatted(original)
|
25
30
|
end
|
31
|
+
|
32
|
+
it "gives the same result with comments" do
|
33
|
+
formatted(to_comments(imitation)).
|
34
|
+
must_equal formatted(to_comments(original))
|
35
|
+
end
|
26
36
|
end
|
27
37
|
end
|
28
38
|
end
|
data/test/test_helper.rb
CHANGED
@@ -9,16 +9,36 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
9
9
|
|
10
10
|
require 'ripper_ruby_parser'
|
11
11
|
|
12
|
-
class MiniTest::
|
12
|
+
class MiniTest::Spec
|
13
13
|
def formatted exp
|
14
14
|
exp.to_s.gsub(/\), /, "),\n")
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
def to_comments exp
|
18
|
+
inner = exp.map do |sub_exp|
|
19
|
+
if sub_exp.is_a? Sexp
|
20
|
+
to_comments sub_exp
|
21
|
+
else
|
22
|
+
sub_exp
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
comments = exp.comments.to_s.gsub(/\n\s*\n/, "\n")
|
27
|
+
if comments.empty?
|
28
|
+
s(*inner)
|
29
|
+
else
|
30
|
+
s(:comment, comments, s(*inner))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def assert_parsed_as sexp, code
|
35
|
+
parser = RipperRubyParser::Parser.new
|
36
|
+
result = parser.parse code
|
37
|
+
assert_equal sexp, result
|
23
38
|
end
|
24
39
|
end
|
40
|
+
|
41
|
+
module MiniTest::Expectations
|
42
|
+
infect_an_assertion :assert_parsed_as, :must_be_parsed_as
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe RipperRubyParser::Parser do
|
4
|
+
describe "#parse" do
|
5
|
+
describe "for multiple assignment" do
|
6
|
+
specify do
|
7
|
+
"foo, * = bar".
|
8
|
+
must_be_parsed_as s(:masgn,
|
9
|
+
s(:array, s(:lasgn, :foo), s(:splat)),
|
10
|
+
s(:to_ary, s(:call, nil, :bar, s(:arglist))))
|
11
|
+
end
|
12
|
+
|
13
|
+
specify do
|
14
|
+
"(foo, *bar) = baz".
|
15
|
+
must_be_parsed_as s(:masgn,
|
16
|
+
s(:array,
|
17
|
+
s(:lasgn, :foo),
|
18
|
+
s(:splat, s(:lasgn, :bar))),
|
19
|
+
s(:to_ary, s(:call, nil, :baz, s(:arglist))))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "for assignment to a collection element" do
|
24
|
+
it "handles multiple indices" do
|
25
|
+
"foo[bar, baz] = qux".
|
26
|
+
must_be_parsed_as s(:attrasgn,
|
27
|
+
s(:call, nil, :foo, s(:arglist)),
|
28
|
+
:[]=,
|
29
|
+
s(:arglist,
|
30
|
+
s(:call, nil, :bar, s(:arglist)),
|
31
|
+
s(:call, nil, :baz, s(:arglist)),
|
32
|
+
s(:call, nil, :qux, s(:arglist))))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "for operator assignment" do
|
37
|
+
describe "assigning to a collection element" do
|
38
|
+
it "handles multiple indices" do
|
39
|
+
"foo[bar, baz] += qux".
|
40
|
+
must_be_parsed_as s(:op_asgn1,
|
41
|
+
s(:call, nil, :foo, s(:arglist)),
|
42
|
+
s(:arglist,
|
43
|
+
s(:call, nil, :bar, s(:arglist)),
|
44
|
+
s(:call, nil, :baz, s(:arglist))),
|
45
|
+
:+,
|
46
|
+
s(:call, nil, :qux, s(:arglist)))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "for multiple assignment" do
|
52
|
+
describe "with a right-hand splat" do
|
53
|
+
specify do
|
54
|
+
"foo, bar = *baz".
|
55
|
+
must_be_parsed_as s(:masgn,
|
56
|
+
s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
|
57
|
+
s(:splat, s(:call, nil, :baz, s(:arglist))))
|
58
|
+
end
|
59
|
+
specify do
|
60
|
+
"foo, bar = baz, *qux".
|
61
|
+
must_be_parsed_as s(:masgn,
|
62
|
+
s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
|
63
|
+
s(:array,
|
64
|
+
s(:call, nil, :baz, s(:arglist)),
|
65
|
+
s(:splat, s(:call, nil, :qux, s(:arglist)))))
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe RipperRubyParser::Parser do
|
4
|
+
describe "#parse" do
|
5
|
+
describe "for block parameters" do
|
6
|
+
specify do
|
7
|
+
"foo do |(bar, baz)| end".
|
8
|
+
must_be_parsed_as s(:iter,
|
9
|
+
s(:call, nil, :foo, s(:arglist)),
|
10
|
+
s(:masgn,
|
11
|
+
s(:array,
|
12
|
+
s(:lasgn, :bar),
|
13
|
+
s(:lasgn, :baz))))
|
14
|
+
end
|
15
|
+
|
16
|
+
specify do
|
17
|
+
"foo do |(bar, *baz)| end".
|
18
|
+
must_be_parsed_as s(:iter,
|
19
|
+
s(:call, nil, :foo, s(:arglist)),
|
20
|
+
s(:masgn,
|
21
|
+
s(:array,
|
22
|
+
s(:lasgn, :bar),
|
23
|
+
s(:splat, s(:lasgn, :baz)))))
|
24
|
+
end
|
25
|
+
|
26
|
+
specify do
|
27
|
+
"foo do |bar,*| end".
|
28
|
+
must_be_parsed_as s(:iter,
|
29
|
+
s(:call, nil, :foo, s(:arglist)),
|
30
|
+
s(:masgn, s(:array, s(:lasgn, :bar), s(:splat))))
|
31
|
+
end
|
32
|
+
|
33
|
+
it "behaves differently from RubyParser with a trailing comma in the block parameters" do
|
34
|
+
"foo do |bar, | end".
|
35
|
+
must_be_parsed_as s(:iter,
|
36
|
+
s(:call, nil, :foo, s(:arglist)),
|
37
|
+
s(:lasgn, :bar))
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "for rescue/else/ensure" do
|
42
|
+
it "works for a block with multiple rescue statements" do
|
43
|
+
"begin foo; rescue; bar; rescue; baz; end".
|
44
|
+
must_be_parsed_as s(:rescue,
|
45
|
+
s(:call, nil, :foo, s(:arglist)),
|
46
|
+
s(:resbody,
|
47
|
+
s(:array),
|
48
|
+
s(:call, nil, :bar, s(:arglist))),
|
49
|
+
s(:resbody,
|
50
|
+
s(:array),
|
51
|
+
s(:call, nil, :baz, s(:arglist))))
|
52
|
+
end
|
53
|
+
|
54
|
+
it "works for a block with rescue and else" do
|
55
|
+
"begin; foo; rescue; bar; else; baz; end".
|
56
|
+
must_be_parsed_as s(:rescue,
|
57
|
+
s(:call, nil, :foo, s(:arglist)),
|
58
|
+
s(:resbody,
|
59
|
+
s(:array),
|
60
|
+
s(:call, nil, :bar, s(:arglist))),
|
61
|
+
s(:call, nil, :baz, s(:arglist)))
|
62
|
+
end
|
63
|
+
|
64
|
+
it "works for a block with only else" do
|
65
|
+
"begin; foo; else; bar; end".
|
66
|
+
must_be_parsed_as s(:block,
|
67
|
+
s(:call, nil, :foo, s(:arglist)),
|
68
|
+
s(:call, nil, :bar, s(:arglist)))
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe RipperRubyParser::Parser do
|
4
|
+
describe "#parse" do
|
5
|
+
describe "for postfix if" do
|
6
|
+
it "normalizes negative conditions" do
|
7
|
+
"foo if not bar".
|
8
|
+
must_be_parsed_as s(:if,
|
9
|
+
s(:call, nil, :bar, s(:arglist)),
|
10
|
+
nil,
|
11
|
+
s(:call, nil, :foo, s(:arglist)))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "for case" do
|
16
|
+
it "emulates RubyParser's strange handling of splat" do
|
17
|
+
"case foo; when *bar; baz; end".
|
18
|
+
must_be_parsed_as s(:case, s(:call, nil, :foo, s(:arglist)),
|
19
|
+
s(:when,
|
20
|
+
s(:array,
|
21
|
+
s(:when, s(:call, nil, :bar, s(:arglist)),
|
22
|
+
nil)),
|
23
|
+
s(:call, nil, :baz, s(:arglist))),
|
24
|
+
nil)
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe RipperRubyParser::Parser do
|
4
|
+
describe "#parse" do
|
5
|
+
describe "for calls to super" do
|
6
|
+
specify { "super".must_be_parsed_as s(:zsuper) }
|
7
|
+
specify { "super foo".must_be_parsed_as s(:super,
|
8
|
+
s(:call, nil, :foo, s(:arglist))) }
|
9
|
+
specify {
|
10
|
+
"super foo, bar".must_be_parsed_as s(:super,
|
11
|
+
s(:call, nil, :foo, s(:arglist)),
|
12
|
+
s(:call, nil, :bar, s(:arglist))) }
|
13
|
+
specify {
|
14
|
+
"super foo, *bar".must_be_parsed_as s(:super,
|
15
|
+
s(:call, nil, :foo, s(:arglist)),
|
16
|
+
s(:splat,
|
17
|
+
s(:call, nil, :bar, s(:arglist)))) }
|
18
|
+
specify {
|
19
|
+
"super foo, *bar, &baz".
|
20
|
+
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)))) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe RipperRubyParser::Parser do
|
4
|
+
describe "#parse" do
|
5
|
+
describe "for negated operators" do
|
6
|
+
specify do
|
7
|
+
"foo !~ bar".must_be_parsed_as s(:not,
|
8
|
+
s(:call,
|
9
|
+
s(:call, nil, :foo, s(:arglist)),
|
10
|
+
:=~,
|
11
|
+
s(:arglist,
|
12
|
+
s(:call, nil, :bar, s(:arglist)))))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/test/unit/parser_test.rb
CHANGED
@@ -29,6 +29,10 @@ describe RipperRubyParser::Parser do
|
|
29
29
|
nil,
|
30
30
|
s(:scope))
|
31
31
|
end
|
32
|
+
|
33
|
+
it "works for singleton classes" do
|
34
|
+
"class << self; end".must_be_parsed_as s(:sclass, s(:self), s(:scope))
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
describe "for a module declaration" do
|
@@ -254,8 +258,7 @@ describe RipperRubyParser::Parser do
|
|
254
258
|
|
255
259
|
describe "for the for statement" do
|
256
260
|
it "works with do" do
|
257
|
-
result =
|
258
|
-
parser.parse "for foo in bar do; baz; end" }
|
261
|
+
result = parser.parse "for foo in bar do; baz; end"
|
259
262
|
result.must_equal s(:for,
|
260
263
|
s(:call, nil, :bar, s(:arglist)),
|
261
264
|
s(:lasgn, :foo),
|
@@ -263,8 +266,7 @@ describe RipperRubyParser::Parser do
|
|
263
266
|
end
|
264
267
|
|
265
268
|
it "works without do" do
|
266
|
-
result =
|
267
|
-
parser.parse "for foo in bar; baz; end" }
|
269
|
+
result = parser.parse "for foo in bar; baz; end"
|
268
270
|
result.must_equal s(:for,
|
269
271
|
s(:call, nil, :bar, s(:arglist)),
|
270
272
|
s(:lasgn, :foo),
|
@@ -321,8 +323,7 @@ describe RipperRubyParser::Parser do
|
|
321
323
|
end
|
322
324
|
|
323
325
|
it "works with assignment to an error variable" do
|
324
|
-
result =
|
325
|
-
parser.parse "begin; foo; rescue => e; bar; end" }
|
326
|
+
result = parser.parse "begin; foo; rescue => e; bar; end"
|
326
327
|
result.must_equal s(:rescue,
|
327
328
|
s(:call, nil, :foo, s(:arglist)),
|
328
329
|
s(:resbody,
|
@@ -340,8 +341,7 @@ describe RipperRubyParser::Parser do
|
|
340
341
|
end
|
341
342
|
|
342
343
|
it "works with filtering of the exception type and assignment to an error variable" do
|
343
|
-
result =
|
344
|
-
parser.parse "begin; foo; rescue Bar => e; baz; end" }
|
344
|
+
result = parser.parse "begin; foo; rescue Bar => e; baz; end"
|
345
345
|
result.must_equal s(:rescue,
|
346
346
|
s(:call, nil, :foo, s(:arglist)),
|
347
347
|
s(:resbody,
|
@@ -1188,6 +1188,9 @@ describe RipperRubyParser::Parser do
|
|
1188
1188
|
result.must_equal s(:nth_ref, 1)
|
1189
1189
|
end
|
1190
1190
|
|
1191
|
+
specify { "$'".must_be_parsed_as s(:back_ref, :"'") }
|
1192
|
+
specify { "$&".must_be_parsed_as s(:back_ref, :"&") }
|
1193
|
+
|
1191
1194
|
it "works for class variables" do
|
1192
1195
|
result = parser.parse "@@foo"
|
1193
1196
|
result.must_equal s(:cvar, :@@foo)
|
@@ -1263,7 +1266,7 @@ describe RipperRubyParser::Parser do
|
|
1263
1266
|
|
1264
1267
|
describe "for operator assignment" do
|
1265
1268
|
it "works with +=" do
|
1266
|
-
result =
|
1269
|
+
result = parser.parse "foo += bar"
|
1267
1270
|
result.must_equal s(:lasgn,
|
1268
1271
|
:foo,
|
1269
1272
|
s(:call,
|
@@ -1273,7 +1276,7 @@ describe RipperRubyParser::Parser do
|
|
1273
1276
|
end
|
1274
1277
|
|
1275
1278
|
it "works with -=" do
|
1276
|
-
result =
|
1279
|
+
result = parser.parse "foo -= bar"
|
1277
1280
|
result.must_equal s(:lasgn,
|
1278
1281
|
:foo,
|
1279
1282
|
s(:call,
|
@@ -1283,7 +1286,7 @@ describe RipperRubyParser::Parser do
|
|
1283
1286
|
end
|
1284
1287
|
|
1285
1288
|
it "works with ||=" do
|
1286
|
-
result =
|
1289
|
+
result = parser.parse "foo ||= bar"
|
1287
1290
|
result.must_equal s(:op_asgn_or,
|
1288
1291
|
s(:lvar, :foo),
|
1289
1292
|
s(:lasgn, :foo,
|
@@ -1339,7 +1342,7 @@ describe RipperRubyParser::Parser do
|
|
1339
1342
|
|
1340
1343
|
describe "for multiple assignment" do
|
1341
1344
|
it "works the same number of items on each side" do
|
1342
|
-
result =
|
1345
|
+
result = parser.parse "foo, bar = baz, qux"
|
1343
1346
|
result.must_equal s(:masgn,
|
1344
1347
|
s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
|
1345
1348
|
s(:array,
|
@@ -1348,7 +1351,7 @@ describe RipperRubyParser::Parser do
|
|
1348
1351
|
end
|
1349
1352
|
|
1350
1353
|
it "works with a single item on the right-hand side" do
|
1351
|
-
result =
|
1354
|
+
result = parser.parse "foo, bar = baz"
|
1352
1355
|
result.must_equal s(:masgn,
|
1353
1356
|
s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
|
1354
1357
|
s(:to_ary,
|
@@ -1356,7 +1359,7 @@ describe RipperRubyParser::Parser do
|
|
1356
1359
|
end
|
1357
1360
|
|
1358
1361
|
it "works with left-hand splat" do
|
1359
|
-
result =
|
1362
|
+
result = parser.parse "foo, *bar = baz, qux"
|
1360
1363
|
result.must_equal s(:masgn,
|
1361
1364
|
s(:array, s(:lasgn, :foo), s(:splat, s(:lasgn, :bar))),
|
1362
1365
|
s(:array,
|
@@ -1365,7 +1368,7 @@ describe RipperRubyParser::Parser do
|
|
1365
1368
|
end
|
1366
1369
|
|
1367
1370
|
it "works with brackets around the left-hand side" do
|
1368
|
-
result =
|
1371
|
+
result = parser.parse "(foo, bar) = baz"
|
1369
1372
|
result.must_equal s(:masgn,
|
1370
1373
|
s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
|
1371
1374
|
s(:to_ary,
|
@@ -1373,7 +1376,7 @@ describe RipperRubyParser::Parser do
|
|
1373
1376
|
end
|
1374
1377
|
|
1375
1378
|
it "works with complex destructuring" do
|
1376
|
-
result =
|
1379
|
+
result = parser.parse "foo, (bar, baz) = qux"
|
1377
1380
|
result.must_equal s(:masgn,
|
1378
1381
|
s(:array,
|
1379
1382
|
s(:lasgn, :foo),
|
@@ -1620,7 +1623,7 @@ describe RipperRubyParser::Parser do
|
|
1620
1623
|
|
1621
1624
|
describe "for expressions" do
|
1622
1625
|
it "handles assignment inside binary operator expressions" do
|
1623
|
-
result =
|
1626
|
+
result = parser.parse "foo + (bar = baz)"
|
1624
1627
|
result.must_equal s(:call,
|
1625
1628
|
s(:call, nil, :foo, s(:arglist)),
|
1626
1629
|
:+,
|
@@ -1631,7 +1634,7 @@ describe RipperRubyParser::Parser do
|
|
1631
1634
|
end
|
1632
1635
|
|
1633
1636
|
it "handles assignment inside unary operator expressions" do
|
1634
|
-
result =
|
1637
|
+
result = parser.parse "+(foo = bar)"
|
1635
1638
|
result.must_equal s(:call,
|
1636
1639
|
s(:lasgn, :foo, s(:call, nil, :bar, s(:arglist))),
|
1637
1640
|
:+@,
|
@@ -1650,6 +1653,15 @@ describe RipperRubyParser::Parser do
|
|
1650
1653
|
result.comments.must_equal "# Foo\n"
|
1651
1654
|
end
|
1652
1655
|
|
1656
|
+
it "handles comments for methods with explicit receiver" do
|
1657
|
+
result = parser.parse "# Foo\ndef foo.bar; end"
|
1658
|
+
result.must_equal s(:defs,
|
1659
|
+
s(:call, nil, :foo, s(:arglist)),
|
1660
|
+
:bar,
|
1661
|
+
s(:args), s(:scope, s(:block)))
|
1662
|
+
result.comments.must_equal "# Foo\n"
|
1663
|
+
end
|
1664
|
+
|
1653
1665
|
it "matches comments to the correct entity" do
|
1654
1666
|
result = parser.parse "# Foo\nclass Foo\n# Bar\ndef bar\nend\nend"
|
1655
1667
|
result.must_equal s(:class, :Foo, nil,
|
@@ -1669,6 +1681,27 @@ describe RipperRubyParser::Parser do
|
|
1669
1681
|
s(:args), s(:scope, s(:block, s(:nil))))
|
1670
1682
|
result.comments.must_equal "# Foo\n# Bar\n"
|
1671
1683
|
end
|
1684
|
+
|
1685
|
+
it "handles the use of symbols that are keywords" do
|
1686
|
+
result = parser.parse "# Foo\ndef bar\n:class\nend"
|
1687
|
+
result.must_equal s(:defn,
|
1688
|
+
:bar,
|
1689
|
+
s(:args),
|
1690
|
+
s(:scope, s(:block, s(:lit, :class))))
|
1691
|
+
result.comments.must_equal "# Foo\n"
|
1692
|
+
end
|
1693
|
+
|
1694
|
+
it "handles use of singleton class inside methods" do
|
1695
|
+
result = parser.parse "# Foo\ndef bar\nclass << self\nbaz\nend\nend"
|
1696
|
+
result.must_equal s(:defn,
|
1697
|
+
:bar,
|
1698
|
+
s(:args),
|
1699
|
+
s(:scope,
|
1700
|
+
s(:block,
|
1701
|
+
s(:sclass, s(:self),
|
1702
|
+
s(:scope, s(:call, nil, :baz, s(:arglist)))))))
|
1703
|
+
result.comments.must_equal "# Foo\n"
|
1704
|
+
end
|
1672
1705
|
end
|
1673
1706
|
|
1674
1707
|
# Note: differences in the handling of line numbers are not caught by
|
@@ -1786,12 +1819,12 @@ describe RipperRubyParser::Parser do
|
|
1786
1819
|
end
|
1787
1820
|
|
1788
1821
|
it "works for assignment of the empty hash" do
|
1789
|
-
result =
|
1822
|
+
result = parser.parse "foo = {}"
|
1790
1823
|
result.line.must_equal 1
|
1791
1824
|
end
|
1792
1825
|
|
1793
1826
|
it "works for multiple assignment of empty hashes" do
|
1794
|
-
result =
|
1827
|
+
result = parser.parse "foo, bar = {}, {}"
|
1795
1828
|
result.line.must_equal 1
|
1796
1829
|
end
|
1797
1830
|
|
@@ -185,11 +185,11 @@ describe RipperRubyParser::SexpProcessor do
|
|
185
185
|
end
|
186
186
|
|
187
187
|
describe "for a :params sexp" do
|
188
|
-
describe "with a normal
|
189
|
-
it "
|
188
|
+
describe "with a normal arguments" do
|
189
|
+
it "creates :lvar sexps" do
|
190
190
|
sexp = s(:params, s(s(:@ident, "bar", s(1, 8))), nil, nil, nil, nil)
|
191
191
|
result = processor.process sexp
|
192
|
-
result.must_equal s(:args, :bar)
|
192
|
+
result.must_equal s(:args, s(:lvar, :bar))
|
193
193
|
end
|
194
194
|
end
|
195
195
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ripper_ruby_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sexp_processor
|
16
|
-
requirement: &
|
16
|
+
requirement: &18762580 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *18762580
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: minitest
|
27
|
-
requirement: &
|
27
|
+
requirement: &18762060 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 2.11.2
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *18762060
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &18761580 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.9.2
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *18761580
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: ruby_parser
|
49
|
-
requirement: &
|
49
|
+
requirement: &18761100 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.3.1
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *18761100
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: simplecov
|
60
|
-
requirement: &
|
60
|
+
requirement: &18760720 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *18760720
|
69
69
|
description:
|
70
70
|
email:
|
71
71
|
- matijs@matijs.net
|
@@ -103,8 +103,13 @@ files:
|
|
103
103
|
- test/end_to_end/line_numbering_test.rb
|
104
104
|
- test/end_to_end/error_conditions_test.rb
|
105
105
|
- test/unit/parser_test.rb
|
106
|
+
- test/unit/parser_blocks_test.rb
|
106
107
|
- test/unit/sexp_processor_test.rb
|
108
|
+
- test/unit/parser_operators_test.rb
|
109
|
+
- test/unit/parser_conditionals_test.rb
|
107
110
|
- test/unit/version_test.rb
|
111
|
+
- test/unit/parser_assignment_test.rb
|
112
|
+
- test/unit/parser_method_calls_test.rb
|
108
113
|
- test/unit/commenting_sexp_builder_test.rb
|
109
114
|
- README.rdoc
|
110
115
|
- Rakefile
|
@@ -144,6 +149,11 @@ test_files:
|
|
144
149
|
- test/end_to_end/test_comparison_test.rb
|
145
150
|
- test/test_helper.rb
|
146
151
|
- test/unit/commenting_sexp_builder_test.rb
|
152
|
+
- test/unit/parser_assignment_test.rb
|
153
|
+
- test/unit/parser_blocks_test.rb
|
154
|
+
- test/unit/parser_conditionals_test.rb
|
155
|
+
- test/unit/parser_method_calls_test.rb
|
156
|
+
- test/unit/parser_operators_test.rb
|
147
157
|
- test/unit/parser_test.rb
|
148
158
|
- test/unit/sexp_processor_test.rb
|
149
159
|
- test/unit/version_test.rb
|