Class: FFIGen::FunctionOrCallback

Inherits:
Object
  • Object
show all
Defined in:
lib/ffi_gen.rb,
lib/ffi_gen/java_output.rb,
lib/ffi_gen/ruby_output.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(generator, name, is_callback, blocking, comment) ⇒ FunctionOrCallback

Returns a new instance of FunctionOrCallback.



113
114
115
116
117
118
119
120
# File 'lib/ffi_gen.rb', line 113

def initialize(generator, name, is_callback, blocking, comment)
  @generator = generator
  @name = name
  @parameters = []
  @is_callback = is_callback
  @blocking = blocking
  @comment = comment
end

Instance Attribute Details

#commentObject (readonly)

Returns the value of attribute comment.



110
111
112
# File 'lib/ffi_gen.rb', line 110

def comment
  @comment
end

#nameObject (readonly)

Returns the value of attribute name.



110
111
112
# File 'lib/ffi_gen.rb', line 110

def name
  @name
end

#parametersObject (readonly)

Returns the value of attribute parameters.



110
111
112
# File 'lib/ffi_gen.rb', line 110

def parameters
  @parameters
end

#return_typeObject

Returns the value of attribute return_type.



111
112
113
# File 'lib/ffi_gen.rb', line 111

def return_type
  @return_type
end

Instance Method Details

#java_nameObject



232
233
234
# File 'lib/ffi_gen/java_output.rb', line 232

def java_name
  @java_name ||= @name.to_java_downcase
end

#ruby_nameObject



241
242
243
# File 'lib/ffi_gen/ruby_output.rb', line 241

def ruby_name
  @ruby_name ||= @name.to_ruby_downcase
end

#write_java(writer) ⇒ Object



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
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# File 'lib/ffi_gen/java_output.rb', line 186

def write_java(writer)
  return if @is_callback # not yet supported
  
  @parameters.each do |parameter|
    parameter[:type_data] = @generator.to_java_type parameter[:type], parameter[:is_array]
    parameter[:java_name] = !parameter[:name].empty? ? parameter[:name].to_java_downcase : parameter[:type_data][:parameter_name]
    parameter[:description] = []
  end
  return_type_data = @generator.to_java_type @return_type
  
  function_description = []
  return_value_description = []
  current_description = function_description
  @comment.split("\n").map do |line|
    line = writer.prepare_comment_line line
    if line.gsub!(/\\param (.*?) /, '')
      parameter = @parameters.find { |p| p[:name].raw == $1 }
      if parameter
        current_description = parameter[:description]
      else
        current_description << "#{$1}: "
      end
    end
    current_description = return_value_description if line.gsub! '\\returns ', ''
    current_description << line
  end
  
  writer.comment do
    writer.write_description function_description
    writer.puts "", "<em>This entry is only for documentation and no real method.</em>" if @is_callback
    writer.puts "", "@method #{@is_callback ? "_callback_#{java_name}_" : java_name}(#{@parameters.map{ |parameter| parameter[:java_name] }.join(', ')})"
    @parameters.each do |parameter|
      writer.write_description parameter[:description], false, "@param [#{parameter[:type_data][:description]}] #{parameter[:java_name]} ", "  "
    end
    writer.write_description return_value_description, false, "@return [#{return_type_data[:description]}] ", "  "
    writer.puts "@scope class"
  end
  
  jna_signature = "#{@parameters.map{ |parameter| "#{parameter[:type_data][:jna_type]} #{parameter[:java_name]}" }.join(', ')}"
  if @is_callback
    writer.puts "callback :#{java_name}, #{jna_signature}", ""
  else
    writer.puts "@NativeName(\"#{@name.raw}\")", "#{return_type_data[:jna_type]} #{java_name}(#{jna_signature});", ""
  end
end

#write_ruby(writer) ⇒ Object



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/ffi_gen/ruby_output.rb', line 196

def write_ruby(writer)
  @parameters.each do |parameter|
    parameter[:type_data] = @generator.to_ruby_type parameter[:type]
    parameter[:ruby_name] = !parameter[:name].empty? ? parameter[:name].to_ruby_downcase : parameter[:type_data][:parameter_name]
    parameter[:description] = []
  end
  return_type_data = @generator.to_ruby_type @return_type
  
  function_description = []
  return_value_description = []
  current_description = function_description
  @comment.split("\n").map do |line|
    line = writer.prepare_comment_line line
    if line.gsub!(/\\param (.*?) /, '')
      parameter = @parameters.find { |p| p[:name].raw == $1 }
      if parameter
        current_description = parameter[:description]
      else
        current_description << "#{$1}: "
      end
    end
    current_description = return_value_description if line.gsub! '\\returns ', ''
    current_description << line
  end
  
  writer.puts "@blocking = true" if @blocking
  writer.comment do
    writer.write_description function_description
    writer.puts "", "<em>This entry is only for documentation and no real method.</em>" if @is_callback
    writer.puts "", "@method #{@is_callback ? "_callback_#{ruby_name}_" : ruby_name}(#{@parameters.map{ |parameter| parameter[:ruby_name] }.join(', ')})"
    @parameters.each do |parameter|
      writer.write_description parameter[:description], false, "@param [#{parameter[:type_data][:description]}] #{parameter[:ruby_name]} ", "  "
    end
    writer.write_description return_value_description, false, "@return [#{return_type_data[:description]}] ", "  "
    writer.puts "@scope class"
  end
  
  ffi_signature = "[#{@parameters.map{ |parameter| parameter[:type_data][:ffi_type] }.join(', ')}], #{return_type_data[:ffi_type]}"
  if @is_callback
    writer.puts "callback :#{ruby_name}, #{ffi_signature}", ""
  else
    writer.puts "attach_function :#{ruby_name}, :#{@name.raw}, #{ffi_signature}", ""
  end
end