ripper_ruby_parser 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +3 -3
- data/Rakefile +4 -4
- data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +5 -7
- data/lib/ripper_ruby_parser/parser.rb +2 -3
- data/lib/ripper_ruby_parser/sexp_handlers/arguments.rb +2 -6
- data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +16 -17
- data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +5 -5
- data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +6 -7
- data/lib/ripper_ruby_parser/sexp_handlers/hashes.rb +4 -5
- data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +7 -11
- data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +35 -26
- data/lib/ripper_ruby_parser/sexp_handlers/loops.rb +19 -18
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +15 -15
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +9 -18
- data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +10 -10
- data/lib/ripper_ruby_parser/sexp_processor.rb +11 -14
- data/lib/ripper_ruby_parser/syntax_error.rb +1 -3
- data/lib/ripper_ruby_parser/version.rb +1 -1
- data/test/end_to_end/comparison_test.rb +0 -1
- data/test/end_to_end/lib_comparison_test.rb +0 -2
- data/test/end_to_end/line_numbering_test.rb +0 -1
- data/test/end_to_end/samples_comparison_test.rb +1 -1
- data/test/end_to_end/test_comparison_test.rb +0 -3
- data/test/pt_testcase/pt_test.rb +4 -4
- data/test/samples/inline.rb +704 -0
- data/test/test_helper.rb +39 -37
- data/test/unit/commenting_ripper_parser_test.rb +57 -59
- data/test/unit/parser_blocks_test.rb +19 -3
- data/test/unit/parser_conditionals_test.rb +0 -1
- data/test/unit/parser_literals_test.rb +25 -25
- data/test/unit/parser_method_calls_test.rb +19 -15
- data/test/unit/parser_test.rb +31 -24
- data/test/unit/sexp_processor_test.rb +1 -14
- metadata +67 -51
- data/lib/ripper_ruby_parser/sexp_ext.rb +0 -14
@@ -13,19 +13,10 @@ module RipperRubyParser
|
|
13
13
|
_, receiver, _, method, params, body = exp.shift 6
|
14
14
|
params = convert_special_args(process(params))
|
15
15
|
|
16
|
-
body = in_method do
|
17
|
-
process(body)
|
18
|
-
end
|
19
|
-
|
20
|
-
if body.length == 1 && body.first.sexp_type == :block
|
21
|
-
body = body.first
|
22
|
-
body.shift
|
23
|
-
end
|
24
|
-
|
25
16
|
s(:defs,
|
26
17
|
process(receiver),
|
27
18
|
extract_node_symbol(method),
|
28
|
-
params, *body)
|
19
|
+
params, *method_body(body))
|
29
20
|
end
|
30
21
|
|
31
22
|
def process_return exp
|
@@ -81,7 +72,7 @@ module RipperRubyParser
|
|
81
72
|
end
|
82
73
|
|
83
74
|
def make_method_name_literal exp
|
84
|
-
process(exp).tap {|it| it[0] = :lit}
|
75
|
+
process(exp).tap { |it| it[0] = :lit }
|
85
76
|
end
|
86
77
|
|
87
78
|
def method_body exp
|
@@ -99,9 +90,9 @@ module RipperRubyParser
|
|
99
90
|
end
|
100
91
|
|
101
92
|
SPECIAL_ARG_MARKER = {
|
102
|
-
:
|
103
|
-
:
|
104
|
-
}
|
93
|
+
splat: "*",
|
94
|
+
blockarg: "&"
|
95
|
+
}.freeze
|
105
96
|
|
106
97
|
def convert_special_args args
|
107
98
|
args.map! do |item|
|
@@ -109,10 +100,6 @@ module RipperRubyParser
|
|
109
100
|
item
|
110
101
|
else
|
111
102
|
case item.sexp_type
|
112
|
-
when *SPECIAL_ARG_MARKER.keys
|
113
|
-
marker = SPECIAL_ARG_MARKER[item.sexp_type]
|
114
|
-
name = extract_node_symbol item[1]
|
115
|
-
:"#{marker}#{name}"
|
116
103
|
when :lvar
|
117
104
|
item[1]
|
118
105
|
when :masgn
|
@@ -125,6 +112,10 @@ module RipperRubyParser
|
|
125
112
|
else
|
126
113
|
item
|
127
114
|
end
|
115
|
+
when *SPECIAL_ARG_MARKER.keys
|
116
|
+
marker = SPECIAL_ARG_MARKER[item.sexp_type]
|
117
|
+
name = extract_node_symbol item[1]
|
118
|
+
:"#{marker}#{name}"
|
128
119
|
else
|
129
120
|
item
|
130
121
|
end
|
@@ -6,15 +6,15 @@ module RipperRubyParser
|
|
6
6
|
:"||" => :or,
|
7
7
|
:and => :and,
|
8
8
|
:or => :or
|
9
|
-
}
|
9
|
+
}.freeze
|
10
10
|
|
11
11
|
UNARY_OPERATOR_MAP = {
|
12
|
-
:
|
13
|
-
}
|
12
|
+
not: :!
|
13
|
+
}.freeze
|
14
14
|
|
15
15
|
NEGATED_BINARY_OPERATOR_MAP = {
|
16
|
-
:"!~" =>
|
17
|
-
}
|
16
|
+
:"!~" => :=~
|
17
|
+
}.freeze
|
18
18
|
|
19
19
|
def process_binary exp
|
20
20
|
_, left, op, right = exp.shift 4
|
@@ -30,7 +30,7 @@ module RipperRubyParser
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def make_boolean_operator
|
33
|
+
def make_boolean_operator op, left, right
|
34
34
|
if left.first == :paren
|
35
35
|
s(op, process(left), process(right))
|
36
36
|
else
|
@@ -38,7 +38,7 @@ module RipperRubyParser
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
def make_regexp_match_operator
|
41
|
+
def make_regexp_match_operator op, left, right
|
42
42
|
if left.sexp_type == :regexp_literal
|
43
43
|
s(:match2, process(left), process(right))
|
44
44
|
elsif right.sexp_type == :regexp_literal
|
@@ -52,7 +52,7 @@ module RipperRubyParser
|
|
52
52
|
_, op, arg = exp.shift 3
|
53
53
|
arg = process(arg)
|
54
54
|
op = UNARY_OPERATOR_MAP[op] || op
|
55
|
-
if
|
55
|
+
if literal?(arg) && op != :!
|
56
56
|
s(:lit, arg[1].send(op))
|
57
57
|
else
|
58
58
|
s(:call, arg, op)
|
@@ -63,7 +63,7 @@ module RipperRubyParser
|
|
63
63
|
_, left, right = exp.shift 3
|
64
64
|
left = process(left)
|
65
65
|
right = process(right)
|
66
|
-
if
|
66
|
+
if literal?(left) && literal?(right)
|
67
67
|
s(:lit, Range.new(left[1], right[1]))
|
68
68
|
else
|
69
69
|
s(:dot2, left, right)
|
@@ -74,7 +74,7 @@ module RipperRubyParser
|
|
74
74
|
_, left, right = exp.shift 3
|
75
75
|
left = process(left)
|
76
76
|
right = process(right)
|
77
|
-
if
|
77
|
+
if literal?(left) && literal?(right)
|
78
78
|
s(:lit, Range.new(left[1], right[1], true))
|
79
79
|
else
|
80
80
|
s(:dot3, left, right)
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'sexp_processor'
|
2
2
|
require 'ripper_ruby_parser/sexp_handlers'
|
3
|
-
require 'ripper_ruby_parser/sexp_ext'
|
4
3
|
|
5
4
|
module RipperRubyParser
|
6
5
|
# Processes the sexp created by Ripper to what RubyParser would produce.
|
@@ -36,7 +35,6 @@ module RipperRubyParser
|
|
36
35
|
|
37
36
|
def process exp
|
38
37
|
return nil if exp.nil?
|
39
|
-
exp.fix_empty_type
|
40
38
|
|
41
39
|
result = super
|
42
40
|
trickle_up_line_numbers result
|
@@ -112,12 +110,12 @@ module RipperRubyParser
|
|
112
110
|
|
113
111
|
def process_paren exp
|
114
112
|
_, body = exp.shift 2
|
115
|
-
if body.
|
113
|
+
if body.empty?
|
116
114
|
s()
|
117
115
|
elsif body.first.is_a? Symbol
|
118
116
|
process body
|
119
117
|
else
|
120
|
-
body.map! {|it| convert_void_stmt_to_nil process it }
|
118
|
+
body.map! { |it| convert_void_stmt_to_nil process it }
|
121
119
|
safe_wrap_in_block body
|
122
120
|
end
|
123
121
|
end
|
@@ -136,16 +134,16 @@ module RipperRubyParser
|
|
136
134
|
|
137
135
|
def process_END exp
|
138
136
|
_, body = exp.shift 2
|
139
|
-
s(:iter, s(:postexe),
|
137
|
+
s(:iter, s(:postexe), 0, *map_body(body))
|
140
138
|
end
|
141
139
|
|
142
140
|
# number literals
|
143
141
|
def process_at_int exp
|
144
|
-
make_literal(exp) {|val| Integer(val) }
|
142
|
+
make_literal(exp) { |val| Integer(val) }
|
145
143
|
end
|
146
144
|
|
147
145
|
def process_at_float exp
|
148
|
-
make_literal(exp
|
146
|
+
make_literal(exp, &:to_f)
|
149
147
|
end
|
150
148
|
|
151
149
|
# character literals
|
@@ -155,7 +153,7 @@ module RipperRubyParser
|
|
155
153
|
end
|
156
154
|
|
157
155
|
def process_at_label exp
|
158
|
-
make_literal(exp) {|val| val.chop.to_sym }
|
156
|
+
make_literal(exp) { |val| val.chop.to_sym }
|
159
157
|
end
|
160
158
|
|
161
159
|
# symbol-like sexps
|
@@ -213,9 +211,7 @@ module RipperRubyParser
|
|
213
211
|
def const_ref_to_const_with_line_number const_ref
|
214
212
|
const = process(const_ref)
|
215
213
|
line = const.line
|
216
|
-
if const.sexp_type == :const
|
217
|
-
const = const[1]
|
218
|
-
end
|
214
|
+
const = const[1] if const.sexp_type == :const
|
219
215
|
return const, line
|
220
216
|
end
|
221
217
|
|
@@ -230,9 +226,10 @@ module RipperRubyParser
|
|
230
226
|
body
|
231
227
|
end
|
232
228
|
|
233
|
-
def make_identifier
|
234
|
-
with_position_from_node_symbol(exp)
|
235
|
-
s(type, ident)
|
229
|
+
def make_identifier type, exp
|
230
|
+
with_position_from_node_symbol(exp) do |ident|
|
231
|
+
s(type, ident)
|
232
|
+
end
|
236
233
|
end
|
237
234
|
|
238
235
|
def make_literal exp
|
@@ -10,7 +10,7 @@ describe "Using RipperRubyParser and RubyParser" do
|
|
10
10
|
RubyParser.new
|
11
11
|
end
|
12
12
|
|
13
|
-
Dir.glob("samples
|
13
|
+
Dir.glob(File.expand_path("../samples/*.rb", File.dirname(__FILE__))).each do |file|
|
14
14
|
describe "for #{file}" do
|
15
15
|
let :program do
|
16
16
|
File.read file
|
data/test/pt_testcase/pt_test.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
|
2
2
|
require 'pt_testcase'
|
3
3
|
|
4
|
-
class RipperRubyParser::Parser
|
4
|
+
class TestParser < RipperRubyParser::Parser
|
5
5
|
def process input
|
6
6
|
parse input
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
SKIPPED_TESTS = ["dstr_heredoc_windoze_sucks"]
|
10
|
+
SKIPPED_TESTS = ["dstr_heredoc_windoze_sucks"].freeze
|
11
11
|
|
12
12
|
class RubyParserTestCase < ParseTreeTestCase
|
13
|
-
def self.previous
|
13
|
+
def self.previous _key
|
14
14
|
"Ruby"
|
15
15
|
end
|
16
16
|
|
@@ -39,6 +39,6 @@ class TestRuby19Parser < RubyParserTestCase
|
|
39
39
|
def setup
|
40
40
|
super
|
41
41
|
|
42
|
-
self.processor =
|
42
|
+
self.processor = TestParser.new
|
43
43
|
end
|
44
44
|
end
|