Skip to content

Commit 6f4eb5b

Browse files
authored
Merge pull request #171 from sue445/generator_helper_to_go_util
Refactor ruby_h_to_go
2 parents 1c6dde9 + cf2b728 commit 6f4eb5b

File tree

11 files changed

+69
-63
lines changed

11 files changed

+69
-63
lines changed

_tools/ruby_h_to_go/lib/ruby_h_to_go.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
require_relative "ruby_header_parser"
66

7-
require_relative "ruby_h_to_go/generator_helper"
8-
require_relative "ruby_h_to_go/argument_definition"
9-
require_relative "ruby_h_to_go/cli"
10-
require_relative "ruby_h_to_go/enum_definition"
11-
require_relative "ruby_h_to_go/function_definition"
12-
require_relative "ruby_h_to_go/struct_definition"
13-
require_relative "ruby_h_to_go/type_definition"
14-
require_relative "ruby_h_to_go/typeref_definition"
15-
167
# Generate Go binding from ruby.h
178
module RubyHToGo
9+
autoload :ArgumentDefinition, "ruby_h_to_go/argument_definition"
10+
autoload :Cli, "ruby_h_to_go/cli"
11+
autoload :GoUtil, "ruby_h_to_go/go_util"
12+
autoload :EnumDefinition, "ruby_h_to_go/enum_definition"
13+
autoload :FunctionDefinition, "ruby_h_to_go/function_definition"
14+
autoload :StructDefinition, "ruby_h_to_go/struct_definition"
15+
autoload :TypeDefinition, "ruby_h_to_go/type_definition"
16+
autoload :TypeHelper, "ruby_h_to_go/type_helper"
17+
autoload :TyperefDefinition, "ruby_h_to_go/typeref_definition"
1818
end

_tools/ruby_h_to_go/lib/ruby_h_to_go/argument_definition.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class ArgumentDefinition
77

88
def_delegators :@definition, :==, :type, :type=, :name, :name=, :pointer, :pointer=, :pointer?, :length, :length=
99

10-
include GeneratorHelper
10+
include TypeHelper
1111

1212
# @param definition [RubyHeaderParser::ArgumentDefinition]
1313
# @param header_dir [String]
@@ -35,25 +35,25 @@ def go_name
3535

3636
# @return [String]
3737
def go_function_arg
38-
"#{go_name} #{ruby_c_type_to_go_type(type, pointer:, pointer_length: length, pos: :arg)}"
38+
"#{go_name} #{ruby_c_type_to_go_type(pointer:, pointer_length: length, pos: :arg)}"
3939
end
4040

4141
# @return [String]
4242
def cast_to_cgo
4343
case pointer
4444
when :array
45-
return "toCArray[#{ruby_c_type_to_go_type(type)}, #{cast_to_cgo_type(type)}](#{go_name})"
45+
return "toCArray[#{ruby_c_type_to_go_type}, #{cast_to_cgo_type}](#{go_name})"
4646
when :ref_array
47-
return "toCArray[*#{ruby_c_type_to_go_type(type)}, *#{cast_to_cgo_type(type)}](#{go_name})"
47+
return "toCArray[*#{ruby_c_type_to_go_type}, *#{cast_to_cgo_type}](#{go_name})"
4848
when :sref
4949
return go_name if type == "void" && length == 2
5050

51-
return "(#{"*" * length}#{cast_to_cgo_type(type)})(unsafe.Pointer(#{go_name}))"
51+
return "(#{"*" * length}#{cast_to_cgo_type})(unsafe.Pointer(#{go_name}))"
5252
when :in_ref
53-
return "(*#{cast_to_cgo_type(type)})(#{go_name})"
53+
return "(*#{cast_to_cgo_type})(#{go_name})"
5454
end
5555

56-
"#{cast_to_cgo_type(type)}(#{go_name})"
56+
"#{cast_to_cgo_type}(#{go_name})"
5757
end
5858

5959
# @param char_var_count [Integer]
@@ -75,10 +75,10 @@ def generate_go_arguments(char_var_count:, chars_var_count:)
7575
[go_name, [], []]
7676

7777
else
78-
c_var_name = "c#{snake_to_camel(go_name)}"
78+
c_var_name = "c#{GoUtil.snake_to_camel(go_name)}"
7979

