sexp2ruby 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -0
  3. data/.travis.yml +1 -2
  4. data/README.md +9 -0
  5. data/lib/{sexp2ruby/core_extensions → core_extensions}/regexp.rb +0 -0
  6. data/lib/sexp2ruby/node/alias.rb +9 -0
  7. data/lib/sexp2ruby/node/and.rb +9 -0
  8. data/lib/sexp2ruby/node/arglist.rb +16 -0
  9. data/lib/sexp2ruby/node/args.rb +33 -0
  10. data/lib/sexp2ruby/node/array.rb +9 -0
  11. data/lib/sexp2ruby/node/attrasgn.rb +27 -0
  12. data/lib/sexp2ruby/node/back_ref.rb +9 -0
  13. data/lib/sexp2ruby/node/base.rb +36 -0
  14. data/lib/sexp2ruby/node/begin.rb +19 -0
  15. data/lib/sexp2ruby/node/block.rb +24 -0
  16. data/lib/sexp2ruby/node/block_pass.rb +10 -0
  17. data/lib/sexp2ruby/node/break.rb +14 -0
  18. data/lib/sexp2ruby/node/call.rb +70 -0
  19. data/lib/sexp2ruby/node/case.rb +27 -0
  20. data/lib/sexp2ruby/node/cdecl.rb +17 -0
  21. data/lib/sexp2ruby/node/class.rb +9 -0
  22. data/lib/sexp2ruby/node/colon2.rb +9 -0
  23. data/lib/sexp2ruby/node/colon3.rb +9 -0
  24. data/lib/sexp2ruby/node/const.rb +9 -0
  25. data/lib/sexp2ruby/node/cvar.rb +9 -0
  26. data/lib/sexp2ruby/node/cvasgn.rb +9 -0
  27. data/lib/sexp2ruby/node/cvdecl.rb +9 -0
  28. data/lib/sexp2ruby/node/defined.rb +9 -0
  29. data/lib/sexp2ruby/node/defn.rb +66 -0
  30. data/lib/sexp2ruby/node/defs.rb +17 -0
  31. data/lib/sexp2ruby/node/dot2.rb +9 -0
  32. data/lib/sexp2ruby/node/dot3.rb +9 -0
  33. data/lib/sexp2ruby/node/dregx.rb +19 -0
  34. data/lib/sexp2ruby/node/dregx_once.rb +9 -0
  35. data/lib/sexp2ruby/node/dstr.rb +9 -0
  36. data/lib/sexp2ruby/node/dsym.rb +9 -0
  37. data/lib/sexp2ruby/node/dxstr.rb +9 -0
  38. data/lib/sexp2ruby/node/ensure.rb +18 -0
  39. data/lib/sexp2ruby/node/evstr.rb +9 -0
  40. data/lib/sexp2ruby/node/false.rb +9 -0
  41. data/lib/sexp2ruby/node/flip2.rb +9 -0
  42. data/lib/sexp2ruby/node/flip3.rb +9 -0
  43. data/lib/sexp2ruby/node/for.rb +17 -0
  44. data/lib/sexp2ruby/node/gasgn.rb +9 -0
  45. data/lib/sexp2ruby/node/gvar.rb +9 -0
  46. data/lib/sexp2ruby/node/hash.rb +53 -0
  47. data/lib/sexp2ruby/node/iasgn.rb +14 -0
  48. data/lib/sexp2ruby/node/if.rb +41 -0
  49. data/lib/sexp2ruby/node/iter.rb +50 -0
  50. data/lib/sexp2ruby/node/ivar.rb +9 -0
  51. data/lib/sexp2ruby/node/kwsplat.rb +9 -0
  52. data/lib/sexp2ruby/node/lasgn.rb +11 -0
  53. data/lib/sexp2ruby/node/lit.rb +15 -0
  54. data/lib/sexp2ruby/node/lvar.rb +9 -0
  55. data/lib/sexp2ruby/node/masgn.rb +46 -0
  56. data/lib/sexp2ruby/node/match.rb +9 -0
  57. data/lib/sexp2ruby/node/match2.rb +11 -0
  58. data/lib/sexp2ruby/node/match3.rb +17 -0
  59. data/lib/sexp2ruby/node/module.rb +9 -0
  60. data/lib/sexp2ruby/node/next.rb +14 -0
  61. data/lib/sexp2ruby/node/nil.rb +9 -0
  62. data/lib/sexp2ruby/node/not.rb +9 -0
  63. data/lib/sexp2ruby/node/nth_ref.rb +9 -0
  64. data/lib/sexp2ruby/node/op_asgn1.rb +16 -0
  65. data/lib/sexp2ruby/node/op_asgn2.rb +17 -0
  66. data/lib/sexp2ruby/node/op_asgn_and.rb +13 -0
  67. data/lib/sexp2ruby/node/op_asgn_or.rb +13 -0
  68. data/lib/sexp2ruby/node/or.rb +9 -0
  69. data/lib/sexp2ruby/node/postexe.rb +9 -0
  70. data/lib/sexp2ruby/node/redo.rb +9 -0
  71. data/lib/sexp2ruby/node/resbody.rb +19 -0
  72. data/lib/sexp2ruby/node/rescue.rb +32 -0
  73. data/lib/sexp2ruby/node/retry.rb +9 -0
  74. data/lib/sexp2ruby/node/return.rb +13 -0
  75. data/lib/sexp2ruby/node/sclass.rb +9 -0
  76. data/lib/sexp2ruby/node/self.rb +9 -0
  77. data/lib/sexp2ruby/node/splat.rb +13 -0
  78. data/lib/sexp2ruby/node/str.rb +9 -0
  79. data/lib/sexp2ruby/node/super.rb +10 -0
  80. data/lib/sexp2ruby/node/svalue.rb +13 -0
  81. data/lib/sexp2ruby/node/to_ary.rb +9 -0
  82. data/lib/sexp2ruby/node/true.rb +9 -0
  83. data/lib/sexp2ruby/node/undef.rb +9 -0
  84. data/lib/sexp2ruby/node/until.rb +9 -0
  85. data/lib/sexp2ruby/node/valias.rb +9 -0
  86. data/lib/sexp2ruby/node/when.rb +24 -0
  87. data/lib/sexp2ruby/node/while.rb +9 -0
  88. data/lib/sexp2ruby/node/xstr.rb +9 -0
  89. data/lib/sexp2ruby/node/yield.rb +18 -0
  90. data/lib/sexp2ruby/node/zsuper.rb +9 -0
  91. data/lib/sexp2ruby/processor.rb +121 -912
  92. data/lib/sexp2ruby/version.rb +1 -1
  93. data/lib/sexp2ruby.rb +88 -1
  94. data/sexp2ruby.gemspec +1 -0
  95. data/spec/lib/processor_spec.rb +478 -1
  96. metadata +104 -8
  97. data/Rakefile +0 -92
  98. data/test/test_ruby2ruby.rb +0 -496
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3a09363137ce2f11cc78ad2733dce55fcf56c27c
4
- data.tar.gz: 804d653482abc54b86ef47119067f80657df796b
3
+ metadata.gz: e6521d5161ee2027c4a9fcfbfa58a6f8800a1032
4
+ data.tar.gz: dd984a8d70a35a285dae0b591e4cc523424c1417
5
5
  SHA512:
