to_source 0.2.15 → 0.2.16
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -6
- data/Changelog.md +4 -0
- data/README.md +1 -1
- data/bin/to_source +1 -0
- data/config/flay.yml +1 -1
- data/config/flog.yml +1 -1
- data/config/roodi.yml +4 -4
- data/config/site.reek +5 -2
- data/config/yardstick.yml +1 -1
- data/lib/to_source.rb +1 -1
- data/lib/to_source/command.rb +63 -1
- data/lib/to_source/emitter.rb +221 -32
- data/lib/to_source/emitter/access.rb +8 -0
- data/lib/to_source/emitter/actual_arguments.rb +51 -8
- data/lib/to_source/emitter/alias.rb +11 -2
- data/lib/to_source/emitter/assignment.rb +62 -22
- data/lib/to_source/emitter/attribute_assignment.rb +11 -2
- data/lib/to_source/emitter/begin.rb +34 -14
- data/lib/to_source/emitter/binary_operator.rb +34 -17
- data/lib/to_source/emitter/binary_operator_method.rb +36 -17
- data/lib/to_source/emitter/block.rb +7 -0
- data/lib/to_source/emitter/block_argument.rb +7 -0
- data/lib/to_source/emitter/block_pass.rb +7 -0
- data/lib/to_source/emitter/case.rb +85 -0
- data/lib/to_source/emitter/class.rb +21 -6
- data/lib/to_source/emitter/concat_arguments.rb +11 -3
- data/lib/to_source/emitter/default_arguments.rb +7 -0
- data/lib/to_source/emitter/define.rb +46 -8
- data/lib/to_source/emitter/defined.rb +7 -0
- data/lib/to_source/emitter/element_assignment.rb +10 -1
- data/lib/to_source/emitter/element_reference.rb +10 -1
- data/lib/to_source/emitter/empty_body.rb +9 -0
- data/lib/to_source/emitter/ensure.rb +34 -7
- data/lib/to_source/emitter/ensure_body.rb +14 -5
- data/lib/to_source/emitter/execute_string.rb +9 -0
- data/lib/to_source/emitter/formal_arguments.rb +131 -39
- data/lib/to_source/emitter/if.rb +59 -14
- data/lib/to_source/emitter/iter.rb +10 -3
- data/lib/to_source/emitter/keyword_value.rb +28 -4
- data/lib/to_source/emitter/literal.rb +99 -14
- data/lib/to_source/emitter/literal/dynamic.rb +88 -13
- data/lib/to_source/emitter/loop.rb +14 -11
- data/lib/to_source/emitter/match3.rb +7 -0
- data/lib/to_source/emitter/module.rb +10 -3
- data/lib/to_source/emitter/multiple_assignment.rb +19 -0
- data/lib/to_source/emitter/nth_ref.rb +7 -0
- data/lib/to_source/emitter/op_assign1.rb +7 -0
- data/lib/to_source/emitter/op_assign2.rb +7 -0
- data/lib/to_source/emitter/pattern_arguments.rb +7 -0
- data/lib/to_source/emitter/rescue.rb +10 -4
- data/lib/to_source/emitter/rescue_condition.rb +40 -3
- data/lib/to_source/emitter/scope.rb +7 -0
- data/lib/to_source/emitter/scope_name.rb +7 -0
- data/lib/to_source/emitter/scoped_name.rb +7 -0
- data/lib/to_source/emitter/send.rb +71 -5
- data/lib/to_source/emitter/send_with_arguments.rb +53 -7
- data/lib/to_source/emitter/singleton_class.rb +17 -5
- data/lib/to_source/emitter/splat.rb +7 -0
- data/lib/to_source/emitter/splat_when.rb +7 -0
- data/lib/to_source/emitter/static.rb +19 -0
- data/lib/to_source/emitter/super.rb +49 -4
- data/lib/to_source/emitter/to_array.rb +7 -0
- data/lib/to_source/emitter/to_string.rb +7 -0
- data/lib/to_source/emitter/toplevel.rb +9 -0
- data/lib/to_source/emitter/unary_operator_method.rb +7 -0
- data/lib/to_source/emitter/unless.rb +23 -4
- data/lib/to_source/emitter/util.rb +8 -0
- data/lib/to_source/emitter/when.rb +28 -3
- data/lib/to_source/emitter/yield.rb +9 -0
- data/lib/to_source/emitter/z_super.rb +7 -0
- data/lib/to_source/state.rb +95 -11
- data/spec/unit/to_source/class_methods/run_spec.rb +13 -0
- data/to_source.gemspec +1 -1
- metadata +3 -4
- data/lib/to_source/buffer.rb +0 -40
- data/lib/to_source/emitter/receiver_case.rb +0 -35
@@ -1,17 +1,24 @@
|
|
1
1
|
module ToSource
|
2
2
|
class Emitter
|
3
|
+
# Emitter for iter nodes
|
3
4
|
class Iter < self
|
4
5
|
|
5
6
|
handle(Rubinius::AST::Iter19)
|
6
7
|
|
7
8
|
private
|
8
9
|
|
10
|
+
# Perform dispatch
|
11
|
+
#
|
12
|
+
# @return [undefined]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
#
|
9
16
|
def dispatch
|
10
17
|
emit(' do')
|
11
18
|
run(FormalArguments::Block)
|
12
|
-
|
13
|
-
|
14
|
-
|
19
|
+
indented do
|
20
|
+
visit(node.body)
|
21
|
+
end
|
15
22
|
emit_end
|
16
23
|
end
|
17
24
|
|
@@ -1,10 +1,17 @@
|
|
1
1
|
module ToSource
|
2
2
|
class Emitter
|
3
3
|
|
4
|
+
# Base class for keyword with value emitters
|
4
5
|
class KeywordValue < self
|
5
6
|
|
6
7
|
private
|
7
8
|
|
9
|
+
# Perform dispatch
|
10
|
+
#
|
11
|
+
# @return [undefined]
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
#
|
8
15
|
def dispatch
|
9
16
|
emit(self.class::SYMBOL)
|
10
17
|
if value?
|
@@ -14,23 +21,41 @@ module ToSource
|
|
14
21
|
end
|
15
22
|
end
|
16
23
|
|
24
|
+
# Emitter for return nodes
|
17
25
|
class Return < self
|
18
|
-
|
26
|
+
|
19
27
|
handle(Rubinius::AST::Return)
|
28
|
+
SYMBOL = :return
|
20
29
|
|
21
30
|
private
|
22
|
-
|
31
|
+
|
32
|
+
# Perform dispatch
|
33
|
+
#
|
34
|
+
# @return [undefined]
|
35
|
+
#
|
36
|
+
# @api private
|
37
|
+
#
|
23
38
|
def value?
|
24
39
|
!!node.value
|
25
40
|
end
|
26
41
|
end
|
27
42
|
|
43
|
+
# Emitter for break nodes
|
28
44
|
class Break < self
|
29
45
|
|
30
46
|
handle(Rubinius::AST::Break)
|
31
|
-
|
32
47
|
SYMBOL = :break
|
33
48
|
|
49
|
+
# Test if value is present
|
50
|
+
#
|
51
|
+
# @return [true]
|
52
|
+
# if value is present
|
53
|
+
#
|
54
|
+
# @return [false]
|
55
|
+
# otherwise
|
56
|
+
#
|
57
|
+
# @api private
|
58
|
+
#
|
34
59
|
def value?
|
35
60
|
!node.value.kind_of?(Rubinius::AST::NilLiteral)
|
36
61
|
end
|
@@ -38,6 +63,5 @@ module ToSource
|
|
38
63
|
end
|
39
64
|
|
40
65
|
end
|
41
|
-
|
42
66
|
end
|
43
67
|
end
|
@@ -1,22 +1,39 @@
|
|
1
1
|
module ToSource
|
2
2
|
class Emitter
|
3
|
+
# Base class for literal emitters
|
3
4
|
class Literal < self
|
4
5
|
|
6
|
+
# Emitter for empty array nodes
|
5
7
|
class EmptyArray < self
|
6
8
|
|
7
9
|
handle(Rubinius::AST::EmptyArray)
|
8
10
|
|
11
|
+
private
|
12
|
+
|
13
|
+
# Perform dispatch
|
14
|
+
#
|
15
|
+
# @return [undefined]
|
16
|
+
#
|
17
|
+
# @api private
|
18
|
+
#
|
9
19
|
def dispatch
|
10
20
|
emit('[]')
|
11
21
|
end
|
12
22
|
end
|
13
23
|
|
24
|
+
# Emitter for array nodes
|
14
25
|
class Array < self
|
15
26
|
|
16
27
|
handle(Rubinius::AST::ArrayLiteral)
|
17
28
|
|
18
29
|
private
|
19
|
-
|
30
|
+
|
31
|
+
# Perform dispatch
|
32
|
+
#
|
33
|
+
# @return [undefined]
|
34
|
+
#
|
35
|
+
# @api private
|
36
|
+
#
|
20
37
|
def dispatch
|
21
38
|
emit('[')
|
22
39
|
run(Util::DelimitedBody, node.body)
|
@@ -24,45 +41,67 @@ module ToSource
|
|
24
41
|
end
|
25
42
|
end
|
26
43
|
|
44
|
+
# Base class for range emitters
|
27
45
|
class Range < self
|
28
46
|
|
29
47
|
private
|
30
|
-
|
48
|
+
|
49
|
+
# Perform dispatch
|
50
|
+
#
|
51
|
+
# @return [undefined]
|
52
|
+
#
|
53
|
+
# @api private
|
54
|
+
#
|
31
55
|
def dispatch
|
32
56
|
util = node
|
33
57
|
visit(util.start)
|
34
|
-
emit(
|
58
|
+
emit(self.class::TOKEN)
|
35
59
|
visit(util.finish)
|
36
60
|
end
|
37
61
|
|
38
|
-
|
39
|
-
self.class::TOKEN
|
40
|
-
end
|
41
|
-
|
62
|
+
# Emitter for incluive range nodes
|
42
63
|
class Inclusive < self
|
64
|
+
|
43
65
|
handle(Rubinius::AST::Range)
|
44
|
-
TOKEN = '..'
|
66
|
+
TOKEN = '..'.freeze
|
67
|
+
|
45
68
|
end
|
46
69
|
|
70
|
+
# Emitter for exclusive range nodes
|
47
71
|
class Exclude < self
|
72
|
+
|
48
73
|
handle(Rubinius::AST::RangeExclude)
|
49
|
-
TOKEN = '...'
|
74
|
+
TOKEN = '...'.freeze
|
75
|
+
|
50
76
|
end
|
51
77
|
|
52
78
|
end
|
53
79
|
|
80
|
+
# Emitter for hash nodes
|
54
81
|
class Hash < self
|
55
82
|
|
56
83
|
handle(Rubinius::AST::HashLiteral)
|
57
84
|
|
58
85
|
private
|
59
|
-
|
86
|
+
|
87
|
+
# Perform dispatch
|
88
|
+
#
|
89
|
+
# @return [undefined]
|
90
|
+
#
|
91
|
+
# @api private
|
92
|
+
#
|
60
93
|
def dispatch
|
61
94
|
emit '{'
|
62
95
|
emit_body
|
63
96
|
emit '}'
|
64
97
|
end
|
65
98
|
|
99
|
+
# Emit body
|
100
|
+
#
|
101
|
+
# @return [undefined]
|
102
|
+
#
|
103
|
+
# @api private
|
104
|
+
#
|
66
105
|
def emit_body
|
67
106
|
body = node.array.each_slice(2).to_a
|
68
107
|
max = body.length - 1
|
@@ -79,64 +118,110 @@ module ToSource
|
|
79
118
|
|
80
119
|
end
|
81
120
|
|
121
|
+
# Base class for emiiters that emit via #inspect
|
82
122
|
class Inspect < self
|
83
123
|
|
84
124
|
handle(Rubinius::AST::SymbolLiteral)
|
85
125
|
|
126
|
+
private
|
127
|
+
|
128
|
+
# Perform dispatch
|
129
|
+
#
|
130
|
+
# @return [undefined]
|
131
|
+
#
|
132
|
+
# @api private
|
133
|
+
#
|
86
134
|
def dispatch
|
87
135
|
emit(value.inspect)
|
88
136
|
end
|
89
137
|
|
90
|
-
|
91
|
-
node.value
|
92
|
-
end
|
138
|
+
delegate :value
|
93
139
|
|
140
|
+
# Base class for emitters with static value
|
94
141
|
class Static < self
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
# Return value
|
146
|
+
#
|
147
|
+
# @return [Object]
|
148
|
+
#
|
149
|
+
# @api private
|
150
|
+
#
|
95
151
|
def value
|
96
152
|
self.class::VALUE
|
97
153
|
end
|
98
154
|
|
155
|
+
# Emitter for true literal nodes
|
99
156
|
class True < self
|
100
157
|
handle(Rubinius::AST::TrueLiteral)
|
101
158
|
VALUE = true
|
102
159
|
end
|
103
160
|
|
161
|
+
# Emitter for false literal nodes
|
104
162
|
class False < self
|
105
163
|
handle(Rubinius::AST::FalseLiteral)
|
106
164
|
VALUE = false
|
107
165
|
end
|
108
166
|
|
167
|
+
# Emitter for nil literal nodes
|
109
168
|
class Nil < self
|
110
169
|
handle(Rubinius::AST::NilLiteral)
|
111
170
|
VALUE = nil
|
112
171
|
end
|
113
172
|
end
|
114
173
|
|
174
|
+
# Emitter for regexp literal nodes
|
115
175
|
class Regexp < self
|
116
176
|
|
117
177
|
handle(Rubinius::AST::RegexLiteral)
|
118
178
|
|
179
|
+
private
|
180
|
+
|
181
|
+
# Return value to inspect
|
182
|
+
#
|
183
|
+
# @return [Regexp]
|
184
|
+
#
|
185
|
+
# @api private
|
186
|
+
#
|
119
187
|
def value
|
120
188
|
::Regexp.new(node.source)
|
121
189
|
end
|
122
190
|
end
|
123
191
|
|
192
|
+
# Emitter for string litera nodes
|
124
193
|
class String < self
|
125
194
|
|
126
195
|
handle(Rubinius::AST::StringLiteral)
|
127
196
|
|
197
|
+
private
|
198
|
+
|
199
|
+
# Return value to inspect
|
200
|
+
#
|
201
|
+
# @return [String]
|
202
|
+
#
|
203
|
+
# @api private
|
204
|
+
#
|
128
205
|
def value
|
129
206
|
node.string
|
130
207
|
end
|
131
208
|
end
|
132
209
|
end
|
133
210
|
|
134
|
-
|
211
|
+
# Emitters that emitt via vlaue pass through
|
135
212
|
class PassThrough < self
|
136
213
|
|
137
214
|
handle(Rubinius::AST::FixnumLiteral)
|
138
215
|
handle(Rubinius::AST::FloatLiteral)
|
139
216
|
|
217
|
+
private
|
218
|
+
|
219
|
+
# Perform dispatch
|
220
|
+
#
|
221
|
+
# @return [undefined]
|
222
|
+
#
|
223
|
+
# @api private
|
224
|
+
#
|
140
225
|
def dispatch
|
141
226
|
emit(node.value)
|
142
227
|
end
|
@@ -1,10 +1,17 @@
|
|
1
1
|
module ToSource
|
2
2
|
class Emitter
|
3
3
|
class Literal
|
4
|
+
# Base class for dynamic literal emitters
|
4
5
|
class Dynamic < self
|
5
6
|
|
6
7
|
private
|
7
|
-
|
8
|
+
|
9
|
+
# Perform dispatch
|
10
|
+
#
|
11
|
+
# @return [undefined]
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
#
|
8
15
|
def dispatch
|
9
16
|
emit_open
|
10
17
|
emit_first
|
@@ -12,37 +19,91 @@ module ToSource
|
|
12
19
|
emit_close
|
13
20
|
end
|
14
21
|
|
22
|
+
# Emit open
|
23
|
+
#
|
24
|
+
# @return [undefined]
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
#
|
15
28
|
def emit_open
|
16
29
|
emit(self.class::OPEN)
|
17
30
|
end
|
18
31
|
|
32
|
+
# Emit close
|
33
|
+
#
|
34
|
+
# @return [undefined]
|
35
|
+
#
|
36
|
+
# @api private
|
37
|
+
#
|
19
38
|
def emit_close
|
20
39
|
emit(self.class::CLOSE)
|
21
40
|
end
|
22
41
|
|
42
|
+
# Return first value
|
43
|
+
#
|
44
|
+
# @return [String]
|
45
|
+
#
|
46
|
+
# @api private
|
47
|
+
#
|
23
48
|
def first_value
|
24
49
|
node.string
|
25
50
|
end
|
26
51
|
|
52
|
+
# Emit literal
|
53
|
+
#
|
54
|
+
# @param [Object] literal
|
55
|
+
#
|
56
|
+
# @return [undefined]
|
57
|
+
#
|
58
|
+
# @api private
|
59
|
+
#
|
27
60
|
def emit_literal(literal)
|
28
61
|
emit(literal.inspect[1..-2])
|
29
62
|
end
|
30
63
|
|
64
|
+
# Emit literal node
|
65
|
+
#
|
66
|
+
# @param [Rubinius::AST::Node] node
|
67
|
+
#
|
68
|
+
# @return [undefined]
|
69
|
+
#
|
70
|
+
# @api private
|
71
|
+
#
|
31
72
|
def emit_literal_node(node)
|
32
73
|
emit_literal(node.string)
|
33
74
|
end
|
34
75
|
|
76
|
+
# Emit first
|
77
|
+
#
|
78
|
+
# @return [undefined]
|
79
|
+
#
|
80
|
+
# @api private
|
81
|
+
#
|
35
82
|
def emit_first
|
36
83
|
emit_literal(first_value)
|
37
84
|
end
|
38
85
|
|
86
|
+
# Emit segments
|
87
|
+
#
|
88
|
+
# @return [undefined]
|
89
|
+
#
|
90
|
+
# @api private
|
91
|
+
#
|
39
92
|
def emit_segments
|
40
|
-
array.
|
41
|
-
emit_segment(segment
|
93
|
+
array.each do |segment|
|
94
|
+
emit_segment(segment)
|
42
95
|
end
|
43
96
|
end
|
44
97
|
|
45
|
-
|
98
|
+
# Emit segment
|
99
|
+
#
|
100
|
+
# @param [Rubinius::AST::Node] segment
|
101
|
+
#
|
102
|
+
# @return [undefined]
|
103
|
+
#
|
104
|
+
# @api private
|
105
|
+
#
|
106
|
+
def emit_segment(segment)
|
46
107
|
case segment
|
47
108
|
when Rubinius::AST::StringLiteral
|
48
109
|
emit_literal_node(segment)
|
@@ -51,46 +112,60 @@ module ToSource
|
|
51
112
|
end
|
52
113
|
end
|
53
114
|
|
54
|
-
|
55
|
-
node.array
|
56
|
-
end
|
115
|
+
delegate :array
|
57
116
|
|
117
|
+
# Return max segment number
|
118
|
+
#
|
119
|
+
# @return [Fixnum]
|
120
|
+
#
|
121
|
+
# @api private
|
122
|
+
#
|
58
123
|
def max
|
59
124
|
array.length - 1
|
60
125
|
end
|
61
126
|
memoize :max
|
62
127
|
|
128
|
+
# Emitter for dynamic symbol literals
|
63
129
|
class Symbol < self
|
64
130
|
|
65
131
|
handle(Rubinius::AST::DynamicSymbol)
|
66
|
-
|
67
|
-
|
68
|
-
CLOSE = '"'
|
132
|
+
OPEN = ':"'.freeze
|
133
|
+
CLOSE = '"'.freeze
|
69
134
|
|
70
135
|
end
|
71
136
|
|
137
|
+
# Emitter for dynamic string literals
|
72
138
|
class String < self
|
73
139
|
|
74
140
|
handle(Rubinius::AST::DynamicString)
|
75
|
-
|
76
141
|
OPEN = CLOSE = '"'.freeze
|
77
142
|
|
78
143
|
end
|
79
144
|
|
145
|
+
# Emitter for dynamic execute string literals
|
80
146
|
class Execute < self
|
81
147
|
|
82
148
|
handle(Rubinius::AST::DynamicExecuteString)
|
83
|
-
|
84
149
|
OPEN = CLOSE = '`'.freeze
|
85
150
|
|
86
151
|
end
|
87
152
|
|
153
|
+
# Emitter for dynamic regexp literals
|
88
154
|
class Regex < self
|
89
155
|
|
156
|
+
handle(Rubinius::AST::DynamicRegex)
|
90
157
|
OPEN = CLOSE = '/'.freeze
|
91
158
|
|
92
|
-
|
159
|
+
private
|
93
160
|
|
161
|
+
# Emit literal
|
162
|
+
#
|
163
|
+
# @param [String] literal
|
164
|
+
#
|
165
|
+
# @return [undefined]
|
166
|
+
#
|
167
|
+
# @api private
|
168
|
+
#
|
94
169
|
def emit_literal(literal)
|
95
170
|
emit(literal)
|
96
171
|
end
|