unparser 0.0.6 → 0.0.7
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/Guardfile +1 -1
- data/README.md +4 -0
- data/Rakefile +0 -22
- data/TODO +1 -0
- data/bin/test-unparser +26 -0
- data/config/flay.yml +1 -1
- data/config/flog.yml +1 -1
- data/config/reek.yml +2 -1
- data/lib/unparser/emitter.rb +56 -16
- data/lib/unparser/emitter/begin.rb +98 -64
- data/lib/unparser/emitter/case.rb +2 -6
- data/lib/unparser/emitter/for.rb +0 -10
- data/lib/unparser/emitter/hookexe.rb +0 -10
- data/lib/unparser/emitter/if.rb +2 -2
- data/spec/integration/unparser/spike_spec.rb +38 -1
- data/unparser.gemspec +3 -3
- metadata +6 -6
- data/bin/unparse +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c9b95ccef00a5ebdeae86ae92b12af786f209ae
|
4
|
+
data.tar.gz: cab5a1dd18399aa00b3afcdd0ea371aee67dfae3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 369c2c1b754ef3d252464a84b334a0e1f8d1bdae36997c811619b9c1483db73232d8a953e08a5b2894b588bdf7d401ebe4ab667c471b1ce5e57572c4016e5809
|
7
|
+
data.tar.gz: cfc34c5e7d02ac2e58c60c41dd7f9f59c66a21eace1b1c9d42e3052a930c59067dc6c572bf7980ab4e53d0305940221424263ab8cff8b71901f7e4e572bb1573
|
data/Guardfile
CHANGED
@@ -4,7 +4,7 @@ guard :bundler do
|
|
4
4
|
watch('Gemfile')
|
5
5
|
end
|
6
6
|
|
7
|
-
guard :rspec, :all_on_start => false, :all_after_pass => false, :cli => '--fail-fast --
|
7
|
+
guard :rspec, :all_on_start => false, :all_after_pass => false, :cli => '--fail-fast --seed 1' do
|
8
8
|
# run all specs if the spec_helper or supporting files files are modified
|
9
9
|
watch('spec/spec_helper.rb') { 'spec/unit' }
|
10
10
|
watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec/unit' }
|
data/README.md
CHANGED
@@ -7,6 +7,10 @@ unparser
|
|
7
7
|
|
8
8
|
Generate equivalent source for ASTs from whitequarks awesome [parser](https://github.com/whitequark/parser).
|
9
9
|
|
10
|
+
This library is in early development stage and still has some bugs/missing features.
|
11
|
+
Nevertheless it is able to regenerate it own source and serves well for
|
12
|
+
[mutant](https://github.cm/mbj/mutant) mutators and the in-memory vendoring for self hosting mutant.
|
13
|
+
|
10
14
|
Usage
|
11
15
|
-----
|
12
16
|
|
data/Rakefile
CHANGED
@@ -1,24 +1,2 @@
|
|
1
1
|
require 'devtools'
|
2
2
|
Devtools.init_rake_tasks
|
3
|
-
|
4
|
-
class Rake::Task
|
5
|
-
def overwrite(&block)
|
6
|
-
@actions.clear
|
7
|
-
enhance(&block)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
Rake.application.load_imports
|
12
|
-
|
13
|
-
Rake::Task['metrics:mutant'].overwrite do
|
14
|
-
begin
|
15
|
-
require 'mutant'
|
16
|
-
rescue LoadError
|
17
|
-
end
|
18
|
-
if defined?(Mutant) and !ENV.key?('CI')
|
19
|
-
status = Mutant::CLI.run(%W(--rspec-full ::Unparser))
|
20
|
-
unless status.zero?
|
21
|
-
fail "Not mutation covered :("
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/TODO
CHANGED
data/bin/test-unparser
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
trap('INT') do |status|
|
4
|
+
exit! 128+status
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'unparser'
|
8
|
+
require 'parser/current'
|
9
|
+
|
10
|
+
ARGV.each do |file|
|
11
|
+
source = File.read(file)
|
12
|
+
node = Parser::CurrentRuby.parse(source)
|
13
|
+
generated = Unparser.unparse(node)
|
14
|
+
unparsed = Parser::CurrentRuby.parse(generated)
|
15
|
+
unless unparsed == node
|
16
|
+
$stderr.puts "Node:"
|
17
|
+
$stderr.puts node.inspect
|
18
|
+
$stderr.puts "Unparsed-Node:"
|
19
|
+
$stderr.puts unparsed.inspect
|
20
|
+
$stderr.puts "Original:"
|
21
|
+
$stderr.puts source
|
22
|
+
$stderr.puts "Generated:"
|
23
|
+
$stderr.puts generated
|
24
|
+
fail "BUG!"
|
25
|
+
end
|
26
|
+
end
|
data/config/flay.yml
CHANGED
data/config/flog.yml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
---
|
2
|
-
threshold:
|
2
|
+
threshold: 9.8
|
data/config/reek.yml
CHANGED
data/lib/unparser/emitter.rb
CHANGED
@@ -8,10 +8,45 @@ module Unparser
|
|
8
8
|
# Registry for node emitters
|
9
9
|
REGISTRY = {}
|
10
10
|
|
11
|
+
NOINDENT = [:rescue, :ensure].to_set
|
12
|
+
|
11
13
|
DEFAULT_DELIMITER = ', '.freeze
|
12
14
|
|
13
15
|
CURLY_BRACKETS = IceNine.deep_freeze(%w({ }))
|
14
16
|
|
17
|
+
# Define remaining children
|
18
|
+
#
|
19
|
+
# @param [Enumerable<Symbol>] names
|
20
|
+
#
|
21
|
+
# @return [undefined]
|
22
|
+
#
|
23
|
+
# @api private
|
24
|
+
#
|
25
|
+
def self.define_remaining_children(names)
|
26
|
+
define_method(:remaining_children) do
|
27
|
+
children[names.length..-1]
|
28
|
+
end
|
29
|
+
private :remaining_children
|
30
|
+
end
|
31
|
+
private_class_method :define_remaining_children
|
32
|
+
|
33
|
+
# Define named child
|
34
|
+
#
|
35
|
+
# @param [Symbol] name
|
36
|
+
# @param [Fixnum] index
|
37
|
+
#
|
38
|
+
# @return [undefined]
|
39
|
+
#
|
40
|
+
# @api private
|
41
|
+
#
|
42
|
+
def self.define_child(name, index)
|
43
|
+
define_method(name) do
|
44
|
+
children.at(index)
|
45
|
+
end
|
46
|
+
protected name
|
47
|
+
end
|
48
|
+
private_class_method :define_child
|
49
|
+
|
15
50
|
# Create name helpers
|
16
51
|
#
|
17
52
|
# @return [undefined]
|
@@ -19,11 +54,10 @@ module Unparser
|
|
19
54
|
# @api private
|
20
55
|
#
|
21
56
|
def self.children(*names)
|
57
|
+
define_remaining_children(names)
|
58
|
+
|
22
59
|
names.each_with_index do |name, index|
|
23
|
-
|
24
|
-
children[index]
|
25
|
-
end
|
26
|
-
private name
|
60
|
+
define_child(name, index)
|
27
61
|
end
|
28
62
|
end
|
29
63
|
private_class_method :children
|
@@ -213,16 +247,6 @@ module Unparser
|
|
213
247
|
end
|
214
248
|
end
|
215
249
|
|
216
|
-
# Write begin keyword
|
217
|
-
#
|
218
|
-
# @return [undefined]
|
219
|
-
#
|
220
|
-
# @api private
|
221
|
-
#
|
222
|
-
def k_begin
|
223
|
-
write(K_BEGIN)
|
224
|
-
end
|
225
|
-
|
226
250
|
# Write end keyword
|
227
251
|
#
|
228
252
|
# @return [undefined]
|
@@ -278,12 +302,28 @@ module Unparser
|
|
278
302
|
#
|
279
303
|
# @api private
|
280
304
|
#
|
281
|
-
def emit_body
|
305
|
+
def emit_body(body = self.body)
|
282
306
|
unless body
|
283
307
|
nl
|
284
308
|
return
|
285
309
|
end
|
286
|
-
|
310
|
+
visit_indented(body)
|
311
|
+
end
|
312
|
+
|
313
|
+
# Visit indented node
|
314
|
+
#
|
315
|
+
# @param [Parser::AST::Node] node
|
316
|
+
#
|
317
|
+
# @return [undefined]
|
318
|
+
#
|
319
|
+
# @api private
|
320
|
+
#
|
321
|
+
def visit_indented(node)
|
322
|
+
if NOINDENT.include?(node.type)
|
323
|
+
visit(node)
|
324
|
+
else
|
325
|
+
indented { visit(node) }
|
326
|
+
end
|
287
327
|
end
|
288
328
|
|
289
329
|
# Emitter that fully relies on parser source maps
|
@@ -17,56 +17,70 @@ module Unparser
|
|
17
17
|
# @api private
|
18
18
|
#
|
19
19
|
def dispatch
|
20
|
-
|
21
|
-
|
22
|
-
children[1..-2].each do |child|
|
20
|
+
visit_indented(body)
|
21
|
+
rescue_bodies.each do |child|
|
23
22
|
visit(child)
|
24
23
|
end
|
25
|
-
|
24
|
+
emit_else
|
26
25
|
end
|
27
|
-
end # Rescue
|
28
|
-
|
29
|
-
# Emitter for enusre nodes
|
30
|
-
class Ensure < self
|
31
|
-
|
32
|
-
handle :ensure
|
33
26
|
|
34
|
-
|
35
|
-
|
36
|
-
|
27
|
+
# Return rescue bodies
|
28
|
+
#
|
29
|
+
# @return [Enumerable<Parser::AST::Node>]
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
#
|
33
|
+
def rescue_bodies
|
34
|
+
children[1..-2]
|
35
|
+
end
|
37
36
|
|
38
|
-
#
|
37
|
+
# Emit else
|
39
38
|
#
|
40
39
|
# @return [undefined]
|
41
40
|
#
|
42
41
|
# @api private
|
43
42
|
#
|
44
|
-
def
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
emit_ensure_body
|
49
|
-
k_end
|
43
|
+
def emit_else
|
44
|
+
return unless else_branch
|
45
|
+
write(K_ELSE)
|
46
|
+
visit_indented(else_branch)
|
50
47
|
end
|
51
48
|
|
52
|
-
#
|
49
|
+
# Return else body
|
53
50
|
#
|
54
|
-
# @return [
|
51
|
+
# @return [Parser::AST::Node]
|
52
|
+
# if else body is present
|
53
|
+
#
|
54
|
+
# @return [nil]
|
55
|
+
# otherwise
|
55
56
|
#
|
56
57
|
# @api private
|
57
58
|
#
|
58
|
-
def
|
59
|
-
|
59
|
+
def else_branch
|
60
|
+
children.last
|
60
61
|
end
|
61
62
|
|
62
|
-
|
63
|
+
end # Rescue
|
64
|
+
|
65
|
+
# Emitter for ensure nodes
|
66
|
+
class Ensure < self
|
67
|
+
|
68
|
+
handle :ensure
|
69
|
+
|
70
|
+
children :body, :ensure_body
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
# Perform dispatch
|
63
75
|
#
|
64
76
|
# @return [undefined]
|
65
77
|
#
|
66
78
|
# @api private
|
67
79
|
#
|
68
|
-
def
|
69
|
-
|
80
|
+
def dispatch
|
81
|
+
visit_indented(body)
|
82
|
+
write(K_ENSURE)
|
83
|
+
visit_indented(ensure_body)
|
70
84
|
end
|
71
85
|
|
72
86
|
end # Ensure
|
@@ -90,11 +104,7 @@ module Unparser
|
|
90
104
|
write(K_RESCUE)
|
91
105
|
emit_exception
|
92
106
|
emit_assignment
|
93
|
-
|
94
|
-
indented { visit(body) }
|
95
|
-
else
|
96
|
-
nl
|
97
|
-
end
|
107
|
+
emit_body
|
98
108
|
end
|
99
109
|
|
100
110
|
# Emit exception
|
@@ -126,40 +136,10 @@ module Unparser
|
|
126
136
|
# Emitter for begin nodes
|
127
137
|
class Begin < self
|
128
138
|
|
129
|
-
|
139
|
+
children :body
|
130
140
|
|
131
141
|
private
|
132
142
|
|
133
|
-
# Perform dispatch
|
134
|
-
#
|
135
|
-
# @return [undefined]
|
136
|
-
#
|
137
|
-
# @api private
|
138
|
-
#
|
139
|
-
def dispatch
|
140
|
-
if children.length == 1 and !parent.needs_begin?
|
141
|
-
visit(first_child)
|
142
|
-
else
|
143
|
-
emit_normal
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
# Emit normal begin block
|
148
|
-
#
|
149
|
-
# @return [undefined]
|
150
|
-
#
|
151
|
-
# @api private
|
152
|
-
#
|
153
|
-
def emit_normal
|
154
|
-
if parent.needs_begin?
|
155
|
-
k_begin
|
156
|
-
indented { emit_inner }
|
157
|
-
k_end
|
158
|
-
else
|
159
|
-
emit_inner
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
143
|
# Emit inner nodes
|
164
144
|
#
|
165
145
|
# @return [undefined]
|
@@ -175,6 +155,60 @@ module Unparser
|
|
175
155
|
end
|
176
156
|
end
|
177
157
|
|
178
|
-
|
158
|
+
# Emitter for implicit begins
|
159
|
+
class Implicit < self
|
160
|
+
|
161
|
+
handle :begin
|
162
|
+
|
163
|
+
private
|
164
|
+
|
165
|
+
# Perform dispatch
|
166
|
+
#
|
167
|
+
# @return [undefined]
|
168
|
+
#
|
169
|
+
# @api private
|
170
|
+
#
|
171
|
+
def dispatch
|
172
|
+
emit_inner
|
173
|
+
end
|
174
|
+
|
175
|
+
end # Implicit
|
176
|
+
|
177
|
+
# Emitter for explicit begins
|
178
|
+
class Explicit < self
|
179
|
+
|
180
|
+
handle :kwbegin
|
181
|
+
|
182
|
+
private
|
183
|
+
|
184
|
+
# Perform dispatch
|
185
|
+
#
|
186
|
+
# @return [undefined]
|
187
|
+
#
|
188
|
+
# @api private
|
189
|
+
#
|
190
|
+
def dispatch
|
191
|
+
write(K_BEGIN)
|
192
|
+
emit_body
|
193
|
+
k_end
|
194
|
+
end
|
195
|
+
|
196
|
+
# Emit body
|
197
|
+
#
|
198
|
+
# @return [undefined]
|
199
|
+
#
|
200
|
+
# @api private
|
201
|
+
#
|
202
|
+
def emit_body
|
203
|
+
if NOINDENT.include?(body.type)
|
204
|
+
emit_inner
|
205
|
+
else
|
206
|
+
indented { emit_inner }
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
end # Explicit
|
211
|
+
|
212
|
+
end # Begin
|
179
213
|
end # Emitter
|
180
214
|
end # Unparser
|
@@ -33,7 +33,7 @@ module Unparser
|
|
33
33
|
else_branch = children.last
|
34
34
|
return unless else_branch
|
35
35
|
write(K_ELSE)
|
36
|
-
|
36
|
+
visit_indented(else_branch)
|
37
37
|
end
|
38
38
|
|
39
39
|
# Emit whens
|
@@ -80,11 +80,7 @@ module Unparser
|
|
80
80
|
write(K_WHEN, WS)
|
81
81
|
emit_captures
|
82
82
|
body = children.last
|
83
|
-
|
84
|
-
indented { visit(body) }
|
85
|
-
else
|
86
|
-
nl
|
87
|
-
end
|
83
|
+
emit_body(body)
|
88
84
|
end
|
89
85
|
|
90
86
|
# Emit captures
|
data/lib/unparser/emitter/for.rb
CHANGED
data/lib/unparser/emitter/if.rb
CHANGED
@@ -65,7 +65,7 @@ module Unparser
|
|
65
65
|
#
|
66
66
|
def emit_if_branch
|
67
67
|
return unless if_branch
|
68
|
-
|
68
|
+
visit_indented(if_branch)
|
69
69
|
end
|
70
70
|
|
71
71
|
# Emit else branch
|
@@ -77,7 +77,7 @@ module Unparser
|
|
77
77
|
def emit_else_branch
|
78
78
|
return unless else_branch
|
79
79
|
write(K_ELSE) unless unless?
|
80
|
-
|
80
|
+
visit_indented(else_branch)
|
81
81
|
end
|
82
82
|
|
83
83
|
end # If
|
@@ -354,6 +354,19 @@ describe Unparser, 'spike' do
|
|
354
354
|
end
|
355
355
|
RUBY
|
356
356
|
|
357
|
+
assert_source <<-RUBY
|
358
|
+
begin
|
359
|
+
begin
|
360
|
+
foo
|
361
|
+
bar
|
362
|
+
rescue
|
363
|
+
end
|
364
|
+
rescue
|
365
|
+
baz
|
366
|
+
bar
|
367
|
+
end
|
368
|
+
RUBY
|
369
|
+
|
357
370
|
assert_source <<-RUBY
|
358
371
|
begin
|
359
372
|
foo
|
@@ -427,6 +440,15 @@ describe Unparser, 'spike' do
|
|
427
440
|
end
|
428
441
|
RUBY
|
429
442
|
|
443
|
+
assert_source <<-RUBY
|
444
|
+
begin
|
445
|
+
bar
|
446
|
+
rescue
|
447
|
+
else
|
448
|
+
baz
|
449
|
+
end
|
450
|
+
RUBY
|
451
|
+
|
430
452
|
assert_source <<-RUBY
|
431
453
|
begin
|
432
454
|
bar
|
@@ -565,6 +587,22 @@ describe Unparser, 'spike' do
|
|
565
587
|
end
|
566
588
|
RUBY
|
567
589
|
|
590
|
+
assert_source <<-RUBY
|
591
|
+
def foo
|
592
|
+
bar
|
593
|
+
ensure
|
594
|
+
baz
|
595
|
+
end
|
596
|
+
RUBY
|
597
|
+
|
598
|
+
assert_source <<-RUBY
|
599
|
+
def foo
|
600
|
+
bar
|
601
|
+
rescue
|
602
|
+
baz
|
603
|
+
end
|
604
|
+
RUBY
|
605
|
+
|
568
606
|
assert_source <<-RUBY
|
569
607
|
def foo(bar)
|
570
608
|
bar
|
@@ -662,7 +700,6 @@ describe Unparser, 'spike' do
|
|
662
700
|
end
|
663
701
|
|
664
702
|
context 'on singleton' do
|
665
|
-
|
666
703
|
assert_source <<-RUBY
|
667
704
|
def self.foo
|
668
705
|
end
|
data/unparser.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'unparser'
|
5
|
-
s.version = '0.0.
|
5
|
+
s.version = '0.0.7'
|
6
6
|
|
7
7
|
s.authors = ['Markus Schirp']
|
8
8
|
s.email = 'mbj@schir-dso.com'
|
@@ -15,9 +15,9 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
16
16
|
s.require_paths = %w(lib)
|
17
17
|
s.extra_rdoc_files = %w(README.md)
|
18
|
-
s.executables = [ '
|
18
|
+
s.executables = [ 'test-unparser' ]
|
19
19
|
|
20
|
-
s.add_dependency('parser', '~> 2.0.0.
|
20
|
+
s.add_dependency('parser', '~> 2.0.0.beta10')
|
21
21
|
s.add_dependency('concord', '~> 0.1.0')
|
22
22
|
s.add_dependency('adamantium', '~> 0.0.7')
|
23
23
|
s.add_dependency('equalizer', '~> 0.0.5')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unparser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Schirp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.0.0.
|
19
|
+
version: 2.0.0.beta10
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.0.0.
|
26
|
+
version: 2.0.0.beta10
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: concord
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,7 +83,7 @@ dependencies:
|
|
83
83
|
description: Generate equivalent source for parser gem AST nodes
|
84
84
|
email: mbj@schir-dso.com
|
85
85
|
executables:
|
86
|
-
-
|
86
|
+
- test-unparser
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files:
|
89
89
|
- README.md
|
@@ -100,7 +100,7 @@ files:
|
|
100
100
|
- README.md
|
101
101
|
- Rakefile
|
102
102
|
- TODO
|
103
|
-
- bin/
|
103
|
+
- bin/test-unparser
|
104
104
|
- config/devtools.yml
|
105
105
|
- config/flay.yml
|
106
106
|
- config/flog.yml
|
data/bin/unparse
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
trap('INT') do |status|
|
4
|
-
exit! 128+status
|
5
|
-
end
|
6
|
-
|
7
|
-
require 'unparser'
|
8
|
-
require 'parser/current'
|
9
|
-
|
10
|
-
ARGV.each do |file|
|
11
|
-
source = File.read(file)
|
12
|
-
node = Parser::CurrentRuby.parse(source)
|
13
|
-
$stderr.puts "File: #{file}"
|
14
|
-
$stderr.puts node.inspect
|
15
|
-
puts Unparser.unparse(node)
|
16
|
-
end
|