to_source 0.0.1 → 0.1.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.
data/Readme.md CHANGED
@@ -18,7 +18,14 @@ transform themselves into source code. It's the reverse of Rubinius' builtin
18
18
 
19
19
  to_source needs Rubinius 2.0 to run, in either 1.8 or 1.9 mode.
20
20
 
21
- Put this in your Gemfile:
21
+ To install it as a gem:
22
+
23
+ $ gem install to_source
24
+
25
+ And `require 'to_source'` from your code. Automatically, your AST nodes respond
26
+ to the `#to_source` method.
27
+
28
+ But if you're using Bundler, just put this in your Gemfile:
22
29
 
23
30
  gem 'to_source'
24
31
 
@@ -1,3 +1,3 @@
1
1
  module ToSource
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -87,6 +87,12 @@ module ToSource
87
87
  node.finish.lazy_visit self, node
88
88
  end
89
89
 
90
+ def range_exclude(node, parent)
91
+ node.start.lazy_visit self, node
92
+ emit '...'
93
+ node.finish.lazy_visit self, node
94
+ end
95
+
90
96
  def regex_literal(node, parent)
91
97
  emit '/'
92
98
  emit node.source
@@ -217,6 +223,90 @@ module ToSource
217
223
  emit node.name
218
224
  end
219
225
 
226
+ def if(node, parent)
227
+ body, else_body = node.body, node.else
228
+ keyword = 'if'
229
+
230
+ if node.body.is_a?(Rubinius::AST::NilLiteral) && !node.else.is_a?(Rubinius::AST::NilLiteral)
231
+
232
+ body, else_body = else_body, body
233
+ keyword = 'unless'
234
+ end
235
+
236
+ emit keyword << ' '
237
+ node.condition.lazy_visit self, node
238
+ emit "\n"
239
+
240
+ @indentation += 1
241
+
242
+ if body.is_a?(Rubinius::AST::Block)
243
+ body.lazy_visit self, parent, true
244
+ else
245
+ emit current_indentation
246
+ body.lazy_visit self, parent
247
+ end
248
+
249
+ emit "\n"
250
+
251
+ if else_body.is_a?(Rubinius::AST::NilLiteral)
252
+ emit 'end'
253
+ return
254
+ end
255
+
256
+ emit "else\n"
257
+
258
+ if else_body.is_a?(Rubinius::AST::Block)
259
+ else_body.lazy_visit self, parent, true
260
+ else
261
+ emit current_indentation
262
+ else_body.lazy_visit self, parent
263
+ end
264
+
265
+ emit "\n"
266
+ emit 'end'
267
+ end
268
+
269
+ def while(node, parent)
270
+ emit 'while '
271
+ node.condition.lazy_visit self, node
272
+ emit "\n"
273
+
274
+ @indentation += 1
275
+
276
+ if node.body.is_a?(Rubinius::AST::Block)
277
+ node.body.lazy_visit self, parent, true
278
+ else
279
+ emit current_indentation
280
+ node.body.lazy_visit self, parent
281
+ end
282
+
283
+ emit "\n"
284
+ emit "end"
285
+ end
286
+
287
+ def until(node, parent)
288
+ emit 'until '
289
+ node.condition.lazy_visit self, node
290
+ emit "\n"
291
+
292
+ @indentation += 1
293
+
294
+ if node.body.is_a?(Rubinius::AST::Block)
295
+ node.body.lazy_visit self, parent, true
296
+ else
297
+ emit current_indentation
298
+ node.body.lazy_visit self, parent
299
+ end
300
+
301
+ emit "\n"
302
+ emit "end"
303
+ end
304
+
305
+ def return(node, parent)
306
+ emit 'return '
307
+ node.value.lazy_visit self, parent
308
+ end
309
+
220
310
  private
221
311
 
222
312
  def process_binary_operator(node, parent)
@@ -71,6 +71,10 @@ module ToSource
71
71
  assert_source '20..34'
72
72
  end
73
73
 
74
+ def test_range_exclude
75
+ assert_source '20...34'
76
+ end
77
+
74
78
  def test_regex
75
79
  assert_source '/.*/'
76
80
  end
@@ -122,5 +126,45 @@ module ToSource
122
126
  assert_source "!1"
123
127
  assert_source "!!1"
124
128
  end
129
+
130
+ def test_if
131
+ assert_source "if 3\n 9\nend"
132
+ end
133
+
134
+ def test_if_with_multiple_blocks
135
+ assert_source "if 3\n 9\n 8\nend"
136
+ end
137
+
138
+ def test_else
139
+ assert_source "if 3\n 9\nelse\n 9\nend"
140
+ end
141
+
142
+ def test_else_with_multiple_blocks
143
+ assert_source "if 3\n 9\n 8\nelse\n 9\n 8\nend"
144
+ end
145
+
146
+ def test_unless
147
+ assert_source "unless 3\n 9\nend"
148
+ end
149
+
150
+ def test_while
151
+ assert_source "while false\n 3\nend"
152
+ end
153
+
154
+ def test_while_with_multiple_blocks
155
+ assert_source "while false\n 3\n 5\nend"
156
+ end
157
+
158
+ def test_until
159
+ assert_source "until false\n 3\nend"
160
+ end
161
+
162
+ def test_until_with_multiple_blocks
163
+ assert_source "while false\n 3\n 5\nend"
164
+ end
165
+
166
+ def test_return
167
+ assert_source "return 9"
168
+ end
125
169
  end
126
170
  end
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: to_source
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Josep M. Bach
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-23 00:00:00.000000000 Z
12
+ date: 2012-02-24 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Transform your Rubinius AST nodes back to source code. Reverse parsing!
15
15
  email: