diff --git a/lib/ffi_generator/clang/cursor.rb b/lib/ffi_generator/clang/cursor.rb index 2d79ac0..672896e 100644 --- a/lib/ffi_generator/clang/cursor.rb +++ b/lib/ffi_generator/clang/cursor.rb @@ -87,6 +87,10 @@ def spelling String.from_c(C.get_cursor_spelling(@c)).to_s end + def attribute? + C.is_attribute(kind) == 1 + end + def ==(other) other.is_a?(self.class) && C.equal_cursors(@c, other.c) == 1 end diff --git a/lib/ffi_generator/generators/from_c_generator/generator.rb b/lib/ffi_generator/generators/from_c_generator/generator.rb index b9f1df8..edf4a28 100644 --- a/lib/ffi_generator/generators/from_c_generator/generator.rb +++ b/lib/ffi_generator/generators/from_c_generator/generator.rb @@ -319,7 +319,17 @@ def read_struct_or_union_declaration(declaration_cursor, comment, name) last_nested_declaration = nil struct.fields << { name: field_name, type: field_type, comment: field_comment } else - raise + if child.attribute? + attr_name = child.extent.tokens.find { |token| token.kind == :identifier } + attr_value = child.extent.tokens.find { |token| token.kind == :literal } + if attr_name + struct.attributes[attr_name.spelling.to_sym] = attr_value ? attr_value.spelling : true + else + raise "Unexpected attribute item #{child}" + end + else + raise "Unrecognized item #{child.kind}" + end end end diff --git a/lib/ffi_generator/generators/from_c_generator/struct_or_union.rb b/lib/ffi_generator/generators/from_c_generator/struct_or_union.rb index 74cc46f..8de7b50 100644 --- a/lib/ffi_generator/generators/from_c_generator/struct_or_union.rb +++ b/lib/ffi_generator/generators/from_c_generator/struct_or_union.rb @@ -3,7 +3,7 @@ class Generator class StructOrUnion < Type attr_accessor :writer, :name, :description - attr_reader :fields, :oo_functions, :written + attr_reader :fields, :attributes, :oo_functions, :written def initialize(generator, name, is_union) @generator = generator @@ -12,6 +12,7 @@ def initialize(generator, name, is_union) @is_union = is_union @description = [] @fields = [] + @attributes = {} @oo_functions = [] @written = false end