Skip to content

Commit 719be80

Browse files
authored
Merge pull request #141 from sue445/feature/fix_rb_event_flag_t
Check whether generated code is valid
2 parents efef514 + acaa70d commit 719be80

File tree

6 files changed

+42
-26
lines changed

6 files changed

+42
-26
lines changed

.github/workflows/ruby_h_to_go.yml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,28 @@ defaults:
2121

2222
jobs:
2323
test:
24-
name: "test (Ruby ${{ matrix.ruby }})"
24+
name: "test (Go ${{ matrix.golang }}, Ruby ${{ matrix.ruby }})"
2525

2626
runs-on: ubuntu-latest
2727

2828
strategy:
2929
fail-fast: false
3030

3131
matrix:
32+
golang:
33+
# TODO: Enable after repo is published
34+
# - "1.22"
35+
- "1.23"
3236
ruby:
3337
- "3.3"
3438

3539
steps:
3640
- uses: actions/checkout@v4
3741

42+
- uses: actions/setup-go@v5
43+
with:
44+
go-version: ${{ matrix.golang }}
45+
3846
- uses: ruby/setup-ruby@v1
3947
with:
4048
ruby-version: ${{ matrix.ruby }}
@@ -43,6 +51,8 @@ jobs:
4351
- run: sudo apt-get update
4452
- run: sudo apt-get install -y universal-ctags
4553

54+
- run: go install golang.org/x/tools/cmd/goimports@latest
55+
4656
- run: bundle exec rspec
4757

4858
- name: Slack Notification (not success)

_tools/ruby_h_to_go/lib/ruby_h_to_go/cli.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ def perform
3030
go_fmt
3131
end
3232

33+
private
34+
35+
# @return [RubyHeaderParser::Parser]
36+
def parser
37+
@parser ||= RubyHeaderParser::Parser.new(header_dir)
38+
end
39+
3340
def write_type_definitions_to_go_file
3441
type_definitions = parser.extract_type_definitions.map do |definition|
3542
RubyHToGo::TypeDefinition.new(definition:, header_dir:)
@@ -70,13 +77,6 @@ def write_function_definitions_to_go_file
7077
end
7178
end
7279

73-
private
74-
75-
# @return [RubyHeaderParser::Parser]
76-
def parser
77-
@parser ||= RubyHeaderParser::Parser.new(header_dir)
78-
end
79-
8080
# Clean all generated files in dist/
8181
def clean_generated_files
8282
FileUtils.rm_f(Dir.glob(File.join(dist_dir, "*.go")))

_tools/ruby_h_to_go/lib/ruby_header_parser/parser.rb

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ def initialize(header_dir)
1919

2020
# @return [Array<RubyHeaderParser::FunctionDefinition>]
2121
def extract_function_definitions
22-
__extract_function_definitions(c_kinds: "p", is_parse_multiline_definition: true)
22+
__extract_function_definitions(c_kinds: "p", kind: "p", is_parse_multiline_definition: true)
2323
end
2424

2525
# @return [Array<RubyHeaderParser::FunctionDefinition>]
2626
def extract_static_inline_function_definitions
27-
__extract_function_definitions(c_kinds: "+p-d", is_parse_multiline_definition: false)
27+
__extract_function_definitions(c_kinds: "+p-d", kind: "f", is_parse_multiline_definition: false)
2828
end
2929

3030
# @return [Array<RubyHeaderParser::StructDefinition>]
@@ -66,9 +66,10 @@ def extract_type_definitions
6666
private
6767

6868
# @param c_kinds [String]
69+
# @param kind [String]
6970
# @param is_parse_multiline_definition [Boolean]
7071
# @return [Array<RubyHeaderParser::FunctionDefinition>]
71-
def __extract_function_definitions(c_kinds:, is_parse_multiline_definition:)
72+
def __extract_function_definitions(c_kinds:, kind:, is_parse_multiline_definition:)
7273
stdout = execute_ctags("--c-kinds=#{c_kinds} --fields=+nS --extras=+q")
7374

7475
stdout.each_line.with_object([]) do |line, definitions|
@@ -78,6 +79,8 @@ def __extract_function_definitions(c_kinds:, is_parse_multiline_definition:)
7879

7980
next unless data.should_generate_function?(function_name)
8081

82+
next unless parts[3] == kind
83+
8184
line_num = Util.find_field(parts, "line").to_i
8285
definition =
8386
parse_function_definition(filepath: parts[1], pattern: parts[2], line_num:, is_parse_multiline_definition:)
@@ -213,11 +216,12 @@ def parse_definition_args(function_name, signature)
213216
def create_typeref(definition:, function_name:, typeref_field:)
214217
typeref_type =
215218
if typeref_field
216-
typeref_field.gsub(/^RBIMPL_ATTR_NONNULL\s*\(\(\)\)/, "").strip
219+
type = typeref_field.gsub(/[A-Z_]+\s*\(\(.*\)\)/, "").gsub("RUBY_SYMBOL_EXPORT_BEGIN", "")
220+
Util.sanitize_type(type) # rubocop:disable Style/IdenticalConditionalBranches
217221
else
218222
# parse typeref in definition
219223
type = definition[0...definition.index(function_name)].gsub("char *", "char*").strip
220-
Util.sanitize_type(type)
224+
Util.sanitize_type(type) # rubocop:disable Style/IdenticalConditionalBranches
221225
end
222226

223227
typeref_pointer = nil

_tools/ruby_h_to_go/spec/ruby_h_to_go/cli_spec.rb

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,12 @@
1010
)
1111
end
1212

13-
describe "#write_type_definitions_to_go_file" do
14-
subject { cli.write_type_definitions_to_go_file }
13+
describe "#perform" do
14+
subject { cli.perform }
1515

16-
it { expect { subject }.not_to raise_error }
17-
end
18-
19-
describe "#write_struct_definitions_to_go_file" do
20-
subject { cli.write_struct_definitions_to_go_file }
21-
22-
it { expect { subject }.not_to raise_error }
23-
end
24-
25-
describe "#write_function_definitions_to_go_file" do
26-
subject { cli.write_function_definitions_to_go_file }
16+
before do
17+
FileUtils.cp(File.join(project_root_dir, "go.mod"), temp_dir)
18+
end
2719

2820
it { expect { subject }.not_to raise_error }
2921
end

_tools/ruby_h_to_go/spec/ruby_header_parser/parser_spec.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@
143143

144144
its(:count) { should be > 0 }
145145

146+
it "should not return type defined in typedef" do
147+
definition_names = definitions.map(&:name)
148+
expect(definition_names).not_to include("rb_event_flag_t")
149+
end
150+
146151
context "rb_num2int_inline" do
147152
subject { definitions.find { |d| d.name == "rb_num2int_inline" } }
148153

_tools/ruby_h_to_go/spec/spec_helper.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,8 @@
111111
meta[:aggregate_failures] = true
112112
end
113113
end
114+
115+
# @return [String]
116+
def project_root_dir
117+
File.expand_path("../../..", __dir__)
118+
end

0 commit comments

Comments
 (0)