Class: Rbind::GeneratorRuby
- Inherits:
-
Object
- Object
- Rbind::GeneratorRuby
- Defined in:
- lib/rbind/generator_ruby.rb
Defined Under Namespace
Classes: HelperBase, RBindHelper, RTypeHelper
Instance Attribute Summary collapse
-
#compact_namespace ⇒ Object
Returns the value of attribute compact_namespace.
-
#file_prefix ⇒ Object
Returns the value of attribute file_prefix.
-
#library_name ⇒ Object
Returns the value of attribute library_name.
-
#module_name ⇒ Object
Returns the value of attribute module_name.
-
#output_path ⇒ Object
Returns the value of attribute output_path.
-
#required_module_names ⇒ Object
Returns the value of attribute required_module_names.
-
#root ⇒ Object
readonly
Returns the value of attribute root.
Class Method Summary collapse
- .keyword?(name) ⇒ Boolean
- .normalize_arg_name(name) ⇒ Object
- .normalize_basic_type_name(name) ⇒ Object
- .normalize_default_value(parameter) ⇒ Object
- .normalize_method_name(name) ⇒ Object
- .normalize_type_name(name) ⇒ Object
Instance Method Summary collapse
- #generate(path = @output_path) ⇒ Object
-
#initialize(root, module_name = "Rbind", library_name = "rbind_lib") ⇒ GeneratorRuby
constructor
A new instance of GeneratorRuby.
Constructor Details
#initialize(root, module_name = "Rbind", library_name = "rbind_lib") ⇒ GeneratorRuby
Returns a new instance of GeneratorRuby.
395 396 397 398 399 400 401 |
# File 'lib/rbind/generator_ruby.rb', line 395 def initialize(root,module_name ="Rbind",library_name="rbind_lib") @root = root @rbind_wrapper = ERB.new(File.open(File.join(File.dirname(__FILE__),"templates","ruby","rbind.rb")).read) @module_name = module_name @library_name = library_name @compact_namespace = false end |
Instance Attribute Details
#compact_namespace ⇒ Object
Returns the value of attribute compact_namespace.
388 389 390 |
# File 'lib/rbind/generator_ruby.rb', line 388 def compact_namespace @compact_namespace end |
#file_prefix ⇒ Object
Returns the value of attribute file_prefix.
387 388 389 |
# File 'lib/rbind/generator_ruby.rb', line 387 def file_prefix @file_prefix end |
#library_name ⇒ Object
Returns the value of attribute library_name.
385 386 387 |
# File 'lib/rbind/generator_ruby.rb', line 385 def library_name @library_name end |
#module_name ⇒ Object
Returns the value of attribute module_name.
383 384 385 |
# File 'lib/rbind/generator_ruby.rb', line 383 def module_name @module_name end |
#output_path ⇒ Object
Returns the value of attribute output_path.
386 387 388 |
# File 'lib/rbind/generator_ruby.rb', line 386 def output_path @output_path end |
#required_module_names ⇒ Object
Returns the value of attribute required_module_names.
384 385 386 |
# File 'lib/rbind/generator_ruby.rb', line 384 def required_module_names @required_module_names end |
#root ⇒ Object (readonly)
Returns the value of attribute root.
389 390 391 |
# File 'lib/rbind/generator_ruby.rb', line 389 def root @root end |
Class Method Details
.keyword?(name) ⇒ Boolean
7 8 9 |
# File 'lib/rbind/generator_ruby.rb', line 7 def self.keyword?(name) %w{__FILE__ __LINE__ alias and begin BEGIN break case class def defined? do else elsif end END ensure false for if in module next nil not or redo rescue retry return self super then true undef unless until when while yield}.include? name end |
.normalize_arg_name(name) ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/rbind/generator_ruby.rb', line 11 def self.normalize_arg_name(name) name = name.to_s.sub(/\A#{RBase.cprefix}?/, "").gsub(/(?<!\A)\p{Lu}/u, '_\0').downcase name = if keyword?(name) "#{name}_" else name end # check for digits at the beginning if name =~/\d(.*)/ "_#{name}" else name end end |
.normalize_basic_type_name(name) ⇒ Object
76 77 78 79 80 81 82 83 84 85 |
# File 'lib/rbind/generator_ruby.rb', line 76 def self.normalize_basic_type_name(name) @@basic_type_map ||= {"char *" => "string","unsigned char" => "uchar" ,"const char *" => "string" } n = @@basic_type_map[name] n ||= name if n =~ /\*/ "pointer" else n end end |
.normalize_default_value(parameter) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/rbind/generator_ruby.rb', line 26 def self.normalize_default_value(parameter) return nil unless parameter.default_value val = if parameter.type.basic_type? || parameter.type.ptr? if parameter.type.name == "float" parameter.default_value.gsub("f","") elsif parameter.type.name == "double" parameter.default_value.gsub(/\.$/,".0") else normalize_type_name(parameter.default_value) end else if(parameter.default_value =~ /(\w*)\((.*)\)/) t = parameter.owner.owner.type($1,false) if t "#{normalize_type_name(t.full_name)}.new(#{$2})" else ns = RBase.namespace($1) t = parameter.owner.owner.type(ns,false) if ns ops = Array(t.operation($1,false)) if t "#{normalize_method_name(ops.first.full_name)}(#{$2})" if ops && !ops.empy? end else parameter.default_value end end if val val else raise "cannot parse default parameter value #{parameter.default_value} for #{parameter.owner.signature}" end end |
.normalize_method_name(name) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/rbind/generator_ruby.rb', line 87 def self.normalize_method_name(name) name = name.to_s.gsub(/\A#{RBase.cprefix}?/, "").gsub(/(?<!\A)\p{Lu}/u, '_\0').downcase str = "" name.split("_").each_with_index do |n,i| next if n.empty? if n.size == 1 && i > 1 str += n else str += "_#{n}" end end str = str[1..-1] #remove leading "_" str = if str =~/^operator(.*)/ n = $1 if n =~ /\(\)/ raise "forbbiden method name #{name}" elsif n=~ /(.*)(\d)/ if $1 == "[]" "array_operator#{$2}" elsif $1 == "+" "plus_operator#{$2}" elsif $1 == "-" "minus_operator#{$2}" elsif $1 == "*" "mul_operator#{$2}" elsif $1 == "/" "div_operator#{$2}" else raise "forbbiden method name #{name}" end else n end else str end end |
.normalize_type_name(name) ⇒ Object
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/rbind/generator_ruby.rb', line 59 def self.normalize_type_name(name) names = name.split("::").map do |n| n.gsub(/^(\w)(.*)/) do $1.upcase+$2 end end n = names.last.split("_").first if n == n.upcase return names.join("::") end names.join("::").split("_").map do |n| n.gsub(/^(\w)(.*)/) do $1.upcase+$2 end end.join("") end |
Instance Method Details
#generate(path = @output_path) ⇒ Object
403 404 405 406 407 408 409 410 411 412 413 |
# File 'lib/rbind/generator_ruby.rb', line 403 def generate(path=@output_path) @output_path = path FileUtils.mkdir_p(path) if path && !File.directory?(path) file_rbind = File.new(File.join(path,"#{file_prefix}.rb"),"w") file_types = File.new(File.join(path,"#{file_prefix}_types.rb"),"w") types = RTypeHelper.new(@module_name,@root,compact_namespace) file_types.write types.result rbind = RBindHelper.new(@module_name,self,compact_namespace) file_rbind.write @rbind_wrapper.result(rbind.binding) end |