clean_ripper 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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