Skip to content

Commit ad93f18

Browse files
authored
Merge pull request #162 from sue445/feature/refactor_function
Refactor `RubyHToGo::FunctionDefinition#generate_go_content`
2 parents 653cc6d + da1ffee commit ad93f18

File tree

5 files changed

+108
-71
lines changed

5 files changed

+108
-71
lines changed

.rubocop_todo.yml

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This configuration was generated by
22
# `rubocop --auto-gen-config`
3-
# on 2024-10-03 13:07:51 UTC using RuboCop version 1.66.1.
3+
# on 2024-10-03 14:22:30 UTC using RuboCop version 1.66.1.
44
# The point is for the user to remove these configuration records
55
# one by one as the offenses are removed from the code base.
66
# Note that changes in the inspected code, or installation of new
@@ -9,30 +9,25 @@
99
# Offense count: 8
1010
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
1111
Metrics/AbcSize:
12-
Max: 81
12+
Max: 50
1313

14-
# Offense count: 2
14+
# Offense count: 1
1515
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
1616
# AllowedMethods: refine
1717
Metrics/BlockLength:
1818
Max: 48
1919

20-
# Offense count: 1
21-
# Configuration parameters: CountComments, CountAsOne.
22-
Metrics/ClassLength:
23-
Max: 102
24-
2520
# Offense count: 5
2621
# Configuration parameters: AllowedMethods, AllowedPatterns.
2722
Metrics/CyclomaticComplexity:
28-
Max: 16
23+
Max: 13
2924

30-
# Offense count: 14
25+
# Offense count: 17
3126
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
3227
Metrics/MethodLength:
33-
Max: 77
28+
Max: 55
3429

3530
# Offense count: 3
3631
# Configuration parameters: AllowedMethods, AllowedPatterns.
3732
Metrics/PerceivedComplexity:
38-
Max: 17
33+
Max: 14

_tools/ruby_h_to_go/lib/ruby_h_to_go/argument_definition.rb

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,94 @@ def cast_to_cgo
5555

5656
"#{cast_to_cgo_type(type)}(#{go_name})"
5757
end
58+
59+
# @param char_var_count [Integer]
60+
# @param chars_var_count [Integer]
61+
#
62+
# @return [Array<String, Array<String>, Array<String>>]
63+
# - casted_go_arg [String]
64+
# - before_call_function_lines [Array<String>]
65+
# - after_call_function_lines [Array<String>]
66+
def generate_go_arguments(char_var_count:, chars_var_count:)
67+
case pointer
68+
when :ref
69+
case type
70+
when "char"
71+
generate_go_arguments_for_char_pointer(char_var_count)
72+
73+
when "void"
74+
# c_arg is pointer
75+
[go_name, [], []]
76+
77+
else
78+
c_var_name = "c#{snake_to_camel(go_name)}"
79+
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})"
82+
83+
["&#{c_var_name}", [before_call_function_line], [after_call_function_line]]
84+
end
85+
86+
when :function
87+
["toCFunctionPointer(#{go_name})", [], []]
88+
89+
when :str_array
90+
generate_go_arguments_for_str_array(chars_var_count)
91+
92+
else
93+
[cast_to_cgo, [], []]
94+
end
95+
end
96+
97+
private
98+
99+
# @param char_var_count [Integer]
100+
#
101+
# @return [Array<String, Array<String>, Array<String>>]
102+
# - casted_go_arg [String]
103+
# - before_call_function_lines [Array<String>]
104+
# - after_call_function_lines [Array<String>]
105+
def generate_go_arguments_for_char_pointer(char_var_count)
106+
# self is string
107+
if char_var_count >= 2
108+
chars_var_name = "char#{snake_to_camel(go_name)}"
109+
clean_var_name = "cleanChar#{go_name}"
110+
else
111+
chars_var_name = "char"
112+
clean_var_name = "clean"
113+
end
114+
115+
before_call_function_lines = [
116+
"#{chars_var_name}, #{clean_var_name} := string2Char(#{go_name})",
117+
"defer #{clean_var_name}()",
118+
"",
119+
]
120+
121+
[chars_var_name, before_call_function_lines, []]
122+
end
123+
124+
# @param chars_var_count [Integer]
125+
#
126+
# @return [Array<String, Array<String>, Array<String>>]
127+
# - casted_go_arg [String]
128+
# - before_call_function_lines [Array<String>]
129+
# - after_call_function_lines [Array<String>]
130+
def generate_go_arguments_for_str_array(chars_var_count)
131+
if chars_var_count >= 2
132+
chars_var_name = "chars#{snake_to_camel(go_name)}"
133+
clean_var_name = "cleanChars#{go_name}"
134+
else
135+
chars_var_name = "chars"
136+
clean_var_name = "cleanChars"
137+
end
138+
139+
before_call_function_lines = [
140+
"#{chars_var_name}, #{clean_var_name} := strings2Chars(#{go_name})",
141+
"defer #{clean_var_name}()",
142+
"",
143+
]
144+
145+
[chars_var_name, before_call_function_lines, []]
146+
end
58147
end
59148
end

