Skip to content

Commit f4d80e0

Browse files
committed
Implement _CursorMirror and _TypeMirror classes to enhance libclang AST object mapping
1 parent eeb0921 commit f4d80e0

3 files changed

Lines changed: 474 additions & 21 deletions

File tree

src/xyz/_libclang_mirrors.py

Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
1+
"""
2+
Base classes that mirror libclang AST objects to provide self-documenting APIs.
3+
4+
This module contains `_CursorMirror` and `_TypeMirror`, which explicitly map
5+
all relevant properties and methods from `clang.cindex.Cursor` and
6+
`clang.cindex.Type`.
7+
8+
By inheriting from these classes, `cppmodel` wrappers natively expose the full
9+
power of `libclang` while remaining discoverable by IDEs and type-checkers.
10+
"""
11+
12+
from typing import Any
13+
14+
from clang.cindex import Cursor
15+
from clang.cindex import Type as _ClangType
16+
17+
18+
class _CursorMirror:
19+
_cursor: Cursor
20+
21+
@property
22+
def access_specifier(self) -> Any:
23+
return self._cursor.access_specifier
24+
25+
@property
26+
def availability(self) -> Any:
27+
return self._cursor.availability
28+
29+
@property
30+
def brief_comment(self) -> Any:
31+
return self._cursor.brief_comment
32+
33+
@property
34+
def canonical(self) -> Any:
35+
return self._cursor.canonical
36+
37+
@property
38+
def displayname(self) -> Any:
39+
return self._cursor.displayname
40+
41+
@property
42+
def location(self) -> Any:
43+
return self._cursor.location
44+
45+
@property
46+
def type(self) -> Any:
47+
return self._cursor.type
48+
49+
@property
50+
def kind(self) -> Any:
51+
return self._cursor.kind
52+
53+
def enum_type(self) -> Any:
54+
return self._cursor.enum_type
55+
56+
@property
57+
def enum_value(self) -> Any:
58+
return self._cursor.enum_value
59+
60+
@property
61+
def exception_specification_kind(self) -> Any:
62+
return self._cursor.exception_specification_kind
63+
64+
@property
65+
def extent(self) -> Any:
66+
return self._cursor.extent
67+
68+
@property
69+
def hash(self) -> Any:
70+
return self._cursor.hash
71+
72+
@property
73+
def lexical_parent(self) -> Any:
74+
return self._cursor.lexical_parent
75+
76+
@property
77+
def linkage(self) -> Any:
78+
return self._cursor.linkage
79+
80+
@property
81+
def mangled_name(self) -> Any:
82+
return self._cursor.mangled_name
83+
84+
@property
85+
def objc_type_encoding(self) -> Any:
86+
return self._cursor.objc_type_encoding
87+
88+
@property
89+
def raw_comment(self) -> Any:
90+
return self._cursor.raw_comment
91+
92+
@property
93+
def referenced(self) -> Any:
94+
return self._cursor.referenced
95+
96+
@property
97+
def result_type(self) -> Any:
98+
return self._cursor.result_type
99+
100+
@property
101+
def semantic_parent(self) -> Any:
102+
return self._cursor.semantic_parent
103+
104+
@property
105+
def spelling(self) -> Any:
106+
return self._cursor.spelling
107+
108+
@property
109+
def storage_class(self) -> Any:
110+
return self._cursor.storage_class
111+
112+
@property
113+
def tls_kind(self) -> Any:
114+
return self._cursor.tls_kind
115+
116+
@property
117+
def translation_unit(self) -> Any:
118+
return self._cursor.translation_unit
119+
120+
@property
121+
def underlying_typedef_type(self) -> Any:
122+
return self._cursor.underlying_typedef_type
123+
124+
def from_cursor_result(self, *args: Any, **kwargs: Any) -> Any:
125+
return self._cursor.from_cursor_result(*args, **kwargs)
126+
127+
def from_location(self, *args: Any, **kwargs: Any) -> Any:
128+
return self._cursor.from_location(*args, **kwargs)
129+
130+
def from_result(self, *args: Any, **kwargs: Any) -> Any:
131+
return self._cursor.from_result(*args, **kwargs)
132+
133+
def get_arguments(self, *args: Any, **kwargs: Any) -> Any:
134+
return self._cursor.get_arguments(*args, **kwargs)
135+
136+
def get_bitfield_width(self, *args: Any, **kwargs: Any) -> Any:
137+
return self._cursor.get_bitfield_width(*args, **kwargs)
138+
139+
def get_children(self, *args: Any, **kwargs: Any) -> Any:
140+
return self._cursor.get_children(*args, **kwargs)
141+
142+
def get_definition(self, *args: Any, **kwargs: Any) -> Any:
143+
return self._cursor.get_definition(*args, **kwargs)
144+
145+
def get_field_offsetof(self, *args: Any, **kwargs: Any) -> Any:
146+
return self._cursor.get_field_offsetof(*args, **kwargs)
147+
148+
def get_included_file(self, *args: Any, **kwargs: Any) -> Any:
149+
return self._cursor.get_included_file(*args, **kwargs)
150+
151+
def get_num_template_arguments(self, *args: Any, **kwargs: Any) -> Any:
152+
return self._cursor.get_num_template_arguments(*args, **kwargs)
153+
154+
def get_template_argument_kind(self, *args: Any, **kwargs: Any) -> Any:
155+
return self._cursor.get_template_argument_kind(*args, **kwargs)
156+
157+
def get_template_argument_type(self, *args: Any, **kwargs: Any) -> Any:
158+
return self._cursor.get_template_argument_type(*args, **kwargs)
159+
160+
def get_template_argument_unsigned_value(self, *args: Any, **kwargs: Any) -> Any:
161+
return self._cursor.get_template_argument_unsigned_value(*args, **kwargs)
162+
163+
def get_template_argument_value(self, *args: Any, **kwargs: Any) -> Any:
164+
return self._cursor.get_template_argument_value(*args, **kwargs)
165+
166+
def get_tokens(self, *args: Any, **kwargs: Any) -> Any:
167+
return self._cursor.get_tokens(*args, **kwargs)
168+
169+
def get_usr(self, *args: Any, **kwargs: Any) -> Any:
170+
return self._cursor.get_usr(*args, **kwargs)
171+
172+
def is_abstract_record(self, *args: Any, **kwargs: Any) -> Any:
173+
return self._cursor.is_abstract_record(*args, **kwargs)
174+
175+
def is_anonymous(self, *args: Any, **kwargs: Any) -> Any:
176+
return self._cursor.is_anonymous(*args, **kwargs)
177+
178+
def is_bitfield(self, *args: Any, **kwargs: Any) -> Any:
179+
return self._cursor.is_bitfield(*args, **kwargs)
180+
181+
def is_const_method(self, *args: Any, **kwargs: Any) -> Any:
182+
return self._cursor.is_const_method(*args, **kwargs)
183+
184+
def is_converting_constructor(self, *args: Any, **kwargs: Any) -> Any:
185+
return self._cursor.is_converting_constructor(*args, **kwargs)
186+
187+
def is_copy_assignment_operator_method(self, *args: Any, **kwargs: Any) -> Any:
188+
return self._cursor.is_copy_assignment_operator_method(*args, **kwargs)
189+
190+
def is_copy_constructor(self, *args: Any, **kwargs: Any) -> Any:
191+
return self._cursor.is_copy_constructor(*args, **kwargs)
192+
193+
def is_default_constructor(self, *args: Any, **kwargs: Any) -> Any:
194+
return self._cursor.is_default_constructor(*args, **kwargs)
195+
196+
def is_default_method(self, *args: Any, **kwargs: Any) -> Any:
197+
return self._cursor.is_default_method(*args, **kwargs)
198+
199+
def is_definition(self, *args: Any, **kwargs: Any) -> Any:
200+
return self._cursor.is_definition(*args, **kwargs)
201+
202+
def is_deleted_method(self, *args: Any, **kwargs: Any) -> Any:
203+
return self._cursor.is_deleted_method(*args, **kwargs)
204+
205+
def is_explicit_method(self, *args: Any, **kwargs: Any) -> Any:
206+
return self._cursor.is_explicit_method(*args, **kwargs)
207+
208+
def is_move_assignment_operator_method(self, *args: Any, **kwargs: Any) -> Any:
209+
return self._cursor.is_move_assignment_operator_method(*args, **kwargs)
210+
211+
def is_move_constructor(self, *args: Any, **kwargs: Any) -> Any:
212+
return self._cursor.is_move_constructor(*args, **kwargs)
213+
214+
def is_mutable_field(self, *args: Any, **kwargs: Any) -> Any:
215+
return self._cursor.is_mutable_field(*args, **kwargs)
216+
217+
def is_pure_virtual_method(self, *args: Any, **kwargs: Any) -> Any:
218+
return self._cursor.is_pure_virtual_method(*args, **kwargs)
219+
220+
def is_scoped_enum(self, *args: Any, **kwargs: Any) -> Any:
221+
return self._cursor.is_scoped_enum(*args, **kwargs)
222+
223+
def is_static_method(self, *args: Any, **kwargs: Any) -> Any:
224+
return self._cursor.is_static_method(*args, **kwargs)
225+
226+
def is_virtual_method(self, *args: Any, **kwargs: Any) -> Any:
227+
return self._cursor.is_virtual_method(*args, **kwargs)
228+
229+
def walk_preorder(self, *args: Any, **kwargs: Any) -> Any:
230+
return self._cursor.walk_preorder(*args, **kwargs)
231+
232+
233+
class _TypeMirror:
234+
_type: _ClangType
235+
236+
@property
237+
def kind(self) -> Any:
238+
return self._type.kind
239+
240+
@property
241+
def element_count(self) -> Any:
242+
return self._type.element_count
243+
244+
@property
245+
def element_type(self) -> Any:
246+
return self._type.element_type
247+
248+
@property
249+
def spelling(self) -> Any:
250+
return self._type.spelling
251+
252+
@property
253+
def translation_unit(self) -> Any:
254+
return self._type.translation_unit
255+
256+
def argument_types(self, *args: Any, **kwargs: Any) -> Any:
257+
return self._type.argument_types(*args, **kwargs)
258+
259+
def from_result(self, *args: Any, **kwargs: Any) -> Any:
260+
return self._type.from_result(*args, **kwargs)
261+
262+
def get_address_space(self, *args: Any, **kwargs: Any) -> Any:
263+
return self._type.get_address_space(*args, **kwargs)
264+
265+
def get_align(self, *args: Any, **kwargs: Any) -> Any:
266+
return self._type.get_align(*args, **kwargs)
267+
268+
def get_array_element_type(self, *args: Any, **kwargs: Any) -> Any:
269+
return self._type.get_array_element_type(*args, **kwargs)
270+
271+
def get_array_size(self, *args: Any, **kwargs: Any) -> Any:
272+
return self._type.get_array_size(*args, **kwargs)
273+
274+
def get_canonical(self, *args: Any, **kwargs: Any) -> Any:
275+
return self._type.get_canonical(*args, **kwargs)
276+
277+
def get_class_type(self, *args: Any, **kwargs: Any) -> Any:
278+
return self._type.get_class_type(*args, **kwargs)
279+
280+
def get_declaration(self, *args: Any, **kwargs: Any) -> Any:
281+
return self._type.get_declaration(*args, **kwargs)
282+
283+
def get_exception_specification_kind(self, *args: Any, **kwargs: Any) -> Any:
284+
return self._type.get_exception_specification_kind(*args, **kwargs)
285+
286+
def get_fields(self, *args: Any, **kwargs: Any) -> Any:
287+
return self._type.get_fields(*args, **kwargs)
288+
289+
def get_named_type(self, *args: Any, **kwargs: Any) -> Any:
290+
return self._type.get_named_type(*args, **kwargs)
291+
292+
def get_num_template_arguments(self, *args: Any, **kwargs: Any) -> Any:
293+
return self._type.get_num_template_arguments(*args, **kwargs)
294+
295+
def get_offset(self, *args: Any, **kwargs: Any) -> Any:
296+
return self._type.get_offset(*args, **kwargs)
297+
298+
def get_pointee(self, *args: Any, **kwargs: Any) -> Any:
299+
return self._type.get_pointee(*args, **kwargs)
300+
301+
def get_ref_qualifier(self, *args: Any, **kwargs: Any) -> Any:
302+
return self._type.get_ref_qualifier(*args, **kwargs)
303+
304+
def get_result(self, *args: Any, **kwargs: Any) -> Any:
305+
return self._type.get_result(*args, **kwargs)
306+
307+
def get_size(self, *args: Any, **kwargs: Any) -> Any:
308+
return self._type.get_size(*args, **kwargs)
309+
310+
def get_template_argument_type(self, *args: Any, **kwargs: Any) -> Any:
311+
return self._type.get_template_argument_type(*args, **kwargs)
312+
313+
def get_typedef_name(self, *args: Any, **kwargs: Any) -> Any:
314+
return self._type.get_typedef_name(*args, **kwargs)
315+
316+
def is_const_qualified(self, *args: Any, **kwargs: Any) -> Any:
317+
return self._type.is_const_qualified(*args, **kwargs)
318+
319+
def is_function_variadic(self, *args: Any, **kwargs: Any) -> Any:
320+
return self._type.is_function_variadic(*args, **kwargs)
321+
322+
def is_pod(self, *args: Any, **kwargs: Any) -> Any:
323+
return self._type.is_pod(*args, **kwargs)
324+
325+
def is_restrict_qualified(self, *args: Any, **kwargs: Any) -> Any:
326+
return self._type.is_restrict_qualified(*args, **kwargs)
327+
328+
def is_volatile_qualified(self, *args: Any, **kwargs: Any) -> Any:
329+
return self._type.is_volatile_qualified(*args, **kwargs)

0 commit comments

Comments
 (0)