Class: Mirah::JavaSource::ClassBuilder

Inherits:
Object
  • Object
show all
Includes:
Mirah::JVM::Compiler::JVMBytecode::JVMLogger, Helper
Defined in:
lib/mirah/plugin/gwt.rb,
lib/mirah/jvm/source_generator/builder.rb

Direct Known Subclasses

InterfaceBuilder

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Mirah::JVM::Compiler::JVMBytecode::JVMLogger

#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 (readonly)

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 (readonly)

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 (readonly)

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 (readonly)

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 (readonly)

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 (readonly)

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 (readonly)

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 (readonly)

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