to_source 0.2.16 → 0.2.17
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/.rspec +1 -0
- data/Changelog.md +34 -1
- data/bin/to_source +2 -8
- data/config/flay.yml +1 -1
- data/config/site.reek +5 -0
- data/lib/to_source.rb +17 -3
- data/lib/to_source/emitter.rb +5 -1
- data/lib/to_source/emitter/alias.rb +23 -0
- data/lib/to_source/emitter/assignment.rb +23 -84
- data/lib/to_source/emitter/assignment/attribute.rb +52 -0
- data/lib/to_source/emitter/assignment/constant.rb +26 -0
- data/lib/to_source/emitter/assignment/element.rb +124 -0
- data/lib/to_source/emitter/assignment/variable.rb +29 -0
- data/lib/to_source/emitter/assignment_operator.rb +54 -0
- data/lib/to_source/emitter/back_ref.rb +23 -0
- data/lib/to_source/emitter/binary_operator_method.rb +38 -2
- data/lib/to_source/emitter/collect_splat.rb +50 -0
- data/lib/to_source/emitter/concat_arguments.rb +16 -1
- data/lib/to_source/emitter/element_reference.rb +1 -1
- data/lib/to_source/emitter/flip.rb +61 -0
- data/lib/to_source/emitter/for.rb +98 -0
- data/lib/to_source/emitter/iter.rb +23 -1
- data/lib/to_source/emitter/literal.rb +1 -18
- data/lib/to_source/emitter/literal/dynamic.rb +0 -23
- data/lib/to_source/emitter/literal/dynamic/regexp.rb +69 -0
- data/lib/to_source/emitter/literal/regexp.rb +27 -0
- data/lib/to_source/emitter/literal/regexp/options.rb +71 -0
- data/lib/to_source/emitter/match.rb +21 -0
- data/lib/to_source/emitter/match2.rb +25 -0
- data/lib/to_source/emitter/multiple_assignment.rb +43 -4
- data/lib/to_source/emitter/op_assign1.rb +37 -5
- data/lib/to_source/emitter/push_args.rb +42 -0
- data/lib/to_source/emitter/send.rb +21 -16
- data/lib/to_source/emitter/splat.rb +40 -1
- data/lib/to_source/emitter/static.rb +32 -0
- data/lib/to_source/emitter/toplevel.rb +2 -1
- data/lib/to_source/emitter/undef.rb +26 -0
- data/spec/unit/to_source/class_methods/run_spec.rb +245 -20
- data/to_source.gemspec +1 -1
- metadata +18 -4
- data/lib/to_source/emitter/attribute_assignment.rb +0 -28
- data/lib/to_source/emitter/element_assignment.rb +0 -29
@@ -171,24 +171,6 @@ module ToSource
|
|
171
171
|
end
|
172
172
|
end
|
173
173
|
|
174
|
-
# Emitter for regexp literal nodes
|
175
|
-
class Regexp < self
|
176
|
-
|
177
|
-
handle(Rubinius::AST::RegexLiteral)
|
178
|
-
|
179
|
-
private
|
180
|
-
|
181
|
-
# Return value to inspect
|
182
|
-
#
|
183
|
-
# @return [Regexp]
|
184
|
-
#
|
185
|
-
# @api private
|
186
|
-
#
|
187
|
-
def value
|
188
|
-
::Regexp.new(node.source)
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
174
|
# Emitter for string litera nodes
|
193
175
|
class String < self
|
194
176
|
|
@@ -212,6 +194,7 @@ module ToSource
|
|
212
194
|
class PassThrough < self
|
213
195
|
|
214
196
|
handle(Rubinius::AST::FixnumLiteral)
|
197
|
+
handle(Rubinius::AST::NumberLiteral)
|
215
198
|
handle(Rubinius::AST::FloatLiteral)
|
216
199
|
|
217
200
|
private
|
@@ -149,29 +149,6 @@ module ToSource
|
|
149
149
|
OPEN = CLOSE = '`'.freeze
|
150
150
|
|
151
151
|
end
|
152
|
-
|
153
|
-
# Emitter for dynamic regexp literals
|
154
|
-
class Regex < self
|
155
|
-
|
156
|
-
handle(Rubinius::AST::DynamicRegex)
|
157
|
-
OPEN = CLOSE = '/'.freeze
|
158
|
-
|
159
|
-
private
|
160
|
-
|
161
|
-
# Emit literal
|
162
|
-
#
|
163
|
-
# @param [String] literal
|
164
|
-
#
|
165
|
-
# @return [undefined]
|
166
|
-
#
|
167
|
-
# @api private
|
168
|
-
#
|
169
|
-
def emit_literal(literal)
|
170
|
-
emit(literal)
|
171
|
-
end
|
172
|
-
|
173
|
-
end
|
174
|
-
|
175
152
|
end
|
176
153
|
end
|
177
154
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class Literal
|
4
|
+
class Dynamic
|
5
|
+
|
6
|
+
# Emitter for dynamic regexp literals
|
7
|
+
class Regex < self
|
8
|
+
|
9
|
+
handle(Rubinius::AST::DynamicRegex)
|
10
|
+
OPEN = CLOSE = '/'.freeze
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
# Perform dispatch
|
15
|
+
#
|
16
|
+
# @return [undefined]
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
#
|
20
|
+
def dispatch
|
21
|
+
super
|
22
|
+
emit_flags
|
23
|
+
end
|
24
|
+
|
25
|
+
# Emit flags
|
26
|
+
#
|
27
|
+
# @return [undefined]
|
28
|
+
#
|
29
|
+
# @api private
|
30
|
+
#
|
31
|
+
def emit_flags
|
32
|
+
run(Literal::Regexp::Options, node.options)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Emit literal
|
36
|
+
#
|
37
|
+
# @param [String] literal
|
38
|
+
#
|
39
|
+
# @return [undefined]
|
40
|
+
#
|
41
|
+
# @api private
|
42
|
+
#
|
43
|
+
def emit_literal(literal)
|
44
|
+
emit(literal)
|
45
|
+
end
|
46
|
+
|
47
|
+
class Once < self
|
48
|
+
|
49
|
+
handle(Rubinius::AST::DynamicOnceRegex)
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# Emit flags
|
54
|
+
#
|
55
|
+
# @return [undefined]
|
56
|
+
#
|
57
|
+
# @api private
|
58
|
+
#
|
59
|
+
def emit_flags
|
60
|
+
emit('o')
|
61
|
+
super
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class Literal
|
4
|
+
# Emitter for regexp literal nodes
|
5
|
+
class Regexp < self
|
6
|
+
|
7
|
+
handle(Rubinius::AST::RegexLiteral)
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
delegate(:options)
|
12
|
+
|
13
|
+
# Perform dispatch
|
14
|
+
#
|
15
|
+
# @return [undefined]
|
16
|
+
#
|
17
|
+
# @api private
|
18
|
+
#
|
19
|
+
def dispatch
|
20
|
+
emit("/#{node.source}/")
|
21
|
+
run(Options, options)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class Literal
|
4
|
+
class Regexp
|
5
|
+
class Options < Emitter
|
6
|
+
|
7
|
+
# No constants for this under ::Regexp in MRI
|
8
|
+
# So stole this from nice player rubinius kernel/common/regexp.rb
|
9
|
+
KCODE_NONE = (1 << 9)
|
10
|
+
KCODE_EUC = (2 << 9)
|
11
|
+
KCODE_SJIS = (3 << 9)
|
12
|
+
KCODE_UTF8 = (4 << 9)
|
13
|
+
KCODE_MASK = KCODE_NONE | KCODE_EUC | KCODE_SJIS | KCODE_UTF8
|
14
|
+
|
15
|
+
GENERIC = IceNine.deep_freeze(
|
16
|
+
::Regexp::EXTENDED => 'x',
|
17
|
+
# FIXME: Documented but no option flag?
|
18
|
+
#::Regexp::FIXEDENCODING => '',
|
19
|
+
::Regexp::IGNORECASE => 'i',
|
20
|
+
::Regexp::MULTILINE => 'm'
|
21
|
+
)
|
22
|
+
|
23
|
+
KCODES = IceNine.deep_freeze(
|
24
|
+
KCODE_NONE => 'n',
|
25
|
+
KCODE_EUC => 'e',
|
26
|
+
KCODE_SJIS => 's',
|
27
|
+
KCODE_UTF8 => 'u'
|
28
|
+
)
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# Perform dispatch
|
33
|
+
#
|
34
|
+
# @return [self]
|
35
|
+
#
|
36
|
+
# @api private
|
37
|
+
#
|
38
|
+
def dispatch
|
39
|
+
emit_generic_flags
|
40
|
+
emit_kcode_flag
|
41
|
+
end
|
42
|
+
|
43
|
+
# Emit kcode flag
|
44
|
+
#
|
45
|
+
# @return [undefined]
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
#
|
49
|
+
def emit_kcode_flag
|
50
|
+
emit(KCODES.fetch(node & KCODE_MASK, ''))
|
51
|
+
end
|
52
|
+
|
53
|
+
# Emit generic flags
|
54
|
+
#
|
55
|
+
# @return [undefined]
|
56
|
+
#
|
57
|
+
# @api private
|
58
|
+
#
|
59
|
+
def emit_generic_flags
|
60
|
+
GENERIC.each do |option, flag|
|
61
|
+
unless (node & option).zero?
|
62
|
+
emit(flag)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class Match < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::Match)
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
# Perform dispatch
|
10
|
+
#
|
11
|
+
# @return [undefined]
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
#
|
15
|
+
def dispatch
|
16
|
+
visit(node.pattern)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
# Emitter for match operator
|
4
|
+
class Match2 < self
|
5
|
+
|
6
|
+
handle(Rubinius::AST::Match2)
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
# Perform dispatch
|
11
|
+
#
|
12
|
+
# @return [undefined]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
#
|
16
|
+
def dispatch
|
17
|
+
util = node
|
18
|
+
visit(util.pattern)
|
19
|
+
emit(' =~ ')
|
20
|
+
visit(util.value)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,5 +1,25 @@
|
|
1
1
|
module ToSource
|
2
2
|
class Emitter
|
3
|
+
|
4
|
+
class Splat < self
|
5
|
+
handle(Rubinius::AST::SplatArray)
|
6
|
+
handle(Rubinius::AST::SplatAssignment)
|
7
|
+
handle(Rubinius::AST::SplatWrapped)
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
# Perform dispatch
|
12
|
+
#
|
13
|
+
# @return [undefined]
|
14
|
+
#
|
15
|
+
# @api private
|
16
|
+
#
|
17
|
+
def dispatch
|
18
|
+
emit('*')
|
19
|
+
visit(node.value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
3
23
|
# Emitter for multiple assignment nodes
|
4
24
|
class MultipleAssignment < self
|
5
25
|
|
@@ -7,6 +27,9 @@ module ToSource
|
|
7
27
|
|
8
28
|
private
|
9
29
|
|
30
|
+
delegate(:right, :splat, :left)
|
31
|
+
predicate(:right, :splat, :left)
|
32
|
+
|
10
33
|
# Perform dispatch
|
11
34
|
#
|
12
35
|
# @return [undefined]
|
@@ -15,8 +38,11 @@ module ToSource
|
|
15
38
|
#
|
16
39
|
def dispatch
|
17
40
|
emit_left
|
18
|
-
|
19
|
-
|
41
|
+
emit_splat
|
42
|
+
if right?
|
43
|
+
emit(' = ')
|
44
|
+
emit_right
|
45
|
+
end
|
20
46
|
end
|
21
47
|
|
22
48
|
# Emit left
|
@@ -26,10 +52,23 @@ module ToSource
|
|
26
52
|
# @api private
|
27
53
|
#
|
28
54
|
def emit_left
|
29
|
-
|
55
|
+
return unless left?
|
56
|
+
run(Util::DelimitedBody, left.body)
|
30
57
|
end
|
31
58
|
|
32
|
-
# Emit
|
59
|
+
# Emit splat
|
60
|
+
#
|
61
|
+
# @return [undefined]
|
62
|
+
#
|
63
|
+
# @api private
|
64
|
+
#
|
65
|
+
def emit_splat
|
66
|
+
return unless splat?
|
67
|
+
emit(', ') if left?
|
68
|
+
visit(splat)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Emit right
|
33
72
|
#
|
34
73
|
# @return [undefined]
|
35
74
|
#
|
@@ -7,6 +7,8 @@ module ToSource
|
|
7
7
|
|
8
8
|
private
|
9
9
|
|
10
|
+
delegate(:receiver, :value)
|
11
|
+
|
10
12
|
# Perform dispatch
|
11
13
|
#
|
12
14
|
# @return [undefined]
|
@@ -14,12 +16,42 @@ module ToSource
|
|
14
16
|
# @api private
|
15
17
|
#
|
16
18
|
def dispatch
|
17
|
-
|
18
|
-
visit(util.receiver)
|
19
|
+
visit(receiver)
|
19
20
|
emit('[')
|
20
|
-
|
21
|
-
emit(
|
22
|
-
visit(
|
21
|
+
emit_index
|
22
|
+
emit("] #{operator} ")
|
23
|
+
visit(value)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Emit index
|
27
|
+
#
|
28
|
+
# @return [undefined]
|
29
|
+
#
|
30
|
+
# @api private
|
31
|
+
#
|
32
|
+
def emit_index
|
33
|
+
arguments = node.arguments
|
34
|
+
array = arguments.array
|
35
|
+
if array.any?
|
36
|
+
visit(array.first)
|
37
|
+
return
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
MAPPING = {
|
42
|
+
:or => :'||',
|
43
|
+
:and => :'&&'
|
44
|
+
}.freeze
|
45
|
+
|
46
|
+
# Return operator
|
47
|
+
#
|
48
|
+
# @return [String]
|
49
|
+
#
|
50
|
+
# @api private
|
51
|
+
#
|
52
|
+
def operator
|
53
|
+
op = node.op
|
54
|
+
"#{MAPPING.fetch(op, op)}="
|
23
55
|
end
|
24
56
|
|
25
57
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
|
4
|
+
class PushArgs < self
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
delegate(:arguments, :value)
|
9
|
+
|
10
|
+
# Perform dispatch
|
11
|
+
#
|
12
|
+
# @return [undefined]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
#
|
16
|
+
def dispatch
|
17
|
+
visit(arguments)
|
18
|
+
emit(', ')
|
19
|
+
visit(value)
|
20
|
+
end
|
21
|
+
|
22
|
+
class Array < self
|
23
|
+
|
24
|
+
handle(Rubinius::AST::PushArgs)
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# Perform dispatch
|
29
|
+
#
|
30
|
+
# @return [undefined]
|
31
|
+
#
|
32
|
+
# @api private
|
33
|
+
#
|
34
|
+
def dispatch
|
35
|
+
emit('[')
|
36
|
+
super
|
37
|
+
emit(']')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|