80-
before_call_function_line = "var #{c_var_name} #{cast_to_cgo_type(type)}"
81-
after_call_function_line = "*#{go_name} = #{ruby_c_type_to_go_type(type, pos: :arg)}(#{c_var_name})"
80+
before_call_function_line = "var #{c_var_name} #{cast_to_cgo_type}"
81+
after_call_function_line = "*#{go_name} = #{ruby_c_type_to_go_type(pos: :arg)}(#{c_var_name})"
8282

8383
["&#{c_var_name}", [before_call_function_line], [after_call_function_line]]
8484
end
@@ -105,7 +105,7 @@ def generate_go_arguments(char_var_count:, chars_var_count:)
105105
def generate_go_arguments_for_char_pointer(char_var_count)
106106
# self is string
107107
if char_var_count >= 2
108-
chars_var_name = "char#{snake_to_camel(go_name)}"
108+
chars_var_name = "char#{GoUtil.snake_to_camel(go_name)}"
109109
clean_var_name = "cleanChar#{go_name}"
110110
else
111111
chars_var_name = "char"
@@ -129,7 +129,7 @@ def generate_go_arguments_for_char_pointer(char_var_count)
129129
# - after_call_function_lines [Array<String>]
130130
def generate_go_arguments_for_str_array(chars_var_count)
131131
if chars_var_count >= 2
132-
chars_var_name = "chars#{snake_to_camel(go_name)}"
132+
chars_var_name = "chars#{GoUtil.snake_to_camel(go_name)}"
133133
clean_var_name = "cleanChars#{go_name}"
134134
else
135135
chars_var_name = "chars"

_tools/ruby_h_to_go/lib/ruby_h_to_go/enum_definition.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ class EnumDefinition
77

88
def_delegators :@definition, :==, :name, :name=, :values, :values=
99

10-
include GeneratorHelper
11-
1210
# @param definition [RubyHeaderParser::EnumDefinition]
1311
def initialize(definition:)
1412
@definition = definition
@@ -19,7 +17,7 @@ def initialize(definition:)
1917
def write_go_file(dist_dir)
2018
go_file_path = File.join(dist_dir, "enum_generated.go")
2119

22-
generate_initial_go_file(go_file_path)
20+
GoUtil.generate_initial_go_file(go_file_path)
2321

2422
File.open(go_file_path, "a") do |f|
2523
f.write(generate_go_content)
@@ -28,7 +26,7 @@ def write_go_file(dist_dir)
2826

2927
# @return [String]
3028
def generate_go_content
31-
go_type_name = snake_to_camel(name)
29+
go_type_name = GoUtil.snake_to_camel(name)
3230

