ripper_ruby_parser 1.7.2 → 1.10.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +50 -0
- data/README.md +4 -4
- data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +24 -12
- data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +2 -2
- data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +47 -53
- data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +17 -19
- data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +34 -1
- data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +1 -1
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +9 -5
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +17 -15
- data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +3 -3
- data/lib/ripper_ruby_parser/sexp_handlers/string_literals.rb +24 -28
- data/lib/ripper_ruby_parser/sexp_processor.rb +5 -18
- data/lib/ripper_ruby_parser/unescape.rb +63 -22
- data/lib/ripper_ruby_parser/version.rb +1 -1
- metadata +140 -79
- data/Rakefile +0 -33
- data/test/end_to_end/comments_test.rb +0 -59
- data/test/end_to_end/comparison_test.rb +0 -104
- data/test/end_to_end/lib_comparison_test.rb +0 -18
- data/test/end_to_end/line_numbering_test.rb +0 -31
- data/test/end_to_end/samples_comparison_test.rb +0 -13
- data/test/end_to_end/test_comparison_test.rb +0 -18
- data/test/pt_testcase/pt_test.rb +0 -44
- data/test/ripper_ruby_parser/commenting_ripper_parser_test.rb +0 -200
- data/test/ripper_ruby_parser/parser_test.rb +0 -576
- data/test/ripper_ruby_parser/sexp_handlers/assignment_test.rb +0 -597
- data/test/ripper_ruby_parser/sexp_handlers/blocks_test.rb +0 -717
- data/test/ripper_ruby_parser/sexp_handlers/conditionals_test.rb +0 -536
- data/test/ripper_ruby_parser/sexp_handlers/literals_test.rb +0 -165
- data/test/ripper_ruby_parser/sexp_handlers/loops_test.rb +0 -209
- data/test/ripper_ruby_parser/sexp_handlers/method_calls_test.rb +0 -237
- data/test/ripper_ruby_parser/sexp_handlers/methods_test.rb +0 -429
- data/test/ripper_ruby_parser/sexp_handlers/operators_test.rb +0 -405
- data/test/ripper_ruby_parser/sexp_handlers/string_literals_test.rb +0 -973
- data/test/ripper_ruby_parser/sexp_processor_test.rb +0 -327
- data/test/ripper_ruby_parser/version_test.rb +0 -7
- data/test/samples/assignment.rb +0 -22
- data/test/samples/comments.rb +0 -13
- data/test/samples/conditionals.rb +0 -23
- data/test/samples/lambdas.rb +0 -5
- data/test/samples/loops.rb +0 -36
- data/test/samples/misc.rb +0 -285
- data/test/samples/number.rb +0 -9
- data/test/samples/operators.rb +0 -18
- data/test/samples/strings.rb +0 -147
- data/test/test_helper.rb +0 -111
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require File.expand_path("../test_helper.rb", File.dirname(__FILE__))
|
4
|
-
require "ruby_parser"
|
5
|
-
|
6
|
-
describe "Using RipperRubyParser and RubyParser" do
|
7
|
-
Dir.glob("lib/**/*.rb").each do |file|
|
8
|
-
describe "for #{file}" do
|
9
|
-
let :program do
|
10
|
-
File.read file
|
11
|
-
end
|
12
|
-
|
13
|
-
it "gives the same result" do
|
14
|
-
_(program).must_be_parsed_as_before
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require File.expand_path("../test_helper.rb", File.dirname(__FILE__))
|
4
|
-
require "ruby_parser"
|
5
|
-
|
6
|
-
describe "Using RipperRubyParser and RubyParser" do
|
7
|
-
describe "for a multi-line program" do
|
8
|
-
let :program do
|
9
|
-
<<-RUBY
|
10
|
-
class Foo
|
11
|
-
def foo()
|
12
|
-
bar()
|
13
|
-
baz(qux)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
module Bar
|
18
|
-
@@baz = {}
|
19
|
-
end
|
20
|
-
RUBY
|
21
|
-
end
|
22
|
-
|
23
|
-
it "gives the same result" do
|
24
|
-
_(program).must_be_parsed_as_before
|
25
|
-
end
|
26
|
-
|
27
|
-
it "gives the same result with line numbers" do
|
28
|
-
_(program).must_be_parsed_as_before with_line_numbers: true
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require File.expand_path("../test_helper.rb", File.dirname(__FILE__))
|
4
|
-
require "ruby_parser"
|
5
|
-
|
6
|
-
describe "Using RipperRubyParser and RubyParser" do
|
7
|
-
Dir.glob(File.expand_path("../samples/*.rb", File.dirname(__FILE__))).each do |file|
|
8
|
-
it "gives the same result for #{file}" do
|
9
|
-
program = File.read file
|
10
|
-
_(program).must_be_parsed_as_before
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require File.expand_path("../test_helper.rb", File.dirname(__FILE__))
|
4
|
-
require "ruby_parser"
|
5
|
-
|
6
|
-
describe "Using RipperRubyParser and RubyParser" do
|
7
|
-
Dir.glob("test/ripper_ruby_parser/**/*.rb").each do |file|
|
8
|
-
describe "for #{file}" do
|
9
|
-
let :program do
|
10
|
-
File.read file
|
11
|
-
end
|
12
|
-
|
13
|
-
it "gives the same result" do
|
14
|
-
_(program).must_be_parsed_as_before
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
data/test/pt_testcase/pt_test.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require File.expand_path("../test_helper.rb", File.dirname(__FILE__))
|
4
|
-
require "pt_testcase"
|
5
|
-
|
6
|
-
class TestParser < RipperRubyParser::Parser
|
7
|
-
def process(input)
|
8
|
-
parse input
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
SKIPPED_TESTS = ["dstr_heredoc_windoze_sucks"].freeze
|
13
|
-
|
14
|
-
class RubyParserTestCase < ParseTreeTestCase
|
15
|
-
def self.previous(_key)
|
16
|
-
"Ruby"
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.generate_test(klass, node, data, input_name, _output_name)
|
20
|
-
if data["Ruby"].is_a? Array
|
21
|
-
klass.send :define_method, "test_#{node}" do
|
22
|
-
skip "Not a parser test"
|
23
|
-
end
|
24
|
-
return
|
25
|
-
end
|
26
|
-
|
27
|
-
if SKIPPED_TESTS.include? node
|
28
|
-
klass.send :define_method, "test_#{node}" do
|
29
|
-
skip "Can't or won't fix this difference"
|
30
|
-
end
|
31
|
-
return
|
32
|
-
end
|
33
|
-
|
34
|
-
super klass, node, data, input_name, "ParseTree"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
class TestRuby19Parser < RubyParserTestCase
|
39
|
-
def setup
|
40
|
-
super
|
41
|
-
|
42
|
-
self.processor = TestParser.new
|
43
|
-
end
|
44
|
-
end
|
@@ -1,200 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require File.expand_path("../test_helper.rb", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
describe RipperRubyParser::CommentingRipperParser do
|
6
|
-
def parse_with_builder(str)
|
7
|
-
builder = RipperRubyParser::CommentingRipperParser.new str
|
8
|
-
builder.parse
|
9
|
-
end
|
10
|
-
|
11
|
-
def empty_params_list
|
12
|
-
@empty_params_list ||= s(:params, *([nil] * 7))
|
13
|
-
end
|
14
|
-
|
15
|
-
describe "handling comments" do
|
16
|
-
# Handle different results for dynamic symbol strings. This was changed in
|
17
|
-
# Ruby 2.6.3 and up. See https://bugs.ruby-lang.org/issues/15670
|
18
|
-
let(:dsym_string_type) { RUBY_VERSION < "2.6.3" ? :xstring : :string_content }
|
19
|
-
|
20
|
-
it "produces a comment node surrounding a commented def" do
|
21
|
-
result = parse_with_builder "# Foo\ndef foo; end"
|
22
|
-
_(result).must_equal s(:program,
|
23
|
-
s(:stmts,
|
24
|
-
s(:comment,
|
25
|
-
"# Foo\n",
|
26
|
-
s(:def,
|
27
|
-
s(:@ident, "foo", s(2, 4)),
|
28
|
-
empty_params_list,
|
29
|
-
s(:bodystmt,
|
30
|
-
s(:stmts, s(:void_stmt, s(2, 12))), nil, nil, nil),
|
31
|
-
s(2, 0)))))
|
32
|
-
end
|
33
|
-
|
34
|
-
it "produces a blank comment node surrounding a def that has no comment" do
|
35
|
-
result = parse_with_builder "def foo; end"
|
36
|
-
_(result).must_equal s(:program,
|
37
|
-
s(:stmts,
|
38
|
-
s(:comment,
|
39
|
-
"",
|
40
|
-
s(:def,
|
41
|
-
s(:@ident, "foo", s(1, 4)),
|
42
|
-
empty_params_list,
|
43
|
-
s(:bodystmt,
|
44
|
-
s(:stmts, s(:void_stmt, s(1, 12))), nil, nil, nil),
|
45
|
-
s(1, 0)))))
|
46
|
-
end
|
47
|
-
|
48
|
-
it "produces a comment node surrounding a commented class" do
|
49
|
-
result = parse_with_builder "# Foo\nclass Foo; end"
|
50
|
-
_(result).must_equal s(:program,
|
51
|
-
s(:stmts,
|
52
|
-
s(:comment,
|
53
|
-
"# Foo\n",
|
54
|
-
s(:class,
|
55
|
-
s(:const_ref, s(:@const, "Foo", s(2, 6))),
|
56
|
-
nil,
|
57
|
-
s(:bodystmt,
|
58
|
-
s(:stmts, s(:void_stmt, s(2, 10))), nil, nil, nil),
|
59
|
-
s(2, 0)))))
|
60
|
-
end
|
61
|
-
|
62
|
-
it "produce a blank comment node surrounding a class that has no comment" do
|
63
|
-
result = parse_with_builder "class Foo; end"
|
64
|
-
_(result).must_equal s(:program,
|
65
|
-
s(:stmts,
|
66
|
-
s(:comment,
|
67
|
-
"",
|
68
|
-
s(:class,
|
69
|
-
s(:const_ref, s(:@const, "Foo", s(1, 6))),
|
70
|
-
nil,
|
71
|
-
s(:bodystmt,
|
72
|
-
s(:stmts, s(:void_stmt, s(1, 10))), nil, nil, nil),
|
73
|
-
s(1, 0)))))
|
74
|
-
end
|
75
|
-
|
76
|
-
it "produces a comment node surrounding a commented module" do
|
77
|
-
result = parse_with_builder "# Foo\nmodule Foo; end"
|
78
|
-
_(result).must_equal s(:program,
|
79
|
-
s(:stmts,
|
80
|
-
s(:comment,
|
81
|
-
"# Foo\n",
|
82
|
-
s(:module,
|
83
|
-
s(:const_ref, s(:@const, "Foo", s(2, 7))),
|
84
|
-
s(:bodystmt,
|
85
|
-
s(:stmts, s(:void_stmt, s(2, 11))), nil, nil, nil),
|
86
|
-
s(2, 0)))))
|
87
|
-
end
|
88
|
-
|
89
|
-
it "produces a blank comment node surrounding a module that has no comment" do
|
90
|
-
result = parse_with_builder "module Foo; end"
|
91
|
-
_(result).must_equal s(:program,
|
92
|
-
s(:stmts,
|
93
|
-
s(:comment,
|
94
|
-
"",
|
95
|
-
s(:module,
|
96
|
-
s(:const_ref, s(:@const, "Foo", s(1, 7))),
|
97
|
-
s(:bodystmt,
|
98
|
-
s(:stmts, s(:void_stmt, s(1, 11))), nil, nil, nil),
|
99
|
-
s(1, 0)))))
|
100
|
-
end
|
101
|
-
|
102
|
-
it "is not confused by a symbol containing a keyword" do
|
103
|
-
result = parse_with_builder ":class; def foo; end"
|
104
|
-
_(result).must_equal s(:program,
|
105
|
-
s(:stmts,
|
106
|
-
s(:symbol_literal, s(:symbol, s(:@kw, "class", s(1, 1)))),
|
107
|
-
s(:comment,
|
108
|
-
"",
|
109
|
-
s(:def,
|
110
|
-
s(:@ident, "foo", s(1, 12)),
|
111
|
-
empty_params_list,
|
112
|
-
s(:bodystmt,
|
113
|
-
s(:stmts, s(:void_stmt, s(1, 20))), nil, nil, nil),
|
114
|
-
s(1, 8)))))
|
115
|
-
end
|
116
|
-
|
117
|
-
it "is not confused by a dynamic symbol" do
|
118
|
-
result = parse_with_builder ":'foo'; def bar; end"
|
119
|
-
_(result).must_equal s(:program,
|
120
|
-
s(:stmts,
|
121
|
-
s(:dyna_symbol,
|
122
|
-
s(dsym_string_type,
|
123
|
-
s(:@tstring_content, "foo", s(1, 2), ":'"))),
|
124
|
-
s(:comment,
|
125
|
-
"",
|
126
|
-
s(:def,
|
127
|
-
s(:@ident, "bar", s(1, 12)),
|
128
|
-
empty_params_list,
|
129
|
-
s(:bodystmt,
|
130
|
-
s(:stmts, s(:void_stmt, s(1, 20))), nil, nil, nil),
|
131
|
-
s(1, 8)))))
|
132
|
-
end
|
133
|
-
|
134
|
-
it "is not confused by a dynamic symbol containing a class definition" do
|
135
|
-
result = parse_with_builder ":\"foo\#{class Bar;end}\""
|
136
|
-
_(result).must_equal s(:program,
|
137
|
-
s(:stmts,
|
138
|
-
s(:dyna_symbol,
|
139
|
-
s(dsym_string_type,
|
140
|
-
s(:@tstring_content, "foo", s(1, 2), ':"'),
|
141
|
-
s(:string_embexpr,
|
142
|
-
s(:stmts,
|
143
|
-
s(:comment,
|
144
|
-
"",
|
145
|
-
s(:class,
|
146
|
-
s(:const_ref, s(:@const, "Bar", s(1, 13))),
|
147
|
-
nil,
|
148
|
-
s(:bodystmt,
|
149
|
-
s(:stmts, s(:void_stmt, s(1, 17))),
|
150
|
-
nil, nil, nil),
|
151
|
-
s(1, 7)))))))))
|
152
|
-
end
|
153
|
-
|
154
|
-
it "turns an embedded document into a comment node" do
|
155
|
-
result = parse_with_builder "=begin Hello\nthere\n=end\nclass Foo; end"
|
156
|
-
_(result).must_equal s(:program,
|
157
|
-
s(:stmts,
|
158
|
-
s(:comment,
|
159
|
-
"=begin Hello\nthere\n=end\n",
|
160
|
-
s(:class,
|
161
|
-
s(:const_ref, s(:@const, "Foo", s(4, 6))),
|
162
|
-
nil,
|
163
|
-
s(:bodystmt,
|
164
|
-
s(:stmts, s(:void_stmt, s(4, 10))), nil, nil, nil),
|
165
|
-
s(4, 0)))))
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
describe "handling syntax errors" do
|
170
|
-
it "raises an error for an incomplete source" do
|
171
|
-
_(proc { parse_with_builder "def foo" }).must_raise RipperRubyParser::SyntaxError
|
172
|
-
end
|
173
|
-
|
174
|
-
it "raises an error for an invalid class name" do
|
175
|
-
_(proc { parse_with_builder "class foo; end" })
|
176
|
-
.must_raise RipperRubyParser::SyntaxError
|
177
|
-
end
|
178
|
-
|
179
|
-
it "raises an error aliasing $1 as foo" do
|
180
|
-
_(proc { parse_with_builder "alias foo $1" }).must_raise RipperRubyParser::SyntaxError
|
181
|
-
end
|
182
|
-
|
183
|
-
it "raises an error aliasing foo as $1" do
|
184
|
-
_(proc { parse_with_builder "alias $1 foo" }).must_raise RipperRubyParser::SyntaxError
|
185
|
-
end
|
186
|
-
|
187
|
-
it "raises an error aliasing $2 as $1" do
|
188
|
-
_(proc { parse_with_builder "alias $1 $2" }).must_raise RipperRubyParser::SyntaxError
|
189
|
-
end
|
190
|
-
|
191
|
-
it "raises an error assigning to $1" do
|
192
|
-
_(proc { parse_with_builder "$1 = foo" }).must_raise RipperRubyParser::SyntaxError
|
193
|
-
end
|
194
|
-
|
195
|
-
it "raises an error using an invalid parameter name" do
|
196
|
-
_(proc { parse_with_builder "def foo(BAR); end" })
|
197
|
-
.must_raise RipperRubyParser::SyntaxError
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|