ffi-clang 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7bac4481c13b37b86189208dd7e0589bd96a42059319828c22ae623025ccc75
4
- data.tar.gz: 3d6cc4ebca61f93b710b5a8fcc80d6fa51eeb8aac466246775c5ba80d8274c32
3
+ metadata.gz: 54ebc6d99d0f99d46028bd950f969bacaaf32e95b8824fa504902974357882d2
4
+ data.tar.gz: 9732b945316e50383c601f5f9938f555445d13f5ce25428a6acadfacb57df284
5
5
  SHA512:
6
- metadata.gz: 816df5fbe722de3c3bc513598455a076bc64a32ee0d4d1697bc51dca767d06b9645be1c6dba444bc50d9d3f073fc02b2d13c6afbce355617df03368dc416930c
7
- data.tar.gz: ec3be8892d6710742e173e54cb6c4f498b28a5178ca7c15ad9c08aae66f67824a039820f7ddff0a21c8aa50221c286dbeef9a2132e140bebb8c5f65fc69928c9
6
+ metadata.gz: e3bb22b3b0e304d05edd4628570642efb0ef7dea8fe588bd37c6d284e06291d0cf7561ceffc8ff9ded5450e1f7751943e91843cb29eaca5c59227cb891ea39cb
7
+ data.tar.gz: 74d1a5920126e62a88a089fa205cdfa1b117ea2e0b8ca90ebc7807395172c436c0d72ccdcb6384a00c6d1d47b96c30e5568e0e991a2bcb0d2fc4d36df8a02731
checksums.yaml.gz.sig CHANGED
@@ -1,3 +1,3 @@
1
- ���%%�Cƕ��j�.� 7��8�#Hx���m�ԭT7Z@���@Ŏ��,��56t��x S[��|�ux9,� !�(�z�V����}��V?c+���{KJ���a p����"��P�$�V �)�HN�խ��c� m+���S+"U9���0��ErK���
2
- jļ���(Ȑ0B�^uط�r�h q��T���
3
- prab}���ّ7w�����Ji��uYU�7��?��{(���bU�X�7<�`u>�,���(J#xk_*��lt�^NC>�+9𡵅R`������0"���}�4
1
+ b�� �^P�r:���V<��j����WG�+��� ��_��X2gB~�ȥ��oL �\���E��pd e3�?��� ��+�m;��OO��baY,^�ӵ鴯�MVhFe]�[X��Y����pA�̱�^v�,����/l:T=�=�VΒuT�:u�:���Qbd"a2A�\���^�
2
+ �Ո��4#��~��:�ɹF8��O��qTk
3
+ KF�{�A���� J;"��8�$�XW��kD��W~�d�����'�<>�����Eew���M*��*)�b����'s�^~�X��;��Ö#�ۦi���'�~�mE�u�
@@ -20,11 +20,12 @@ require_relative 'printing_policy'
20
20
  require_relative 'source_location'
21
21
  require_relative 'source_range'
22
22
  require_relative 'comment'
23
- require_relative 'type'
24
23
 
25
24
  module FFI
26
25
  module Clang
27
26
  class Cursor
27
+ include Enumerable
28
+
28
29
  attr_reader :cursor
29
30
  attr_reader :translation_unit
30
31
 
@@ -62,6 +63,14 @@ module FFI
62
63
  CodeCompletion::String.new Lib.get_cursor_completion_string(@cursor)
63
64
  end
64
65
 
66
+ def anonymous?
67
+ Lib.cursor_is_anonymous(@cursor) != 0
68
+ end
69
+
70
+ def anonymous_record_declaration?
71
+ Lib.cursor_is_anonymous_record_decl(@cursor) != 0
72
+ end
73
+
65
74
  def declaration?
66
75
  Lib.is_declaration(kind) != 0
67
76
  end
@@ -137,6 +146,9 @@ module FFI
137
146
 
138
147
  def qualified_name
139
148
  if self.kind != :cursor_translation_unit
149
+ if self.semantic_parent.kind == :cursor_invalid_file
150
+ raise(ArgumentError, "Invalid semantic parent: #{self}")
151
+ end
140
152
  result = self.semantic_parent.qualified_name
141
153
  result ? "#{result}::#{self.spelling}" : self.spelling
142
154
  end
@@ -155,7 +167,7 @@ module FFI
155
167
  end
156
168
 
157
169
  def kind
158
- @cursor[:kind]
170
+ @cursor ? @cursor[:kind] : nil
159
171
  end
160
172
 
161
173
  def kind_spelling
@@ -163,15 +175,15 @@ module FFI
163
175
  end
164
176
 
165
177
  def type
166
- Type.new Lib.get_cursor_type(@cursor), @translation_unit
178
+ Types::Type.create Lib.get_cursor_type(@cursor), @translation_unit
167
179
  end
168
180
 
169
181
  def result_type
170
- Type.new Lib.get_cursor_result_type(@cursor), @translation_unit
182
+ Types::Type.create Lib.get_cursor_result_type(@cursor), @translation_unit
171
183
  end
172
184
 
173
185
  def underlying_type
174
- Type.new Lib.get_typedef_decl_underlying_type(@cursor), @translation_unit
186
+ Types::Type.create Lib.get_typedef_decl_underlying_type(@cursor), @translation_unit
175
187
  end
176
188
 
177
189
  def virtual_base?
@@ -211,7 +223,7 @@ module FFI
211
223
  end
212
224
 
213
225
  def enum_type
214
- Type.new Lib.get_enum_decl_integer_type(@cursor), @translation_unit
226
+ Types::Type.create Lib.get_enum_decl_integer_type(@cursor), @translation_unit
215
227
  end
216
228
 
217
229
  def specialized_template
@@ -269,14 +281,57 @@ module FFI
269
281
  Lib.get_num_args @cursor
270
282
  end
271
283
 
272
- def visit_children(&block)
284
+ def each(recurse = true, &block)
285
+ return to_enum(:each, recurse) unless block_given?
286
+
273
287
  adapter = Proc.new do |cxcursor, parent_cursor, unused|
274
- block.call Cursor.new(cxcursor, @translation_unit), Cursor.new(parent_cursor, @translation_unit)
288
+ # Call the block and capture the result. This lets advanced users
289
+ # modify the recursion on a case by case basis if needed
290
+ result = block.call Cursor.new(cxcursor, @translation_unit), Cursor.new(parent_cursor, @translation_unit)
291
+ case result
292
+ when :continue
293
+ :continue
294
+ when :recurse
295
+ :recurse
296
+ else
297
+ recurse ? :recurse : :continue
298
+ end
275
299
  end
276
-
300
+
277
301
  Lib.visit_children(@cursor, adapter, nil)
278
302
  end
279
303
 
304
+ def visit_children(&block)
305
+ each(false, &block)
306
+ end
307
+
308
+ def ancestors_by_kind(*kinds)
309
+ result = Array.new
310
+
311
+ parent = self
312
+ while parent != self.semantic_parent
313
+ parent = self.semantic_parent
314
+ if kinds.include?(parent.kind)
315
+ result << parent
316
+ end
317
+ end
318
+ result
319
+ end
320
+
321
+ def find_by_kind(recurse, *kinds)
322
+ unless (recurse == nil || recurse == true || recurse == false)
323
+ raise("Recurse parameter must be nil or a boolean value. Value was: #{recurse}")
324
+ end
325
+
326
+ result = Array.new
327
+ self.each(recurse) do |child, parent|
328
+ if kinds.include?(child.kind)
329
+ result << child
330
+ end
331
+ end
332
+ result
333
+ end
334
+
280
335
  def find_references_in_file(file = nil, &block)
281
336
  file ||= Lib.extract_string Lib.get_translation_unit_spelling(@translation_unit)
282
337
 
@@ -293,6 +348,10 @@ module FFI
293
348
  Lib.get_cursor_linkage(@cursor)
294
349
  end
295
350
 
351
+ def exception_specification
352
+ Lib.get_cursor_exception_specification_type(@cursor)
353
+ end
354
+
296
355
  def availability
297
356
  Lib.get_cursor_availability(@cursor)
298
357
  end
@@ -384,46 +443,10 @@ module FFI
384
443
  Lib.get_cursor_hash(@cursor)
385
444
  end
386
445
 
387
- def find_all(*kinds)
388
- filter do |child, parent|
389
- kinds.include?(child.kind)
390
- end
391
- end
392
-
393
- def find_first(*kinds)
394
- find_all(*kinds).first
395
- end
396
-
397
- def filter
398
- return to_enum(:select) unless block_given?
399
-
400
- matching = []
401
-
402
- self.visit_children do |child, parent|
403
- if yield(child, parent)
404
- matching << child
405
- end
406
-
407
- :recurse
408
- end
409
-
410
- return matching
411
- end
412
-
413
- def select
414
- filter do |child, parent|
415
- yield(child)
416
- end
417
- end
418
-
419
446
  def to_s
420
447
  "Cursor <#{self.kind.to_s.gsub(/^cursor_/, '')}: #{self.spelling}>"
421
448
  end
422
449
 
423
- def to_a
424
- filter.collect{|child, parent| child}
425
- end
426
-
427
450
  def references(file = nil)
428
451
  refs = []
429
452
  self.find_references_in_file(file) do |cursor, unused|
@@ -319,6 +319,19 @@ module FFI
319
319
  :external, 4,
320
320
  ]
321
321
 
322
+ enum :exception_specification_type, [
323
+ :none,
324
+ :dynamic_none,
325
+ :dynamic,
326
+ :ms_any,
327
+ :basic_noexcept,
328
+ :computed_noexcept,
329
+ :unevaluated,
330
+ :uninstantiated,
331
+ :unparsed,
332
+ :no_throw
333
+ ]
334
+
322
335
  class CXCursor < FFI::Struct
323
336
  layout(
324
337
  :kind, :cursor_kind,
@@ -441,6 +454,8 @@ module FFI
441
454
  attach_function :find_references_in_file, :clang_findReferencesInFile, [CXCursor.by_value, :CXFile, CXCursorAndRangeVisitor.by_value], :result
442
455
 
443
456
  attach_function :get_cursor_type, :clang_getCursorType, [CXCursor.by_value], CXType.by_value
457
+ attach_function :cursor_is_anonymous, :clang_Cursor_isAnonymous, [CXCursor.by_value], :uint
458
+ attach_function :cursor_is_anonymous_record_decl, :clang_Cursor_isAnonymousRecordDecl, [CXCursor.by_value], :uint
444
459
  attach_function :get_cursor_result_type, :clang_getCursorResultType, [CXCursor.by_value], CXType.by_value
445
460
  attach_function :get_typedef_decl_underlying_type, :clang_getTypedefDeclUnderlyingType, [CXCursor.by_value], CXType.by_value
446
461
  attach_function :get_enum_decl_integer_type, :clang_getEnumDeclIntegerType, [CXCursor.by_value], CXType.by_value
@@ -452,6 +467,7 @@ module FFI
452
467
 
453
468
  attach_function :get_cursor_availability, :clang_getCursorAvailability, [CXCursor.by_value], :availability
454
469
  attach_function :get_cursor_linkage, :clang_getCursorLinkage, [CXCursor.by_value], :linkage_kind
470
+ attach_function :get_cursor_exception_specification_type, :clang_getCursorExceptionSpecificationType, [CXCursor.by_value], :exception_specification_type
455
471
  attach_function :get_included_file, :clang_getIncludedFile, [CXCursor.by_value], :CXFile
456
472
  attach_function :get_cursor_hash, :clang_hashCursor, [CXCursor.by_value], :uint
457
473
 
@@ -169,6 +169,20 @@ module FFI
169
169
  :layout_error_undeduced, -6
170
170
  ]
171
171
 
172
+ # Also defined in cursor.rb
173
+ enum :exception_specification_type, [
174
+ :none,
175
+ :dynamic_none,
176
+ :dynamic,
177
+ :ms_any,
178
+ :basic_noexcept,
179
+ :computed_noexcept,
180
+ :unevaluated,
181
+ :uninstantiated,
182
+ :unparsed,
183
+ :no_throw
184
+ ]
185
+
172
186
  class CXType < FFI::Struct
173
187
  layout(
174
188
  :kind, :kind,
@@ -206,6 +220,7 @@ module FFI
206
220
  attach_function :type_get_cxx_ref_qualifier, :clang_Type_getCXXRefQualifier, [CXType.by_value], :ref_qualifier_kind
207
221
 
208
222
  attach_function :get_fuction_type_calling_conv, :clang_getFunctionTypeCallingConv, [CXType.by_value], :calling_conv
223
+ attach_function :get_exception_specification_type, :clang_getExceptionSpecificationType, [CXType.by_value], :exception_specification_type
209
224
 
210
225
  attach_function :equal_types, :clang_equalTypes, [CXType.by_value, CXType.by_value], :uint
211
226
  end
@@ -0,0 +1,15 @@
1
+ module FFI
2
+ module Clang
3
+ module Types
4
+ class Array < Type
5
+ def element_type
6
+ Type.create Lib.get_array_element_type(@type), @translation_unit
7
+ end
8
+
9
+ def size
10
+ Lib.get_array_size(@type)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ module FFI
2
+ module Clang
3
+ module Types
4
+ class Elaborated < Type
5
+ def canonical
6
+ Type.create Lib.get_canonical_type(@type), @translation_unit
7
+ end
8
+
9
+ # Example anonymous union where `u` is an elaborated type
10
+ #
11
+ # typedef struct {
12
+ # union {
13
+ # int idata;
14
+ # } u;
15
+ # } SomeStruct;
16
+ def anonymous?
17
+ self.declaration.anonymous?
18
+ end
19
+
20
+ def pointer?
21
+ self.canonical.is_a?(Pointer)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,43 @@
1
+ module FFI
2
+ module Clang
3
+ module Types
4
+ class Function < Type
5
+ include Enumerable
6
+
7
+ def variadic?
8
+ Lib.is_function_type_variadic(@type) != 0
9
+ end
10
+
11
+ def args_size
12
+ Lib.get_num_arg_types(@type)
13
+ end
14
+
15
+ def arg_type(i)
16
+ Type.create Lib.get_arg_type(@type, i), @translation_unit
17
+ end
18
+
19
+ def arg_types
20
+ return to_enum(:arg_types) unless block_given?
21
+
22
+ self.args_size.times do |i|
23
+ yield self.arg_type(i)
24
+ end
25
+
26
+ self
27
+ end
28
+
29
+ def result_type
30
+ Type.create Lib.get_result_type(@type), @translation_unit
31
+ end
32
+
33
+ def calling_conv
34
+ Lib.get_fuction_type_calling_conv(@type)
35
+ end
36
+
37
+ def exception_specification
38
+ Lib.get_exception_specification_type(@type)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,42 @@
1
+ module FFI
2
+ module Clang
3
+ module Types
4
+ class Pointer < Type
5
+ def pointee
6
+ Type.create Lib.get_pointee_type(@type), @translation_unit
7
+ end
8
+
9
+ def function?
10
+ self.pointee.is_a?(Types::Function)
11
+ end
12
+
13
+ def class_type
14
+ if self.kind == :type_member_pointer
15
+ Type.create Lib.type_get_class_type(@type), @translation_unit
16
+ else
17
+ nil
18
+ end
19
+ end
20
+
21
+ def forward_declaration?
22
+ # Is this a pointer to a record (struct or union) that referenced
23
+ # a forward declaration at the point of its inclusion in the translation unit?
24
+ if !self.function? && self.pointee.is_a?(Types::Elaborated) &&
25
+ self.pointee.canonical.is_a?(Types::Record)
26
+
27
+ # Get the universal symbol reference
28
+ usr = self.pointee.canonical.declaration.usr
29
+
30
+ # Now does that same usr occur earlier in the file?
31
+ first_declaration, _ = self.translation_unit.cursor.find do |child, parent|
32
+ child.usr == usr
33
+ end
34
+ # NOTE - Maybe should also check that the line number of
35
+ # is less than the line number of the declaration this type references
36
+ first_declaration.forward_declaration?
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,26 @@
1
+ module FFI
2
+ module Clang
3
+ module Types
4
+ class Record < Type
5
+ def offsetof(field)
6
+ Lib.type_get_offset_of(@type, field)
7
+ end
8
+
9
+ def anonymous?
10
+ self.spelling.match(/unnamed/)
11
+ end
12
+
13
+ def record_type
14
+ case self.spelling
15
+ when /struct/
16
+ :struct
17
+ when /union/
18
+ :union
19
+ else
20
+ raise("Unknown record type: #{self.spelling}")
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2013, by Carlos Martín Nieto.
5
+ # Copyright, 2013-2024, by Samuel Williams.
6
+ # Copyright, 2013, by Takeshi Watanabe.
7
+ # Copyright, 2014, by Masahiro Sano.
8
+ # Copyright, 2014, by Niklas Therning.
9
+ # Copyright, 2024, by Charlie Savage.
10
+
11
+ module FFI
12
+ module Clang
13
+ module Types
14
+ class Type
15
+ attr_reader :type, :translation_unit
16
+
17
+ # Just hard code the types - they are not likely to change
18
+ def self.create(cxtype, translation_unit)
19
+ case cxtype[:kind]
20
+ when :type_pointer, :type_block_pointer, :type_obj_c_object_pointer, :type_member_pointer
21
+ Pointer.new(cxtype, translation_unit)
22
+ when :type_constant_array, :type_incomplete_array, :type_variable_array, :type_dependent_sized_array
23
+ Array.new(cxtype, translation_unit)
24
+ when :type_vector
25
+ Vector.new(cxtype, translation_unit)
26
+ when :type_function_no_proto, :type_function_proto
27
+ Function.new(cxtype, translation_unit)
28
+ when :type_elaborated
29
+ Elaborated.new(cxtype, translation_unit)
30
+ when :type_typedef
31
+ TypeDef.new(cxtype, translation_unit)
32
+ when :type_record
33
+ Record.new(cxtype, translation_unit)
34
+ else
35
+ Type.new(cxtype, translation_unit)
36
+ end
37
+ end
38
+
39
+ def initialize(type, translation_unit)
40
+ @type = type
41
+ @translation_unit = translation_unit
42
+ end
43
+
44
+ def kind
45
+ @type[:kind]
46
+ end
47
+
48
+ def kind_spelling
49
+ Lib.extract_string Lib.get_type_kind_spelling @type[:kind]
50
+ end
51
+
52
+ def spelling
53
+ Lib.extract_string Lib.get_type_spelling(@type)
54
+ end
55
+
56
+ def pod?
57
+ Lib.is_pod_type(@type) != 0
58
+ end
59
+
60
+ def const_qualified?
61
+ Lib.is_const_qualified_type(@type) != 0
62
+ end
63
+
64
+ def volatile_qualified?
65
+ Lib.is_volatile_qualified_type(@type) != 0
66
+ end
67
+
68
+ def restrict_qualified?
69
+ Lib.is_restrict_qualified_type(@type) != 0
70
+ end
71
+
72
+ def alignof
73
+ Lib.type_get_align_of(@type)
74
+ end
75
+
76
+ def sizeof
77
+ Lib.type_get_size_of(@type)
78
+ end
79
+
80
+ def ref_qualifier
81
+ Lib.type_get_cxx_ref_qualifier(@type)
82
+ end
83
+
84
+ def declaration
85
+ Cursor.new Lib.get_type_declaration(@type), @translation_unit
86
+ end
87
+
88
+ def non_reference_type
89
+ Type.create Lib.get_non_reference_type(@type),@translation_unit
90
+ end
91
+
92
+ def ==(other)
93
+ Lib.equal_types(@type, other.type) != 0
94
+ end
95
+
96
+ def to_s
97
+ "#{self.class.name} <#{self.kind}: #{self.spelling}>"
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,15 @@
1
+ module FFI
2
+ module Clang
3
+ module Types
4
+ class TypeDef < Type
5
+ def canonical
6
+ Type.create Lib.get_canonical_type(@type), @translation_unit
7
+ end
8
+
9
+ def anonymous?
10
+ self.canonical.kind == :type_record && self.canonical.anonymous?
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module FFI
2
+ module Clang
3
+ module Types
4
+ class Vector < Type
5
+ def element_type
6
+ Type.create Lib.get_element_type(@type), @translation_unit
7
+ end
8
+
9
+ def size
10
+ Lib.get_num_elements(@type)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -7,6 +7,6 @@
7
7
 
8
8
  module FFI
9
9
  module Clang
10
- VERSION = "0.9.0"
10
+ VERSION = "0.11.0"
11
11
  end
12
12
  end
data/lib/ffi/clang.rb CHANGED
@@ -46,3 +46,12 @@ require_relative 'clang/unsaved_file'
46
46
  require_relative 'clang/token'
47
47
  require_relative 'clang/code_completion'
48
48
  require_relative 'clang/compilation_database'
49
+
50
+ require_relative 'clang/types/type'
51
+ require_relative 'clang/types/array'
52
+ require_relative 'clang/types/elaborated'
53
+ require_relative 'clang/types/function'
54
+ require_relative 'clang/types/pointer'
55
+ require_relative 'clang/types/record'
56
+ require_relative 'clang/types/type_def'
57
+ require_relative 'clang/types/vector'
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-clang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -55,7 +55,7 @@ cert_chain:
55
55
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
56
56
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
57
57
  -----END CERTIFICATE-----
58
- date: 2024-04-07 00:00:00.000000000 Z
58
+ date: 2024-11-13 00:00:00.000000000 Z
59
59
  dependencies:
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: ffi
@@ -110,7 +110,14 @@ files:
110
110
  - lib/ffi/clang/source_range.rb
111
111
  - lib/ffi/clang/token.rb
112
112
  - lib/ffi/clang/translation_unit.rb
113
- - lib/ffi/clang/type.rb
113
+ - lib/ffi/clang/types/array.rb
114
+ - lib/ffi/clang/types/elaborated.rb
115
+ - lib/ffi/clang/types/function.rb
116
+ - lib/ffi/clang/types/pointer.rb
117
+ - lib/ffi/clang/types/record.rb
118
+ - lib/ffi/clang/types/type.rb
119
+ - lib/ffi/clang/types/type_def.rb
120
+ - lib/ffi/clang/types/vector.rb
114
121
  - lib/ffi/clang/unsaved_file.rb
115
122
  - lib/ffi/clang/version.rb
116
123
  - license.md
@@ -136,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
143
  - !ruby/object:Gem::Version
137
144
  version: '0'
138
145
  requirements: []
139
- rubygems_version: 3.5.3
146
+ rubygems_version: 3.5.22
140
147
  signing_key:
141
148
  specification_version: 4
142
149
  summary: Ruby FFI bindings for libclang C interface.
metadata.gz.sig CHANGED
Binary file
@@ -1,160 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Released under the MIT License.
4
- # Copyright, 2013, by Carlos Martín Nieto.
5
- # Copyright, 2013-2024, by Samuel Williams.
6
- # Copyright, 2013, by Takeshi Watanabe.
7
- # Copyright, 2014, by Masahiro Sano.
8
- # Copyright, 2014, by Niklas Therning.
9
- # Copyright, 2024, by Charlie Savage.
10
-
11
- module FFI
12
- module Clang
13
- class Type
14
- attr_reader :type
15
-
16
- def initialize(type, translation_unit)
17
- @type = type
18
- @translation_unit = translation_unit
19
- end
20
-
21
- def kind
22
- @type[:kind]
23
- end
24
-
25
- def kind_spelling
26
- Lib.extract_string Lib.get_type_kind_spelling @type[:kind]
27
- end
28
-
29
- def spelling
30
- Lib.extract_string Lib.get_type_spelling(@type)
31
- end
32
-
33
- def variadic?
34
- Lib.is_function_type_variadic(@type) != 0
35
- end
36
-
37
- def pod?
38
- Lib.is_pod_type(@type) != 0
39
- end
40
-
41
- def num_arg_types
42
- Lib.get_num_arg_types(@type)
43
- end
44
-
45
- def pointer?
46
- [:type_pointer, :type_block_pointer, :type_obj_c_object_pointer, :type_member_pointer].
47
- include?(self.kind)
48
- end
49
-
50
- def pointee
51
- if self.pointer?
52
- Type.new Lib.get_pointee_type(@type), @translation_unit
53
- else
54
- nil
55
- end
56
- end
57
-
58
- def canonical
59
- Type.new Lib.get_canonical_type(@type), @translation_unit
60
- end
61
-
62
- def class_type
63
- if self.kind == :type_member_pointer
64
- Type.new Lib.type_get_class_type(@type), @translation_unit
65
- else
66
- nil
67
- end
68
- end
69
-
70
- def const_qualified?
71
- Lib.is_const_qualified_type(@type) != 0
72
- end
73
-
74
- def volatile_qualified?
75
- Lib.is_volatile_qualified_type(@type) != 0
76
- end
77
-
78
- def restrict_qualified?
79
- Lib.is_restrict_qualified_type(@type) != 0
80
- end
81
-
82
- def function?
83
- [:type_function_no_proto, :type_function_proto].include?(self.kind)
84
- end
85
-
86
- def arg_type(i)
87
- if self.function?
88
- Type.new Lib.get_arg_type(@type, i), @translation_unit
89
- else
90
- nil
91
- end
92
- end
93
-
94
- def result_type
95
- if self.function?
96
- Type.new Lib.get_result_type(@type), @translation_unit
97
- else
98
- nil
99
- end
100
- end
101
-
102
- def element_type
103
- if self.array? || [:type_vector, :type_complex].include?(self.kind)
104
- Type.new Lib.get_element_type(@type), @translation_unit
105
- else
106
- nil
107
- end
108
- end
109
-
110
- def num_elements
111
- Lib.get_num_elements(@type)
112
- end
113
-
114
- def array?
115
- [:type_constant_array, :type_incomplete_array, :type_variable_array, :type_dependent_sized_array].
116
- include?(self.kind)
117
- end
118
-
119
- def array_element_type
120
- if self.array?
121
- Type.new Lib.get_array_element_type(@type), @translation_unit
122
- else
123
- nil
124
- end
125
- end
126
-
127
- def array_size
128
- Lib.get_array_size(@type)
129
- end
130
-
131
- def alignof
132
- Lib.type_get_align_of(@type)
133
- end
134
-
135
- def sizeof
136
- Lib.type_get_size_of(@type)
137
- end
138
-
139
- def offsetof(field)
140
- Lib.type_get_offset_of(@type, field)
141
- end
142
-
143
- def ref_qualifier
144
- Lib.type_get_cxx_ref_qualifier(@type)
145
- end
146
-
147
- def calling_conv
148
- Lib.get_fuction_type_calling_conv(@type)
149
- end
150
-
151
- def declaration
152
- Cursor.new Lib.get_type_declaration(@type), @translation_unit
153
- end
154
-
155
- def ==(other)
156
- Lib.equal_types(@type, other.type) != 0
157
- end
158
- end
159
- end
160
- end