meta-ruby 3.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 884fc5bb96caeddf63c54c52d783fe32d9d87088
4
+ data.tar.gz: 253e3b4c1d462ce002152facea5231f4a39ce948
5
+ SHA512:
6
+ metadata.gz: 56b0d554a1854a34a2332431975c2c94889461157c36822af3ce0f6260a865273ec367d77babbb0f24b400e1ebdbdde15b68c75d6176682893aa6f87419a3129
7
+ data.tar.gz: 107905c4b9eda3d6e7a3b3c959050f9ad7b6c3f8ce0d4e78872da502cd207163843eed1bde304dcf1aea836f5539ffed95b9e6bb2af80c5935d37e473e7c4d09
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org/"
2
+ gemspec
data/MIT-LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2011-2015 InfraRuby Vision
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a
4
+ copy of this software and associated documentation files (the "Software"),
5
+ to deal in the Software without restriction, including without limitation
6
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
7
+ and/or sell copies of the Software, and to permit persons to whom the
8
+ Software is furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
19
+ DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,52 @@
1
+ InfraRuby meta-ruby
2
+ ===================
3
+
4
+ This gem provides classes to generate Ruby source code.
5
+
6
+
7
+ Example
8
+ -------
9
+
10
+ require "meta-ruby"
11
+
12
+ class Generator < MetaRuby::Generator
13
+ def initialize_sexp
14
+ s(:defn, "initialize", s(:args, "x", "y"),
15
+ s(:iasgn, "@x", s(:lvar, "x")),
16
+ s(:iasgn, "@y", s(:lvar, "y")),
17
+ s(:return),
18
+ )
19
+ end
20
+
21
+ def attr_reader_sexp(name)
22
+ s(:defn, name, s(:args),
23
+ s(:return, s(:ivar, "@#{name}")),
24
+ )
25
+ end
26
+
27
+ def xy_class_sexp
28
+ s(:class, "XY", nil,
29
+ initialize_sexp,
30
+ attr_reader_sexp("x"),
31
+ attr_reader_sexp("y"),
32
+ )
33
+ end
34
+ end
35
+
36
+ g = Generator.new
37
+
38
+ d = MetaRuby::Directory.new
39
+ d.instance_eval do
40
+ write("XY.rb", g.xy_class_sexp)
41
+ end
42
+
43
+
44
+ Support
45
+ -------
46
+
47
+ InfraRuby Vision
48
+ rubygems@infraruby.com
49
+
50
+ http://infraruby.com/
51
+ https://github.com/InfraRuby
52
+ https://twitter.com/InfraRuby
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "infraruby-task"
2
+
3
+ loader = InfraRuby.task_loader
4
+ loader.add_program("meta-hello")
5
+ loader.load_tasks
6
+
7
+ task "default" => "spec"
data/bin/meta-hello ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "meta-ruby"
4
+
5
+ class Generator < MetaRuby::Generator
6
+ ## -> MetaRuby::Sexp
7
+ def hello_sexp
8
+ s(:call, nil, "puts", s(:arglist, s(:str, "hello, world")))
9
+ end
10
+ end
11
+
12
+ g = Generator.new
13
+
14
+ d = MetaRuby::Directory.new
15
+ d.instance_eval do
16
+ write("hello.rb", g.hello_sexp)
17
+ end
data/lib/meta-ruby.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "infraruby-shim"
2
+
3
+ require "s-expression"
4
+ require "fab"
5
+
6
+ InfraRuby.load_parent_library(__dir__)
data/meta-ruby.gemspec ADDED
@@ -0,0 +1,17 @@
1
+ Gem::Specification.new do |s|
2
+ s.platform = "ruby"
3
+ s.name = "meta-ruby"
4
+ s.version = "3.1.0"
5
+ s.licenses = ["MIT"]
6
+ s.author = "InfraRuby Vision"
7
+ s.email = "rubygems@infraruby.com"
8
+ s.homepage = "http://infraruby.com/"
9
+ s.summary = "Ruby metaprogramming with s-expressions"
10
+ s.description = "Ruby metaprogramming with s-expressions"
11
+ s.files = Dir["**/*"]
12
+ s.add_runtime_dependency "infraruby-shim", "~> 3.7"
13
+ s.add_runtime_dependency "s-expression", "~> 3.1"
14
+ s.add_runtime_dependency "fab", "~> 0.2"
15
+ s.add_development_dependency "infraruby-task", "~> 3.7"
16
+ s.add_development_dependency "rspec", "~> 3.0"
17
+ end
@@ -0,0 +1,118 @@
1
+ ## <>
2
+ module MetaRuby
3
+ end
4
+
5
+ ## <>
6
+ ## :write: String, MetaRuby::Sexp -> void
7
+ ## :write: String, String -> void
8
+ ## :initialize: -> void
9
+ ## :initialize: String -> void
10
+ class MetaRuby::Directory < Fab::Directory
11
+ end
12
+
13
+ ## <>
14
+ ## :s: Symbol, *java.lang.Object? -> MetaRuby::Sexp
15
+ ## :initialize: -> void
16
+ class MetaRuby::Generator < Object
17
+ end
18
+
19
+ ## <>
20
+ ## :process: MetaRuby::Sexp -> String
21
+ ## #process_array: MetaRuby::Sexp -> String
22
+ ## #process_attrasgn: MetaRuby::Sexp -> String
23
+ ## #process_call: MetaRuby::Sexp -> String
24
+ ## #process_case: MetaRuby::Sexp -> String
25
+ ## #process_cdecl: MetaRuby::Sexp -> String
26
+ ## #process_class: MetaRuby::Sexp -> String
27
+ ## #process_colon2: MetaRuby::Sexp -> String
28
+ ## #process_colon3: MetaRuby::Sexp -> String
29
+ ## #process_const: MetaRuby::Sexp -> String
30
+ ## #process_defn: MetaRuby::Sexp -> String
31
+ ## #process_ensure: MetaRuby::Sexp -> String
32
+ ## #process_false: MetaRuby::Sexp -> String
33
+ ## #process_hash: MetaRuby::Sexp -> String
34
+ ## #process_iasgn: MetaRuby::Sexp -> String
35
+ ## #process_if: MetaRuby::Sexp -> String
36
+ ## #process_iter: MetaRuby::Sexp -> String
37
+ ## #process_ivar: MetaRuby::Sexp -> String
38
+ ## #process_lasgn: MetaRuby::Sexp -> String
39
+ ## #process_lit: MetaRuby::Sexp -> String
40
+ ## #process_lvar: MetaRuby::Sexp -> String
41
+ ## #process_module: MetaRuby::Sexp -> String
42
+ ## #process_nil: MetaRuby::Sexp -> String
43
+ ## #process_op_asgn1: MetaRuby::Sexp -> String
44
+ ## #process_op_asgn2: MetaRuby::Sexp -> String
45
+ ## #process_op_asgn_and: MetaRuby::Sexp -> String
46
+ ## #process_op_asgn_or: MetaRuby::Sexp -> String
47
+ ## #process_rescue: MetaRuby::Sexp -> String
48
+ ## #process_return: MetaRuby::Sexp -> String
49
+ ## #process_sclass: MetaRuby::Sexp -> String
50
+ ## #process_self: MetaRuby::Sexp -> String
51
+ ## #process_str: MetaRuby::Sexp -> String
52
+ ## #process_super: MetaRuby::Sexp -> String
53
+ ## #process_true: MetaRuby::Sexp -> String
54
+ ## #process_until: MetaRuby::Sexp -> String
55
+ ## #process_while: MetaRuby::Sexp -> String
56
+ ## #process_yield: MetaRuby::Sexp -> String
57
+ ## :initialize: -> void
58
+ class MetaRuby::Processor < Object
59
+ end
60
+
61
+ ## <>
62
+ ## INSTANCE: MetaRuby::SourceProcessor
63
+ ## @depth: int32
64
+ ## @level: int32
65
+ ## .process: MetaRuby::Sexp -> String
66
+ ## :initialize: -> void
67
+ ## :process: MetaRuby::Sexp -> String
68
+ ## :process_array: MetaRuby::Sexp -> String
69
+ ## :process_attrasgn: MetaRuby::Sexp -> String
70
+ ## :process_call: MetaRuby::Sexp -> String
71
+ ## :process_case: MetaRuby::Sexp -> String
72
+ ## :process_cdecl: MetaRuby::Sexp -> String
73
+ ## :process_class: MetaRuby::Sexp -> String
74
+ ## :process_colon2: MetaRuby::Sexp -> String
75
+ ## :process_colon3: MetaRuby::Sexp -> String
76
+ ## :process_const: MetaRuby::Sexp -> String
77
+ ## :process_defn: MetaRuby::Sexp -> String
78
+ ## :process_ensure: MetaRuby::Sexp -> String
79
+ ## :process_false: MetaRuby::Sexp -> String
80
+ ## :process_hash: MetaRuby::Sexp -> String
81
+ ## :process_iasgn: MetaRuby::Sexp -> String
82
+ ## :process_if: MetaRuby::Sexp -> String
83
+ ## :process_iter: MetaRuby::Sexp -> String
84
+ ## :process_ivar: MetaRuby::Sexp -> String
85
+ ## :process_lasgn: MetaRuby::Sexp -> String
86
+ ## :process_lit: MetaRuby::Sexp -> String
87
+ ## :process_lvar: MetaRuby::Sexp -> String
88
+ ## :process_module: MetaRuby::Sexp -> String
89
+ ## :process_nil: MetaRuby::Sexp -> String
90
+ ## :process_op_asgn1: MetaRuby::Sexp -> String
91
+ ## :process_op_asgn2: MetaRuby::Sexp -> String
92
+ ## :process_op_asgn_and: MetaRuby::Sexp -> String
93
+ ## :process_op_asgn_or: MetaRuby::Sexp -> String
94
+ ## :process_rescue: MetaRuby::Sexp -> String
95
+ ## :process_return: MetaRuby::Sexp -> String
96
+ ## :process_sclass: MetaRuby::Sexp -> String
97
+ ## :process_self: MetaRuby::Sexp -> String
98
+ ## :process_str: MetaRuby::Sexp -> String
99
+ ## :process_super: MetaRuby::Sexp -> String
100
+ ## :process_true: MetaRuby::Sexp -> String
101
+ ## :process_until: MetaRuby::Sexp -> String
102
+ ## :process_while: MetaRuby::Sexp -> String
103
+ ## :process_yield: MetaRuby::Sexp -> String
104
+ class MetaRuby::SourceProcessor < MetaRuby::Processor
105
+ end
106
+
107
+ ## <>
108
+ ## :initialize: Symbol -> void
109
+ ## :initialize: Symbol, Array<java.lang.Object?> -> void
110
+ ## :fetch_as_s: int32 -> String
111
+ ## :fetch_as_s: Fixnum -> String
112
+ ## :fetch_as_sexp: int32 -> MetaRuby::Sexp
113
+ ## :fetch_as_sexp: Fixnum -> MetaRuby::Sexp
114
+ ## :comments: -> Array<String>?
115
+ ## :comments=: Array<String>? -> void
116
+ class MetaRuby::Sexp < Sexp
117
+ end
118
+
Binary file
data/ruby/MetaRuby.rb ADDED
@@ -0,0 +1,3 @@
1
+ ## <>
2
+ module MetaRuby
3
+ end
@@ -0,0 +1,19 @@
1
+ module MetaRuby
2
+ ## <>
3
+ class Directory < Fab::Directory
4
+ ## String, Sexp -> void
5
+ ## String, String -> void
6
+ def write(path, o)
7
+ case o
8
+ when Sexp
9
+ s = SourceProcessor.process(o)
10
+ when String
11
+ s = o
12
+ else
13
+ raise RuntimeError
14
+ end
15
+ super(path, s)
16
+ return
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ module MetaRuby
2
+ ## <>
3
+ class Generator
4
+ ## Symbol, *java.lang.Object? -> Sexp
5
+ def s(type, *args)
6
+ return Sexp.__new__(type, args)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,99 @@
1
+ module MetaRuby
2
+ ## <>
3
+ ## #process_array: Sexp -> String
4
+ ## #process_attrasgn: Sexp -> String
5
+ ## #process_call: Sexp -> String
6
+ ## #process_case: Sexp -> String
7
+ ## #process_cdecl: Sexp -> String
8
+ ## #process_class: Sexp -> String
9
+ ## #process_colon2: Sexp -> String
10
+ ## #process_colon3: Sexp -> String
11
+ ## #process_const: Sexp -> String
12
+ ## #process_defn: Sexp -> String
13
+ ## #process_ensure: Sexp -> String
14
+ ## #process_false: Sexp -> String
15
+ ## #process_hash: Sexp -> String
16
+ ## #process_iasgn: Sexp -> String
17
+ ## #process_if: Sexp -> String
18
+ ## #process_iter: Sexp -> String
19
+ ## #process_ivar: Sexp -> String
20
+ ## #process_lasgn: Sexp -> String
21
+ ## #process_lit: Sexp -> String
22
+ ## #process_lvar: Sexp -> String
23
+ ## #process_module: Sexp -> String
24
+ ## #process_nil: Sexp -> String
25
+ ## #process_op_asgn1: Sexp -> String
26
+ ## #process_op_asgn2: Sexp -> String
27
+ ## #process_op_asgn_and: Sexp -> String
28
+ ## #process_op_asgn_or: Sexp -> String
29
+ ## #process_rescue: Sexp -> String
30
+ ## #process_return: Sexp -> String
31
+ ## #process_sclass: Sexp -> String
32
+ ## #process_self: Sexp -> String
33
+ ## #process_str: Sexp -> String
34
+ ## #process_super: Sexp -> String
35
+ ## #process_true: Sexp -> String
36
+ ## #process_until: Sexp -> String
37
+ ## #process_while: Sexp -> String
38
+ ## #process_yield: Sexp -> String
39
+ class Processor
40
+ ## % nojava
41
+ ## <>
42
+ module X
43
+ class << self
44
+ ## &(Processor, Sexp -> String) -> (Processor, Sexp -> String)
45
+ def process_block(&block)
46
+ return block
47
+ end
48
+ end
49
+
50
+ BLOCKS = {
51
+ :array => process_block { |processor, sexp| processor.process_array(sexp) },
52
+ :attrasgn => process_block { |processor, sexp| processor.process_attrasgn(sexp) },
53
+ :call => process_block { |processor, sexp| processor.process_call(sexp) },
54
+ :case => process_block { |processor, sexp| processor.process_case(sexp) },
55
+ :cdecl => process_block { |processor, sexp| processor.process_cdecl(sexp) },
56
+ :class => process_block { |processor, sexp| processor.process_class(sexp) },
57
+ :colon2 => process_block { |processor, sexp| processor.process_colon2(sexp) },
58
+ :colon3 => process_block { |processor, sexp| processor.process_colon3(sexp) },
59
+ :const => process_block { |processor, sexp| processor.process_const(sexp) },
60
+ :defn => process_block { |processor, sexp| processor.process_defn(sexp) },
61
+ :ensure => process_block { |processor, sexp| processor.process_ensure(sexp) },
62
+ :false => process_block { |processor, sexp| processor.process_false(sexp) },
63
+ :hash => process_block { |processor, sexp| processor.process_hash(sexp) },
64
+ :iasgn => process_block { |processor, sexp| processor.process_iasgn(sexp) },
65
+ :if => process_block { |processor, sexp| processor.process_if(sexp) },
66
+ :iter => process_block { |processor, sexp| processor.process_iter(sexp) },
67
+ :ivar => process_block { |processor, sexp| processor.process_ivar(sexp) },
68
+ :lasgn => process_block { |processor, sexp| processor.process_lasgn(sexp) },
69
+ :lit => process_block { |processor, sexp| processor.process_lit(sexp) },
70
+ :lvar => process_block { |processor, sexp| processor.process_lvar(sexp) },
71
+ :module => process_block { |processor, sexp| processor.process_module(sexp) },
72
+ :nil => process_block { |processor, sexp| processor.process_nil(sexp) },
73
+ :op_asgn1 => process_block { |processor, sexp| processor.process_op_asgn1(sexp) },
74
+ :op_asgn2 => process_block { |processor, sexp| processor.process_op_asgn2(sexp) },
75
+ :op_asgn_and => process_block { |processor, sexp| processor.process_op_asgn_and(sexp) },
76
+ :op_asgn_or => process_block { |processor, sexp| processor.process_op_asgn_or(sexp) },
77
+ :rescue => process_block { |processor, sexp| processor.process_rescue(sexp) },
78
+ :return => process_block { |processor, sexp| processor.process_return(sexp) },
79
+ :sclass => process_block { |processor, sexp| processor.process_sclass(sexp) },
80
+ :self => process_block { |processor, sexp| processor.process_self(sexp) },
81
+ :str => process_block { |processor, sexp| processor.process_str(sexp) },
82
+ :super => process_block { |processor, sexp| processor.process_super(sexp) },
83
+ :true => process_block { |processor, sexp| processor.process_true(sexp) },
84
+ :until => process_block { |processor, sexp| processor.process_until(sexp) },
85
+ :while => process_block { |processor, sexp| processor.process_while(sexp) },
86
+ :yield => process_block { |processor, sexp| processor.process_yield(sexp) },
87
+ }
88
+ end
89
+
90
+ ## Sexp -> String
91
+ def process(sexp)
92
+ block = X::BLOCKS[sexp.type]
93
+ if block.nil?
94
+ raise ArgumentError, sexp.inspect
95
+ end
96
+ return block.call(self, sexp)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,788 @@
1
+ module MetaRuby
2
+ ## <>
3
+ ## @depth: int32
4
+ ## @level: int32
5
+ class SourceProcessor < Processor
6
+ ## % nojava
7
+ ## <>
8
+ module X
9
+ BINARY_L = {
10
+ "*" => 12.i32, "/" => 12.i32, "%" => 12.i32,
11
+ "+" => 11.i32, "-" => 11.i32,
12
+ "<<" => 10.i32, ">>" => 10.i32,
13
+ "&" => 9.i32,
14
+ "|" => 8.i32, "^" => 8.i32,
15
+ "<" => 7.i32, "<=" => 7.i32, ">=" => 7.i32, ">" => 7.i32,
16
+ "&&" => 5.i32,
17
+ "||" => 4.i32,
18
+ }
19
+
20
+ BINARY_R = {
21
+ "**" => 14.i32,
22
+ }
23
+
24
+ BINARY_X = {
25
+ "==" => 6.i32, "!=" => 6.i32, "=~" => 6.i32, "!~" => 6.i32, "===" => 6.i32, "<=>" => 6.i32,
26
+ ".." => 3.i32, "..." => 3.i32,
27
+ }
28
+ end
29
+
30
+ # ===
31
+
32
+ class << self
33
+ ## Sexp -> String
34
+ def process(sexp)
35
+ return INSTANCE.process(sexp)
36
+ end
37
+ end
38
+
39
+ # ===
40
+
41
+ ## -> void
42
+ def initialize
43
+ super()
44
+ @depth = 0.i32
45
+ @level = 0.i32
46
+ return
47
+ end
48
+
49
+ # ===
50
+
51
+ INSTANCE = SourceProcessor.__new__
52
+
53
+ # ===
54
+
55
+ ## -> String
56
+ def __tabs
57
+ return "\t" * @depth
58
+ end
59
+
60
+ ## java.lang.Object? -> String
61
+ def __with_depth(o)
62
+ if o.nil?
63
+ return ""
64
+ elsif o.is_a?(Sexp)
65
+ @depth += 1
66
+ begin
67
+ return process(o)
68
+ ensure
69
+ @depth -= 1
70
+ end
71
+ else
72
+ raise ArgumentError, o.inspect
73
+ end
74
+ end
75
+
76
+ ## int32, &{-> void} -> void
77
+ def __with_level(new_level)
78
+ old_level = @level
79
+ @level = new_level
80
+ begin
81
+ yield
82
+ return
83
+ ensure
84
+ @level = old_level
85
+ end
86
+ end
87
+
88
+ ## int32, &{-> String} -> String
89
+ def __with_level_s(new_level)
90
+ old_level = @level
91
+ @level = new_level
92
+ begin
93
+ return yield
94
+ ensure
95
+ @level = old_level
96
+ end
97
+ end
98
+
99
+ ## Sexp, int32 -> Sexp
100
+ def __arglist_sexp(sexp, i)
101
+ arglist_sexp = Sexp.__new__(:arglist)
102
+ n = sexp.size_as_int32
103
+ while i < n
104
+ e = sexp.fetch_as_sexp(i)
105
+ if e.type == :arglist
106
+ arglist_sexp.concat(e.args)
107
+ else
108
+ arglist_sexp << e
109
+ end
110
+ i += 1
111
+ end
112
+ return arglist_sexp
113
+ end
114
+
115
+ ## Sexp -> Array<String>
116
+ def __process_arglist(sexp)
117
+ a = []
118
+ __with_level(2.i32) do
119
+ n = sexp.size_as_int32
120
+ n.times do |i|
121
+ arg_sexp = sexp.fetch_as_sexp(i)
122
+ case arg_sexp.type
123
+ when :block_pass
124
+ s = "&" + process(arg_sexp.fetch_as_sexp(0.i32))
125
+ when :splat
126
+ s = "*" + process(arg_sexp.fetch_as_sexp(0.i32))
127
+ else
128
+ s = process(arg_sexp)
129
+ end
130
+ a.push(s)
131
+ end
132
+ end
133
+ return a
134
+ end
135
+
136
+ ## Sexp -> Hash<Symbol, Sexp>
137
+ def __lasgn_hash(sexp)
138
+ h = {}
139
+ n = sexp.size_as_int32
140
+ n.times do |i|
141
+ lasgn_sexp = sexp.fetch_as_sexp(i)
142
+ raise ArgumentError if lasgn_sexp.type != :lasgn
143
+ k = lasgn_sexp.fetch_as_s(0.i32)
144
+ v = lasgn_sexp.fetch_as_sexp(1.i32)
145
+ h[k] = v
146
+ end
147
+ return h
148
+ end
149
+
150
+ ## Sexp -> Array<String>
151
+ def __process_args(sexp)
152
+ a = []
153
+ n = sexp.size_as_int32
154
+ if n == 0
155
+ return a
156
+ end
157
+ o = sexp.fetch(n - 1)
158
+ if o.is_a?(Sexp)
159
+ if o.type == :block
160
+ h = __lasgn_hash(o)
161
+ n -= 1
162
+ n.times do |i|
163
+ k = sexp.fetch_as_s(i)
164
+ v = h[k]
165
+ if v.nil?
166
+ a.push(k)
167
+ else
168
+ s = __with_level_s(2.i32) { process(v) }
169
+ a.push(k + " = " + s)
170
+ end
171
+ end
172
+ return a
173
+ end
174
+ end
175
+ n.times do |i|
176
+ o = sexp.fetch(i)
177
+ case o
178
+ when String
179
+ a.push(o.to_s)
180
+ when Symbol
181
+ a.push(o.to_s)
182
+ when Sexp
183
+ lasgn_sexp = o
184
+ raise ArgumentError if lasgn_sexp.type != :lasgn
185
+ k = lasgn_sexp.fetch_as_s(0.i32)
186
+ v = lasgn_sexp.fetch_as_sexp(1.i32)
187
+ s = __with_level_s(2.i32) { process(v) }
188
+ a.push(k + " = " + s)
189
+ else
190
+ raise TypeError
191
+ end
192
+ end
193
+ return a
194
+ end
195
+
196
+ ## Sexp, int32 -> String
197
+ def __process_scope(sexp, i)
198
+ a = []
199
+ @depth += 1
200
+ n = sexp.size_as_int32
201
+ while i < n
202
+ e = sexp.fetch_as_sexp(i)
203
+ if e.type == :scope
204
+ o = e[0.i32]
205
+ unless o.nil?
206
+ s = process(o.is_a!(Sexp))
207
+ a.push(s)
208
+ end
209
+ else
210
+ s = process(e)
211
+ a.push(s)
212
+ end
213
+ i += 1
214
+ end
215
+ @depth -= 1
216
+ return a.join
217
+ end
218
+
219
+ ## Sexp -> Array<String>
220
+ def __process_hash(sexp)
221
+ a = []
222
+ __with_level(2.i32) do
223
+ n = sexp.size_as_int32
224
+ symbol = true
225
+ i = 0.i32
226
+ while i < n
227
+ key_sexp = sexp.fetch_as_sexp(i)
228
+ if key_sexp.type != :lit || !key_sexp.fetch(0.i32).is_a?(Symbol)
229
+ symbol = false
230
+ end
231
+ i += 2
232
+ end
233
+ i = 0.i32
234
+ while i < n
235
+ key_sexp = sexp.fetch_as_sexp(i)
236
+ i += 1
237
+ value_sexp = sexp.fetch_as_sexp(i)
238
+ i += 1
239
+ if symbol
240
+ k = key_sexp.fetch_as_s(0.i32)
241
+ v = process(value_sexp)
242
+ a.push("#{k}: #{v}")
243
+ else
244
+ k = process(key_sexp)
245
+ v = process(value_sexp)
246
+ a.push("#{k} => #{v}")
247
+ end
248
+ end
249
+ end
250
+ return a
251
+ end
252
+
253
+ ## java.lang.Object?, Sexp, String, int32 -> String
254
+ def __unary(o, arglist_sexp, name, new_level)
255
+ if o.nil?
256
+ r = "self"
257
+ else
258
+ r = __with_level_s(new_level) { process(o.is_a!(Sexp)) }
259
+ end
260
+ s = "#{name}#{r}"
261
+ return @level > new_level ? "(#{s})" : s
262
+ end
263
+
264
+ ## java.lang.Object?, Sexp, String, int32, int32, int32 -> String
265
+ def __binary(o, arglist_sexp, name, new_level, dl, dr)
266
+ if o.nil?
267
+ r = "self"
268
+ else
269
+ r = __with_level_s(new_level + dl) { process(o.is_a!(Sexp)) }
270
+ end
271
+ a = __with_level_s(new_level + dr) { process(arglist_sexp.fetch_as_sexp(0.i32)) }
272
+ s = "#{r} #{name} #{a}"
273
+ return @level > new_level ? "(#{s})" : s
274
+ end
275
+
276
+ # ===
277
+
278
+ ## Sexp -> String
279
+ def process(sexp)
280
+ if @level > 0
281
+ return super(sexp)
282
+ end
283
+ if sexp.type == :block
284
+ a = []
285
+ n = sexp.size_as_int32
286
+ n.times do |i|
287
+ o = sexp.fetch(i)
288
+ if o.nil?
289
+ # ...
290
+ elsif o.is_a?(Sexp)
291
+ a.push(process(o))
292
+ else
293
+ raise ArgumentError, sexp.inspect
294
+ end
295
+ end
296
+ return a.join
297
+ end
298
+ s = __tabs + super(sexp) + "\n"
299
+ comments = sexp.comments
300
+ if comments.nil?
301
+ return s
302
+ end
303
+ return comments.map { |c| __tabs + c + "\n" }.join + s
304
+ end
305
+
306
+ ## Sexp -> String
307
+ def process_array(sexp)
308
+ a = __process_arglist(sexp)
309
+ if @level < 2 && a.size_as_int32 > 0
310
+ s = a.map { |c| __tabs + "\t" + c + "," + "\n" }.join
311
+ return "[" + "\n" + s + __tabs + "]"
312
+ else
313
+ s = a.join(", ")
314
+ return "[#{s}]"
315
+ end
316
+ end
317
+
318
+ ## Sexp -> String
319
+ def process_attrasgn(sexp)
320
+ raise ArgumentError if @level > 1
321
+ arglist_sexp = __arglist_sexp(sexp, 2.i32)
322
+ r = __with_level_s(2.i32) { process(sexp.fetch_as_sexp(0.i32)) }
323
+ name = sexp.fetch_as_s(1.i32)
324
+ raise ArgumentError unless name.end_with?("=")
325
+ name = name.chop
326
+ if name == "[]"
327
+ k = __with_level_s(2.i32) { process(arglist_sexp.fetch_as_sexp(0.i32)) }
328
+ v = __with_level_s(1.i32) { process(arglist_sexp.fetch_as_sexp(1.i32)) }
329
+ return "#{r}[#{k}] = #{v}"
330
+ else
331
+ s = __with_level_s(1.i32) { process(arglist_sexp.fetch_as_sexp(0.i32)) }
332
+ return "#{r}.#{name} = #{s}"
333
+ end
334
+ end
335
+
336
+ ## Sexp -> String
337
+ def process_call(sexp)
338
+ name = sexp.fetch_as_s(1.i32)
339
+ arglist_sexp = __arglist_sexp(sexp, 2.i32)
340
+ o = sexp.fetch(0.i32)
341
+ new_level = X::BINARY_L[name]
342
+ unless new_level.nil?
343
+ return __binary(o, arglist_sexp, name, new_level, 0.i32, 1.i32)
344
+ end
345
+ new_level = X::BINARY_R[name]
346
+ unless new_level.nil?
347
+ return __binary(o, arglist_sexp, name, new_level, 1.i32, 0.i32)
348
+ end
349
+ new_level = X::BINARY_X[name]
350
+ unless new_level.nil?
351
+ return __binary(o, arglist_sexp, name, new_level, 1.i32, 1.i32)
352
+ end
353
+ case name
354
+ when "[]"
355
+ if o.nil?
356
+ r = "self"
357
+ else
358
+ r = __with_level_s(15.i32) { process(o.is_a!(Sexp)) }
359
+ end
360
+ a = __process_arglist(arglist_sexp)
361
+ s = a.join(", ")
362
+ return "#{r}[#{s}]"
363
+ when "[]="
364
+ raise ArgumentError if @level > 1
365
+ if o.nil?
366
+ r = "self"
367
+ else
368
+ r = __with_level_s(15.i32) { process(o.is_a!(Sexp)) }
369
+ end
370
+ n = arglist_sexp.size_as_int32
371
+ if n == 0
372
+ raise ArgumentError
373
+ end
374
+ n -= 1
375
+ a = []
376
+ __with_level(2.i32) do
377
+ n.times do |i|
378
+ arg_sexp = arglist_sexp.fetch_as_sexp(i)
379
+ a.push(process(arg_sexp))
380
+ end
381
+ end
382
+ s = a.join(", ")
383
+ v = __with_level_s(1.i32) { process(arglist_sexp.fetch_as_sexp(n)) }
384
+ return "#{r}[#{s}] = #{v}"
385
+ when "!"
386
+ return __unary(o, arglist_sexp, "!", 13.i32)
387
+ when "~"
388
+ return __unary(o, arglist_sexp, "~", 13.i32)
389
+ when "+@"
390
+ return __unary(o, arglist_sexp, "+", 13.i32)
391
+ when "-@"
392
+ return __unary(o, arglist_sexp, "-", 13.i32)
393
+ end
394
+ if o.nil?
395
+ f = name
396
+ else
397
+ r = __with_level_s(15.i32) { process(o.is_a!(Sexp)) }
398
+ f = r + "." + name
399
+ end
400
+ n = arglist_sexp.size_as_int32
401
+ if n == 0
402
+ return f
403
+ end
404
+ a = __process_arglist(arglist_sexp)
405
+ s = a.join(", ")
406
+ return "#{f}(#{s})"
407
+ end
408
+
409
+ ## Sexp -> String
410
+ def process_case(sexp)
411
+ c = __with_level_s(2.i32) { process(sexp.fetch_as_sexp(0.i32)) }
412
+ a = []
413
+ n = sexp.size_as_int32
414
+ if n == 0
415
+ raise ArgumentError
416
+ end
417
+ n -= 1
418
+ i = 1.i32
419
+ while i < n
420
+ when_sexp = sexp.fetch_as_sexp(i)
421
+ raise ArgumentError if when_sexp.type != :when
422
+ array_sexp = when_sexp.fetch_as_sexp(0.i32)
423
+ raise ArgumentError if array_sexp.type != :array
424
+ if array_sexp.size_as_int32 != 1
425
+ raise ArgumentError
426
+ end
427
+ w = __with_level_s(2.i32) { process(array_sexp.fetch_as_sexp(0.i32)) }
428
+ s = __with_depth(when_sexp[1.i32])
429
+ a.push(__tabs + "when" + " " + w + "\n" + s)
430
+ i += 1
431
+ end
432
+ o = sexp[n]
433
+ unless o.nil?
434
+ s = __with_depth(o)
435
+ a.push(__tabs + "else" + "\n" + s)
436
+ end
437
+ return "case" + " " + c + "\n" + a.join + __tabs + "end"
438
+ end
439
+
440
+ ## Sexp -> String
441
+ def process_cdecl(sexp)
442
+ raise ArgumentError if @level > 1
443
+ name = sexp.fetch_as_s(0.i32)
444
+ s = __with_level_s(1.i32) { process(sexp.fetch_as_sexp(1.i32)) }
445
+ return "#{name} = #{s}"
446
+ end
447
+
448
+ ## Sexp -> String
449
+ def process_class(sexp)
450
+ raise ArgumentError if @level > 0
451
+ name = sexp.fetch_as_s(0.i32)
452
+ s = __process_scope(sexp, 2.i32)
453
+ o = sexp[1.i32]
454
+ if o.nil?
455
+ return "class" + " " + name + "\n" + s + __tabs + "end"
456
+ else
457
+ c = __with_level_s(2.i32) { process(o.is_a!(Sexp)) }
458
+ return "class" + " " + name + " < " + c + "\n" + s + __tabs + "end"
459
+ end
460
+ end
461
+
462
+ ## Sexp -> String
463
+ def process_colon2(sexp)
464
+ name = sexp.fetch_as_s(1.i32)
465
+ s = __with_level_s(16.i32) { process(sexp.fetch_as_sexp(0.i32)) }
466
+ return "#{s}::#{name}"
467
+ end
468
+
469
+ ## Sexp -> String
470
+ def process_colon3(sexp)
471
+ name = sexp.fetch_as_s(0.i32)
472
+ return "::#{name}"
473
+ end
474
+
475
+ ## Sexp -> String
476
+ def process_const(sexp)
477
+ name = sexp.fetch_as_s(0.i32)
478
+ return name
479
+ end
480
+
481
+ ## Sexp -> String
482
+ def process_defn(sexp)
483
+ raise ArgumentError if @level > 0
484
+ name = sexp.fetch_as_s(0.i32)
485
+ s = __process_scope(sexp, 2.i32)
486
+ args_sexp = sexp.fetch_as_sexp(1.i32)
487
+ raise ArgumentError if args_sexp.type != :args
488
+ a = __process_args(args_sexp)
489
+ if a.empty?
490
+ return "def" + " " + name + "\n" + s + __tabs + "end"
491
+ end
492
+ t = a.join(", ")
493
+ return "def" + " " + name + "(" + t + ")" + "\n" + s + __tabs + "end"
494
+ end
495
+
496
+ ## Sexp -> String
497
+ def process_ensure(sexp)
498
+ s0 = __with_depth(sexp[0.i32])
499
+ s1 = __with_depth(sexp[1.i32])
500
+ return "begin" + "\n" + s0 + __tabs + "ensure" + "\n" + s1 + __tabs + "end"
501
+ end
502
+
503
+ ## Sexp -> String
504
+ def process_false(sexp)
505
+ return "false"
506
+ end
507
+
508
+ ## Sexp -> String
509
+ def process_hash(sexp)
510
+ a = __process_hash(sexp)
511
+ if @level < 2 && a.size_as_int32 > 0
512
+ s = a.map { |c| __tabs + "\t" + c + "," + "\n" }.join
513
+ return "{" + "\n" + s + __tabs + "}"
514
+ else
515
+ s = a.join(", ")
516
+ return "{#{s}}"
517
+ end
518
+ end
519
+
520
+ ## Sexp -> String
521
+ def process_iasgn(sexp)
522
+ raise ArgumentError if @level > 1
523
+ name = sexp.fetch_as_s(0.i32)
524
+ s = __with_level_s(1.i32) { process(sexp.fetch_as_sexp(1.i32)) }
525
+ return "#{name} = #{s}"
526
+ end
527
+
528
+ ## Sexp -> String
529
+ def process_if(sexp)
530
+ then_o = sexp[1.i32]
531
+ else_o = sexp[2.i32]
532
+ if @level == 0
533
+ c = __with_level_s(2.i32) { process(sexp.fetch_as_sexp(0.i32)) }
534
+ if then_o.nil? && else_o.nil?
535
+ raise ArgumentError
536
+ end
537
+ if then_o.nil?
538
+ s1 = __with_depth(else_o)
539
+ return "unless" + " " + c + "\n" + s1 + __tabs + "end"
540
+ end
541
+ if else_o.nil?
542
+ s0 = __with_depth(then_o)
543
+ return "if" + " " + c + "\n" + s0 + __tabs + "end"
544
+ end
545
+ s0 = __with_depth(then_o)
546
+ else_sexp = else_o.is_a!(Sexp)
547
+ if else_sexp.type == :if
548
+ if else_sexp[1.i32].not_nil?
549
+ s1 = process_if(else_sexp)
550
+ return "if" + " " + c + "\n" + s0 + __tabs + "els" + s1
551
+ end
552
+ end
553
+ s1 = __with_depth(else_o)
554
+ return "if" + " " + c + "\n" + s0 + __tabs + "else" + "\n" + s1 + __tabs + "end"
555
+ else
556
+ c = __with_level_s(3.i32) { process(sexp.fetch_as_sexp(0.i32)) }
557
+ s0 = __with_level_s(2.i32) { process(then_o.is_a!(Sexp)) }
558
+ s1 = __with_level_s(2.i32) { process(else_o.is_a!(Sexp)) }
559
+ s = c + " " + "?" + " " + s0 + " " + ":" + " " + s1
560
+ return @level > 2 ? "(#{s})" : s
561
+ end
562
+ end
563
+
564
+ ## Sexp -> String
565
+ def process_iter(sexp)
566
+ c = __with_level_s(2.i32) { process(sexp.fetch_as_sexp(0.i32)) }
567
+ s = __with_depth(sexp[2.i32])
568
+ o = sexp.fetch(1.i32)
569
+ if o.nil?
570
+ return c + " " + "{" + "\n" + s + __tabs + "}"
571
+ else
572
+ args_sexp = o.is_a!(Sexp)
573
+ case args_sexp.type
574
+ when :args
575
+ a = __process_args(args_sexp)
576
+ if a.empty?
577
+ return c + " " + "{" + "\n" + s + __tabs + "}"
578
+ end
579
+ when :lasgn
580
+ a = []
581
+ name = args_sexp.fetch_as_s(0.i32)
582
+ a.push(name)
583
+ when :masgn
584
+ a = []
585
+ array_sexp = args_sexp.fetch_as_sexp(0.i32)
586
+ raise ArgumentError if array_sexp.type != :array
587
+ n = array_sexp.size_as_int32
588
+ n.times do |i|
589
+ name = array_sexp.fetch_as_sexp(i).fetch_as_s(0.i32)
590
+ a.push(name)
591
+ end
592
+ else
593
+ raise ArgumentError
594
+ end
595
+ t = a.join(", ")
596
+ return c + " " + "{" + " " + "|#{t}|" + "\n" + s + __tabs + "}"
597
+ end
598
+ end
599
+
600
+ ## Sexp -> String
601
+ def process_ivar(sexp)
602
+ name = sexp.fetch_as_s(0.i32)
603
+ return name
604
+ end
605
+
606
+ ## Sexp -> String
607
+ def process_lasgn(sexp)
608
+ raise ArgumentError if @level > 1
609
+ name = sexp.fetch_as_s(0.i32)
610
+ arg_sexp = sexp.fetch_as_sexp(1.i32)
611
+ s = __with_level_s(1.i32) { process(arg_sexp) }
612
+ return "#{name} = #{s}"
613
+ end
614
+
615
+ ## Sexp -> String
616
+ def process_lit(sexp)
617
+ return sexp.fetch(0.i32).inspect
618
+ end
619
+
620
+ ## Sexp -> String
621
+ def process_lvar(sexp)
622
+ name = sexp.fetch_as_s(0.i32)
623
+ return name
624
+ end
625
+
626
+ ## Sexp -> String
627
+ def process_module(sexp)
628
+ raise ArgumentError if @level > 0
629
+ name = sexp.fetch_as_s(0.i32)
630
+ s = __process_scope(sexp, 1.i32)
631
+ return "module" + " " + name + "\n" + s + __tabs + "end"
632
+ end
633
+
634
+ ## Sexp -> String
635
+ def process_nil(sexp)
636
+ return "nil"
637
+ end
638
+
639
+ ## Sexp -> String
640
+ def process_op_asgn1(sexp)
641
+ raise ArgumentError if @level > 1
642
+ r = __with_level_s(2.i32) { process(sexp.fetch_as_sexp(0.i32)) }
643
+ arg_sexp = sexp.fetch_as_sexp(1.i32)
644
+ if arg_sexp.type == :arglist
645
+ a = __process_arglist(arg_sexp)
646
+ t = a.join(", ")
647
+ else
648
+ t = __with_level_s(2.i32) { process(arg_sexp) }
649
+ end
650
+ operator = sexp.fetch_as_s(2.i32)
651
+ s = __with_level_s(1.i32) { process(sexp.fetch_as_sexp(3.i32)) }
652
+ return "#{r}[#{t}] #{operator}= #{s}"
653
+ end
654
+
655
+ ## Sexp -> String
656
+ def process_op_asgn2(sexp)
657
+ raise ArgumentError if @level > 1
658
+ r = __with_level_s(2.i32) { process(sexp.fetch_as_sexp(0.i32)) }
659
+ name = sexp.fetch_as_s(1.i32)
660
+ raise ArgumentError unless name.end_with?("=")
661
+ name = name.chop
662
+ operator = sexp.fetch_as_s(2.i32)
663
+ s = __with_level_s(1.i32) { process(sexp.fetch_as_sexp(3.i32)) }
664
+ return "#{r}.#{name} #{operator}= #{s}"
665
+ end
666
+
667
+ ## Sexp -> String
668
+ def process_op_asgn_and(sexp)
669
+ raise ArgumentError if @level > 1
670
+ lasgn_sexp = sexp.fetch_as_sexp(1.i32)
671
+ raise ArgumentError if lasgn_sexp.type != :lasgn
672
+ name = lasgn_sexp.fetch_as_s(0.i32)
673
+ v = __with_level_s(1.i32) { process(lasgn_sexp.fetch_as_sexp(1.i32)) }
674
+ return "#{name} &&= #{v}"
675
+ end
676
+
677
+ ## Sexp -> String
678
+ def process_op_asgn_or(sexp)
679
+ raise ArgumentError if @level > 1
680
+ lasgn_sexp = sexp.fetch_as_sexp(1.i32)
681
+ raise ArgumentError if lasgn_sexp.type != :lasgn
682
+ name = lasgn_sexp.fetch_as_s(0.i32)
683
+ v = __with_level_s(1.i32) { process(lasgn_sexp.fetch_as_sexp(1.i32)) }
684
+ return "#{name} ||= #{v}"
685
+ end
686
+
687
+ ## Sexp -> String
688
+ def process_rescue(sexp)
689
+ raise ArgumentError if @level > 0
690
+ n = sexp.size_as_int32
691
+ a = []
692
+ i = 1.i32
693
+ while i < n
694
+ resbody_sexp = sexp.fetch_as_sexp(i)
695
+ raise ArgumentError if resbody_sexp.type != :resbody
696
+ array_sexp = resbody_sexp.fetch_as_sexp(0.i32)
697
+ raise ArgumentError if array_sexp.type != :array
698
+ if array_sexp.size_as_int32 != 1
699
+ raise ArgumentError
700
+ end
701
+ r = __with_level_s(2.i32) { process(array_sexp.fetch_as_sexp(0.i32)) }
702
+ s = __with_depth(resbody_sexp[1.i32])
703
+ a.push(__tabs + "rescue" + " " + r + "\n" + s)
704
+ i += 1
705
+ end
706
+ s = __with_depth(sexp[0.i32])
707
+ return "begin" + "\n" + s + a.join + __tabs + "end"
708
+ end
709
+
710
+ ## Sexp -> String
711
+ def process_return(sexp)
712
+ raise ArgumentError if @level > 0
713
+ case sexp.size_as_int32
714
+ when 0.i32
715
+ return "return"
716
+ when 1.i32
717
+ s = __with_level_s(1.i32) { process(sexp.fetch_as_sexp(0.i32)) }
718
+ return "return" + " " + s
719
+ else
720
+ raise ArgumentError
721
+ end
722
+ end
723
+
724
+ ## Sexp -> String
725
+ def process_sclass(sexp)
726
+ raise ArgumentError if @level > 0
727
+ c = __with_level_s(2.i32) { process(sexp.fetch_as_sexp(0.i32)) }
728
+ s = __process_scope(sexp, 1.i32)
729
+ return "class" + " << " + c + "\n" + s + __tabs + "end"
730
+ end
731
+
732
+ ## Sexp -> String
733
+ def process_self(sexp)
734
+ return "self"
735
+ end
736
+
737
+ ## Sexp -> String
738
+ def process_str(sexp)
739
+ return sexp.fetch(0.i32).is_a!(String).inspect
740
+ end
741
+
742
+ ## Sexp -> String
743
+ def process_super(sexp)
744
+ a = __process_arglist(sexp)
745
+ s = a.join(", ")
746
+ return "super" + "(#{s})"
747
+ end
748
+
749
+ ## Sexp -> String
750
+ def process_true(sexp)
751
+ return "true"
752
+ end
753
+
754
+ ## Sexp -> String
755
+ def process_until(sexp)
756
+ raise ArgumentError if @level > 0
757
+ c = __with_level_s(2.i32) { process(sexp.fetch_as_sexp(0.i32)) }
758
+ s = __with_depth(sexp[1.i32])
759
+ if sexp.fetch(2.i32)
760
+ return "until" + " " + c + "\n" + s + __tabs + "end"
761
+ else
762
+ return "begin" + "\n" + s + __tabs + "end" + " " + "until" + " " + c
763
+ end
764
+ end
765
+
766
+ ## Sexp -> String
767
+ def process_while(sexp)
768
+ raise ArgumentError if @level > 0
769
+ c = __with_level_s(2.i32) { process(sexp.fetch_as_sexp(0.i32)) }
770
+ s = __with_depth(sexp[1.i32])
771
+ if sexp.fetch(2.i32)
772
+ return "while" + " " + c + "\n" + s + __tabs + "end"
773
+ else
774
+ return "begin" + "\n" + s + __tabs + "end" + " " + "while" + " " + c
775
+ end
776
+ end
777
+
778
+ ## Sexp -> String
779
+ def process_yield(sexp)
780
+ a = __process_arglist(sexp)
781
+ if a.empty?
782
+ return "yield"
783
+ end
784
+ s = a.join(", ")
785
+ return "yield" + "(#{s})"
786
+ end
787
+ end
788
+ end
@@ -0,0 +1,50 @@
1
+ module MetaRuby
2
+ ## <>
3
+ ## @__comments: Array<String>?
4
+ class Sexp < ::Sexp
5
+ ## Symbol -> void
6
+ ## Symbol, Array<java.lang.Object?> -> void
7
+ def initialize(type, args = nix)
8
+ if args.nix?
9
+ super(type)
10
+ else
11
+ super(type, args)
12
+ end
13
+ @__comments = nil
14
+ return
15
+ end
16
+
17
+ # ===
18
+
19
+ ## int32 -> String
20
+ ## Fixnum -> String
21
+ def fetch_as_s(i)
22
+ o = fetch(i)
23
+ case o
24
+ when String
25
+ return o
26
+ when Symbol
27
+ return o.to_s
28
+ else
29
+ raise TypeError
30
+ end
31
+ end
32
+
33
+ ## int32 -> Sexp
34
+ ## Fixnum -> Sexp
35
+ def fetch_as_sexp(i)
36
+ return fetch(i).is_a!(Sexp)
37
+ end
38
+
39
+ ## -> Array<String>?
40
+ def comments
41
+ return @__comments
42
+ end
43
+
44
+ ## Array<String>? -> void
45
+ def comments=(o)
46
+ @__comments = o
47
+ return
48
+ end
49
+ end
50
+ end
@@ -0,0 +1 @@
1
+ require "meta-ruby"
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meta-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.1.0
5
+ platform: ruby
6
+ authors:
7
+ - InfraRuby Vision
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: infraruby-shim
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: s-expression
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fab
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: infraruby-task
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.7'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.7'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ description: Ruby metaprogramming with s-expressions
84
+ email: rubygems@infraruby.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - Gemfile
90
+ - MIT-LICENSE
91
+ - README.md
92
+ - Rakefile
93
+ - bin/meta-hello
94
+ - lib/meta-ruby.rb
95
+ - meta-ruby.gemspec
96
+ - pool/meta-ruby.cut
97
+ - pool/meta-ruby.jar
98
+ - ruby/MetaRuby.rb
99
+ - ruby/MetaRuby/Directory.rb
100
+ - ruby/MetaRuby/Generator.rb
101
+ - ruby/MetaRuby/Processor.rb
102
+ - ruby/MetaRuby/Processor/SourceProcessor.rb
103
+ - ruby/MetaRuby/Sexp.rb
104
+ - spec/spec_helper.rb
105
+ homepage: http://infraruby.com/
106
+ licenses:
107
+ - MIT
108
+ metadata: {}
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubyforge_project:
125
+ rubygems_version: 2.2.2
126
+ signing_key:
127
+ specification_version: 4
128
+ summary: Ruby metaprogramming with s-expressions
129
+ test_files: []