_tools/ruby_h_to_go/lib/ruby_h_to_go/function_definition.rb

Lines changed: 6 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ def generate_go_content
5252

5353
go_function_lines << "func #{go_function_name}(#{go_function_args.join(", ")}) #{go_function_typeref} {"
5454

55-
call_c_method = "C.#{name}("
56-
5755
casted_go_args = []
5856
char_var_count = args.count { |c_arg| c_arg.type == "char" && c_arg.pointer == :ref }
5957
chars_var_count = args.count { |c_arg| c_arg.type == "char" && c_arg.pointer == :str_array }
@@ -62,59 +60,14 @@ def generate_go_content
6260
after_call_function_lines = []
6361

6462
args.each do |c_arg|
65-
case c_arg.pointer
66-
when :ref
67-
case c_arg.type
68-
when "char"
69-
# c_arg is string
70-
if char_var_count >= 2
71-
chars_var_name = "char#{snake_to_camel(c_arg.go_name)}"
72-
clean_var_name = "cleanChar#{c_arg.go_name}"
73-
else
74-
chars_var_name = "char"
75-
clean_var_name = "clean"
76-
end
77-
78-
go_function_lines << "#{chars_var_name}, #{clean_var_name} := string2Char(#{c_arg.go_name})"
79-
go_function_lines << "defer #{clean_var_name}()"
80-
go_function_lines << ""
81-
82-
casted_go_args << chars_var_name.to_s
83-
when "void"
84-
# c_arg is pointer
85-
casted_go_args << c_arg.go_name
86-
else
87-
c_var_name = "c#{snake_to_camel(c_arg.go_name)}"
88-
89-
before_call_function_lines << "var #{c_var_name} #{cast_to_cgo_type(c_arg.type)}"
90-
after_call_function_lines <<
91-
"*#{c_arg.go_name} = #{ruby_c_type_to_go_type(c_arg.type, pos: :arg)}(#{c_var_name})"
92-
93-
casted_go_args << "&#{c_var_name}"
94-
end
95-
when :function
96-
casted_go_args << "toCFunctionPointer(#{c_arg.go_name})"
97-
when :str_array
98-
if chars_var_count >= 2
99-
chars_var_name = "chars#{snake_to_camel(c_arg.go_name)}"
100-
clean_var_name = "cleanChars#{c_arg.go_name}"
101-
else
102-
chars_var_name = "chars"
103-
clean_var_name = "cleanChars"
104-
end
105-
106-
go_function_lines << "#{chars_var_name}, #{clean_var_name} := strings2Chars(#{c_arg.go_name})"
107-
go_function_lines << "defer #{clean_var_name}()"
108-
go_function_lines << ""
109-
110-
casted_go_args << chars_var_name
111-
else
112-
casted_go_args << c_arg.cast_to_cgo
113-
end
63+
casted_go_arg, before_lines, after_lines = c_arg.generate_go_arguments(char_var_count:, chars_var_count:)
64+
65+
casted_go_args << casted_go_arg
66+
before_call_function_lines.push(*before_lines)
67+
after_call_function_lines.push(*after_lines)
11468
end
11569

116-
call_c_method << casted_go_args.join(", ")
117-
call_c_method << ")"
70+
call_c_method = "C.#{name}(#{casted_go_args.join(", ")})"
11871

11972
go_function_lines.push(*before_call_function_lines)
12073
cast_func = typeref.cast_func_for_function_return

_tools/ruby_h_to_go/spec/ruby_h_to_go/function_definition_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,10 +284,10 @@
284284
//
285285
// rb_scan_args_set(int kw_flag, int argc, const VALUE *argv,
286286
func RbScanArgsSet(kw_flag int, argc int, argv *VALUE, n_lead int, n_opt int, n_trail int, f_var Bool, f_hash Bool, f_block Bool, vars []*VALUE, fmt string, varc int) int {
287+
var cArgv C.VALUE
287288
char, clean := string2Char(fmt)
288289
defer clean()
289290
290-
var cArgv C.VALUE
291291
ret := int(C.rb_scan_args_set(C.int(kw_flag), C.int(argc), &cArgv, C.int(n_lead), C.int(n_opt), C.int(n_trail), C._Bool(f_var), C._Bool(f_hash), C._Bool(f_block), toCArray[*VALUE, *C.VALUE](vars), char, C.int(varc)))
292292
*argv = VALUE(cArgv)
293293
return ret
@@ -411,10 +411,10 @@
411411
//
412412
// int rb_find_file_ext(VALUE *feature, const char *const *exts)
413413
func RbFindFileExt(feature *VALUE, exts []string) int {
414+
var cFeature C.VALUE
414415
chars, cleanChars := strings2Chars(exts)
415416
defer cleanChars()
416417
417-
var cFeature C.VALUE
418418
ret := int(C.rb_find_file_ext(&cFeature, chars))
419419
*feature = VALUE(cFeature)
420420
return ret

ruby/function_generated.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)