Class: FFIGen::Function

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(generator, name, is_callback, comment) ⇒ Function

Returns a new instance of Function.



151
152
153
154
155
156
157
# File 'lib/ffi_gen.rb', line 151

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

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



148
149
150
# File 'lib/ffi_gen.rb', line 148

def name
  @name
end

#parametersObject (readonly)

Returns the value of attribute parameters.



148
149
150
# File 'lib/ffi_gen.rb', line 148

def parameters
  @parameters
end

#return_typeObject

Returns the value of attribute return_type.



149
150
151
# File 'lib/ffi_gen.rb', line 149

def return_type
  @return_type
end

Instance Method Details

#referenceObject



210
211
212
# File 'lib/ffi_gen.rb', line 210

def reference
  ":#{ruby_name}"
end

#ruby_nameObject



202
203
204
# File 'lib/ffi_gen.rb', line 202

def ruby_name
  @ruby_name ||= @generator.to_ruby_lowercase @name, true
end

#type_name(short) ⇒ Object



206
207
208
# File 'lib/ffi_gen.rb', line 206

def type_name(short)
  "Proc(_callback_#{ruby_name}_)"
end

#write(writer) ⇒ Object



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/ffi_gen.rb', line 159

def write(writer)
  @parameters.each do |parameter|
    parameter[:ruby_type] = @generator.to_type_name parameter[:type]
    parameter[:ruby_name] = @generator.to_ruby_lowercase(parameter[:name].empty? ? @generator.to_type_name(parameter[:type], true) : parameter[:name])
    parameter[:description] = []
  end
  
  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 { |parameter| parameter[:name] == $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_#{ruby_name}_" : ruby_name}(#{@parameters.map{ |parameter| parameter[:ruby_name] }.join(', ')})"
    @parameters.each do |parameter|
      writer.write_description parameter[:description], false, "@param [#{parameter[:ruby_type]}] #{parameter[:ruby_name]} ", "  "
    end
    writer.write_description return_value_description, false, "@return [#{@generator.to_type_name @return_type}] ", "  "
    writer.puts "@scope class"
  end
  
  ffi_signature = "[#{@parameters.map{ |parameter| @generator.to_ffi_type parameter[:type] }.join(', ')}], #{@generator.to_ffi_type @return_type}"
  if @is_callback
    writer.puts "callback :#{ruby_name}, #{ffi_signature}", ""
  else
    writer.puts "attach_function :#{ruby_name}, :#{@name}, #{ffi_signature}", ""
  end
end