6
- metadata.gz: 7a7d4b703d320e202289deee5eb673d27e1457e25fb0b42e3adb894bddb811ba41816933dda1766ee2bbd08be78c1cff7105d12d598adf5bc9636a89dcabb636
7
- data.tar.gz: b91c818789cc96b280af027092ce11dce5d38e4d1648c2e35e4806d216b2288d75c7f20923f802155421294b8a04a5d92dfece52aa314565a6d6cde13f520920
6
+ metadata.gz: f87f34c8f9ca2006e15738e8329289ae087bc928b2d0c0eb06e9d813f20f7346796c0935347f0913841ff466cbe5b0f486856264944ee9e87dca4af76f2e77b2
7
+ data.tar.gz: 43e0e32832b2a01b3966770a812c917bc130f3489bb29d4900c5d554d110ee80badd8b50967a245c170aec0e15c510772277b00feb2dc12a2e6b7a6f3c9d2fd0
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --require spec_helper
3
+
data/.travis.yml CHANGED
@@ -1,10 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
3
  - 1.9.3
5
4
  - 2.0.0
6
5
  - 2.1.6
7
6
  - 2.2.2
8
- script: bundle exec rspec
7
+ script: bundle exec rspec --require spec_helper
9
8
  notifications:
10
9
  email: false
data/README.md CHANGED
@@ -1,11 +1,15 @@
1
1
  sexp2ruby
2
2
  =========
3
3
 
4
+ [![Build Status][5]][6] [![Code Climate][7]][8]
5
+
4
6
  `sexp2ruby` generates ruby from RubyParser S-expressions.
5
7
  It is a fork of [ruby2ruby][1] with slightly different goals.
6
8
 
7
9
  - Generates ruby that follows [ruby-style-guide][3] where possible
8
10
  - Prefers OO design over performance
