clean_ripper 0.0.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.
@@ -0,0 +1,8 @@
1
+
2
+ require 'clean_sexp_builder'
3
+
4
+ CleanRipper = Ripper::CleanSexpBuilder
5
+
6
+ def CleanRipper.parse(source)
7
+ CleanRipper.new(source).parse
8
+ end
@@ -0,0 +1,196 @@
1
+
2
+ require 'ripper'
3
+
4
+ class Ripper
5
+ class CleanSexpBuilder < SexpBuilder
6
+
7
+ def initialize(source)
8
+ @source = source.split("\n")
9
+ super
10
+ end
11
+
12
+ def on_program(*args)
13
+ [:program] + args.first
14
+ end
15
+
16
+ def on_void_stmt(*args)
17
+ nil
18
+ end
19
+
20
+ def on_stmts_new(*args)
21
+ nil
22
+ end
23
+
24
+ def on_mrhs_new(*args)
25
+ nil
26
+ end
27
+
28
+ def on_stmts_add(*args)
29
+ args.first ? args.first + [args.last] : [args.last]
30
+ end
31
+
32
+ def on_mrhs_add_star(*args)
33
+ [:splat, args.last]
34
+ end
35
+
36
+ def on_args_add_star(*args)
37
+ [:splat, args.last]
38
+ end
39
+
40
+ def on_int(*args)
41
+ [:lit, eval(args.first)]
42
+ end
43
+
44
+ def on_float(*args)
45
+ [:lit, eval(args.first)]
46
+ end
47
+
48
+ def on_CHAR(*args)
49
+ [:lit, eval(args.first)]
50
+ end
51
+
52
+ def on_var_field(*args)
53
+ var = args.first
54
+ var[0] = :lvar if var.first == :ident
55
+ var
56
+ end
57
+
58
+ def on_var_ref(*args)
59
+ var = args.first
60
+ var[0] = :ident if var.first == :ident
61
+ var
62
+ end
63
+
64
+ def on_gvar(*args)
65
+ [:gvar, args.first.to_sym]
66
+ end
67
+
68
+ def on_cvar(*args)
69
+ [:cvar, args.first.to_sym]
70
+ end
71
+
72
+ def on_ivar(*args)
73
+ [:ivar, args.first.to_sym]
74
+ end
75
+
76
+ def on_ident(*args)
77
+ [:ident, args.first.to_sym]
78
+ end
79
+
80
+ def on_opassign(*args)
81
+ [:assign, args.first, [:binary, args.first, args[1][1][0..-2].to_sym, args.last]]
82
+ end
83
+
84
+ def on_method_add_arg(*args)
85
+ [:call, args.first[1][1], (args[1][1] if args[1]), nil]
86
+ end
87
+
88
+ def on_args_add_block(*args)
89
+ [:block] + args.first
90
+ end
91
+
92
+ def on_args_new(*args)
93
+ nil
94
+ end
95
+
96
+ def on_args_add(*args)
97
+ args.first ? args.first + [args.last] : [args.last]
98
+ end
99
+
100
+ def on_method_add_block(*args)
101
+ brace_block = args[1]
102
+ brace_block[2].unshift(:block)
103
+ brace_block[2] = nil if brace_block[2].compact.size == 1
104
+ args.first[0..2] << brace_block
105
+ end
106
+
107
+ def on_block_var(*args)
108
+ [:block] + args.first
109
+ end
110
+
111
+ def on_params(*args)
112
+ params = []
113
+ args.first.each do |p|
114
+ p[0] = :lvar if p.first == :ident
115
+ params << [:param, p, nil]
116
+ end if args.first
117
+ args[1].each do |p|
118
+ p.first[0] = :lvar if p.first.first == :ident
119
+ p[1] = [p[1]] if Symbol === p[1].first
120
+ params << [:param, p.first, [:block, *p[1]]]
121
+ end if args[1]
122
+ params << args[2] if args[2]
123
+ params
124
+ end
125
+
126
+ def on_rest_param(*args)
127
+ args.first[0] = :lvar if args.first.first == :ident
128
+ [:rest_param, args.first]
129
+ end
130
+
131
+ def on_param_error(*args)
132
+ args.first
133
+ end
134
+
135
+ def on_paren(*args)
136
+ l = args.first
137
+ l.size == 1 ? l.first : [:block] + l
138
+ end
139
+
140
+ def on_kw(*args)
141
+ [args.first.to_sym]
142
+ end
143
+
144
+ def on_do_block(*args)
145
+ [:brace_block] + args
146
+ end
147
+
148
+ def on_if_mod(*args)
149
+ [:if] + args + [nil]
150
+ end
151
+
152
+ def on_if(*args)
153
+ args[0] = [args.first] if Symbol === args.first.first
154
+ [:if] << [:block] + args.first << ([:block, *args[1]] if args[1].first) << ([:block, *args[2][1][1..-1]] if args[2])
155
+ end
156
+
157
+ def on_unless(*args)
158
+ args[0] = [args.first] if Symbol === args.first.first
159
+ [:if] << [:block] + args.first << ([:block, *args[2][1][1..-1]] if args[2]) << ([:block, *args[1]] if args[1].first)
160
+ end
161
+
162
+ def on_array(*args)
163
+ el = args.first || []
164
+ [:array] + ((el.size > 0 and Symbol === el.first) ? [el] : el)
165
+ end
166
+
167
+ def on_string_add(*args)
168
+ args.first ? args.first + [args.last] : [args.last]
169
+ end
170
+
171
+ def on_qwords_add(*args)
172
+ args.first ? args.first + [args.last] : [args.last]
173
+ end
174
+
175
+ def on_string_content(*args)
176
+ nil
177
+ end
178
+
179
+ def on_string_literal(*args)
180
+ [:string, *(args.first || []).compact]
181
+ end
182
+
183
+ def on_tstring_content(*args)
184
+ str = "\""+args.first+"\""
185
+ if @source[lineno-1][column-1, 1] == "'"
186
+ str[0] = str[-1] = "'"
187
+ end
188
+ [:str, eval(str)]
189
+ end
190
+
191
+ def on_string_embexpr(*args)
192
+ [:block] + args.first if args.first.first
193
+ end
194
+
195
+ end
196
+ end
@@ -0,0 +1,418 @@
1
+
2
+ require 'test/unit'
3
+ require '../lib/clean_ripper'
4
+
5
+ class CleanRipperTest < Test::Unit::TestCase
6
+
7
+ def test_001
8
+ code = <<-END
9
+ (12 + 65) * 3
10
+ END
11
+
12
+ # CleanRipper output
13
+ clean_ripper = [:program,
14
+ [:binary,
15
+ [:binary,
16
+ [:lit, 12],
17
+ :+,
18
+ [:lit, 65]
19
+ ],
20
+ :*,
21
+ [:lit, 3]
22
+ ]
23
+ ]
24
+
25
+ # Ripper output
26
+ ripper = [:program,
27
+ [:stmts_add,
28
+ [:stmts_new],
29
+ [:binary,
30
+ [:paren,
31
+ [:stmts_add,
32
+ [:stmts_new],
33
+ [:binary,
34
+ [:@int, "12", [1, 5]],
35
+ :+,
36
+ [:@int, "65", [1, 10]]
37
+ ]
38
+ ]
39
+ ],
40
+ :*,
41
+ [:@int, "3", [1, 16]]
42
+ ]
43
+ ]
44
+ ]
45
+
46
+ assert_equal(clean_ripper, CleanRipper.parse(code))
47
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
48
+ end
49
+ def test_002
50
+ code = <<-END
51
+ --2
52
+ END
53
+
54
+ # CleanRipper output
55
+ clean_ripper = [:program,
56
+ [:unary,
57
+ :-@,
58
+ [:unary, :-@, [:lit, 2]]
59
+ ]
60
+ ]
61
+
62
+ # Ripper output
63
+ ripper = [:program,
64
+ [:stmts_add,
65
+ [:stmts_new],
66
+ [:unary,
67
+ :-@,
68
+ [:unary,
69
+ :-@,
70
+ [:@int, "2", [1, 6]]
71
+ ]
72
+ ]
73
+ ]
74
+ ]
75
+
76
+ assert_equal(clean_ripper, CleanRipper.parse(code))
77
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
78
+ end
79
+ def test_003
80
+ code = <<-END
81
+ -2**-3
82
+ END
83
+
84
+ # CleanRipper output
85
+ clean_ripper = [:program,
86
+ [:unary,
87
+ :-@,
88
+ [:binary,
89
+ [:lit, 2],
90
+ :**,
91
+ [:unary, :-@, [:lit, 3]]
92
+ ]
93
+ ]
94
+ ]
95
+
96
+ # Ripper output
97
+ ripper = [:program,
98
+ [:stmts_add,
99
+ [:stmts_new],
100
+ [:unary,
101
+ :-@,
102
+ [:binary,
103
+ [:@int, "2", [1, 5]],
104
+ :**,
105
+ [:unary,
106
+ :-@,
107
+ [:@int, "3", [1, 9]]
108
+ ]
109
+ ]
110
+ ]
111
+ ]
112
+ ]
113
+
114
+ assert_equal(clean_ripper, CleanRipper.parse(code))
115
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
116
+ end
117
+ def test_004
118
+ code = <<-END
119
+ true ? 2 : 3 ? 4 : 5
120
+ END
121
+
122
+ # CleanRipper output
123
+ clean_ripper = [:program,
124
+ [:ifop,
125
+ [:true],
126
+ [:lit, 2],
127
+ [:ifop,
128
+ [:lit, 3],
129
+ [:lit, 4],
130
+ [:lit, 5]
131
+ ]
132
+ ]
133
+ ]
134
+
135
+ # Ripper output
136
+ ripper = [:program,
137
+ [:stmts_add,
138
+ [:stmts_new],
139
+ [:ifop,
140
+ [:var_ref, [:@kw, "true", [1, 4]]],
141
+ [:@int, "2", [1, 11]],
142
+ [:ifop,
143
+ [:@int, "3", [1, 15]],
144
+ [:@int, "4", [1, 19]],
145
+ [:@int, "5", [1, 23]]
146
+ ]
147
+ ]
148
+ ]
149
+ ]
150
+
151
+ assert_equal(clean_ripper, CleanRipper.parse(code))
152
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
153
+ end
154
+ def test_005
155
+ code = <<-END
156
+ a = oops rescue 10
157
+ END
158
+
159
+ # CleanRipper output
160
+ clean_ripper = [:program,
161
+ [:assign,
162
+ [:lvar, :a],
163
+ [:rescue_mod,
164
+ [:ident, :oops],
165
+ [:lit, 10]
166
+ ]
167
+ ]
168
+ ]
169
+
170
+ # Ripper output
171
+ ripper = [:program,
172
+ [:stmts_add,
173
+ [:stmts_new],
174
+ [:assign,
175
+ [:var_field, [:@ident, "a", [1, 4]]],
176
+ [:rescue_mod,
177
+ [:var_ref, [:@ident, "oops", [1, 8]]],
178
+ [:@int, "10", [1, 20]]
179
+ ]
180
+ ]
181
+ ]
182
+ ]
183
+
184
+ assert_equal(clean_ripper, CleanRipper.parse(code))
185
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
186
+ end
187
+ def test_006
188
+ code = <<-END
189
+ a = nil
190
+ b = 1 + 2
191
+ END
192
+
193
+ # CleanRipper output
194
+ clean_ripper = [:program,
195
+ [:assign,
196
+ [:lvar, :a],
197
+ [:nil]
198
+ ],
199
+ [:assign,
200
+ [:lvar, :b],
201
+ [:binary, [:lit, 1], :+, [:lit, 2]]
202
+ ]
203
+ ]
204
+
205
+ # Ripper output
206
+ ripper = [:program,
207
+ [:stmts_add,
208
+ [:stmts_add,
209
+ [:stmts_new],
210
+ [:assign,
211
+ [:var_field, [:@ident, "a", [1, 4]]],
212
+ [:var_ref, [:@kw, "nil", [1, 8]]]]
213
+ ],
214
+ [:assign,
215
+ [:var_field, [:@ident, "b", [2, 4]]],
216
+ [:binary, [:@int, "1", [2, 8]], :+, [:@int, "2", [2, 12]]]
217
+ ]
218
+ ]
219
+ ]
220
+
221
+ assert_equal(clean_ripper, CleanRipper.parse(code))
222
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
223
+ end
224
+ def test_007
225
+ code = <<-END
226
+ a = *()
227
+ b = *[1, 2, 3]
228
+ END
229
+
230
+ # CleanRipper output
231
+ clean_ripper = [:program,
232
+ [:assign,
233
+ [:lvar, :a],
234
+ [:splat, nil]
235
+ ],
236
+ [:assign,
237
+ [:lvar, :b],
238
+ [:splat,
239
+ [:array, [:lit, 1], [:lit, 2], [:lit, 3]]
240
+ ]
241
+ ]
242
+ ]
243
+
244
+ # Ripper output
245
+ ripper = [:program,
246
+ [:stmts_add,
247
+ [:stmts_add,
248
+ [:stmts_new],
249
+ [:assign,
250
+ [:var_field, [:@ident, "a", [1, 4]]],
251
+ [:mrhs_add_star,
252
+ [:mrhs_new],
253
+ [:paren,
254
+ [:stmts_add,
255
+ [:stmts_new],
256
+ [:void_stmt]
257
+ ]
258
+ ]
259
+ ]
260
+ ]
261
+ ],
262
+ [:assign,
263
+ [:var_field, [:@ident, "b", [2, 4]]],
264
+ [:mrhs_add_star,
265
+ [:mrhs_new],
266
+ [:array,
267
+ [:args_add,
268
+ [:args_add,
269
+ [:args_add,
270
+ [:args_new],
271
+ [:@int, "1", [2, 10]]
272
+ ],
273
+ [:@int, "2", [2, 13]]
274
+ ],
275
+ [:@int, "3", [2, 16]]
276
+ ]
277
+ ]
278
+ ]
279
+ ]
280
+ ]
281
+ ]
282
+
283
+ assert_equal(clean_ripper, CleanRipper.parse(code))
284
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
285
+ end
286
+ def test_008
287
+ code = <<-END
288
+ a = b = 2
289
+ a += 5
290
+ END
291
+
292
+ # CleanRipper output
293
+ clean_ripper = [:program,
294
+ [:assign,
295
+ [:lvar, :a],
296
+ [:assign, [:lvar, :b], [:lit, 2]]
297
+ ],
298
+ [:assign,
299
+ [:lvar, :a],
300
+ [:binary, [:lvar, :a], :+, [:lit, 5]]
301
+ ]
302
+ ]
303
+
304
+ # Ripper output
305
+ ripper = [:program,
306
+ [:stmts_add,
307
+ [:stmts_add,
308
+ [:stmts_new],
309
+ [:assign,
310
+ [:var_field, [:@ident, "a", [1, 4]]],
311
+ [:assign,
312
+ [:var_field, [:@ident, "b", [1, 8]]],
313
+ [:@int, "2", [1, 12]]
314
+ ]
315
+ ]
316
+ ],
317
+ [:opassign,
318
+ [:var_field, [:@ident, "a", [2, 4]]],
319
+ [:@op, "+=", [2, 6]],
320
+ [:@int, "5", [2, 9]]
321
+ ]
322
+ ]
323
+ ]
324
+
325
+ assert_equal(clean_ripper, CleanRipper.parse(code))
326
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
327
+ end
328
+ def test_009
329
+ code = <<-END
330
+ !!10
331
+ a || b and c
332
+ END
333
+
334
+ # CleanRipper output
335
+ clean_ripper = [:program,
336
+ [:unary,
337
+ :!,
338
+ [:unary, :!, [:lit, 10]]
339
+ ],
340
+ [:binary,
341
+ [:binary, [:ident, :a], :"||", [:ident, :b]],
342
+ :and,
343
+ [:ident, :c]
344
+ ]
345
+ ]
346
+
347
+ # Ripper output
348
+ ripper = [:program,
349
+ [:stmts_add,
350
+ [:stmts_add,
351
+ [:stmts_new],
352
+ [:unary,
353
+ :!,
354
+ [:unary, :!, [:@int, "10", [1, 6]]]
355
+ ]
356
+ ],
357
+ [:binary,
358
+ [:binary,
359
+ [:var_ref, [:@ident, "a", [2, 4]]],
360
+ :"||",
361
+ [:var_ref, [:@ident, "b", [2, 9]]]],
362
+ :and,
363
+ [:var_ref, [:@ident, "c", [2, 15]]]
364
+ ]
365
+ ]
366
+ ]
367
+
368
+ assert_equal(clean_ripper, CleanRipper.parse(code))
369
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
370
+ end
371
+ def test_010
372
+ code = <<-END
373
+ if true
374
+ true while true or false
375
+ end
376
+ END
377
+
378
+ # CleanRipper output
379
+ clean_ripper = [:program,
380
+ [:if,
381
+ [:block, [:true]],
382
+ [:block,
383
+ [:while_mod,
384
+ [:binary, [:true], :or, [:false]],
385
+ [:true]
386
+ ]
387
+ ],
388
+ nil
389
+ ]
390
+ ]
391
+
392
+ # Ripper output
393
+ ripper = [:program,
394
+ [:stmts_add,
395
+ [:stmts_new],
396
+ [:if,
397
+ [:var_ref, [:@kw, "true", [1, 7]]],
398
+ [:stmts_add,
399
+ [:stmts_new],
400
+ [:while_mod,
401
+ [:binary,
402
+ [:var_ref, [:@kw, "true", [2, 17]]],
403
+ :or,
404
+ [:var_ref, [:@kw, "false", [2, 25]]]
405
+ ],
406
+ [:var_ref, [:@kw, "true", [2, 6]]]
407
+ ]
408
+ ],
409
+ nil
410
+ ]
411
+ ]
412
+ ]
413
+
414
+ assert_equal(clean_ripper, CleanRipper.parse(code))
415
+ assert_equal(ripper, Ripper::SexpBuilder.new(code).parse)
416
+ end
417
+
418
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: clean_ripper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Guilherme Bernal
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-10 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Produces a clean output for Ripper, making the output tree usable and
15
+ redable.
16
+ email: lb-guilherme@live.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/clean_ripper.rb
22
+ - lib/clean_sexp_builder.rb
23
+ - test/clean_ripper_test.rb
24
+ homepage: https://github.com/LBg/CleanRipper
25
+ licenses: []
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.10
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: Produces a clean output for Ripper.
48
+ test_files:
49
+ - test/clean_ripper_test.rb