3331
go_enum_lines = [
3432
"// #{go_type_name} is a type for passing `C.#{name}` in and out of package",

_tools/ruby_h_to_go/lib/ruby_h_to_go/function_definition.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ class FunctionDefinition
77

88
def_delegators :@definition, :==, :name, :name=, :definition, :definition=
99

10-
include GeneratorHelper
11-
1210
# @param definition [RubyHeaderParser::FunctionDefinition]
1311
def initialize(definition:)
1412
@definition = definition
@@ -29,7 +27,7 @@ def args
2927
def write_go_file(dist_dir)
3028
go_file_path = File.join(dist_dir, "function_generated.go")
3129

32-
generate_initial_go_file(go_file_path)
30+
GoUtil.generate_initial_go_file(go_file_path)
3331

3432
File.open(go_file_path, "a") do |f|
3533
f.write(generate_go_content)
@@ -93,7 +91,7 @@ def generate_go_content
9391
def go_function_name
9492
return name if name.match?(/^[A-Z0-9_]+$/)
9593

96-
snake_to_camel(name)
94+
GoUtil.snake_to_camel(name)
9795
end
9896
end
9997
end

_tools/ruby_h_to_go/lib/ruby_h_to_go/generator_helper.rb renamed to _tools/ruby_h_to_go/lib/ruby_h_to_go/go_util.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22

33
module RubyHToGo
44
# helper methods for generating go code
5-
module GeneratorHelper
5+
module GoUtil
66
# @param str [String]
77
# @return [String]
8-
def snake_to_camel(str)
8+
def self.snake_to_camel(str)
99
return str if %w[VALUE ID].include?(str)
1010

1111
str.split("_").map(&:capitalize).join.gsub(/(?<=\d)([a-z])/) { _1.upcase } # rubocop:disable Style/SymbolProc
1212
end
1313

1414
# Generate initial go file whether not exists
1515
# @param go_file_path [String]
16-
def generate_initial_go_file(go_file_path)
16+
def self.generate_initial_go_file(go_file_path)
1717
return if File.exist?(go_file_path)
1818

1919
File.binwrite(go_file_path, <<~GO)
@@ -53,7 +53,7 @@ def generate_initial_go_file(go_file_path)
5353
# @param pointer [Symbol,nil] pointer hint (:ref, :array, :ref_array, :function, :sref, :str_array, :in_ref, :raw)
5454
# @param pointer_length [Integer]
5555
# @return [String]
56-
def ruby_c_type_to_go_type(typename, pos: nil, pointer: nil, pointer_length: 0)
56+
def self.ruby_c_type_to_go_type(typename, pos: nil, pointer: nil, pointer_length: 0)
5757
return ruby_pointer_c_type_to_go_type(typename, pos:, pointer:, pointer_length:) if pointer
5858

5959
return C_TYPE_TO_GO_TYPE[typename] if C_TYPE_TO_GO_TYPE[typename]
@@ -87,21 +87,19 @@ def ruby_c_type_to_go_type(typename, pos: nil, pointer: nil, pointer_length: 0)
8787
# Cast C type to cgo type. (Used in wrapper function)
8888
# @param typename [String]
8989
# @return [String]
90-
def cast_to_cgo_type(typename)
90+
def self.cast_to_cgo_type(typename)
9191
return C_TYPE_TO_CGO_TYPE[typename] if C_TYPE_TO_CGO_TYPE[typename]
9292

9393
"C.#{typename}"
9494
end
9595

96-
private
97-
9896
# Convert pointer C type to Go type. (used in wrapper function args and return type etc)
9997
# @param typename [String]
10098
# @param pos [Symbol,nil] :arg, :typeref, :return
10199
# @param pointer [Symbol,nil] pointer hint (:ref, :array, :ref_array, :function, :sref, :str_array, :in_ref, :raw)
102100
# @param pointer_length [Integer]
103101
# @return [String]
104-
def ruby_pointer_c_type_to_go_type(typename, pos:, pointer:, pointer_length:)
102+
def self.ruby_pointer_c_type_to_go_type(typename, pos:, pointer:, pointer_length:)
105103
go_type_name =
106104
if typename == "int" && %i[return typeref].include?(pos)
107105
"Int"
@@ -139,5 +137,7 @@ def ruby_pointer_c_type_to_go_type(typename, pos:, pointer:, pointer_length:)
139137

140138
"*#{go_type_name}"
141139
end
140+
141+
private_class_method :ruby_pointer_c_type_to_go_type
142142
end
143143
end

_tools/ruby_h_to_go/lib/ruby_h_to_go/struct_definition.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ class StructDefinition
77

88
def_delegators :@definition, :==, :name, :name=
99

10-
include GeneratorHelper
11-
1210
# @param definition [RubyHeaderParser::StructDefinition]
1311
def initialize(definition:)
1412
@definition = definition
@@ -19,7 +17,7 @@ def initialize(definition:)
1917
def write_go_file(dist_dir)
2018
go_file_path = File.join(dist_dir, "struct_generated.go")
2119

22-
generate_initial_go_file(go_file_path)
20+
GoUtil.generate_initial_go_file(go_file_path)
2321

2422
File.open(go_file_path, "a") do |f|
2523
f.write(generate_go_content)
@@ -28,7 +26,7 @@ def write_go_file(dist_dir)
2826

2927
# @return [String]
3028
def generate_go_content
31-
go_type_name = snake_to_camel(name)
29+
go_type_name = GoUtil.snake_to_camel(name)
3230

3331
<<~GO
3432
// #{go_type_name} is a type for passing `C.#{name}` in and out of package

_tools/ruby_h_to_go/lib/ruby_h_to_go/type_definition.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ class TypeDefinition
77

88
def_delegators :@definition, :==, :name, :name=
99

10-
include GeneratorHelper
11-
1210
# @param definition [RubyHeaderParser::TypeDefinition]
1311
def initialize(definition:)
1412
@definition = definition
@@ -19,7 +17,7 @@ def initialize(definition:)
1917
def write_go_file(dist_dir)
2018
go_file_path = File.join(dist_dir, "type_generated.go")
2119

22-
generate_initial_go_file(go_file_path)
20+
GoUtil.generate_initial_go_file(go_file_path)
2321

2422
File.open(go_file_path, "a") do |f|
2523
f.write(generate_go_content)
@@ -28,7 +26,7 @@ def write_go_file(dist_dir)
2826

2927
# @return [String]
3028
def generate_go_content
31-
go_type_name = snake_to_camel(name)
29+
go_type_name = GoUtil.snake_to_camel(name)
3230

3331
<<~GO
3432
// #{go_type_name} is a type for passing `C.#{name}` in and out of package
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
module RubyHToGo
4+
# type attribute helper
5+
module TypeHelper
6+
# @param pos [Symbol,nil] :arg, :typeref, :return
7+
# @param pointer [Symbol,nil] pointer hint (:ref, :array, :ref_array, :function, :sref, :str_array, :in_ref, :raw)
8+
# @param pointer_length [Integer]
9+
# @return [String]
10+
def ruby_c_type_to_go_type(pos: nil, pointer: nil, pointer_length: 0)
11+
GoUtil.ruby_c_type_to_go_type(type, pos:, pointer:, pointer_length:)
12+
end
13+
14+
# Cast C type to cgo type. (Used in wrapper function)
15+
# @return [String]
16+
def cast_to_cgo_type
17+
GoUtil.cast_to_cgo_type(type)
18+
end
19+
end
20+
end

_tools/ruby_h_to_go/lib/ruby_h_to_go/typeref_definition.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class TyperefDefinition
77

88
def_delegators :@definition, :==, :type, :type=, :pointer, :pointer=, :pointer?
99

10-
include GeneratorHelper
10+
include TypeHelper
1111

1212
# @param definition [RubyHeaderParser::TyperefDefinition]
1313
def initialize(definition:)
@@ -18,14 +18,14 @@ def initialize(definition:)
1818
def go_function_typeref
1919
return "" if type == "void" && !pointer?
2020

21-
ruby_c_type_to_go_type(type, pos: :typeref, pointer:)
21+
ruby_c_type_to_go_type(pos: :typeref, pointer:)
2222
end
2323

2424
# @return [String]
2525
def cast_func_for_function_return
2626
return "" if type == "void" && !pointer?
2727

28-
cast_func = ruby_c_type_to_go_type(type, pos: :return, pointer:)
28+
cast_func = ruby_c_type_to_go_type(pos: :return, pointer:)
2929
return "(#{cast_func})" if cast_func.start_with?("*")
3030

3131
cast_func

_tools/ruby_h_to_go/lib/ruby_header_parser.rb

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@
22

33
require "yaml"
44

5-
require_relative "ruby_header_parser/argument_definition"
6-
require_relative "ruby_header_parser/data"
7-
require_relative "ruby_header_parser/enum_definition"
8-
require_relative "ruby_header_parser/function_definition"
9-
require_relative "ruby_header_parser/parser"
10-
require_relative "ruby_header_parser/struct_definition"
11-
require_relative "ruby_header_parser/type_definition"
12-
require_relative "ruby_header_parser/typeref_definition"
13-
require_relative "ruby_header_parser/util"
14-
155
# Parser for ruby.h
166
module RubyHeaderParser
7+
autoload :ArgumentDefinition, "ruby_header_parser/argument_definition"
8+
autoload :Data, "ruby_header_parser/data"
9+
autoload :EnumDefinition, "ruby_header_parser/enum_definition"
10+
autoload :FunctionDefinition, "ruby_header_parser/function_definition"
11+
autoload :Parser, "ruby_header_parser/parser"
12+
autoload :StructDefinition, "ruby_header_parser/struct_definition"
13+
autoload :TypeDefinition, "ruby_header_parser/type_definition"
14+
autoload :TyperefDefinition, "ruby_header_parser/typeref_definition"
15+
autoload :Util, "ruby_header_parser/util"
1716
end

0 commit comments

Comments
 (0)