Class: Mirah::JavaSource::ClassBuilder
Instance Attribute Summary collapse
Instance Method Summary
collapse
-
#build_constructor(visibility, exceptions, *args) ⇒ Object
-
#build_jsni_method(name, visibility, static, exceptions, type, *args) ⇒ Object
-
#build_method(name, visibility, static, exceptions, type, *args) ⇒ Object
-
#classes ⇒ Object
-
#compiler ⇒ Object
-
#declare_field(name, type, static, access = 'private', annotations = []) ⇒ Object
-
#finish_declaration ⇒ Object
-
#generate ⇒ Object
-
#initialize(builder, name, superclass, interfaces, abstract) ⇒ ClassBuilder
constructor
A new instance of ClassBuilder.
-
#main ⇒ Object
-
#start ⇒ Object
-
#stop ⇒ Object
#log
Methods included from Helper
#annotate, #annotation_value, #block, #dedent, #indent, #init_value, #print, #puts
Constructor Details
#initialize(builder, name, superclass, interfaces, abstract) ⇒ ClassBuilder
Returns a new instance of ClassBuilder.
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 182
def initialize(builder, name, superclass, interfaces, abstract)
@builder = builder
@package = builder.package
if @package
@name = "#{@package}.#{name}"
else
@name = name
end
if name =~ %r{[/.]}
pieces = name.split(%r{[/.]})
name = pieces.pop
@package = pieces.join('.')
end
@class_name = name
if @class_name =~ /\$([^$]+)/
@class_name = $1
@static = true
@inner_class = true
end
@superclass = superclass || JVMTypes::Object
@interfaces = interfaces
@filename = "#{name}.java"
@filename = "#{package.tr('.', '/')}/#{@filename}" if @package
@out = Output.new
@stopped = false
@methods = []
@fields = {}
@inner_classes = {}
@abstract = abstract
start
end
|
Instance Attribute Details
#abstract ⇒ Object
Returns the value of attribute abstract.
181
182
183
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 181
def abstract
@abstract
end
|
#class_name ⇒ Object
Returns the value of attribute class_name.
180
181
182
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 180
def class_name
@class_name
end
|
#filename ⇒ Object
Returns the value of attribute filename.
180
181
182
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 180
def filename
@filename
end
|
#interfaces ⇒ Object
Returns the value of attribute interfaces.
181
182
183
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 181
def interfaces
@interfaces
end
|
#name ⇒ Object
Returns the value of attribute name.
180
181
182
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 180
def name
@name
end
|
#out ⇒ Object
Returns the value of attribute out.
180
181
182
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 180
def out
@out
end
|
#package ⇒ Object
Returns the value of attribute package.
180
181
182
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 180
def package
@package
end
|
#superclass ⇒ Object
Returns the value of attribute superclass.
180
181
182
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 180
def superclass
@superclass
end
|
Instance Method Details
#build_constructor(visibility, exceptions, *args) ⇒ Object
290
291
292
293
294
295
296
297
298
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 290
def build_constructor(visibility, exceptions, *args)
finish_declaration
@methods << MethodBuilder.new(self,
:name => class_name,
:visibility => visibility,
:args => args,
:exceptions => exceptions)
@methods[-1]
end
|
#build_jsni_method(name, visibility, static, exceptions, type, *args) ⇒ Object
20
21
22
23
24
25
26
27
28
29
30
31
|
# File 'lib/mirah/plugin/gwt.rb', line 20
def build_jsni_method(name, visibility, static, exceptions, type, *args)
finish_declaration
type ||= Mirah::AST.type(nil, :void)
@methods << JsniMethodBuilder.new(self,
:name => name,
:visibility => visibility,
:static => static,
:return => type,
:args => args,
:exceptions => exceptions)
@methods[-1]
end
|
#build_method(name, visibility, static, exceptions, type, *args) ⇒ Object
277
278
279
280
281
282
283
284
285
286
287
288
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 277
def build_method(name, visibility, static, exceptions, type, *args)
finish_declaration
type ||= Mirah::AST::type(nil, :void)
@methods << MethodBuilder.new(self,
:name => name,
:visibility => visibility,
:static => static,
:return => type,
:args => args,
:exceptions => exceptions)
@methods[-1]
end
|
#classes ⇒ Object
218
219
220
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 218
def classes
@inner_classes
end
|
#compiler ⇒ Object
214
215
216
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 214
def compiler
@builder.compiler
end
|
#declare_field(name, type, static, access = 'private', annotations = []) ⇒ Object
268
269
270
271
272
273
274
275
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 268
def declare_field(name, type, static, access='private', annotations=[])
finish_declaration
return if @fields[name]
static = static ? ' static' : ''
annotate(annotations)
puts "#{access}#{static} #{type.to_source} #{name};"
@fields[name] = true
end
|
#finish_declaration ⇒ Object
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 229
def finish_declaration
return if @declaration_finished
raise "Already stopped class #{class_name}" if @stopped
@declaration_finished = true
modifiers = "public#{' static' if @static}#{' abstract' if @abstract}"
print "#{modifiers} class #{class_name} extends #{superclass.name}"
unless @interfaces.empty?
print " implements "
@interfaces.each_with_index do |interface, index|
print ', ' unless index == 0
print interface.to_source
end
end
puts " {"
indent
end
|
#generate ⇒ Object
300
301
302
303
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 300
def generate
stop
@out.to_s
end
|
#main ⇒ Object
263
264
265
266
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 263
def main
build_method('main', :public, :static, [], JVMTypes::Void,
[JVMTypes::String.array_type, 'argv'])
end
|
#start ⇒ Object
222
223
224
225
226
227
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 222
def start
unless @inner_class
puts "// Generated from #{@builder.filename}"
puts "package #{package};" if package
end
end
|
#stop ⇒ Object
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
|
# File 'lib/mirah/jvm/source_generator/builder.rb', line 247
def stop
return if @stopped
finish_declaration
@methods.each do |method|
@out << method.out
end
@inner_classes.values.each do |inner_class|
@out << inner_class.out
end
log "Class #{name} complete (#{@out.to_s.size})"
@stopped = true
dedent
puts "}"
log "Class #{name} complete (#{@out.to_s.size})"
end
|