11
+ - Drops support for ruby 1.8.7
12
+ - Depends on [activesupport][4]
9
13
  - Uses bundler instead of hoe
10
14
  - Uses rspec instead of minitest
11
15
 
@@ -30,3 +34,8 @@ so `deep_clone` if you need to preserve it.
30
34
  [1]: https://github.com/seattlerb/ruby2ruby
31
35
  [2]: http://docs.seattlerb.org/ruby2ruby
32
36
  [3]: https://github.com/bbatsov/ruby-style-guide
37
+ [4]: https://rubygems.org/gems/activesupport
38
+ [5]: https://travis-ci.org/jaredbeck/sexp2ruby.svg
39
+ [6]: https://travis-ci.org/jaredbeck/sexp2ruby
40
+ [7]: https://codeclimate.com/github/jaredbeck/sexp2ruby/badges/gpa.svg
41
+ [8]: https://codeclimate.com/github/jaredbeck/sexp2ruby
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Alias < Base
4
+ def to_s(exp)
5
+ parenthesize "alias #{process(exp.shift)} #{process(exp.shift)}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class And < Base
4
+ def to_s(exp)
5
+ parenthesize "#{process exp.shift} and #{process exp.shift}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Arglist < Base
4
+ def to_s(exp)
5
+ code = []
6
+ until exp.empty? do
7
+ arg = exp.shift
8
+ to_wrap = arg.first == :rescue
9
+ arg_code = process arg
10
+ code << (to_wrap ? "(#{arg_code})" : arg_code)
11
+ end
12
+ code.join ', '
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,33 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Args < Base
4
+ def to_s(exp)
5
+ args = []
6
+
7
+ until exp.empty? do
8
+ arg = exp.shift
9
+ case arg
10
+ when Symbol then
11
+ args << arg
12
+ when Sexp then
13
+ case arg.first
14
+ when :lasgn then
15
+ args << process(arg)
16
+ when :masgn then
17
+ args << process(arg)
18
+ when :kwarg then
19
+ _, k, v = arg
20
+ args << "#{k}: #{process v}"
21
+ else
22
+ raise "unknown arg type #{arg.first.inspect}"
23
+ end
24
+ else
25
+ raise "unknown arg type #{arg.inspect}"
26
+ end
27
+ end
28
+
29
+ "(#{args.join ', '})"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Array < Base
4
+ def to_s(exp)
5
+ "[#{process_arglist(exp)}]"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Attrasgn < Base
4
+ def to_s(exp)
5
+ receiver = process exp.shift
6
+ name = exp.shift
7
+ rhs = exp.pop
8
+ args = s(:array, *exp)
9
+ exp.clear
10
+
11
+ case name
12
+ when :[]= then
13
+ args = process args
14
+ "#{receiver}#{args} = #{process rhs}"
15
+ else
16
+ raise "dunno what to do: #{args.inspect}" unless args.size == 1 # s(:array)
17
+ name = name.to_s.sub(/=$/, '')
18
+ if rhs && rhs != s(:arglist)
19
+ "#{receiver}.#{name} = #{process(rhs)}"
20
+ else
21
+ raise "dunno what to do: #{rhs.inspect}"
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class BackRef < Base
4
+ def to_s(exp)
5
+ "$#{exp.shift}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,36 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+
4
+ # A node in the AST.
5
+ class Base
6
+ ASSIGN_NODES = Processor::ASSIGN_NODES
7
+ LF = Processor::LF
8
+ LINE_LENGTH = 78 # cutoff for one-liners
9
+
10
+ attr_reader :processor
11
+ delegate(
12
+ :call_push,
13
+ :call_pop,
14
+ :cond_loop,
15
+ :hash_syntax,
16
+ :in_context,
17
+ :indent,
18
+ :indent_lvl,
19
+ :finish,
20
+ :parenthesize,
21
+ :process,
22
+ :process_arglist,
23
+ :process_dregx,
24
+ :process_iasgn,
25
+ :ruby19_hash_key?,
26
+ :util_dthing,
27
+ :util_module_or_class,
28
+ to: :processor
29
+ )
30
+
31
+ def initialize(processor)
32
+ @processor = processor
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,19 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+
4
+ # TODO: figure out how to do rescue and ensure ENTIRELY w/o begin
5
+ class Begin < Base
6
+ def to_s(exp)
7
+ code = []
8
+ code << "begin"
9
+ until exp.empty?
10
+ src = process(exp.shift)
11
+ src = indent(src) unless src =~ /(^|\n)(rescue|ensure)/ # ensure no level 0 rescues
12
+ code << src
13
+ end
14
+ code << "end"
15
+ code.join(LF)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Block < Base
4
+ def to_s(exp)
5
+ result = []
6
+
7
+ exp << nil if exp.empty?
8
+ until exp.empty? do
9
+ code = exp.shift
10
+ if code.nil? or code.first == :nil
11
+ result << "# do nothing\n"
12
+ else
13
+ result << process(code)
14
+ end
15
+ end
16
+
17
+ result = parenthesize result.join LF
18
+ result += LF unless result.start_with? "("
19
+
20
+ result
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,10 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class BlockPass < Base
4
+ def to_s(exp)
5
+ raise "huh?: #{exp.inspect}" if exp.size > 1
6
+ "&#{process exp.shift}"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Break < Base
4
+ def to_s(exp)
5
+ val = exp.empty? ? nil : process(exp.shift)
6
+ if val
7
+ "break #{val}"
8
+ else
9
+ "break"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,70 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Call < Base
4
+
5
+ # binary operation messages
6
+ BINARY = [:<=>, :==, :<, :>, :<=, :>=, :-, :+, :*, :/, :%, :<<, :>>, :**, :'!=']
7
+
8
+ def to_s(exp)
9
+ receiver_node_type = exp.first.nil? ? nil : exp.first.first
10
+ receiver = process exp.shift
11
+ receiver = "(#{receiver})" if ASSIGN_NODES.include? receiver_node_type
12
+
13
+ name = exp.shift
14
+ args = []
15
+
16
+ # this allows us to do both old and new sexp forms:
17
+ exp.push(*exp.pop[1..-1]) if exp.size == 1 && exp.first.first == :arglist
18
+
19
+ call_push(name)
20
+
21
+ in_context :arglist do
22
+ until exp.empty? do
23
+ arg_type = exp.first.sexp_type
24
+ is_empty_hash = (exp.first == s(:hash))
25
+ arg = process exp.shift
26
+
27
+ next if arg.empty?
28
+
29
+ strip_hash = (arg_type == :hash and
30
+ not BINARY.include? name and
31
+ not is_empty_hash and
32
+ (exp.empty? or exp.first.sexp_type == :splat))
33
+ wrap_arg = ASSIGN_NODES.include? arg_type
34
+
35
+ arg = arg[2..-3] if strip_hash
36
+ arg = "(#{arg})" if wrap_arg
37
+
38
+ args << arg
39
+ end
40
+ end
41
+
42
+ case name
43
+ when *BINARY then
44
+ "(#{receiver} #{name} #{args.join(', ')})"
45
+ when :[] then
46
+ receiver ||= "self"
47
+ "#{receiver}[#{args.join(', ')}]"
48
+ when :[]= then
49
+ receiver ||= "self"
50
+ rhs = args.pop
51
+ "#{receiver}[#{args.join(', ')}] = #{rhs}"
52
+ when :"!" then
53
+ "(not #{receiver})"
54
+ when :"-@" then
55
+ "-#{receiver}"
56
+ when :"+@" then
57
+ "+#{receiver}"
58
+ else
59
+ args = nil if args.empty?
60
+ args = "(#{args.join(', ')})" if args
61
+ receiver = "#{receiver}." if receiver
62
+
63
+ "#{receiver}#{name}#{args}"
64
+ end
65
+ ensure
66
+ call_pop
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,27 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Case < Base
4
+ def to_s(exp)
5
+ result = []
6
+ expr = process exp.shift
7
+ if expr
8
+ result << "case #{expr}"
9
+ else
10
+ result << "case"
11
+ end
12
+ until exp.empty?
13
+ pt = exp.shift
14
+ if pt and pt.first == :when
15
+ result << "#{process(pt)}"
16
+ else
17
+ code = indent(process(pt))
18
+ code = indent("# do nothing") if code =~ /^\s*$/
19
+ result << "else\n#{code}"
20
+ end
21
+ end
22
+ result << "end"
23
+ result.join(LF)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Cdecl < Base
4
+ def to_s(exp)
5
+ lhs = exp.shift
6
+ lhs = process lhs if Sexp === lhs
7
+
8
+ if exp.empty?
9
+ lhs.to_s
10
+ else
11
+ rhs = process(exp.shift)
12
+ "#{lhs} = #{rhs}"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Class < Base
4
+ def to_s(exp)
5
+ "#{exp.comments}class #{util_module_or_class(exp, true)}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Colon2 < Base
4
+ def to_s(exp)
5
+ "#{process(exp.shift)}::#{exp.shift}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Colon3 < Base
4
+ def to_s(exp)
5
+ "::#{exp.shift}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Const < Base
4
+ def to_s(exp)
5
+ exp.shift.to_s
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Cvar < Base
4
+ def to_s(exp)
5
+ "#{exp.shift}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Cvasgn < Base
4
+ def to_s(exp)
5
+ "#{exp.shift} = #{process(exp.shift)}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Cvdecl < Base
4
+ def to_s(exp)
5
+ "#{exp.shift} = #{process(exp.shift)}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Defined < Base
4
+ def to_s(exp)
5
+ "defined? #{process(exp.shift)}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,66 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Defn < Base
4
+ def to_s(exp)
5
+ type1 = exp[1].first
6
+ type2 = exp[2].first rescue nil
7
+ expect = [:ivar, :iasgn, :attrset]
8
+
9
+ # s(name, args, ivar|iasgn|attrset)
10
+ if exp.size == 3 and type1 == :args and expect.include? type2
11
+ name = exp.first # don't shift in case we pass through
12
+ case type2
13
+ when :ivar then
14
+ ivar_name = exp.ivar.last
15
+
16
+ meth_name = ivar_name.to_s[1..-1].to_sym
17
+ expected = s(meth_name, s(:args), s(:ivar, ivar_name))
18
+
19
+ if exp == expected
20
+ exp.clear
21
+ return "attr_reader #{name.inspect}"
22
+ end
23
+ when :attrset then
24
+ # TODO: deprecate? this is a PT relic
25
+ exp.clear
26
+ return "attr_writer :#{name.to_s[0..-2]}"
27
+ when :iasgn then
28
+ ivar_name = exp.iasgn[1]
29
+ meth_name = "#{ivar_name.to_s[1..-1]}=".to_sym
30
+ arg_name = exp.args.last
31
+ expected = s(meth_name, s(:args, arg_name),
32
+ s(:iasgn, ivar_name, s(:lvar, arg_name)))
33
+
34
+ if exp == expected
35
+ exp.clear
36
+ return "attr_writer :#{name.to_s[0..-2]}"
37
+ end
38
+ else
39
+ raise "Unknown defn type: #{exp.inspect}"
40
+ end
41
+ end
42
+
43
+ comm = exp.comments
44
+ name = exp.shift
45
+ args = process exp.shift
46
+ args = "" if args == "()"
47
+
48
+ exp.shift if exp == s(s(:nil)) # empty it out of a default nil expression
49
+
50
+ # REFACTOR: use process_block but get it happier wrt parenthesize
51
+ body = []
52
+ until exp.empty? do
53
+ body << process(exp.shift)
54
+ end
55
+
56
+ body << "# do nothing" if body.empty?
57
+ body = body.join(LF)
58
+ body = body.lines.to_a[1..-2].join(LF) if
59
+ body =~ /^\Abegin/ && body =~ /^end\z/
60
+ body = indent(body) unless body =~ /(^|\n)rescue/
61
+
62
+ "#{comm}def #{name}#{args}\n#{body}\nend".gsub(/\n\s*\n+/, LF)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,17 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Defs < Base
4
+ def to_s(exp)
5
+ lhs = exp.shift
6
+ var = [:self, :cvar, :dvar, :ivar, :gvar, :lvar].include? lhs.first
7
+ name = exp.shift
8
+
9
+ lhs = process(lhs)
10
+ lhs = "(#{lhs})" unless var
11
+
12
+ exp.unshift "#{lhs}.#{name}"
13
+ process_defn(exp)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Dot2 < Base
4
+ def to_s(exp)
5
+ "(#{process exp.shift}..#{process exp.shift})"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Dot3 < Base
4
+ def to_s(exp)
5
+ "(#{process exp.shift}...#{process exp.shift})"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Dregx < Base
4
+ def to_s(exp)
5
+ options = re_opt exp.pop if Fixnum === exp.last
6
+ "/" << util_dthing(:dregx, exp) << "/#{options}"
7
+ end
8
+
9
+ private
10
+
11
+ # Return the appropriate regexp flags for a given numeric code.
12
+ def re_opt options
13
+ bits = (0..8).map { |n| options[n] * 2**n }
14
+ bits.delete 0
15
+ bits.map { |n| Regexp::CODES[n] }.join
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class DregxOnce < Base
4
+ def to_s(exp)
5
+ process_dregx(exp) + "o"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Dstr < Base
4
+ def to_s(exp)
5
+ "\"#{util_dthing(:dstr, exp)}\""
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Dsym < Base
4
+ def to_s(exp)
5
+ ":\"#{util_dthing(:dsym, exp)}\""
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Dxstr < Base
4
+ def to_s(exp)
5
+ "`#{util_dthing(:dxstr, exp)}`"
6
+ end
7
+ end
8
+ end
9
+ end