ffi-clang 0.8.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/ffi/clang/clang_version.rb +2 -1
- data/lib/ffi/clang/code_completion.rb +5 -3
- data/lib/ffi/clang/cursor.rb +102 -53
- data/lib/ffi/clang/diagnostic.rb +4 -3
- data/lib/ffi/clang/index.rb +11 -4
- data/lib/ffi/clang/lib/code_completion.rb +9 -8
- data/lib/ffi/clang/lib/cursor.rb +89 -24
- data/lib/ffi/clang/lib/diagnostic.rb +2 -2
- data/lib/ffi/clang/lib/file.rb +3 -1
- data/lib/ffi/clang/lib/index.rb +19 -0
- data/lib/ffi/clang/lib/printing_policy.rb +47 -0
- data/lib/ffi/clang/lib/string.rb +1 -3
- data/lib/ffi/clang/lib/translation_unit.rb +14 -2
- data/lib/ffi/clang/lib/type.rb +80 -3
- data/lib/ffi/clang/lib.rb +11 -10
- data/lib/ffi/clang/printing_policy.rb +36 -0
- data/lib/ffi/clang/source_location.rb +35 -18
- data/lib/ffi/clang/types/array.rb +15 -0
- data/lib/ffi/clang/types/elaborated.rb +26 -0
- data/lib/ffi/clang/types/function.rb +27 -0
- data/lib/ffi/clang/types/pointer.rb +42 -0
- data/lib/ffi/clang/types/record.rb +26 -0
- data/lib/ffi/clang/types/type.rb +98 -0
- data/lib/ffi/clang/types/type_def.rb +15 -0
- data/lib/ffi/clang/types/vector.rb +15 -0
- data/lib/ffi/clang/version.rb +2 -2
- data/lib/ffi/clang.rb +9 -0
- data/license.md +3 -2
- data/readme.md +15 -5
- data.tar.gz.sig +0 -0
- metadata +17 -62
- metadata.gz.sig +0 -0
- data/lib/ffi/clang/type.rb +0 -121
data/lib/ffi/clang/lib/string.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright,
|
5
|
-
# Copyright, 2012, by Hal Brodigan.
|
6
|
-
# Copyright, 2013-2022, by Samuel Williams.
|
4
|
+
# Copyright, 2013-2024, by Samuel Williams.
|
7
5
|
|
8
6
|
module FFI
|
9
7
|
module Clang
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright, 2013-
|
4
|
+
# Copyright, 2013-2024, by Samuel Williams.
|
5
5
|
# Copyright, 2014, by Masahiro Sano.
|
6
6
|
# Copyright, 2019, by Hayden Purdy.
|
7
7
|
# Copyright, 2022, by Motonori Iwamuro.
|
8
|
+
# Copyright, 2023, by Charlie Savage.
|
8
9
|
|
9
10
|
require_relative 'index'
|
10
11
|
|
@@ -28,7 +29,9 @@ module FFI
|
|
28
29
|
:single_file_parse, 0x400,
|
29
30
|
:limit_skip_function_bodies_to_preamble, 0x800,
|
30
31
|
:include_attributed_type, 0x1000,
|
31
|
-
:visit_implicit_attributes, 0x2000
|
32
|
+
:visit_implicit_attributes, 0x2000,
|
33
|
+
:ignore_non_errors_from_included_files, 0x4000,
|
34
|
+
:retain_excluded_conditional_blocks, 0x8000,
|
32
35
|
]
|
33
36
|
|
34
37
|
SaveTranslationUnitFlags = enum [
|
@@ -63,6 +66,14 @@ module FFI
|
|
63
66
|
:preprocessor_header_search, 14,
|
64
67
|
]
|
65
68
|
|
69
|
+
ErrorCodes = enum [
|
70
|
+
:cx_error_success, 0,
|
71
|
+
:cx_error_failure, 1,
|
72
|
+
:cx_error_crashed, 2,
|
73
|
+
:cx_error_invalid_arguments, 3,
|
74
|
+
:cx_error_ast_read_error, 4,
|
75
|
+
]
|
76
|
+
|
66
77
|
class CXTUResourceUsage < FFI::Struct
|
67
78
|
layout(
|
68
79
|
:data, :pointer,
|
@@ -80,6 +91,7 @@ module FFI
|
|
80
91
|
|
81
92
|
# Source code translation units:
|
82
93
|
attach_function :parse_translation_unit, :clang_parseTranslationUnit, [:CXIndex, :string, :pointer, :int, :pointer, :uint, :uint], :CXTranslationUnit
|
94
|
+
attach_function :parse_translation_unit2, :clang_parseTranslationUnit2, [:CXIndex, :string, :pointer, :int, :pointer, :uint, :uint, :pointer], ErrorCodes
|
83
95
|
attach_function :create_translation_unit, :clang_createTranslationUnit, [:CXIndex, :string], :CXTranslationUnit
|
84
96
|
attach_function :dispose_translation_unit, :clang_disposeTranslationUnit, [:CXTranslationUnit], :void
|
85
97
|
attach_function :get_translation_unit_spelling, :clang_getTranslationUnitSpelling, [:CXTranslationUnit], CXString.by_value
|
data/lib/ffi/clang/lib/type.rb
CHANGED
@@ -2,10 +2,11 @@
|
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2013, by Carlos Martín Nieto.
|
5
|
-
# Copyright, 2013-
|
5
|
+
# Copyright, 2013-2024, by Samuel Williams.
|
6
6
|
# Copyright, 2013, by Takeshi Watanabe.
|
7
7
|
# Copyright, 2013-2014, by Masahiro Sano.
|
8
8
|
# Copyright, 2014, by Niklas Therning.
|
9
|
+
# Copyright, 2024, by Charlie Savage.
|
9
10
|
|
10
11
|
module FFI
|
11
12
|
module Clang
|
@@ -59,6 +60,71 @@ module FFI
|
|
59
60
|
:type_variable_array, 115,
|
60
61
|
:type_dependent_sized_array, 116,
|
61
62
|
:type_member_pointer, 117,
|
63
|
+
:type_auto, 118,
|
64
|
+
:type_elaborated, 119,
|
65
|
+
:type_pipe, 120,
|
66
|
+
:type_ocl_image_1d_ro, 121,
|
67
|
+
:type_ocl_image_1d_array_ro, 122,
|
68
|
+
:type_ocl_image_1d_buffer_ro, 123,
|
69
|
+
:type_ocl_image_2d_ro, 124,
|
70
|
+
:type_ocl_image_2d_array_ro, 125,
|
71
|
+
:type_ocl_image_2d_depth_ro, 126,
|
72
|
+
:type_ocl_image_2d_array_depth_ro, 127,
|
73
|
+
:type_ocl_image_2d_msaa_ro, 128,
|
74
|
+
:type_ocl_image_2d_array_msaa_ro, 129,
|
75
|
+
:type_ocl_image_2d_msaa_depth_ro, 130,
|
76
|
+
:type_ocl_image_2d_array_msaa_depth_ro, 131,
|
77
|
+
:type_ocl_image_3d_ro, 132,
|
78
|
+
:type_ocl_image_1d_wo, 133,
|
79
|
+
:type_ocl_image_1d_array_wo, 134,
|
80
|
+
:type_ocl_image_1d_buffer_wo, 135,
|
81
|
+
:type_ocl_image_2d_wo, 136,
|
82
|
+
:type_ocl_image_2d_array_wo, 137,
|
83
|
+
:type_ocl_image_2d_depth_wo, 138,
|
84
|
+
:type_ocl_image_2d_arraydepth_wo, 139,
|
85
|
+
:type_ocl_image_2d_msaa_wo, 140,
|
86
|
+
:type_ocl_image_2d_array_msaa_wo, 141,
|
87
|
+
:type_ocl_image_2d_msaa_depth_wo, 142,
|
88
|
+
:type_ocl_image_2d_array_msaa_depth_wo, 143,
|
89
|
+
:type_ocl_image_3d_wo, 144,
|
90
|
+
:type_ocl_image_1d_rw, 145,
|
91
|
+
:type_ocl_image_1d_array_rw, 146,
|
92
|
+
:type_ocl_image_1d_buffer_rw, 147,
|
93
|
+
:type_ocl_image_2d_rw, 148,
|
94
|
+
:type_ocl_image_2d_array_rw, 149,
|
95
|
+
:type_ocl_image_2d_depth_rw, 150,
|
96
|
+
:type_ocl_image_2d_arraydepth_rw, 151,
|
97
|
+
:type_ocl_image_2d_msaa_rw, 152,
|
98
|
+
:type_ocl_image_2d_array_msaa_rw, 153,
|
99
|
+
:type_ocl_image_2d_msaa_depth_rw, 154,
|
100
|
+
:type_ocl_image_2d_array_msaa_depth_rw, 155,
|
101
|
+
:type_ocl_image_3d_rw, 156,
|
102
|
+
:type_ocl_sampler, 157,
|
103
|
+
:type_ocl_event, 158,
|
104
|
+
:type_ocl_queue, 159,
|
105
|
+
:type_ocl_reserve_id, 160,
|
106
|
+
:type_objc_object, 161,
|
107
|
+
:type_objc_type_param, 162,
|
108
|
+
:type_attributed, 163,
|
109
|
+
:type_ocl_intel_subgroup_avc_mce_payload, 164,
|
110
|
+
:type_ocl_intel_subgroup_avc_ime_payload, 165,
|
111
|
+
:type_ocl_intel_subgroup_avc_ref_payload, 166,
|
112
|
+
:type_ocl_intel_subgroup_avc_sic_payload, 167,
|
113
|
+
:type_ocl_intel_subgroup_avc_mce_result, 168,
|
114
|
+
:type_ocl_intel_subgroup_avc_ime_result, 169,
|
115
|
+
:type_ocl_intel_subgroup_avc_ref_result, 170,
|
116
|
+
:type_ocl_intel_subgroup_avc_sic_result, 171,
|
117
|
+
:type_ocl_intel_subgroup_avc_ime_result_single_reference_streamout, 172,
|
118
|
+
:type_ocl_intel_subgroup_avc_ime_result_dual_reference_streamout, 173,
|
119
|
+
:type_ocl_intel_subgroup_avc_ime_single_reference_streamin, 174,
|
120
|
+
:type_ocl_intel_subgroup_avc_ime_dual_reference_streamin, 175,
|
121
|
+
:type_ocl_intel_subgroup_avc_ime_result_single_ref_streamout, 172,
|
122
|
+
:type_ocl_intel_subgroup_avc_ime_result_dual_ref_streamout, 173,
|
123
|
+
:type_ocl_intel_subgroup_avc_ime_single_ref_streamin, 174,
|
124
|
+
:type_ocl_intel_subgroup_avc_ime_dual_ref_streamin, 175,
|
125
|
+
:type_ext_vector, 176,
|
126
|
+
:type_atomic, 177,
|
127
|
+
:type_btf_tag_attributed, 178
|
62
128
|
]
|
63
129
|
|
64
130
|
enum :calling_conv, [
|
@@ -74,6 +140,16 @@ module FFI
|
|
74
140
|
:calling_conv_intel_ocl_bicc, 9,
|
75
141
|
:calling_conv_x86_64_win64, 10,
|
76
142
|
:calling_conv_x86_64_sysv, 11,
|
143
|
+
:calling_conv_x86_vector_call, 12,
|
144
|
+
:calling_conv_swift, 13,
|
145
|
+
:calling_conv_preserve_most, 14,
|
146
|
+
:calling_conv_preserve_all, 15,
|
147
|
+
:calling_conv_aarch64_vector_call, 16,
|
148
|
+
:calling_conv_swift_async, 17,
|
149
|
+
:calling_conv_aarch64_sve_pcs, 18,
|
150
|
+
:calling_conv_m68k_rtd, 19,
|
151
|
+
:calling_conv_preserve_none, 20,
|
152
|
+
:calling_conv_riscv_vector_call, 21,
|
77
153
|
:calling_conv_invalid, 100,
|
78
154
|
:calling_conv_unexposed, 200
|
79
155
|
]
|
@@ -90,6 +166,7 @@ module FFI
|
|
90
166
|
:layout_error_dependent, -3,
|
91
167
|
:layout_error_not_constant_size, -4,
|
92
168
|
:layout_error_invalid_field_name, -5,
|
169
|
+
:layout_error_undeduced, -6
|
93
170
|
]
|
94
171
|
|
95
172
|
class CXType < FFI::Struct
|
@@ -108,7 +185,7 @@ module FFI
|
|
108
185
|
attach_function :get_pointee_type, :clang_getPointeeType, [CXType.by_value], CXType.by_value
|
109
186
|
attach_function :get_result_type, :clang_getResultType, [CXType.by_value], CXType.by_value
|
110
187
|
attach_function :get_canonical_type, :clang_getCanonicalType, [CXType.by_value], CXType.by_value
|
111
|
-
|
188
|
+
|
112
189
|
attach_function :type_get_class_type, :clang_Type_getClassType, [CXType.by_value], CXType.by_value
|
113
190
|
|
114
191
|
attach_function :is_const_qualified_type, :clang_isConstQualifiedType, [CXType.by_value], :uint
|
@@ -127,7 +204,7 @@ module FFI
|
|
127
204
|
attach_function :type_get_offset_of, :clang_Type_getOffsetOf, [CXType.by_value, :string], :long_long
|
128
205
|
|
129
206
|
attach_function :type_get_cxx_ref_qualifier, :clang_Type_getCXXRefQualifier, [CXType.by_value], :ref_qualifier_kind
|
130
|
-
|
207
|
+
|
131
208
|
attach_function :get_fuction_type_calling_conv, :clang_getFunctionTypeCallingConv, [CXType.by_value], :calling_conv
|
132
209
|
|
133
210
|
attach_function :equal_types, :clang_equalTypes, [CXType.by_value, CXType.by_value], :uint
|
data/lib/ffi/clang/lib.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2010-2012, by Jari Bakken.
|
5
5
|
# Copyright, 2012, by Hal Brodigan.
|
6
|
-
# Copyright, 2013-
|
6
|
+
# Copyright, 2013-2024, by Samuel Williams.
|
7
7
|
# Copyright, 2013-2014, by Carlos Martín Nieto.
|
8
8
|
# Copyright, 2013, by Takeshi Watanabe.
|
9
9
|
# Copyright, 2014, by Masahiro Sano.
|
@@ -12,7 +12,8 @@
|
|
12
12
|
# Copyright, 2016, by Mike Dalessio.
|
13
13
|
# Copyright, 2019, by Hayden Purdy.
|
14
14
|
# Copyright, 2019, by Dominic Sisnero.
|
15
|
-
# Copyright, 2020, by
|
15
|
+
# Copyright, 2020, by Zete Lui.
|
16
|
+
# Copyright, 2023, by Charlie Savage.
|
16
17
|
|
17
18
|
require 'mkmf'
|
18
19
|
|
@@ -69,11 +70,11 @@ module FFI
|
|
69
70
|
def self.bitmask_from(enum, opts)
|
70
71
|
bitmask = 0
|
71
72
|
|
72
|
-
opts.each do |
|
73
|
-
if int = enum[
|
73
|
+
opts.each do |symbol|
|
74
|
+
if int = enum[symbol]
|
74
75
|
bitmask |= int
|
75
76
|
else
|
76
|
-
|
77
|
+
raise Error, "unknown option: #{symbol}, expected one of #{enum.symbols}"
|
77
78
|
end
|
78
79
|
end
|
79
80
|
|
@@ -82,19 +83,19 @@ module FFI
|
|
82
83
|
|
83
84
|
def self.opts_from(enum, bitmask)
|
84
85
|
bit = 1
|
85
|
-
|
86
|
+
result = []
|
86
87
|
while bitmask != 0
|
87
88
|
if bitmask & 1
|
88
|
-
if
|
89
|
-
|
89
|
+
if symbol = enum[bit]
|
90
|
+
result << symbol
|
90
91
|
else
|
91
|
-
raise
|
92
|
+
raise(Error, "unknown values: #{bit}, expected one of #{enum.symbols}")
|
92
93
|
end
|
93
94
|
end
|
94
95
|
bitmask >>= 1
|
95
96
|
bit <<= 1
|
96
97
|
end
|
97
|
-
|
98
|
+
result
|
98
99
|
end
|
99
100
|
end
|
100
101
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2024, by Charlie Savage.
|
5
|
+
# Copyright, 2024, by Samuel Williams.
|
6
|
+
|
7
|
+
require_relative 'lib/printing_policy'
|
8
|
+
|
9
|
+
module FFI
|
10
|
+
module Clang
|
11
|
+
class PrintingPolicy < AutoPointer
|
12
|
+
def initialize(cursor)
|
13
|
+
policy = Lib.get_printing_policy(cursor)
|
14
|
+
super(policy)
|
15
|
+
@cursor = cursor
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.release(pointer)
|
19
|
+
Lib.dispose_printing_policy(pointer)
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_property(property)
|
23
|
+
result = Lib.printing_policy_get_property(self, property)
|
24
|
+
result == 0 ? false : true
|
25
|
+
end
|
26
|
+
|
27
|
+
def set_property(property, value)
|
28
|
+
Lib.printing_policy_set_property(self, property, value ? 1 : 0)
|
29
|
+
end
|
30
|
+
|
31
|
+
def pretty_print
|
32
|
+
Lib.extract_string Lib.pretty_print(@cursor, self)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -6,6 +6,7 @@
|
|
6
6
|
# Copyright, 2013-2022, by Samuel Williams.
|
7
7
|
# Copyright, 2013, by Garry Marshall.
|
8
8
|
# Copyright, 2014, by Masahiro Sano.
|
9
|
+
# Copyright, 2024, by Charlie Savage.
|
9
10
|
|
10
11
|
require_relative 'lib/source_location'
|
11
12
|
require_relative 'lib/file'
|
@@ -30,22 +31,6 @@ module FFI
|
|
30
31
|
Lib.location_is_from_main_file(@location) != 0
|
31
32
|
end
|
32
33
|
|
33
|
-
def expansion_location
|
34
|
-
ExpansionLocation.new(@location)
|
35
|
-
end
|
36
|
-
|
37
|
-
def presumed_location
|
38
|
-
PresumedLocation.new(@location)
|
39
|
-
end
|
40
|
-
|
41
|
-
def spelling_location
|
42
|
-
SpellingLocation.new(@location)
|
43
|
-
end
|
44
|
-
|
45
|
-
def file_location
|
46
|
-
FileLocation.new(@location)
|
47
|
-
end
|
48
|
-
|
49
34
|
def null?
|
50
35
|
Lib.equal_locations(@location, Lib.get_null_location) != 0
|
51
36
|
end
|
@@ -73,6 +58,14 @@ module FFI
|
|
73
58
|
@column = column.get_uint(0)
|
74
59
|
@offset = offset.get_uint(0)
|
75
60
|
end
|
61
|
+
|
62
|
+
def as_string
|
63
|
+
"#{@file}:#{@line}:#{@column}:#{@offset}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_s
|
67
|
+
"ExpansionLocation <#{self.as_string}>"
|
68
|
+
end
|
76
69
|
end
|
77
70
|
|
78
71
|
class PresumedLocation < SourceLocation
|
@@ -82,8 +75,8 @@ module FFI
|
|
82
75
|
super(location)
|
83
76
|
|
84
77
|
cxstring = MemoryPointer.new Lib::CXString
|
85
|
-
line
|
86
|
-
column
|
78
|
+
line = MemoryPointer.new :uint
|
79
|
+
column = MemoryPointer.new :uint
|
87
80
|
|
88
81
|
Lib::get_presumed_location(@location, cxstring, line, column)
|
89
82
|
|
@@ -91,6 +84,14 @@ module FFI
|
|
91
84
|
@line = line.get_uint(0)
|
92
85
|
@column = column.get_uint(0)
|
93
86
|
end
|
87
|
+
|
88
|
+
def as_string
|
89
|
+
"#{@filename}:#{@line}:#{@column}"
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_s
|
93
|
+
"PresumedLocation <#{self.as_string}>"
|
94
|
+
end
|
94
95
|
end
|
95
96
|
|
96
97
|
class SpellingLocation < SourceLocation
|
@@ -111,6 +112,14 @@ module FFI
|
|
111
112
|
@column = column.get_uint(0)
|
112
113
|
@offset = offset.get_uint(0)
|
113
114
|
end
|
115
|
+
|
116
|
+
def as_string
|
117
|
+
"#{@file}:#{@line}:#{@column}:#{@offset}"
|
118
|
+
end
|
119
|
+
|
120
|
+
def to_s
|
121
|
+
"SpellingLocation <#{self.as_string}>"
|
122
|
+
end
|
114
123
|
end
|
115
124
|
|
116
125
|
class FileLocation < SourceLocation
|
@@ -131,6 +140,14 @@ module FFI
|
|
131
140
|
@column = column.get_uint(0)
|
132
141
|
@offset = offset.get_uint(0)
|
133
142
|
end
|
143
|
+
|
144
|
+
def as_string
|
145
|
+
"#{@file}:#{@line}:#{@column}:#{@offset}"
|
146
|
+
end
|
147
|
+
|
148
|
+
def to_s
|
149
|
+
"FileLocation <#{self.as_string}>"
|
150
|
+
end
|
134
151
|
end
|
135
152
|
end
|
136
153
|
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,27 @@
|
|
1
|
+
module FFI
|
2
|
+
module Clang
|
3
|
+
module Types
|
4
|
+
class Function < Type
|
5
|
+
def variadic?
|
6
|
+
Lib.is_function_type_variadic(@type) != 0
|
7
|
+
end
|
8
|
+
|
9
|
+
def args_size
|
10
|
+
Lib.get_num_arg_types(@type)
|
11
|
+
end
|
12
|
+
|
13
|
+
def arg_type(i)
|
14
|
+
Type.create Lib.get_arg_type(@type, i), @translation_unit
|
15
|
+
end
|
16
|
+
|
17
|
+
def result_type
|
18
|
+
Type.create Lib.get_result_type(@type), @translation_unit
|
19
|
+
end
|
20
|
+
|
21
|
+
def calling_conv
|
22
|
+
Lib.get_fuction_type_calling_conv(@type)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
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,98 @@
|
|
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 don't 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 ==(other)
|
89
|
+
Lib.equal_types(@type, other.type) != 0
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_s
|
93
|
+
"#{self.class.name} <#{self.kind}: #{self.spelling}>"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
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
|
data/lib/ffi/clang/version.rb
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2010, by Jari Bakken.
|
5
5
|
# Copyright, 2012, by Hal Brodigan.
|
6
|
-
# Copyright, 2013-
|
6
|
+
# Copyright, 2013-2024, by Samuel Williams.
|
7
7
|
|
8
8
|
module FFI
|
9
9
|
module Clang
|
10
|
-
VERSION = "0.
|
10
|
+
VERSION = "0.10.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/license.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Copyright, 2010-2012, by Jari Bakken.
|
4
4
|
Copyright, 2012, by Hal Brodigan.
|
5
|
-
Copyright, 2013-
|
5
|
+
Copyright, 2013-2024, by Samuel Williams.
|
6
6
|
Copyright, 2013, by Garry Marshall.
|
7
7
|
Copyright, 2013-2014, by Carlos Martín Nieto.
|
8
8
|
Copyright, 2013, by Dave Wilkinson.
|
@@ -16,8 +16,9 @@ Copyright, 2017, by Cameron Dutro.
|
|
16
16
|
Copyright, 2019, by Hayden Purdy.
|
17
17
|
Copyright, 2019, by Michael Metivier.
|
18
18
|
Copyright, 2019, by Dominic Sisnero.
|
19
|
-
Copyright, 2020, by
|
19
|
+
Copyright, 2020, by Zete Lui.
|
20
20
|
Copyright, 2022, by Motonori Iwamuro.
|
21
|
+
Copyright, 2023-2024, by Charlie Savage.
|
21
22
|
|
22
23
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
23
24
|
of this software and associated documentation files (the "Software"), to deal
|