]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - bindings/python/clang/cindex.py
Vendor import of clang trunk r238337:
[FreeBSD/FreeBSD.git] / bindings / python / clang / cindex.py
1 #===- cindex.py - Python Indexing Library Bindings -----------*- python -*--===#
2 #
3 #                     The LLVM Compiler Infrastructure
4 #
5 # This file is distributed under the University of Illinois Open Source
6 # License. See LICENSE.TXT for details.
7 #
8 #===------------------------------------------------------------------------===#
9
10 r"""
11 Clang Indexing Library Bindings
12 ===============================
13
14 This module provides an interface to the Clang indexing library. It is a
15 low-level interface to the indexing library which attempts to match the Clang
16 API directly while also being "pythonic". Notable differences from the C API
17 are:
18
19  * string results are returned as Python strings, not CXString objects.
20
21  * null cursors are translated to None.
22
23  * access to child cursors is done via iteration, not visitation.
24
25 The major indexing objects are:
26
27   Index
28
29     The top-level object which manages some global library state.
30
31   TranslationUnit
32
33     High-level object encapsulating the AST for a single translation unit. These
34     can be loaded from .ast files or parsed on the fly.
35
36   Cursor
37
38     Generic object for representing a node in the AST.
39
40   SourceRange, SourceLocation, and File
41
42     Objects representing information about the input source.
43
44 Most object information is exposed using properties, when the underlying API
45 call is efficient.
46 """
47
48 # TODO
49 # ====
50 #
51 # o API support for invalid translation units. Currently we can't even get the
52 #   diagnostics on failure because they refer to locations in an object that
53 #   will have been invalidated.
54 #
55 # o fix memory management issues (currently client must hold on to index and
56 #   translation unit, or risk crashes).
57 #
58 # o expose code completion APIs.
59 #
60 # o cleanup ctypes wrapping, would be nice to separate the ctypes details more
61 #   clearly, and hide from the external interface (i.e., help(cindex)).
62 #
63 # o implement additional SourceLocation, SourceRange, and File methods.
64
65 from ctypes import *
66 import collections
67
68 import clang.enumerations
69
70 # ctypes doesn't implicitly convert c_void_p to the appropriate wrapper
71 # object. This is a problem, because it means that from_parameter will see an
72 # integer and pass the wrong value on platforms where int != void*. Work around
73 # this by marshalling object arguments as void**.
74 c_object_p = POINTER(c_void_p)
75
76 callbacks = {}
77
78 ### Exception Classes ###
79
80 class TranslationUnitLoadError(Exception):
81     """Represents an error that occurred when loading a TranslationUnit.
82
83     This is raised in the case where a TranslationUnit could not be
84     instantiated due to failure in the libclang library.
85
86     FIXME: Make libclang expose additional error information in this scenario.
87     """
88     pass
89
90 class TranslationUnitSaveError(Exception):
91     """Represents an error that occurred when saving a TranslationUnit.
92
93     Each error has associated with it an enumerated value, accessible under
94     e.save_error. Consumers can compare the value with one of the ERROR_
95     constants in this class.
96     """
97
98     # Indicates that an unknown error occurred. This typically indicates that
99     # I/O failed during save.
100     ERROR_UNKNOWN = 1
101
102     # Indicates that errors during translation prevented saving. The errors
103     # should be available via the TranslationUnit's diagnostics.
104     ERROR_TRANSLATION_ERRORS = 2
105
106     # Indicates that the translation unit was somehow invalid.
107     ERROR_INVALID_TU = 3
108
109     def __init__(self, enumeration, message):
110         assert isinstance(enumeration, int)
111
112         if enumeration < 1 or enumeration > 3:
113             raise Exception("Encountered undefined TranslationUnit save error "
114                             "constant: %d. Please file a bug to have this "
115                             "value supported." % enumeration)
116
117         self.save_error = enumeration
118         Exception.__init__(self, 'Error %d: %s' % (enumeration, message))
119
120 ### Structures and Utility Classes ###
121
122 class CachedProperty(object):
123     """Decorator that lazy-loads the value of a property.
124
125     The first time the property is accessed, the original property function is
126     executed. The value it returns is set as the new value of that instance's
127     property, replacing the original method.
128     """
129
130     def __init__(self, wrapped):
131         self.wrapped = wrapped
132         try:
133             self.__doc__ = wrapped.__doc__
134         except:
135             pass
136
137     def __get__(self, instance, instance_type=None):
138         if instance is None:
139             return self
140
141         value = self.wrapped(instance)
142         setattr(instance, self.wrapped.__name__, value)
143
144         return value
145
146
147 class _CXString(Structure):
148     """Helper for transforming CXString results."""
149
150     _fields_ = [("spelling", c_char_p), ("free", c_int)]
151
152     def __del__(self):
153         conf.lib.clang_disposeString(self)
154
155     @staticmethod
156     def from_result(res, fn, args):
157         assert isinstance(res, _CXString)
158         return conf.lib.clang_getCString(res)
159
160 class SourceLocation(Structure):
161     """
162     A SourceLocation represents a particular location within a source file.
163     """
164     _fields_ = [("ptr_data", c_void_p * 2), ("int_data", c_uint)]
165     _data = None
166
167     def _get_instantiation(self):
168         if self._data is None:
169             f, l, c, o = c_object_p(), c_uint(), c_uint(), c_uint()
170             conf.lib.clang_getInstantiationLocation(self, byref(f), byref(l),
171                     byref(c), byref(o))
172             if f:
173                 f = File(f)
174             else:
175                 f = None
176             self._data = (f, int(l.value), int(c.value), int(o.value))
177         return self._data
178
179     @staticmethod
180     def from_position(tu, file, line, column):
181         """
182         Retrieve the source location associated with a given file/line/column in
183         a particular translation unit.
184         """
185         return conf.lib.clang_getLocation(tu, file, line, column)
186
187     @staticmethod
188     def from_offset(tu, file, offset):
189         """Retrieve a SourceLocation from a given character offset.
190
191         tu -- TranslationUnit file belongs to
192         file -- File instance to obtain offset from
193         offset -- Integer character offset within file
194         """
195         return conf.lib.clang_getLocationForOffset(tu, file, offset)
196
197     @property
198     def file(self):
199         """Get the file represented by this source location."""
200         return self._get_instantiation()[0]
201
202     @property
203     def line(self):
204         """Get the line represented by this source location."""
205         return self._get_instantiation()[1]
206
207     @property
208     def column(self):
209         """Get the column represented by this source location."""
210         return self._get_instantiation()[2]
211
212     @property
213     def offset(self):
214         """Get the file offset represented by this source location."""
215         return self._get_instantiation()[3]
216
217     def __eq__(self, other):
218         return conf.lib.clang_equalLocations(self, other)
219
220     def __ne__(self, other):
221         return not self.__eq__(other)
222
223     def __repr__(self):
224         if self.file:
225             filename = self.file.name
226         else:
227             filename = None
228         return "<SourceLocation file %r, line %r, column %r>" % (
229             filename, self.line, self.column)
230
231 class SourceRange(Structure):
232     """
233     A SourceRange describes a range of source locations within the source
234     code.
235     """
236     _fields_ = [
237         ("ptr_data", c_void_p * 2),
238         ("begin_int_data", c_uint),
239         ("end_int_data", c_uint)]
240
241     # FIXME: Eliminate this and make normal constructor? Requires hiding ctypes
242     # object.
243     @staticmethod
244     def from_locations(start, end):
245         return conf.lib.clang_getRange(start, end)
246
247     @property
248     def start(self):
249         """
250         Return a SourceLocation representing the first character within a
251         source range.
252         """
253         return conf.lib.clang_getRangeStart(self)
254
255     @property
256     def end(self):
257         """
258         Return a SourceLocation representing the last character within a
259         source range.
260         """
261         return conf.lib.clang_getRangeEnd(self)
262
263     def __eq__(self, other):
264         return conf.lib.clang_equalRanges(self, other)
265
266     def __ne__(self, other):
267         return not self.__eq__(other)
268
269     def __contains__(self, other):
270         """Useful to detect the Token/Lexer bug"""
271         if not isinstance(other, SourceLocation):
272             return False
273         if other.file is None and self.start.file is None:
274             pass
275         elif ( self.start.file.name != other.file.name or
276                other.file.name != self.end.file.name):
277             # same file name
278             return False
279         # same file, in between lines
280         if self.start.line < other.line < self.end.line:
281             return True
282         elif self.start.line == other.line:
283             # same file first line
284             if self.start.column <= other.column:
285                 return True
286         elif other.line == self.end.line:
287             # same file last line
288             if other.column <= self.end.column:
289                 return True
290         return False
291
292     def __repr__(self):
293         return "<SourceRange start %r, end %r>" % (self.start, self.end)
294
295 class Diagnostic(object):
296     """
297     A Diagnostic is a single instance of a Clang diagnostic. It includes the
298     diagnostic severity, the message, the location the diagnostic occurred, as
299     well as additional source ranges and associated fix-it hints.
300     """
301
302     Ignored = 0
303     Note    = 1
304     Warning = 2
305     Error   = 3
306     Fatal   = 4
307
308     def __init__(self, ptr):
309         self.ptr = ptr
310
311     def __del__(self):
312         conf.lib.clang_disposeDiagnostic(self)
313
314     @property
315     def severity(self):
316         return conf.lib.clang_getDiagnosticSeverity(self)
317
318     @property
319     def location(self):
320         return conf.lib.clang_getDiagnosticLocation(self)
321
322     @property
323     def spelling(self):
324         return conf.lib.clang_getDiagnosticSpelling(self)
325
326     @property
327     def ranges(self):
328         class RangeIterator:
329             def __init__(self, diag):
330                 self.diag = diag
331
332             def __len__(self):
333                 return int(conf.lib.clang_getDiagnosticNumRanges(self.diag))
334
335             def __getitem__(self, key):
336                 if (key >= len(self)):
337                     raise IndexError
338                 return conf.lib.clang_getDiagnosticRange(self.diag, key)
339
340         return RangeIterator(self)
341
342     @property
343     def fixits(self):
344         class FixItIterator:
345             def __init__(self, diag):
346                 self.diag = diag
347
348             def __len__(self):
349                 return int(conf.lib.clang_getDiagnosticNumFixIts(self.diag))
350
351             def __getitem__(self, key):
352                 range = SourceRange()
353                 value = conf.lib.clang_getDiagnosticFixIt(self.diag, key,
354                         byref(range))
355                 if len(value) == 0:
356                     raise IndexError
357
358                 return FixIt(range, value)
359
360         return FixItIterator(self)
361
362     @property
363     def category_number(self):
364         """The category number for this diagnostic or 0 if unavailable."""
365         return conf.lib.clang_getDiagnosticCategory(self)
366
367     @property
368     def category_name(self):
369         """The string name of the category for this diagnostic."""
370         return conf.lib.clang_getDiagnosticCategoryText(self)
371
372     @property
373     def option(self):
374         """The command-line option that enables this diagnostic."""
375         return conf.lib.clang_getDiagnosticOption(self, None)
376
377     @property
378     def disable_option(self):
379         """The command-line option that disables this diagnostic."""
380         disable = _CXString()
381         conf.lib.clang_getDiagnosticOption(self, byref(disable))
382
383         return conf.lib.clang_getCString(disable)
384
385     def __repr__(self):
386         return "<Diagnostic severity %r, location %r, spelling %r>" % (
387             self.severity, self.location, self.spelling)
388
389     def from_param(self):
390       return self.ptr
391
392 class FixIt(object):
393     """
394     A FixIt represents a transformation to be applied to the source to
395     "fix-it". The fix-it shouldbe applied by replacing the given source range
396     with the given value.
397     """
398
399     def __init__(self, range, value):
400         self.range = range
401         self.value = value
402
403     def __repr__(self):
404         return "<FixIt range %r, value %r>" % (self.range, self.value)
405
406 class TokenGroup(object):
407     """Helper class to facilitate token management.
408
409     Tokens are allocated from libclang in chunks. They must be disposed of as a
410     collective group.
411
412     One purpose of this class is for instances to represent groups of allocated
413     tokens. Each token in a group contains a reference back to an instance of
414     this class. When all tokens from a group are garbage collected, it allows
415     this class to be garbage collected. When this class is garbage collected,
416     it calls the libclang destructor which invalidates all tokens in the group.
417
418     You should not instantiate this class outside of this module.
419     """
420     def __init__(self, tu, memory, count):
421         self._tu = tu
422         self._memory = memory
423         self._count = count
424
425     def __del__(self):
426         conf.lib.clang_disposeTokens(self._tu, self._memory, self._count)
427
428     @staticmethod
429     def get_tokens(tu, extent):
430         """Helper method to return all tokens in an extent.
431
432         This functionality is needed multiple places in this module. We define
433         it here because it seems like a logical place.
434         """
435         tokens_memory = POINTER(Token)()
436         tokens_count = c_uint()
437
438         conf.lib.clang_tokenize(tu, extent, byref(tokens_memory),
439                 byref(tokens_count))
440
441         count = int(tokens_count.value)
442
443         # If we get no tokens, no memory was allocated. Be sure not to return
444         # anything and potentially call a destructor on nothing.
445         if count < 1:
446             return
447
448         tokens_array = cast(tokens_memory, POINTER(Token * count)).contents
449
450         token_group = TokenGroup(tu, tokens_memory, tokens_count)
451
452         for i in xrange(0, count):
453             token = Token()
454             token.int_data = tokens_array[i].int_data
455             token.ptr_data = tokens_array[i].ptr_data
456             token._tu = tu
457             token._group = token_group
458
459             yield token
460
461 class TokenKind(object):
462     """Describes a specific type of a Token."""
463
464     _value_map = {} # int -> TokenKind
465
466     def __init__(self, value, name):
467         """Create a new TokenKind instance from a numeric value and a name."""
468         self.value = value
469         self.name = name
470
471     def __repr__(self):
472         return 'TokenKind.%s' % (self.name,)
473
474     @staticmethod
475     def from_value(value):
476         """Obtain a registered TokenKind instance from its value."""
477         result = TokenKind._value_map.get(value, None)
478
479         if result is None:
480             raise ValueError('Unknown TokenKind: %d' % value)
481
482         return result
483
484     @staticmethod
485     def register(value, name):
486         """Register a new TokenKind enumeration.
487
488         This should only be called at module load time by code within this
489         package.
490         """
491         if value in TokenKind._value_map:
492             raise ValueError('TokenKind already registered: %d' % value)
493
494         kind = TokenKind(value, name)
495         TokenKind._value_map[value] = kind
496         setattr(TokenKind, name, kind)
497
498 ### Cursor Kinds ###
499 class BaseEnumeration(object):
500     """
501     Common base class for named enumerations held in sync with Index.h values.
502
503     Subclasses must define their own _kinds and _name_map members, as:
504     _kinds = []
505     _name_map = None
506     These values hold the per-subclass instances and value-to-name mappings,
507     respectively.
508
509     """
510
511     def __init__(self, value):
512         if value >= len(self.__class__._kinds):
513             self.__class__._kinds += [None] * (value - len(self.__class__._kinds) + 1)
514         if self.__class__._kinds[value] is not None:
515             raise ValueError,'{0} value {1} already loaded'.format(
516                 str(self.__class__), value)
517         self.value = value
518         self.__class__._kinds[value] = self
519         self.__class__._name_map = None
520
521
522     def from_param(self):
523         return self.value
524
525     @property
526     def name(self):
527         """Get the enumeration name of this cursor kind."""
528         if self._name_map is None:
529             self._name_map = {}
530             for key, value in self.__class__.__dict__.items():
531                 if isinstance(value, self.__class__):
532                     self._name_map[value] = key
533         return self._name_map[self]
534
535     @classmethod
536     def from_id(cls, id):
537         if id >= len(cls._kinds) or cls._kinds[id] is None:
538             raise ValueError,'Unknown template argument kind %d' % id
539         return cls._kinds[id]
540
541     def __repr__(self):
542         return '%s.%s' % (self.__class__, self.name,)
543
544
545 class CursorKind(BaseEnumeration):
546     """
547     A CursorKind describes the kind of entity that a cursor points to.
548     """
549
550     # The required BaseEnumeration declarations.
551     _kinds = []
552     _name_map = None
553
554     @staticmethod
555     def get_all_kinds():
556         """Return all CursorKind enumeration instances."""
557         return filter(None, CursorKind._kinds)
558
559     def is_declaration(self):
560         """Test if this is a declaration kind."""
561         return conf.lib.clang_isDeclaration(self)
562
563     def is_reference(self):
564         """Test if this is a reference kind."""
565         return conf.lib.clang_isReference(self)
566
567     def is_expression(self):
568         """Test if this is an expression kind."""
569         return conf.lib.clang_isExpression(self)
570
571     def is_statement(self):
572         """Test if this is a statement kind."""
573         return conf.lib.clang_isStatement(self)
574
575     def is_attribute(self):
576         """Test if this is an attribute kind."""
577         return conf.lib.clang_isAttribute(self)
578
579     def is_invalid(self):
580         """Test if this is an invalid kind."""
581         return conf.lib.clang_isInvalid(self)
582
583     def is_translation_unit(self):
584         """Test if this is a translation unit kind."""
585         return conf.lib.clang_isTranslationUnit(self)
586
587     def is_preprocessing(self):
588         """Test if this is a preprocessing kind."""
589         return conf.lib.clang_isPreprocessing(self)
590
591     def is_unexposed(self):
592         """Test if this is an unexposed kind."""
593         return conf.lib.clang_isUnexposed(self)
594
595     def __repr__(self):
596         return 'CursorKind.%s' % (self.name,)
597
598 ###
599 # Declaration Kinds
600
601 # A declaration whose specific kind is not exposed via this interface.
602 #
603 # Unexposed declarations have the same operations as any other kind of
604 # declaration; one can extract their location information, spelling, find their
605 # definitions, etc. However, the specific kind of the declaration is not
606 # reported.
607 CursorKind.UNEXPOSED_DECL = CursorKind(1)
608
609 # A C or C++ struct.
610 CursorKind.STRUCT_DECL = CursorKind(2)
611
612 # A C or C++ union.
613 CursorKind.UNION_DECL = CursorKind(3)
614
615 # A C++ class.
616 CursorKind.CLASS_DECL = CursorKind(4)
617
618 # An enumeration.
619 CursorKind.ENUM_DECL = CursorKind(5)
620
621 # A field (in C) or non-static data member (in C++) in a struct, union, or C++
622 # class.
623 CursorKind.FIELD_DECL = CursorKind(6)
624
625 # An enumerator constant.
626 CursorKind.ENUM_CONSTANT_DECL = CursorKind(7)
627
628 # A function.
629 CursorKind.FUNCTION_DECL = CursorKind(8)
630
631 # A variable.
632 CursorKind.VAR_DECL = CursorKind(9)
633
634 # A function or method parameter.
635 CursorKind.PARM_DECL = CursorKind(10)
636
637 # An Objective-C @interface.
638 CursorKind.OBJC_INTERFACE_DECL = CursorKind(11)
639
640 # An Objective-C @interface for a category.
641 CursorKind.OBJC_CATEGORY_DECL = CursorKind(12)
642
643 # An Objective-C @protocol declaration.
644 CursorKind.OBJC_PROTOCOL_DECL = CursorKind(13)
645
646 # An Objective-C @property declaration.
647 CursorKind.OBJC_PROPERTY_DECL = CursorKind(14)
648
649 # An Objective-C instance variable.
650 CursorKind.OBJC_IVAR_DECL = CursorKind(15)
651
652 # An Objective-C instance method.
653 CursorKind.OBJC_INSTANCE_METHOD_DECL = CursorKind(16)
654
655 # An Objective-C class method.
656 CursorKind.OBJC_CLASS_METHOD_DECL = CursorKind(17)
657
658 # An Objective-C @implementation.
659 CursorKind.OBJC_IMPLEMENTATION_DECL = CursorKind(18)
660
661 # An Objective-C @implementation for a category.
662 CursorKind.OBJC_CATEGORY_IMPL_DECL = CursorKind(19)
663
664 # A typedef.
665 CursorKind.TYPEDEF_DECL = CursorKind(20)
666
667 # A C++ class method.
668 CursorKind.CXX_METHOD = CursorKind(21)
669
670 # A C++ namespace.
671 CursorKind.NAMESPACE = CursorKind(22)
672
673 # A linkage specification, e.g. 'extern "C"'.
674 CursorKind.LINKAGE_SPEC = CursorKind(23)
675
676 # A C++ constructor.
677 CursorKind.CONSTRUCTOR = CursorKind(24)
678
679 # A C++ destructor.
680 CursorKind.DESTRUCTOR = CursorKind(25)
681
682 # A C++ conversion function.
683 CursorKind.CONVERSION_FUNCTION = CursorKind(26)
684
685 # A C++ template type parameter
686 CursorKind.TEMPLATE_TYPE_PARAMETER = CursorKind(27)
687
688 # A C++ non-type template paramater.
689 CursorKind.TEMPLATE_NON_TYPE_PARAMETER = CursorKind(28)
690
691 # A C++ template template parameter.
692 CursorKind.TEMPLATE_TEMPLATE_PARAMETER = CursorKind(29)
693
694 # A C++ function template.
695 CursorKind.FUNCTION_TEMPLATE = CursorKind(30)
696
697 # A C++ class template.
698 CursorKind.CLASS_TEMPLATE = CursorKind(31)
699
700 # A C++ class template partial specialization.
701 CursorKind.CLASS_TEMPLATE_PARTIAL_SPECIALIZATION = CursorKind(32)
702
703 # A C++ namespace alias declaration.
704 CursorKind.NAMESPACE_ALIAS = CursorKind(33)
705
706 # A C++ using directive
707 CursorKind.USING_DIRECTIVE = CursorKind(34)
708
709 # A C++ using declaration
710 CursorKind.USING_DECLARATION = CursorKind(35)
711
712 # A Type alias decl.
713 CursorKind.TYPE_ALIAS_DECL = CursorKind(36)
714
715 # A Objective-C synthesize decl
716 CursorKind.OBJC_SYNTHESIZE_DECL = CursorKind(37)
717
718 # A Objective-C dynamic decl
719 CursorKind.OBJC_DYNAMIC_DECL = CursorKind(38)
720
721 # A C++ access specifier decl.
722 CursorKind.CXX_ACCESS_SPEC_DECL = CursorKind(39)
723
724
725 ###
726 # Reference Kinds
727
728 CursorKind.OBJC_SUPER_CLASS_REF = CursorKind(40)
729 CursorKind.OBJC_PROTOCOL_REF = CursorKind(41)
730 CursorKind.OBJC_CLASS_REF = CursorKind(42)
731
732 # A reference to a type declaration.
733 #
734 # A type reference occurs anywhere where a type is named but not
735 # declared. For example, given:
736 #   typedef unsigned size_type;
737 #   size_type size;
738 #
739 # The typedef is a declaration of size_type (CXCursor_TypedefDecl),
740 # while the type of the variable "size" is referenced. The cursor
741 # referenced by the type of size is the typedef for size_type.
742 CursorKind.TYPE_REF = CursorKind(43)
743 CursorKind.CXX_BASE_SPECIFIER = CursorKind(44)
744
745 # A reference to a class template, function template, template
746 # template parameter, or class template partial specialization.
747 CursorKind.TEMPLATE_REF = CursorKind(45)
748
749 # A reference to a namespace or namepsace alias.
750 CursorKind.NAMESPACE_REF = CursorKind(46)
751
752 # A reference to a member of a struct, union, or class that occurs in
753 # some non-expression context, e.g., a designated initializer.
754 CursorKind.MEMBER_REF = CursorKind(47)
755
756 # A reference to a labeled statement.
757 CursorKind.LABEL_REF = CursorKind(48)
758
759 # A reference to a set of overloaded functions or function templates
760 # that has not yet been resolved to a specific function or function template.
761 CursorKind.OVERLOADED_DECL_REF = CursorKind(49)
762
763 # A reference to a variable that occurs in some non-expression
764 # context, e.g., a C++ lambda capture list.
765 CursorKind.VARIABLE_REF = CursorKind(50)
766
767 ###
768 # Invalid/Error Kinds
769
770 CursorKind.INVALID_FILE = CursorKind(70)
771 CursorKind.NO_DECL_FOUND = CursorKind(71)
772 CursorKind.NOT_IMPLEMENTED = CursorKind(72)
773 CursorKind.INVALID_CODE = CursorKind(73)
774
775 ###
776 # Expression Kinds
777
778 # An expression whose specific kind is not exposed via this interface.
779 #
780 # Unexposed expressions have the same operations as any other kind of
781 # expression; one can extract their location information, spelling, children,
782 # etc. However, the specific kind of the expression is not reported.
783 CursorKind.UNEXPOSED_EXPR = CursorKind(100)
784
785 # An expression that refers to some value declaration, such as a function,
786 # varible, or enumerator.
787 CursorKind.DECL_REF_EXPR = CursorKind(101)
788
789 # An expression that refers to a member of a struct, union, class, Objective-C
790 # class, etc.
791 CursorKind.MEMBER_REF_EXPR = CursorKind(102)
792
793 # An expression that calls a function.
794 CursorKind.CALL_EXPR = CursorKind(103)
795
796 # An expression that sends a message to an Objective-C object or class.
797 CursorKind.OBJC_MESSAGE_EXPR = CursorKind(104)
798
799 # An expression that represents a block literal.
800 CursorKind.BLOCK_EXPR = CursorKind(105)
801
802 # An integer literal.
803 CursorKind.INTEGER_LITERAL = CursorKind(106)
804
805 # A floating point number literal.
806 CursorKind.FLOATING_LITERAL = CursorKind(107)
807
808 # An imaginary number literal.
809 CursorKind.IMAGINARY_LITERAL = CursorKind(108)
810
811 # A string literal.
812 CursorKind.STRING_LITERAL = CursorKind(109)
813
814 # A character literal.
815 CursorKind.CHARACTER_LITERAL = CursorKind(110)
816
817 # A parenthesized expression, e.g. "(1)".
818 #
819 # This AST node is only formed if full location information is requested.
820 CursorKind.PAREN_EXPR = CursorKind(111)
821
822 # This represents the unary-expression's (except sizeof and
823 # alignof).
824 CursorKind.UNARY_OPERATOR = CursorKind(112)
825
826 # [C99 6.5.2.1] Array Subscripting.
827 CursorKind.ARRAY_SUBSCRIPT_EXPR = CursorKind(113)
828
829 # A builtin binary operation expression such as "x + y" or
830 # "x <= y".
831 CursorKind.BINARY_OPERATOR = CursorKind(114)
832
833 # Compound assignment such as "+=".
834 CursorKind.COMPOUND_ASSIGNMENT_OPERATOR = CursorKind(115)
835
836 # The ?: ternary operator.
837 CursorKind.CONDITIONAL_OPERATOR = CursorKind(116)
838
839 # An explicit cast in C (C99 6.5.4) or a C-style cast in C++
840 # (C++ [expr.cast]), which uses the syntax (Type)expr.
841 #
842 # For example: (int)f.
843 CursorKind.CSTYLE_CAST_EXPR = CursorKind(117)
844
845 # [C99 6.5.2.5]
846 CursorKind.COMPOUND_LITERAL_EXPR = CursorKind(118)
847
848 # Describes an C or C++ initializer list.
849 CursorKind.INIT_LIST_EXPR = CursorKind(119)
850
851 # The GNU address of label extension, representing &&label.
852 CursorKind.ADDR_LABEL_EXPR = CursorKind(120)
853
854 # This is the GNU Statement Expression extension: ({int X=4; X;})
855 CursorKind.StmtExpr = CursorKind(121)
856
857 # Represents a C11 generic selection.
858 CursorKind.GENERIC_SELECTION_EXPR = CursorKind(122)
859
860 # Implements the GNU __null extension, which is a name for a null
861 # pointer constant that has integral type (e.g., int or long) and is the same
862 # size and alignment as a pointer.
863 #
864 # The __null extension is typically only used by system headers, which define
865 # NULL as __null in C++ rather than using 0 (which is an integer that may not
866 # match the size of a pointer).
867 CursorKind.GNU_NULL_EXPR = CursorKind(123)
868
869 # C++'s static_cast<> expression.
870 CursorKind.CXX_STATIC_CAST_EXPR = CursorKind(124)
871
872 # C++'s dynamic_cast<> expression.
873 CursorKind.CXX_DYNAMIC_CAST_EXPR = CursorKind(125)
874
875 # C++'s reinterpret_cast<> expression.
876 CursorKind.CXX_REINTERPRET_CAST_EXPR = CursorKind(126)
877
878 # C++'s const_cast<> expression.
879 CursorKind.CXX_CONST_CAST_EXPR = CursorKind(127)
880
881 # Represents an explicit C++ type conversion that uses "functional"
882 # notion (C++ [expr.type.conv]).
883 #
884 # Example:
885 # \code
886 #   x = int(0.5);
887 # \endcode
888 CursorKind.CXX_FUNCTIONAL_CAST_EXPR = CursorKind(128)
889
890 # A C++ typeid expression (C++ [expr.typeid]).
891 CursorKind.CXX_TYPEID_EXPR = CursorKind(129)
892
893 # [C++ 2.13.5] C++ Boolean Literal.
894 CursorKind.CXX_BOOL_LITERAL_EXPR = CursorKind(130)
895
896 # [C++0x 2.14.7] C++ Pointer Literal.
897 CursorKind.CXX_NULL_PTR_LITERAL_EXPR = CursorKind(131)
898
899 # Represents the "this" expression in C++
900 CursorKind.CXX_THIS_EXPR = CursorKind(132)
901
902 # [C++ 15] C++ Throw Expression.
903 #
904 # This handles 'throw' and 'throw' assignment-expression. When
905 # assignment-expression isn't present, Op will be null.
906 CursorKind.CXX_THROW_EXPR = CursorKind(133)
907
908 # A new expression for memory allocation and constructor calls, e.g:
909 # "new CXXNewExpr(foo)".
910 CursorKind.CXX_NEW_EXPR = CursorKind(134)
911
912 # A delete expression for memory deallocation and destructor calls,
913 # e.g. "delete[] pArray".
914 CursorKind.CXX_DELETE_EXPR = CursorKind(135)
915
916 # Represents a unary expression.
917 CursorKind.CXX_UNARY_EXPR = CursorKind(136)
918
919 # ObjCStringLiteral, used for Objective-C string literals i.e. "foo".
920 CursorKind.OBJC_STRING_LITERAL = CursorKind(137)
921
922 # ObjCEncodeExpr, used for in Objective-C.
923 CursorKind.OBJC_ENCODE_EXPR = CursorKind(138)
924
925 # ObjCSelectorExpr used for in Objective-C.
926 CursorKind.OBJC_SELECTOR_EXPR = CursorKind(139)
927
928 # Objective-C's protocol expression.
929 CursorKind.OBJC_PROTOCOL_EXPR = CursorKind(140)
930
931 # An Objective-C "bridged" cast expression, which casts between
932 # Objective-C pointers and C pointers, transferring ownership in the process.
933 #
934 # \code
935 #   NSString *str = (__bridge_transfer NSString *)CFCreateString();
936 # \endcode
937 CursorKind.OBJC_BRIDGE_CAST_EXPR = CursorKind(141)
938
939 # Represents a C++0x pack expansion that produces a sequence of
940 # expressions.
941 #
942 # A pack expansion expression contains a pattern (which itself is an
943 # expression) followed by an ellipsis. For example:
944 CursorKind.PACK_EXPANSION_EXPR = CursorKind(142)
945
946 # Represents an expression that computes the length of a parameter
947 # pack.
948 CursorKind.SIZE_OF_PACK_EXPR = CursorKind(143)
949
950 # Represents a C++ lambda expression that produces a local function
951 # object.
952 #
953 #  \code
954 #  void abssort(float *x, unsigned N) {
955 #    std::sort(x, x + N,
956 #              [](float a, float b) {
957 #                return std::abs(a) < std::abs(b);
958 #              });
959 #  }
960 #  \endcode
961 CursorKind.LAMBDA_EXPR = CursorKind(144)
962
963 # Objective-c Boolean Literal.
964 CursorKind.OBJ_BOOL_LITERAL_EXPR = CursorKind(145)
965
966 # Represents the "self" expression in a ObjC method.
967 CursorKind.OBJ_SELF_EXPR = CursorKind(146)
968
969
970 # A statement whose specific kind is not exposed via this interface.
971 #
972 # Unexposed statements have the same operations as any other kind of statement;
973 # one can extract their location information, spelling, children, etc. However,
974 # the specific kind of the statement is not reported.
975 CursorKind.UNEXPOSED_STMT = CursorKind(200)
976
977 # A labelled statement in a function.
978 CursorKind.LABEL_STMT = CursorKind(201)
979
980 # A compound statement
981 CursorKind.COMPOUND_STMT = CursorKind(202)
982
983 # A case statement.
984 CursorKind.CASE_STMT = CursorKind(203)
985
986 # A default statement.
987 CursorKind.DEFAULT_STMT = CursorKind(204)
988
989 # An if statement.
990 CursorKind.IF_STMT = CursorKind(205)
991
992 # A switch statement.
993 CursorKind.SWITCH_STMT = CursorKind(206)
994
995 # A while statement.
996 CursorKind.WHILE_STMT = CursorKind(207)
997
998 # A do statement.
999 CursorKind.DO_STMT = CursorKind(208)
1000
1001 # A for statement.
1002 CursorKind.FOR_STMT = CursorKind(209)
1003
1004 # A goto statement.
1005 CursorKind.GOTO_STMT = CursorKind(210)
1006
1007 # An indirect goto statement.
1008 CursorKind.INDIRECT_GOTO_STMT = CursorKind(211)
1009
1010 # A continue statement.
1011 CursorKind.CONTINUE_STMT = CursorKind(212)
1012
1013 # A break statement.
1014 CursorKind.BREAK_STMT = CursorKind(213)
1015
1016 # A return statement.
1017 CursorKind.RETURN_STMT = CursorKind(214)
1018
1019 # A GNU-style inline assembler statement.
1020 CursorKind.ASM_STMT = CursorKind(215)
1021
1022 # Objective-C's overall @try-@catch-@finally statement.
1023 CursorKind.OBJC_AT_TRY_STMT = CursorKind(216)
1024
1025 # Objective-C's @catch statement.
1026 CursorKind.OBJC_AT_CATCH_STMT = CursorKind(217)
1027
1028 # Objective-C's @finally statement.
1029 CursorKind.OBJC_AT_FINALLY_STMT = CursorKind(218)
1030
1031 # Objective-C's @throw statement.
1032 CursorKind.OBJC_AT_THROW_STMT = CursorKind(219)
1033
1034 # Objective-C's @synchronized statement.
1035 CursorKind.OBJC_AT_SYNCHRONIZED_STMT = CursorKind(220)
1036
1037 # Objective-C's autorealease pool statement.
1038 CursorKind.OBJC_AUTORELEASE_POOL_STMT = CursorKind(221)
1039
1040 # Objective-C's for collection statement.
1041 CursorKind.OBJC_FOR_COLLECTION_STMT = CursorKind(222)
1042
1043 # C++'s catch statement.
1044 CursorKind.CXX_CATCH_STMT = CursorKind(223)
1045
1046 # C++'s try statement.
1047 CursorKind.CXX_TRY_STMT = CursorKind(224)
1048
1049 # C++'s for (* : *) statement.
1050 CursorKind.CXX_FOR_RANGE_STMT = CursorKind(225)
1051
1052 # Windows Structured Exception Handling's try statement.
1053 CursorKind.SEH_TRY_STMT = CursorKind(226)
1054
1055 # Windows Structured Exception Handling's except statement.
1056 CursorKind.SEH_EXCEPT_STMT = CursorKind(227)
1057
1058 # Windows Structured Exception Handling's finally statement.
1059 CursorKind.SEH_FINALLY_STMT = CursorKind(228)
1060
1061 # A MS inline assembly statement extension.
1062 CursorKind.MS_ASM_STMT = CursorKind(229)
1063
1064 # The null statement.
1065 CursorKind.NULL_STMT = CursorKind(230)
1066
1067 # Adaptor class for mixing declarations with statements and expressions.
1068 CursorKind.DECL_STMT = CursorKind(231)
1069
1070 ###
1071 # Other Kinds
1072
1073 # Cursor that represents the translation unit itself.
1074 #
1075 # The translation unit cursor exists primarily to act as the root cursor for
1076 # traversing the contents of a translation unit.
1077 CursorKind.TRANSLATION_UNIT = CursorKind(300)
1078
1079 ###
1080 # Attributes
1081
1082 # An attribute whoe specific kind is note exposed via this interface
1083 CursorKind.UNEXPOSED_ATTR = CursorKind(400)
1084
1085 CursorKind.IB_ACTION_ATTR = CursorKind(401)
1086 CursorKind.IB_OUTLET_ATTR = CursorKind(402)
1087 CursorKind.IB_OUTLET_COLLECTION_ATTR = CursorKind(403)
1088
1089 CursorKind.CXX_FINAL_ATTR = CursorKind(404)
1090 CursorKind.CXX_OVERRIDE_ATTR = CursorKind(405)
1091 CursorKind.ANNOTATE_ATTR = CursorKind(406)
1092 CursorKind.ASM_LABEL_ATTR = CursorKind(407)
1093 CursorKind.PACKED_ATTR = CursorKind(408)
1094 CursorKind.PURE_ATTR = CursorKind(409)
1095 CursorKind.CONST_ATTR = CursorKind(410)
1096 CursorKind.NODUPLICATE_ATTR = CursorKind(411)
1097 CursorKind.CUDACONSTANT_ATTR = CursorKind(412)
1098 CursorKind.CUDADEVICE_ATTR = CursorKind(413)
1099 CursorKind.CUDAGLOBAL_ATTR = CursorKind(414)
1100 CursorKind.CUDAHOST_ATTR = CursorKind(415)
1101 CursorKind.CUDASHARED_ATTR = CursorKind(416)
1102
1103 ###
1104 # Preprocessing
1105 CursorKind.PREPROCESSING_DIRECTIVE = CursorKind(500)
1106 CursorKind.MACRO_DEFINITION = CursorKind(501)
1107 CursorKind.MACRO_INSTANTIATION = CursorKind(502)
1108 CursorKind.INCLUSION_DIRECTIVE = CursorKind(503)
1109
1110 ###
1111 # Extra declaration
1112
1113 # A module import declaration.
1114 CursorKind.MODULE_IMPORT_DECL = CursorKind(600)
1115
1116
1117 ### Template Argument Kinds ###
1118 class TemplateArgumentKind(BaseEnumeration):
1119     """
1120     A TemplateArgumentKind describes the kind of entity that a template argument
1121     represents.
1122     """
1123
1124     # The required BaseEnumeration declarations.
1125     _kinds = []
1126     _name_map = None
1127
1128 TemplateArgumentKind.NULL = TemplateArgumentKind(0)
1129 TemplateArgumentKind.TYPE = TemplateArgumentKind(1)
1130 TemplateArgumentKind.DECLARATION = TemplateArgumentKind(2)
1131 TemplateArgumentKind.NULLPTR = TemplateArgumentKind(3)
1132 TemplateArgumentKind.INTEGRAL = TemplateArgumentKind(4)
1133
1134 ### Cursors ###
1135
1136 class Cursor(Structure):
1137     """
1138     The Cursor class represents a reference to an element within the AST. It
1139     acts as a kind of iterator.
1140     """
1141     _fields_ = [("_kind_id", c_int), ("xdata", c_int), ("data", c_void_p * 3)]
1142
1143     @staticmethod
1144     def from_location(tu, location):
1145         # We store a reference to the TU in the instance so the TU won't get
1146         # collected before the cursor.
1147         cursor = conf.lib.clang_getCursor(tu, location)
1148         cursor._tu = tu
1149
1150         return cursor
1151
1152     def __eq__(self, other):
1153         return conf.lib.clang_equalCursors(self, other)
1154
1155     def __ne__(self, other):
1156         return not self.__eq__(other)
1157
1158     def is_definition(self):
1159         """
1160         Returns true if the declaration pointed at by the cursor is also a
1161         definition of that entity.
1162         """
1163         return conf.lib.clang_isCursorDefinition(self)
1164
1165     def is_static_method(self):
1166         """Returns True if the cursor refers to a C++ member function or member
1167         function template that is declared 'static'.
1168         """
1169         return conf.lib.clang_CXXMethod_isStatic(self)
1170
1171     def get_definition(self):
1172         """
1173         If the cursor is a reference to a declaration or a declaration of
1174         some entity, return a cursor that points to the definition of that
1175         entity.
1176         """
1177         # TODO: Should probably check that this is either a reference or
1178         # declaration prior to issuing the lookup.
1179         return conf.lib.clang_getCursorDefinition(self)
1180
1181     def get_usr(self):
1182         """Return the Unified Symbol Resultion (USR) for the entity referenced
1183         by the given cursor (or None).
1184
1185         A Unified Symbol Resolution (USR) is a string that identifies a
1186         particular entity (function, class, variable, etc.) within a
1187         program. USRs can be compared across translation units to determine,
1188         e.g., when references in one translation refer to an entity defined in
1189         another translation unit."""
1190         return conf.lib.clang_getCursorUSR(self)
1191
1192     @property
1193     def kind(self):
1194         """Return the kind of this cursor."""
1195         return CursorKind.from_id(self._kind_id)
1196
1197     @property
1198     def spelling(self):
1199         """Return the spelling of the entity pointed at by the cursor."""
1200         if not hasattr(self, '_spelling'):
1201             self._spelling = conf.lib.clang_getCursorSpelling(self)
1202
1203         return self._spelling
1204
1205     @property
1206     def displayname(self):
1207         """
1208         Return the display name for the entity referenced by this cursor.
1209
1210         The display name contains extra information that helps identify the
1211         cursor, such as the parameters of a function or template or the
1212         arguments of a class template specialization.
1213         """
1214         if not hasattr(self, '_displayname'):
1215             self._displayname = conf.lib.clang_getCursorDisplayName(self)
1216
1217         return self._displayname
1218
1219     @property
1220     def mangled_name(self):
1221         """Return the mangled name for the entity referenced by this cursor."""
1222         if not hasattr(self, '_mangled_name'):
1223             self._mangled_name = conf.lib.clang_Cursor_getMangling(self)
1224
1225         return self._mangled_name
1226
1227     @property
1228     def location(self):
1229         """
1230         Return the source location (the starting character) of the entity
1231         pointed at by the cursor.
1232         """
1233         if not hasattr(self, '_loc'):
1234             self._loc = conf.lib.clang_getCursorLocation(self)
1235
1236         return self._loc
1237
1238     @property
1239     def extent(self):
1240         """
1241         Return the source range (the range of text) occupied by the entity
1242         pointed at by the cursor.
1243         """
1244         if not hasattr(self, '_extent'):
1245             self._extent = conf.lib.clang_getCursorExtent(self)
1246
1247         return self._extent
1248
1249     @property
1250     def storage_class(self):
1251         """
1252         Retrieves the storage class (if any) of the entity pointed at by the
1253         cursor.
1254         """
1255         if not hasattr(self, '_storage_class'):
1256             self._storage_class = conf.lib.clang_Cursor_getStorageClass(self)
1257
1258         return StorageClass.from_id(self._storage_class)
1259
1260     @property
1261     def access_specifier(self):
1262         """
1263         Retrieves the access specifier (if any) of the entity pointed at by the
1264         cursor.
1265         """
1266         if not hasattr(self, '_access_specifier'):
1267             self._access_specifier = conf.lib.clang_getCXXAccessSpecifier(self)
1268
1269         return AccessSpecifier.from_id(self._access_specifier)
1270
1271     @property
1272     def type(self):
1273         """
1274         Retrieve the Type (if any) of the entity pointed at by the cursor.
1275         """
1276         if not hasattr(self, '_type'):
1277             self._type = conf.lib.clang_getCursorType(self)
1278
1279         return self._type
1280
1281     @property
1282     def canonical(self):
1283         """Return the canonical Cursor corresponding to this Cursor.
1284
1285         The canonical cursor is the cursor which is representative for the
1286         underlying entity. For example, if you have multiple forward
1287         declarations for the same class, the canonical cursor for the forward
1288         declarations will be identical.
1289         """
1290         if not hasattr(self, '_canonical'):
1291             self._canonical = conf.lib.clang_getCanonicalCursor(self)
1292
1293         return self._canonical
1294
1295     @property
1296     def result_type(self):
1297         """Retrieve the Type of the result for this Cursor."""
1298         if not hasattr(self, '_result_type'):
1299             self._result_type = conf.lib.clang_getResultType(self.type)
1300
1301         return self._result_type
1302
1303     @property
1304     def underlying_typedef_type(self):
1305         """Return the underlying type of a typedef declaration.
1306
1307         Returns a Type for the typedef this cursor is a declaration for. If
1308         the current cursor is not a typedef, this raises.
1309         """
1310         if not hasattr(self, '_underlying_type'):
1311             assert self.kind.is_declaration()
1312             self._underlying_type = \
1313               conf.lib.clang_getTypedefDeclUnderlyingType(self)
1314
1315         return self._underlying_type
1316
1317     @property
1318     def enum_type(self):
1319         """Return the integer type of an enum declaration.
1320
1321         Returns a Type corresponding to an integer. If the cursor is not for an
1322         enum, this raises.
1323         """
1324         if not hasattr(self, '_enum_type'):
1325             assert self.kind == CursorKind.ENUM_DECL
1326             self._enum_type = conf.lib.clang_getEnumDeclIntegerType(self)
1327
1328         return self._enum_type
1329
1330     @property
1331     def enum_value(self):
1332         """Return the value of an enum constant."""
1333         if not hasattr(self, '_enum_value'):
1334             assert self.kind == CursorKind.ENUM_CONSTANT_DECL
1335             # Figure out the underlying type of the enum to know if it
1336             # is a signed or unsigned quantity.
1337             underlying_type = self.type
1338             if underlying_type.kind == TypeKind.ENUM:
1339                 underlying_type = underlying_type.get_declaration().enum_type
1340             if underlying_type.kind in (TypeKind.CHAR_U,
1341                                         TypeKind.UCHAR,
1342                                         TypeKind.CHAR16,
1343                                         TypeKind.CHAR32,
1344                                         TypeKind.USHORT,
1345                                         TypeKind.UINT,
1346                                         TypeKind.ULONG,
1347                                         TypeKind.ULONGLONG,
1348                                         TypeKind.UINT128):
1349                 self._enum_value = \
1350                   conf.lib.clang_getEnumConstantDeclUnsignedValue(self)
1351             else:
1352                 self._enum_value = conf.lib.clang_getEnumConstantDeclValue(self)
1353         return self._enum_value
1354
1355     @property
1356     def objc_type_encoding(self):
1357         """Return the Objective-C type encoding as a str."""
1358         if not hasattr(self, '_objc_type_encoding'):
1359             self._objc_type_encoding = \
1360               conf.lib.clang_getDeclObjCTypeEncoding(self)
1361
1362         return self._objc_type_encoding
1363
1364     @property
1365     def hash(self):
1366         """Returns a hash of the cursor as an int."""
1367         if not hasattr(self, '_hash'):
1368             self._hash = conf.lib.clang_hashCursor(self)
1369
1370         return self._hash
1371
1372     @property
1373     def semantic_parent(self):
1374         """Return the semantic parent for this cursor."""
1375         if not hasattr(self, '_semantic_parent'):
1376             self._semantic_parent = conf.lib.clang_getCursorSemanticParent(self)
1377
1378         return self._semantic_parent
1379
1380     @property
1381     def lexical_parent(self):
1382         """Return the lexical parent for this cursor."""
1383         if not hasattr(self, '_lexical_parent'):
1384             self._lexical_parent = conf.lib.clang_getCursorLexicalParent(self)
1385
1386         return self._lexical_parent
1387
1388     @property
1389     def translation_unit(self):
1390         """Returns the TranslationUnit to which this Cursor belongs."""
1391         # If this triggers an AttributeError, the instance was not properly
1392         # created.
1393         return self._tu
1394
1395     @property
1396     def referenced(self):
1397         """
1398         For a cursor that is a reference, returns a cursor
1399         representing the entity that it references.
1400         """
1401         if not hasattr(self, '_referenced'):
1402             self._referenced = conf.lib.clang_getCursorReferenced(self)
1403
1404         return self._referenced
1405
1406     @property
1407     def brief_comment(self):
1408         """Returns the brief comment text associated with that Cursor"""
1409         return conf.lib.clang_Cursor_getBriefCommentText(self)
1410
1411     @property
1412     def raw_comment(self):
1413         """Returns the raw comment text associated with that Cursor"""
1414         return conf.lib.clang_Cursor_getRawCommentText(self)
1415
1416     def get_arguments(self):
1417         """Return an iterator for accessing the arguments of this cursor."""
1418         num_args = conf.lib.clang_Cursor_getNumArguments(self)
1419         for i in range(0, num_args):
1420             yield conf.lib.clang_Cursor_getArgument(self, i)
1421
1422     def get_num_template_arguments(self):
1423         """Returns the number of template args associated with this cursor."""
1424         return conf.lib.clang_Cursor_getNumTemplateArguments(self)
1425
1426     def get_template_argument_kind(self, num):
1427         """Returns the TemplateArgumentKind for the indicated template
1428         argument."""
1429         return conf.lib.clang_Cursor_getTemplateArgumentKind(self, num)
1430
1431     def get_template_argument_type(self, num):
1432         """Returns the CXType for the indicated template argument."""
1433         return conf.lib.clang_Cursor_getTemplateArgumentType(self, num)
1434
1435     def get_template_argument_value(self, num):
1436         """Returns the value of the indicated arg as a signed 64b integer."""
1437         return conf.lib.clang_Cursor_getTemplateArgumentValue(self, num)
1438
1439     def get_template_argument_unsigned_value(self, num):
1440         """Returns the value of the indicated arg as an unsigned 64b integer."""
1441         return conf.lib.clang_Cursor_getTemplateArgumentUnsignedValue(self, num)
1442
1443     def get_children(self):
1444         """Return an iterator for accessing the children of this cursor."""
1445
1446         # FIXME: Expose iteration from CIndex, PR6125.
1447         def visitor(child, parent, children):
1448             # FIXME: Document this assertion in API.
1449             # FIXME: There should just be an isNull method.
1450             assert child != conf.lib.clang_getNullCursor()
1451
1452             # Create reference to TU so it isn't GC'd before Cursor.
1453             child._tu = self._tu
1454             children.append(child)
1455             return 1 # continue
1456         children = []
1457         conf.lib.clang_visitChildren(self, callbacks['cursor_visit'](visitor),
1458             children)
1459         return iter(children)
1460
1461     def walk_preorder(self):
1462         """Depth-first preorder walk over the cursor and its descendants.
1463
1464         Yields cursors.
1465         """
1466         yield self
1467         for child in self.get_children():
1468             for descendant in child.walk_preorder():
1469                 yield descendant
1470
1471     def get_tokens(self):
1472         """Obtain Token instances formulating that compose this Cursor.
1473
1474         This is a generator for Token instances. It returns all tokens which
1475         occupy the extent this cursor occupies.
1476         """
1477         return TokenGroup.get_tokens(self._tu, self.extent)
1478
1479     def get_field_offsetof(self):
1480         """Returns the offsetof the FIELD_DECL pointed by this Cursor."""
1481         return conf.lib.clang_Cursor_getOffsetOfField(self)
1482
1483     def is_anonymous(self):
1484         """
1485         Check if the record is anonymous.
1486         """
1487         if self.kind == CursorKind.FIELD_DECL:
1488             return self.type.get_declaration().is_anonymous()
1489         return conf.lib.clang_Cursor_isAnonymous(self)
1490
1491     def is_bitfield(self):
1492         """
1493         Check if the field is a bitfield.
1494         """
1495         return conf.lib.clang_Cursor_isBitField(self)
1496
1497     def get_bitfield_width(self):
1498         """
1499         Retrieve the width of a bitfield.
1500         """
1501         return conf.lib.clang_getFieldDeclBitWidth(self)
1502
1503     @staticmethod
1504     def from_result(res, fn, args):
1505         assert isinstance(res, Cursor)
1506         # FIXME: There should just be an isNull method.
1507         if res == conf.lib.clang_getNullCursor():
1508             return None
1509
1510         # Store a reference to the TU in the Python object so it won't get GC'd
1511         # before the Cursor.
1512         tu = None
1513         for arg in args:
1514             if isinstance(arg, TranslationUnit):
1515                 tu = arg
1516                 break
1517
1518             if hasattr(arg, 'translation_unit'):
1519                 tu = arg.translation_unit
1520                 break
1521
1522         assert tu is not None
1523
1524         res._tu = tu
1525         return res
1526
1527     @staticmethod
1528     def from_cursor_result(res, fn, args):
1529         assert isinstance(res, Cursor)
1530         if res == conf.lib.clang_getNullCursor():
1531             return None
1532
1533         res._tu = args[0]._tu
1534         return res
1535
1536 class StorageClass(object):
1537     """
1538     Describes the storage class of a declaration
1539     """
1540
1541     # The unique kind objects, index by id.
1542     _kinds = []
1543     _name_map = None
1544
1545     def __init__(self, value):
1546         if value >= len(StorageClass._kinds):
1547             StorageClass._kinds += [None] * (value - len(StorageClass._kinds) + 1)
1548         if StorageClass._kinds[value] is not None:
1549             raise ValueError,'StorageClass already loaded'
1550         self.value = value
1551         StorageClass._kinds[value] = self
1552         StorageClass._name_map = None
1553
1554     def from_param(self):
1555         return self.value
1556
1557     @property
1558     def name(self):
1559         """Get the enumeration name of this storage class."""
1560         if self._name_map is None:
1561             self._name_map = {}
1562             for key,value in StorageClass.__dict__.items():
1563                 if isinstance(value,StorageClass):
1564                     self._name_map[value] = key
1565         return self._name_map[self]
1566
1567     @staticmethod
1568     def from_id(id):
1569         if id >= len(StorageClass._kinds) or not StorageClass._kinds[id]:
1570             raise ValueError,'Unknown storage class %d' % id
1571         return StorageClass._kinds[id]
1572
1573     def __repr__(self):
1574         return 'StorageClass.%s' % (self.name,)
1575
1576 StorageClass.INVALID = StorageClass(0)
1577 StorageClass.NONE = StorageClass(1)
1578 StorageClass.EXTERN = StorageClass(2)
1579 StorageClass.STATIC = StorageClass(3)
1580 StorageClass.PRIVATEEXTERN = StorageClass(4)
1581 StorageClass.OPENCLWORKGROUPLOCAL = StorageClass(5)
1582 StorageClass.AUTO = StorageClass(6)
1583 StorageClass.REGISTER = StorageClass(7)
1584
1585
1586 ### C++ access specifiers ###
1587
1588 class AccessSpecifier(BaseEnumeration):
1589     """
1590     Describes the access of a C++ class member
1591     """
1592
1593     # The unique kind objects, index by id.
1594     _kinds = []
1595     _name_map = None
1596
1597     def from_param(self):
1598         return self.value
1599
1600     def __repr__(self):
1601         return 'AccessSpecifier.%s' % (self.name,)
1602
1603 AccessSpecifier.INVALID = AccessSpecifier(0)
1604 AccessSpecifier.PUBLIC = AccessSpecifier(1)
1605 AccessSpecifier.PROTECTED = AccessSpecifier(2)
1606 AccessSpecifier.PRIVATE = AccessSpecifier(3)
1607 AccessSpecifier.NONE = AccessSpecifier(4)
1608
1609 ### Type Kinds ###
1610
1611 class TypeKind(BaseEnumeration):
1612     """
1613     Describes the kind of type.
1614     """
1615
1616     # The unique kind objects, indexed by id.
1617     _kinds = []
1618     _name_map = None
1619
1620     @property
1621     def spelling(self):
1622         """Retrieve the spelling of this TypeKind."""
1623         return conf.lib.clang_getTypeKindSpelling(self.value)
1624
1625     def __repr__(self):
1626         return 'TypeKind.%s' % (self.name,)
1627
1628 TypeKind.INVALID = TypeKind(0)
1629 TypeKind.UNEXPOSED = TypeKind(1)
1630 TypeKind.VOID = TypeKind(2)
1631 TypeKind.BOOL = TypeKind(3)
1632 TypeKind.CHAR_U = TypeKind(4)
1633 TypeKind.UCHAR = TypeKind(5)
1634 TypeKind.CHAR16 = TypeKind(6)
1635 TypeKind.CHAR32 = TypeKind(7)
1636 TypeKind.USHORT = TypeKind(8)
1637 TypeKind.UINT = TypeKind(9)
1638 TypeKind.ULONG = TypeKind(10)
1639 TypeKind.ULONGLONG = TypeKind(11)
1640 TypeKind.UINT128 = TypeKind(12)
1641 TypeKind.CHAR_S = TypeKind(13)
1642 TypeKind.SCHAR = TypeKind(14)
1643 TypeKind.WCHAR = TypeKind(15)
1644 TypeKind.SHORT = TypeKind(16)
1645 TypeKind.INT = TypeKind(17)
1646 TypeKind.LONG = TypeKind(18)
1647 TypeKind.LONGLONG = TypeKind(19)
1648 TypeKind.INT128 = TypeKind(20)
1649 TypeKind.FLOAT = TypeKind(21)
1650 TypeKind.DOUBLE = TypeKind(22)
1651 TypeKind.LONGDOUBLE = TypeKind(23)
1652 TypeKind.NULLPTR = TypeKind(24)
1653 TypeKind.OVERLOAD = TypeKind(25)
1654 TypeKind.DEPENDENT = TypeKind(26)
1655 TypeKind.OBJCID = TypeKind(27)
1656 TypeKind.OBJCCLASS = TypeKind(28)
1657 TypeKind.OBJCSEL = TypeKind(29)
1658 TypeKind.COMPLEX = TypeKind(100)
1659 TypeKind.POINTER = TypeKind(101)
1660 TypeKind.BLOCKPOINTER = TypeKind(102)
1661 TypeKind.LVALUEREFERENCE = TypeKind(103)
1662 TypeKind.RVALUEREFERENCE = TypeKind(104)
1663 TypeKind.RECORD = TypeKind(105)
1664 TypeKind.ENUM = TypeKind(106)
1665 TypeKind.TYPEDEF = TypeKind(107)
1666 TypeKind.OBJCINTERFACE = TypeKind(108)
1667 TypeKind.OBJCOBJECTPOINTER = TypeKind(109)
1668 TypeKind.FUNCTIONNOPROTO = TypeKind(110)
1669 TypeKind.FUNCTIONPROTO = TypeKind(111)
1670 TypeKind.CONSTANTARRAY = TypeKind(112)
1671 TypeKind.VECTOR = TypeKind(113)
1672 TypeKind.INCOMPLETEARRAY = TypeKind(114)
1673 TypeKind.VARIABLEARRAY = TypeKind(115)
1674 TypeKind.DEPENDENTSIZEDARRAY = TypeKind(116)
1675 TypeKind.MEMBERPOINTER = TypeKind(117)
1676
1677 class RefQualifierKind(BaseEnumeration):
1678     """Describes a specific ref-qualifier of a type."""
1679
1680     # The unique kind objects, indexed by id.
1681     _kinds = []
1682     _name_map = None
1683
1684     def from_param(self):
1685         return self.value
1686
1687     def __repr__(self):
1688         return 'RefQualifierKind.%s' % (self.name,)
1689
1690 RefQualifierKind.NONE = RefQualifierKind(0)
1691 RefQualifierKind.LVALUE = RefQualifierKind(1)
1692 RefQualifierKind.RVALUE = RefQualifierKind(2)
1693
1694 class Type(Structure):
1695     """
1696     The type of an element in the abstract syntax tree.
1697     """
1698     _fields_ = [("_kind_id", c_int), ("data", c_void_p * 2)]
1699
1700     @property
1701     def kind(self):
1702         """Return the kind of this type."""
1703         return TypeKind.from_id(self._kind_id)
1704
1705     def argument_types(self):
1706         """Retrieve a container for the non-variadic arguments for this type.
1707
1708         The returned object is iterable and indexable. Each item in the
1709         container is a Type instance.
1710         """
1711         class ArgumentsIterator(collections.Sequence):
1712             def __init__(self, parent):
1713                 self.parent = parent
1714                 self.length = None
1715
1716             def __len__(self):
1717                 if self.length is None:
1718                     self.length = conf.lib.clang_getNumArgTypes(self.parent)
1719
1720                 return self.length
1721
1722             def __getitem__(self, key):
1723                 # FIXME Support slice objects.
1724                 if not isinstance(key, int):
1725                     raise TypeError("Must supply a non-negative int.")
1726
1727                 if key < 0:
1728                     raise IndexError("Only non-negative indexes are accepted.")
1729
1730                 if key >= len(self):
1731                     raise IndexError("Index greater than container length: "
1732                                      "%d > %d" % ( key, len(self) ))
1733
1734                 result = conf.lib.clang_getArgType(self.parent, key)
1735                 if result.kind == TypeKind.INVALID:
1736                     raise IndexError("Argument could not be retrieved.")
1737
1738                 return result
1739
1740         assert self.kind == TypeKind.FUNCTIONPROTO
1741         return ArgumentsIterator(self)
1742
1743     @property
1744     def element_type(self):
1745         """Retrieve the Type of elements within this Type.
1746
1747         If accessed on a type that is not an array, complex, or vector type, an
1748         exception will be raised.
1749         """
1750         result = conf.lib.clang_getElementType(self)
1751         if result.kind == TypeKind.INVALID:
1752             raise Exception('Element type not available on this type.')
1753
1754         return result
1755
1756     @property
1757     def element_count(self):
1758         """Retrieve the number of elements in this type.
1759
1760         Returns an int.
1761
1762         If the Type is not an array or vector, this raises.
1763         """
1764         result = conf.lib.clang_getNumElements(self)
1765         if result < 0:
1766             raise Exception('Type does not have elements.')
1767
1768         return result
1769
1770     @property
1771     def translation_unit(self):
1772         """The TranslationUnit to which this Type is associated."""
1773         # If this triggers an AttributeError, the instance was not properly
1774         # instantiated.
1775         return self._tu
1776
1777     @staticmethod
1778     def from_result(res, fn, args):
1779         assert isinstance(res, Type)
1780
1781         tu = None
1782         for arg in args:
1783             if hasattr(arg, 'translation_unit'):
1784                 tu = arg.translation_unit
1785                 break
1786
1787         assert tu is not None
1788         res._tu = tu
1789
1790         return res
1791
1792     def get_canonical(self):
1793         """
1794         Return the canonical type for a Type.
1795
1796         Clang's type system explicitly models typedefs and all the
1797         ways a specific type can be represented.  The canonical type
1798         is the underlying type with all the "sugar" removed.  For
1799         example, if 'T' is a typedef for 'int', the canonical type for
1800         'T' would be 'int'.
1801         """
1802         return conf.lib.clang_getCanonicalType(self)
1803
1804     def is_const_qualified(self):
1805         """Determine whether a Type has the "const" qualifier set.
1806
1807         This does not look through typedefs that may have added "const"
1808         at a different level.
1809         """
1810         return conf.lib.clang_isConstQualifiedType(self)
1811
1812     def is_volatile_qualified(self):
1813         """Determine whether a Type has the "volatile" qualifier set.
1814
1815         This does not look through typedefs that may have added "volatile"
1816         at a different level.
1817         """
1818         return conf.lib.clang_isVolatileQualifiedType(self)
1819
1820     def is_restrict_qualified(self):
1821         """Determine whether a Type has the "restrict" qualifier set.
1822
1823         This does not look through typedefs that may have added "restrict" at
1824         a different level.
1825         """
1826         return conf.lib.clang_isRestrictQualifiedType(self)
1827
1828     def is_function_variadic(self):
1829         """Determine whether this function Type is a variadic function type."""
1830         assert self.kind == TypeKind.FUNCTIONPROTO
1831
1832         return conf.lib.clang_isFunctionTypeVariadic(self)
1833
1834     def is_pod(self):
1835         """Determine whether this Type represents plain old data (POD)."""
1836         return conf.lib.clang_isPODType(self)
1837
1838     def get_pointee(self):
1839         """
1840         For pointer types, returns the type of the pointee.
1841         """
1842         return conf.lib.clang_getPointeeType(self)
1843
1844     def get_declaration(self):
1845         """
1846         Return the cursor for the declaration of the given type.
1847         """
1848         return conf.lib.clang_getTypeDeclaration(self)
1849
1850     def get_result(self):
1851         """
1852         Retrieve the result type associated with a function type.
1853         """
1854         return conf.lib.clang_getResultType(self)
1855
1856     def get_array_element_type(self):
1857         """
1858         Retrieve the type of the elements of the array type.
1859         """
1860         return conf.lib.clang_getArrayElementType(self)
1861
1862     def get_array_size(self):
1863         """
1864         Retrieve the size of the constant array.
1865         """
1866         return conf.lib.clang_getArraySize(self)
1867
1868     def get_class_type(self):
1869         """
1870         Retrieve the class type of the member pointer type.
1871         """
1872         return conf.lib.clang_Type_getClassType(self)
1873
1874     def get_align(self):
1875         """
1876         Retrieve the alignment of the record.
1877         """
1878         return conf.lib.clang_Type_getAlignOf(self)
1879
1880     def get_size(self):
1881         """
1882         Retrieve the size of the record.
1883         """
1884         return conf.lib.clang_Type_getSizeOf(self)
1885
1886     def get_offset(self, fieldname):
1887         """
1888         Retrieve the offset of a field in the record.
1889         """
1890         return conf.lib.clang_Type_getOffsetOf(self, c_char_p(fieldname))
1891
1892     def get_ref_qualifier(self):
1893         """
1894         Retrieve the ref-qualifier of the type.
1895         """
1896         return RefQualifierKind.from_id(
1897                 conf.lib.clang_Type_getCXXRefQualifier(self))
1898
1899     def get_fields(self):
1900         """Return an iterator for accessing the fields of this type."""
1901
1902         def visitor(field, children):
1903             assert field != conf.lib.clang_getNullCursor()
1904
1905             # Create reference to TU so it isn't GC'd before Cursor.
1906             field._tu = self._tu
1907             fields.append(field)
1908             return 1 # continue
1909         fields = []
1910         conf.lib.clang_Type_visitFields(self,
1911                             callbacks['fields_visit'](visitor), fields)
1912         return iter(fields)
1913
1914     @property
1915     def spelling(self):
1916         """Retrieve the spelling of this Type."""
1917         return conf.lib.clang_getTypeSpelling(self)
1918
1919     def __eq__(self, other):
1920         if type(other) != type(self):
1921             return False
1922
1923         return conf.lib.clang_equalTypes(self, other)
1924
1925     def __ne__(self, other):
1926         return not self.__eq__(other)
1927
1928 ## CIndex Objects ##
1929
1930 # CIndex objects (derived from ClangObject) are essentially lightweight
1931 # wrappers attached to some underlying object, which is exposed via CIndex as
1932 # a void*.
1933
1934 class ClangObject(object):
1935     """
1936     A helper for Clang objects. This class helps act as an intermediary for
1937     the ctypes library and the Clang CIndex library.
1938     """
1939     def __init__(self, obj):
1940         assert isinstance(obj, c_object_p) and obj
1941         self.obj = self._as_parameter_ = obj
1942
1943     def from_param(self):
1944         return self._as_parameter_
1945
1946
1947 class _CXUnsavedFile(Structure):
1948     """Helper for passing unsaved file arguments."""
1949     _fields_ = [("name", c_char_p), ("contents", c_char_p), ('length', c_ulong)]
1950
1951 # Functions calls through the python interface are rather slow. Fortunately,
1952 # for most symboles, we do not need to perform a function call. Their spelling
1953 # never changes and is consequently provided by this spelling cache.
1954 SpellingCache = {
1955             # 0: CompletionChunk.Kind("Optional"),
1956             # 1: CompletionChunk.Kind("TypedText"),
1957             # 2: CompletionChunk.Kind("Text"),
1958             # 3: CompletionChunk.Kind("Placeholder"),
1959             # 4: CompletionChunk.Kind("Informative"),
1960             # 5 : CompletionChunk.Kind("CurrentParameter"),
1961             6: '(',   # CompletionChunk.Kind("LeftParen"),
1962             7: ')',   # CompletionChunk.Kind("RightParen"),
1963             8: '[',   # CompletionChunk.Kind("LeftBracket"),
1964             9: ']',   # CompletionChunk.Kind("RightBracket"),
1965             10: '{',  # CompletionChunk.Kind("LeftBrace"),
1966             11: '}',  # CompletionChunk.Kind("RightBrace"),
1967             12: '<',  # CompletionChunk.Kind("LeftAngle"),
1968             13: '>',  # CompletionChunk.Kind("RightAngle"),
1969             14: ', ', # CompletionChunk.Kind("Comma"),
1970             # 15: CompletionChunk.Kind("ResultType"),
1971             16: ':',  # CompletionChunk.Kind("Colon"),
1972             17: ';',  # CompletionChunk.Kind("SemiColon"),
1973             18: '=',  # CompletionChunk.Kind("Equal"),
1974             19: ' ',  # CompletionChunk.Kind("HorizontalSpace"),
1975             # 20: CompletionChunk.Kind("VerticalSpace")
1976 }
1977
1978 class CompletionChunk:
1979     class Kind:
1980         def __init__(self, name):
1981             self.name = name
1982
1983         def __str__(self):
1984             return self.name
1985
1986         def __repr__(self):
1987             return "<ChunkKind: %s>" % self
1988
1989     def __init__(self, completionString, key):
1990         self.cs = completionString
1991         self.key = key
1992         self.__kindNumberCache = -1
1993
1994     def __repr__(self):
1995         return "{'" + self.spelling + "', " + str(self.kind) + "}"
1996
1997     @CachedProperty
1998     def spelling(self):
1999         if self.__kindNumber in SpellingCache:
2000                 return SpellingCache[self.__kindNumber]
2001         return conf.lib.clang_getCompletionChunkText(self.cs, self.key).spelling
2002
2003     # We do not use @CachedProperty here, as the manual implementation is
2004     # apparently still significantly faster. Please profile carefully if you
2005     # would like to add CachedProperty back.
2006     @property
2007     def __kindNumber(self):
2008         if self.__kindNumberCache == -1:
2009             self.__kindNumberCache = \
2010                 conf.lib.clang_getCompletionChunkKind(self.cs, self.key)
2011         return self.__kindNumberCache
2012
2013     @CachedProperty
2014     def kind(self):
2015         return completionChunkKindMap[self.__kindNumber]
2016
2017     @CachedProperty
2018     def string(self):
2019         res = conf.lib.clang_getCompletionChunkCompletionString(self.cs,
2020                                                                 self.key)
2021
2022         if (res):
2023           return CompletionString(res)
2024         else:
2025           None
2026
2027     def isKindOptional(self):
2028       return self.__kindNumber == 0
2029
2030     def isKindTypedText(self):
2031       return self.__kindNumber == 1
2032
2033     def isKindPlaceHolder(self):
2034       return self.__kindNumber == 3
2035
2036     def isKindInformative(self):
2037       return self.__kindNumber == 4
2038
2039     def isKindResultType(self):
2040       return self.__kindNumber == 15
2041
2042 completionChunkKindMap = {
2043             0: CompletionChunk.Kind("Optional"),
2044             1: CompletionChunk.Kind("TypedText"),
2045             2: CompletionChunk.Kind("Text"),
2046             3: CompletionChunk.Kind("Placeholder"),
2047             4: CompletionChunk.Kind("Informative"),
2048             5: CompletionChunk.Kind("CurrentParameter"),
2049             6: CompletionChunk.Kind("LeftParen"),
2050             7: CompletionChunk.Kind("RightParen"),
2051             8: CompletionChunk.Kind("LeftBracket"),
2052             9: CompletionChunk.Kind("RightBracket"),
2053             10: CompletionChunk.Kind("LeftBrace"),
2054             11: CompletionChunk.Kind("RightBrace"),
2055             12: CompletionChunk.Kind("LeftAngle"),
2056             13: CompletionChunk.Kind("RightAngle"),
2057             14: CompletionChunk.Kind("Comma"),
2058             15: CompletionChunk.Kind("ResultType"),
2059             16: CompletionChunk.Kind("Colon"),
2060             17: CompletionChunk.Kind("SemiColon"),
2061             18: CompletionChunk.Kind("Equal"),
2062             19: CompletionChunk.Kind("HorizontalSpace"),
2063             20: CompletionChunk.Kind("VerticalSpace")}
2064
2065 class CompletionString(ClangObject):
2066     class Availability:
2067         def __init__(self, name):
2068             self.name = name
2069
2070         def __str__(self):
2071             return self.name
2072
2073         def __repr__(self):
2074             return "<Availability: %s>" % self
2075
2076     def __len__(self):
2077         return self.num_chunks
2078
2079     @CachedProperty
2080     def num_chunks(self):
2081         return conf.lib.clang_getNumCompletionChunks(self.obj)
2082
2083     def __getitem__(self, key):
2084         if self.num_chunks <= key:
2085             raise IndexError
2086         return CompletionChunk(self.obj, key)
2087
2088     @property
2089     def priority(self):
2090         return conf.lib.clang_getCompletionPriority(self.obj)
2091
2092     @property
2093     def availability(self):
2094         res = conf.lib.clang_getCompletionAvailability(self.obj)
2095         return availabilityKinds[res]
2096
2097     @property
2098     def briefComment(self):
2099         if conf.function_exists("clang_getCompletionBriefComment"):
2100             return conf.lib.clang_getCompletionBriefComment(self.obj)
2101         return _CXString()
2102
2103     def __repr__(self):
2104         return " | ".join([str(a) for a in self]) \
2105                + " || Priority: " + str(self.priority) \
2106                + " || Availability: " + str(self.availability) \
2107                + " || Brief comment: " + str(self.briefComment.spelling)
2108
2109 availabilityKinds = {
2110             0: CompletionChunk.Kind("Available"),
2111             1: CompletionChunk.Kind("Deprecated"),
2112             2: CompletionChunk.Kind("NotAvailable"),
2113             3: CompletionChunk.Kind("NotAccessible")}
2114
2115 class CodeCompletionResult(Structure):
2116     _fields_ = [('cursorKind', c_int), ('completionString', c_object_p)]
2117
2118     def __repr__(self):
2119         return str(CompletionString(self.completionString))
2120
2121     @property
2122     def kind(self):
2123         return CursorKind.from_id(self.cursorKind)
2124
2125     @property
2126     def string(self):
2127         return CompletionString(self.completionString)
2128
2129 class CCRStructure(Structure):
2130     _fields_ = [('results', POINTER(CodeCompletionResult)),
2131                 ('numResults', c_int)]
2132
2133     def __len__(self):
2134         return self.numResults
2135
2136     def __getitem__(self, key):
2137         if len(self) <= key:
2138             raise IndexError
2139
2140         return self.results[key]
2141
2142 class CodeCompletionResults(ClangObject):
2143     def __init__(self, ptr):
2144         assert isinstance(ptr, POINTER(CCRStructure)) and ptr
2145         self.ptr = self._as_parameter_ = ptr
2146
2147     def from_param(self):
2148         return self._as_parameter_
2149
2150     def __del__(self):
2151         conf.lib.clang_disposeCodeCompleteResults(self)
2152
2153     @property
2154     def results(self):
2155         return self.ptr.contents
2156
2157     @property
2158     def diagnostics(self):
2159         class DiagnosticsItr:
2160             def __init__(self, ccr):
2161                 self.ccr= ccr
2162
2163             def __len__(self):
2164                 return int(\
2165                   conf.lib.clang_codeCompleteGetNumDiagnostics(self.ccr))
2166
2167             def __getitem__(self, key):
2168                 return conf.lib.clang_codeCompleteGetDiagnostic(self.ccr, key)
2169
2170         return DiagnosticsItr(self)
2171
2172
2173 class Index(ClangObject):
2174     """
2175     The Index type provides the primary interface to the Clang CIndex library,
2176     primarily by providing an interface for reading and parsing translation
2177     units.
2178     """
2179
2180     @staticmethod
2181     def create(excludeDecls=False):
2182         """
2183         Create a new Index.
2184         Parameters:
2185         excludeDecls -- Exclude local declarations from translation units.
2186         """
2187         return Index(conf.lib.clang_createIndex(excludeDecls, 0))
2188
2189     def __del__(self):
2190         conf.lib.clang_disposeIndex(self)
2191
2192     def read(self, path):
2193         """Load a TranslationUnit from the given AST file."""
2194         return TranslationUnit.from_ast_file(path, self)
2195
2196     def parse(self, path, args=None, unsaved_files=None, options = 0):
2197         """Load the translation unit from the given source code file by running
2198         clang and generating the AST before loading. Additional command line
2199         parameters can be passed to clang via the args parameter.
2200
2201         In-memory contents for files can be provided by passing a list of pairs
2202         to as unsaved_files, the first item should be the filenames to be mapped
2203         and the second should be the contents to be substituted for the
2204         file. The contents may be passed as strings or file objects.
2205
2206         If an error was encountered during parsing, a TranslationUnitLoadError
2207         will be raised.
2208         """
2209         return TranslationUnit.from_source(path, args, unsaved_files, options,
2210                                            self)
2211
2212 class TranslationUnit(ClangObject):
2213     """Represents a source code translation unit.
2214
2215     This is one of the main types in the API. Any time you wish to interact
2216     with Clang's representation of a source file, you typically start with a
2217     translation unit.
2218     """
2219
2220     # Default parsing mode.
2221     PARSE_NONE = 0
2222
2223     # Instruct the parser to create a detailed processing record containing
2224     # metadata not normally retained.
2225     PARSE_DETAILED_PROCESSING_RECORD = 1
2226
2227     # Indicates that the translation unit is incomplete. This is typically used
2228     # when parsing headers.
2229     PARSE_INCOMPLETE = 2
2230
2231     # Instruct the parser to create a pre-compiled preamble for the translation
2232     # unit. This caches the preamble (included files at top of source file).
2233     # This is useful if the translation unit will be reparsed and you don't
2234     # want to incur the overhead of reparsing the preamble.
2235     PARSE_PRECOMPILED_PREAMBLE = 4
2236
2237     # Cache code completion information on parse. This adds time to parsing but
2238     # speeds up code completion.
2239     PARSE_CACHE_COMPLETION_RESULTS = 8
2240
2241     # Flags with values 16 and 32 are deprecated and intentionally omitted.
2242
2243     # Do not parse function bodies. This is useful if you only care about
2244     # searching for declarations/definitions.
2245     PARSE_SKIP_FUNCTION_BODIES = 64
2246
2247     # Used to indicate that brief documentation comments should be included
2248     # into the set of code completions returned from this translation unit.
2249     PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION = 128
2250
2251     @classmethod
2252     def from_source(cls, filename, args=None, unsaved_files=None, options=0,
2253                     index=None):
2254         """Create a TranslationUnit by parsing source.
2255
2256         This is capable of processing source code both from files on the
2257         filesystem as well as in-memory contents.
2258
2259         Command-line arguments that would be passed to clang are specified as
2260         a list via args. These can be used to specify include paths, warnings,
2261         etc. e.g. ["-Wall", "-I/path/to/include"].
2262
2263         In-memory file content can be provided via unsaved_files. This is an
2264         iterable of 2-tuples. The first element is the str filename. The
2265         second element defines the content. Content can be provided as str
2266         source code or as file objects (anything with a read() method). If
2267         a file object is being used, content will be read until EOF and the
2268         read cursor will not be reset to its original position.
2269
2270         options is a bitwise or of TranslationUnit.PARSE_XXX flags which will
2271         control parsing behavior.
2272
2273         index is an Index instance to utilize. If not provided, a new Index
2274         will be created for this TranslationUnit.
2275
2276         To parse source from the filesystem, the filename of the file to parse
2277         is specified by the filename argument. Or, filename could be None and
2278         the args list would contain the filename(s) to parse.
2279
2280         To parse source from an in-memory buffer, set filename to the virtual
2281         filename you wish to associate with this source (e.g. "test.c"). The
2282         contents of that file are then provided in unsaved_files.
2283
2284         If an error occurs, a TranslationUnitLoadError is raised.
2285
2286         Please note that a TranslationUnit with parser errors may be returned.
2287         It is the caller's responsibility to check tu.diagnostics for errors.
2288
2289         Also note that Clang infers the source language from the extension of
2290         the input filename. If you pass in source code containing a C++ class
2291         declaration with the filename "test.c" parsing will fail.
2292         """
2293         if args is None:
2294             args = []
2295
2296         if unsaved_files is None:
2297             unsaved_files = []
2298
2299         if index is None:
2300             index = Index.create()
2301
2302         args_array = None
2303         if len(args) > 0:
2304             args_array = (c_char_p * len(args))(* args)
2305
2306         unsaved_array = None
2307         if len(unsaved_files) > 0:
2308             unsaved_array = (_CXUnsavedFile * len(unsaved_files))()
2309             for i, (name, contents) in enumerate(unsaved_files):
2310                 if hasattr(contents, "read"):
2311                     contents = contents.read()
2312
2313                 unsaved_array[i].name = name
2314                 unsaved_array[i].contents = contents
2315                 unsaved_array[i].length = len(contents)
2316
2317         ptr = conf.lib.clang_parseTranslationUnit(index, filename, args_array,
2318                                     len(args), unsaved_array,
2319                                     len(unsaved_files), options)
2320
2321         if not ptr:
2322             raise TranslationUnitLoadError("Error parsing translation unit.")
2323
2324         return cls(ptr, index=index)
2325
2326     @classmethod
2327     def from_ast_file(cls, filename, index=None):
2328         """Create a TranslationUnit instance from a saved AST file.
2329
2330         A previously-saved AST file (provided with -emit-ast or
2331         TranslationUnit.save()) is loaded from the filename specified.
2332
2333         If the file cannot be loaded, a TranslationUnitLoadError will be
2334         raised.
2335
2336         index is optional and is the Index instance to use. If not provided,
2337         a default Index will be created.
2338         """
2339         if index is None:
2340             index = Index.create()
2341
2342         ptr = conf.lib.clang_createTranslationUnit(index, filename)
2343         if not ptr:
2344             raise TranslationUnitLoadError(filename)
2345
2346         return cls(ptr=ptr, index=index)
2347
2348     def __init__(self, ptr, index):
2349         """Create a TranslationUnit instance.
2350
2351         TranslationUnits should be created using one of the from_* @classmethod
2352         functions above. __init__ is only called internally.
2353         """
2354         assert isinstance(index, Index)
2355
2356         ClangObject.__init__(self, ptr)
2357
2358     def __del__(self):
2359         conf.lib.clang_disposeTranslationUnit(self)
2360
2361     @property
2362     def cursor(self):
2363         """Retrieve the cursor that represents the given translation unit."""
2364         return conf.lib.clang_getTranslationUnitCursor(self)
2365
2366     @property
2367     def spelling(self):
2368         """Get the original translation unit source file name."""
2369         return conf.lib.clang_getTranslationUnitSpelling(self)
2370
2371     def get_includes(self):
2372         """
2373         Return an iterable sequence of FileInclusion objects that describe the
2374         sequence of inclusions in a translation unit. The first object in
2375         this sequence is always the input file. Note that this method will not
2376         recursively iterate over header files included through precompiled
2377         headers.
2378         """
2379         def visitor(fobj, lptr, depth, includes):
2380             if depth > 0:
2381                 loc = lptr.contents
2382                 includes.append(FileInclusion(loc.file, File(fobj), loc, depth))
2383
2384         # Automatically adapt CIndex/ctype pointers to python objects
2385         includes = []
2386         conf.lib.clang_getInclusions(self,
2387                 callbacks['translation_unit_includes'](visitor), includes)
2388
2389         return iter(includes)
2390
2391     def get_file(self, filename):
2392         """Obtain a File from this translation unit."""
2393
2394         return File.from_name(self, filename)
2395
2396     def get_location(self, filename, position):
2397         """Obtain a SourceLocation for a file in this translation unit.
2398
2399         The position can be specified by passing:
2400
2401           - Integer file offset. Initial file offset is 0.
2402           - 2-tuple of (line number, column number). Initial file position is
2403             (0, 0)
2404         """
2405         f = self.get_file(filename)
2406
2407         if isinstance(position, int):
2408             return SourceLocation.from_offset(self, f, position)
2409
2410         return SourceLocation.from_position(self, f, position[0], position[1])
2411
2412     def get_extent(self, filename, locations):
2413         """Obtain a SourceRange from this translation unit.
2414
2415         The bounds of the SourceRange must ultimately be defined by a start and
2416         end SourceLocation. For the locations argument, you can pass:
2417
2418           - 2 SourceLocation instances in a 2-tuple or list.
2419           - 2 int file offsets via a 2-tuple or list.
2420           - 2 2-tuple or lists of (line, column) pairs in a 2-tuple or list.
2421
2422         e.g.
2423
2424         get_extent('foo.c', (5, 10))
2425         get_extent('foo.c', ((1, 1), (1, 15)))
2426         """
2427         f = self.get_file(filename)
2428
2429         if len(locations) < 2:
2430             raise Exception('Must pass object with at least 2 elements')
2431
2432         start_location, end_location = locations
2433
2434         if hasattr(start_location, '__len__'):
2435             start_location = SourceLocation.from_position(self, f,
2436                 start_location[0], start_location[1])
2437         elif isinstance(start_location, int):
2438             start_location = SourceLocation.from_offset(self, f,
2439                 start_location)
2440
2441         if hasattr(end_location, '__len__'):
2442             end_location = SourceLocation.from_position(self, f,
2443                 end_location[0], end_location[1])
2444         elif isinstance(end_location, int):
2445             end_location = SourceLocation.from_offset(self, f, end_location)
2446
2447         assert isinstance(start_location, SourceLocation)
2448         assert isinstance(end_location, SourceLocation)
2449
2450         return SourceRange.from_locations(start_location, end_location)
2451
2452     @property
2453     def diagnostics(self):
2454         """
2455         Return an iterable (and indexable) object containing the diagnostics.
2456         """
2457         class DiagIterator:
2458             def __init__(self, tu):
2459                 self.tu = tu
2460
2461             def __len__(self):
2462                 return int(conf.lib.clang_getNumDiagnostics(self.tu))
2463
2464             def __getitem__(self, key):
2465                 diag = conf.lib.clang_getDiagnostic(self.tu, key)
2466                 if not diag:
2467                     raise IndexError
2468                 return Diagnostic(diag)
2469
2470         return DiagIterator(self)
2471
2472     def reparse(self, unsaved_files=None, options=0):
2473         """
2474         Reparse an already parsed translation unit.
2475
2476         In-memory contents for files can be provided by passing a list of pairs
2477         as unsaved_files, the first items should be the filenames to be mapped
2478         and the second should be the contents to be substituted for the
2479         file. The contents may be passed as strings or file objects.
2480         """
2481         if unsaved_files is None:
2482             unsaved_files = []
2483
2484         unsaved_files_array = 0
2485         if len(unsaved_files):
2486             unsaved_files_array = (_CXUnsavedFile * len(unsaved_files))()
2487             for i,(name,value) in enumerate(unsaved_files):
2488                 if not isinstance(value, str):
2489                     # FIXME: It would be great to support an efficient version
2490                     # of this, one day.
2491                     value = value.read()
2492                     print value
2493                 if not isinstance(value, str):
2494                     raise TypeError,'Unexpected unsaved file contents.'
2495                 unsaved_files_array[i].name = name
2496                 unsaved_files_array[i].contents = value
2497                 unsaved_files_array[i].length = len(value)
2498         ptr = conf.lib.clang_reparseTranslationUnit(self, len(unsaved_files),
2499                 unsaved_files_array, options)
2500
2501     def save(self, filename):
2502         """Saves the TranslationUnit to a file.
2503
2504         This is equivalent to passing -emit-ast to the clang frontend. The
2505         saved file can be loaded back into a TranslationUnit. Or, if it
2506         corresponds to a header, it can be used as a pre-compiled header file.
2507
2508         If an error occurs while saving, a TranslationUnitSaveError is raised.
2509         If the error was TranslationUnitSaveError.ERROR_INVALID_TU, this means
2510         the constructed TranslationUnit was not valid at time of save. In this
2511         case, the reason(s) why should be available via
2512         TranslationUnit.diagnostics().
2513
2514         filename -- The path to save the translation unit to.
2515         """
2516         options = conf.lib.clang_defaultSaveOptions(self)
2517         result = int(conf.lib.clang_saveTranslationUnit(self, filename,
2518                                                         options))
2519         if result != 0:
2520             raise TranslationUnitSaveError(result,
2521                 'Error saving TranslationUnit.')
2522
2523     def codeComplete(self, path, line, column, unsaved_files=None,
2524                      include_macros=False, include_code_patterns=False,
2525                      include_brief_comments=False):
2526         """
2527         Code complete in this translation unit.
2528
2529         In-memory contents for files can be provided by passing a list of pairs
2530         as unsaved_files, the first items should be the filenames to be mapped
2531         and the second should be the contents to be substituted for the
2532         file. The contents may be passed as strings or file objects.
2533         """
2534         options = 0
2535
2536         if include_macros:
2537             options += 1
2538
2539         if include_code_patterns:
2540             options += 2
2541
2542         if include_brief_comments:
2543             options += 4
2544
2545         if unsaved_files is None:
2546             unsaved_files = []
2547
2548         unsaved_files_array = 0
2549         if len(unsaved_files):
2550             unsaved_files_array = (_CXUnsavedFile * len(unsaved_files))()
2551             for i,(name,value) in enumerate(unsaved_files):
2552                 if not isinstance(value, str):
2553                     # FIXME: It would be great to support an efficient version
2554                     # of this, one day.
2555                     value = value.read()
2556                     print value
2557                 if not isinstance(value, str):
2558                     raise TypeError,'Unexpected unsaved file contents.'
2559                 unsaved_files_array[i].name = name
2560                 unsaved_files_array[i].contents = value
2561                 unsaved_files_array[i].length = len(value)
2562         ptr = conf.lib.clang_codeCompleteAt(self, path, line, column,
2563                 unsaved_files_array, len(unsaved_files), options)
2564         if ptr:
2565             return CodeCompletionResults(ptr)
2566         return None
2567
2568     def get_tokens(self, locations=None, extent=None):
2569         """Obtain tokens in this translation unit.
2570
2571         This is a generator for Token instances. The caller specifies a range
2572         of source code to obtain tokens for. The range can be specified as a
2573         2-tuple of SourceLocation or as a SourceRange. If both are defined,
2574         behavior is undefined.
2575         """
2576         if locations is not None:
2577             extent = SourceRange(start=locations[0], end=locations[1])
2578
2579         return TokenGroup.get_tokens(self, extent)
2580
2581 class File(ClangObject):
2582     """
2583     The File class represents a particular source file that is part of a
2584     translation unit.
2585     """
2586
2587     @staticmethod
2588     def from_name(translation_unit, file_name):
2589         """Retrieve a file handle within the given translation unit."""
2590         return File(conf.lib.clang_getFile(translation_unit, file_name))
2591
2592     @property
2593     def name(self):
2594         """Return the complete file and path name of the file."""
2595         return conf.lib.clang_getCString(conf.lib.clang_getFileName(self))
2596
2597     @property
2598     def time(self):
2599         """Return the last modification time of the file."""
2600         return conf.lib.clang_getFileTime(self)
2601
2602     def __str__(self):
2603         return self.name
2604
2605     def __repr__(self):
2606         return "<File: %s>" % (self.name)
2607
2608     @staticmethod
2609     def from_cursor_result(res, fn, args):
2610         assert isinstance(res, File)
2611
2612         # Copy a reference to the TranslationUnit to prevent premature GC.
2613         res._tu = args[0]._tu
2614         return res
2615
2616 class FileInclusion(object):
2617     """
2618     The FileInclusion class represents the inclusion of one source file by
2619     another via a '#include' directive or as the input file for the translation
2620     unit. This class provides information about the included file, the including
2621     file, the location of the '#include' directive and the depth of the included
2622     file in the stack. Note that the input file has depth 0.
2623     """
2624
2625     def __init__(self, src, tgt, loc, depth):
2626         self.source = src
2627         self.include = tgt
2628         self.location = loc
2629         self.depth = depth
2630
2631     @property
2632     def is_input_file(self):
2633         """True if the included file is the input file."""
2634         return self.depth == 0
2635
2636 class CompilationDatabaseError(Exception):
2637     """Represents an error that occurred when working with a CompilationDatabase
2638
2639     Each error is associated to an enumerated value, accessible under
2640     e.cdb_error. Consumers can compare the value with one of the ERROR_
2641     constants in this class.
2642     """
2643
2644     # An unknown error occurred
2645     ERROR_UNKNOWN = 0
2646
2647     # The database could not be loaded
2648     ERROR_CANNOTLOADDATABASE = 1
2649
2650     def __init__(self, enumeration, message):
2651         assert isinstance(enumeration, int)
2652
2653         if enumeration > 1:
2654             raise Exception("Encountered undefined CompilationDatabase error "
2655                             "constant: %d. Please file a bug to have this "
2656                             "value supported." % enumeration)
2657
2658         self.cdb_error = enumeration
2659         Exception.__init__(self, 'Error %d: %s' % (enumeration, message))
2660
2661 class CompileCommand(object):
2662     """Represents the compile command used to build a file"""
2663     def __init__(self, cmd, ccmds):
2664         self.cmd = cmd
2665         # Keep a reference to the originating CompileCommands
2666         # to prevent garbage collection
2667         self.ccmds = ccmds
2668
2669     @property
2670     def directory(self):
2671         """Get the working directory for this CompileCommand"""
2672         return conf.lib.clang_CompileCommand_getDirectory(self.cmd)
2673
2674     @property
2675     def arguments(self):
2676         """
2677         Get an iterable object providing each argument in the
2678         command line for the compiler invocation as a _CXString.
2679
2680         Invariant : the first argument is the compiler executable
2681         """
2682         length = conf.lib.clang_CompileCommand_getNumArgs(self.cmd)
2683         for i in xrange(length):
2684             yield conf.lib.clang_CompileCommand_getArg(self.cmd, i)
2685
2686 class CompileCommands(object):
2687     """
2688     CompileCommands is an iterable object containing all CompileCommand
2689     that can be used for building a specific file.
2690     """
2691     def __init__(self, ccmds):
2692         self.ccmds = ccmds
2693
2694     def __del__(self):
2695         conf.lib.clang_CompileCommands_dispose(self.ccmds)
2696
2697     def __len__(self):
2698         return int(conf.lib.clang_CompileCommands_getSize(self.ccmds))
2699
2700     def __getitem__(self, i):
2701         cc = conf.lib.clang_CompileCommands_getCommand(self.ccmds, i)
2702         if not cc:
2703             raise IndexError
2704         return CompileCommand(cc, self)
2705
2706     @staticmethod
2707     def from_result(res, fn, args):
2708         if not res:
2709             return None
2710         return CompileCommands(res)
2711
2712 class CompilationDatabase(ClangObject):
2713     """
2714     The CompilationDatabase is a wrapper class around
2715     clang::tooling::CompilationDatabase
2716
2717     It enables querying how a specific source file can be built.
2718     """
2719
2720     def __del__(self):
2721         conf.lib.clang_CompilationDatabase_dispose(self)
2722
2723     @staticmethod
2724     def from_result(res, fn, args):
2725         if not res:
2726             raise CompilationDatabaseError(0,
2727                                            "CompilationDatabase loading failed")
2728         return CompilationDatabase(res)
2729
2730     @staticmethod
2731     def fromDirectory(buildDir):
2732         """Builds a CompilationDatabase from the database found in buildDir"""
2733         errorCode = c_uint()
2734         try:
2735             cdb = conf.lib.clang_CompilationDatabase_fromDirectory(buildDir,
2736                 byref(errorCode))
2737         except CompilationDatabaseError as e:
2738             raise CompilationDatabaseError(int(errorCode.value),
2739                                            "CompilationDatabase loading failed")
2740         return cdb
2741
2742     def getCompileCommands(self, filename):
2743         """
2744         Get an iterable object providing all the CompileCommands available to
2745         build filename. Returns None if filename is not found in the database.
2746         """
2747         return conf.lib.clang_CompilationDatabase_getCompileCommands(self,
2748                                                                      filename)
2749
2750     def getAllCompileCommands(self):
2751         """
2752         Get an iterable object providing all the CompileCommands available from
2753         the database.
2754         """
2755         return conf.lib.clang_CompilationDatabase_getAllCompileCommands(self)
2756
2757
2758 class Token(Structure):
2759     """Represents a single token from the preprocessor.
2760
2761     Tokens are effectively segments of source code. Source code is first parsed
2762     into tokens before being converted into the AST and Cursors.
2763
2764     Tokens are obtained from parsed TranslationUnit instances. You currently
2765     can't create tokens manually.
2766     """
2767     _fields_ = [
2768         ('int_data', c_uint * 4),
2769         ('ptr_data', c_void_p)
2770     ]
2771
2772     @property
2773     def spelling(self):
2774         """The spelling of this token.
2775
2776         This is the textual representation of the token in source.
2777         """
2778         return conf.lib.clang_getTokenSpelling(self._tu, self)
2779
2780     @property
2781     def kind(self):
2782         """Obtain the TokenKind of the current token."""
2783         return TokenKind.from_value(conf.lib.clang_getTokenKind(self))
2784
2785     @property
2786     def location(self):
2787         """The SourceLocation this Token occurs at."""
2788         return conf.lib.clang_getTokenLocation(self._tu, self)
2789
2790     @property
2791     def extent(self):
2792         """The SourceRange this Token occupies."""
2793         return conf.lib.clang_getTokenExtent(self._tu, self)
2794
2795     @property
2796     def cursor(self):
2797         """The Cursor this Token corresponds to."""
2798         cursor = Cursor()
2799
2800         conf.lib.clang_annotateTokens(self._tu, byref(self), 1, byref(cursor))
2801
2802         return cursor
2803
2804 # Now comes the plumbing to hook up the C library.
2805
2806 # Register callback types in common container.
2807 callbacks['translation_unit_includes'] = CFUNCTYPE(None, c_object_p,
2808         POINTER(SourceLocation), c_uint, py_object)
2809 callbacks['cursor_visit'] = CFUNCTYPE(c_int, Cursor, Cursor, py_object)
2810 callbacks['fields_visit'] = CFUNCTYPE(c_int, Cursor, py_object)
2811
2812 # Functions strictly alphabetical order.
2813 functionList = [
2814   ("clang_annotateTokens",
2815    [TranslationUnit, POINTER(Token), c_uint, POINTER(Cursor)]),
2816
2817   ("clang_CompilationDatabase_dispose",
2818    [c_object_p]),
2819
2820   ("clang_CompilationDatabase_fromDirectory",
2821    [c_char_p, POINTER(c_uint)],
2822    c_object_p,
2823    CompilationDatabase.from_result),
2824
2825   ("clang_CompilationDatabase_getAllCompileCommands",
2826    [c_object_p],
2827    c_object_p,
2828    CompileCommands.from_result),
2829
2830   ("clang_CompilationDatabase_getCompileCommands",
2831    [c_object_p, c_char_p],
2832    c_object_p,
2833    CompileCommands.from_result),
2834
2835   ("clang_CompileCommands_dispose",
2836    [c_object_p]),
2837
2838   ("clang_CompileCommands_getCommand",
2839    [c_object_p, c_uint],
2840    c_object_p),
2841
2842   ("clang_CompileCommands_getSize",
2843    [c_object_p],
2844    c_uint),
2845
2846   ("clang_CompileCommand_getArg",
2847    [c_object_p, c_uint],
2848    _CXString,
2849    _CXString.from_result),
2850
2851   ("clang_CompileCommand_getDirectory",
2852    [c_object_p],
2853    _CXString,
2854    _CXString.from_result),
2855
2856   ("clang_CompileCommand_getNumArgs",
2857    [c_object_p],
2858    c_uint),
2859
2860   ("clang_codeCompleteAt",
2861    [TranslationUnit, c_char_p, c_int, c_int, c_void_p, c_int, c_int],
2862    POINTER(CCRStructure)),
2863
2864   ("clang_codeCompleteGetDiagnostic",
2865    [CodeCompletionResults, c_int],
2866    Diagnostic),
2867
2868   ("clang_codeCompleteGetNumDiagnostics",
2869    [CodeCompletionResults],
2870    c_int),
2871
2872   ("clang_createIndex",
2873    [c_int, c_int],
2874    c_object_p),
2875
2876   ("clang_createTranslationUnit",
2877    [Index, c_char_p],
2878    c_object_p),
2879
2880   ("clang_CXXMethod_isPureVirtual",
2881    [Cursor],
2882    bool),
2883
2884   ("clang_CXXMethod_isStatic",
2885    [Cursor],
2886    bool),
2887
2888   ("clang_CXXMethod_isVirtual",
2889    [Cursor],
2890    bool),
2891
2892   ("clang_defaultSaveOptions",
2893    [TranslationUnit],
2894    c_uint),
2895
2896   ("clang_disposeCodeCompleteResults",
2897    [CodeCompletionResults]),
2898
2899 # ("clang_disposeCXTUResourceUsage",
2900 #  [CXTUResourceUsage]),
2901
2902   ("clang_disposeDiagnostic",
2903    [Diagnostic]),
2904
2905   ("clang_disposeIndex",
2906    [Index]),
2907
2908   ("clang_disposeString",
2909    [_CXString]),
2910
2911   ("clang_disposeTokens",
2912    [TranslationUnit, POINTER(Token), c_uint]),
2913
2914   ("clang_disposeTranslationUnit",
2915    [TranslationUnit]),
2916
2917   ("clang_equalCursors",
2918    [Cursor, Cursor],
2919    bool),
2920
2921   ("clang_equalLocations",
2922    [SourceLocation, SourceLocation],
2923    bool),
2924
2925   ("clang_equalRanges",
2926    [SourceRange, SourceRange],
2927    bool),
2928
2929   ("clang_equalTypes",
2930    [Type, Type],
2931    bool),
2932
2933   ("clang_getArgType",
2934    [Type, c_uint],
2935    Type,
2936    Type.from_result),
2937
2938   ("clang_getArrayElementType",
2939    [Type],
2940    Type,
2941    Type.from_result),
2942
2943   ("clang_getArraySize",
2944    [Type],
2945    c_longlong),
2946
2947   ("clang_getFieldDeclBitWidth",
2948    [Cursor],
2949    c_int),
2950
2951   ("clang_getCanonicalCursor",
2952    [Cursor],
2953    Cursor,
2954    Cursor.from_cursor_result),
2955
2956   ("clang_getCanonicalType",
2957    [Type],
2958    Type,
2959    Type.from_result),
2960
2961   ("clang_getCompletionAvailability",
2962    [c_void_p],
2963    c_int),
2964
2965   ("clang_getCompletionBriefComment",
2966    [c_void_p],
2967    _CXString),
2968
2969   ("clang_getCompletionChunkCompletionString",
2970    [c_void_p, c_int],
2971    c_object_p),
2972
2973   ("clang_getCompletionChunkKind",
2974    [c_void_p, c_int],
2975    c_int),
2976
2977   ("clang_getCompletionChunkText",
2978    [c_void_p, c_int],
2979    _CXString),
2980
2981   ("clang_getCompletionPriority",
2982    [c_void_p],
2983    c_int),
2984
2985   ("clang_getCString",
2986    [_CXString],
2987    c_char_p),
2988
2989   ("clang_getCursor",
2990    [TranslationUnit, SourceLocation],
2991    Cursor),
2992
2993   ("clang_getCursorDefinition",
2994    [Cursor],
2995    Cursor,
2996    Cursor.from_result),
2997
2998   ("clang_getCursorDisplayName",
2999    [Cursor],
3000    _CXString,
3001    _CXString.from_result),
3002
3003   ("clang_getCursorExtent",
3004    [Cursor],
3005    SourceRange),
3006
3007   ("clang_getCursorLexicalParent",
3008    [Cursor],
3009    Cursor,
3010    Cursor.from_cursor_result),
3011
3012   ("clang_getCursorLocation",
3013    [Cursor],
3014    SourceLocation),
3015
3016   ("clang_getCursorReferenced",
3017    [Cursor],
3018    Cursor,
3019    Cursor.from_result),
3020
3021   ("clang_getCursorReferenceNameRange",
3022    [Cursor, c_uint, c_uint],
3023    SourceRange),
3024
3025   ("clang_getCursorSemanticParent",
3026    [Cursor],
3027    Cursor,
3028    Cursor.from_cursor_result),
3029
3030   ("clang_getCursorSpelling",
3031    [Cursor],
3032    _CXString,
3033    _CXString.from_result),
3034
3035   ("clang_getCursorType",
3036    [Cursor],
3037    Type,
3038    Type.from_result),
3039
3040   ("clang_getCursorUSR",
3041    [Cursor],
3042    _CXString,
3043    _CXString.from_result),
3044
3045   ("clang_Cursor_getMangling",
3046    [Cursor],
3047    _CXString,
3048    _CXString.from_result),
3049
3050 # ("clang_getCXTUResourceUsage",
3051 #  [TranslationUnit],
3052 #  CXTUResourceUsage),
3053
3054   ("clang_getCXXAccessSpecifier",
3055    [Cursor],
3056    c_uint),
3057
3058   ("clang_getDeclObjCTypeEncoding",
3059    [Cursor],
3060    _CXString,
3061    _CXString.from_result),
3062
3063   ("clang_getDiagnostic",
3064    [c_object_p, c_uint],
3065    c_object_p),
3066
3067   ("clang_getDiagnosticCategory",
3068    [Diagnostic],
3069    c_uint),
3070
3071   ("clang_getDiagnosticCategoryText",
3072    [Diagnostic],
3073    _CXString,
3074    _CXString.from_result),
3075
3076   ("clang_getDiagnosticFixIt",
3077    [Diagnostic, c_uint, POINTER(SourceRange)],
3078    _CXString,
3079    _CXString.from_result),
3080
3081   ("clang_getDiagnosticLocation",
3082    [Diagnostic],
3083    SourceLocation),
3084
3085   ("clang_getDiagnosticNumFixIts",
3086    [Diagnostic],
3087    c_uint),
3088
3089   ("clang_getDiagnosticNumRanges",
3090    [Diagnostic],
3091    c_uint),
3092
3093   ("clang_getDiagnosticOption",
3094    [Diagnostic, POINTER(_CXString)],
3095    _CXString,
3096    _CXString.from_result),
3097
3098   ("clang_getDiagnosticRange",
3099    [Diagnostic, c_uint],
3100    SourceRange),
3101
3102   ("clang_getDiagnosticSeverity",
3103    [Diagnostic],
3104    c_int),
3105
3106   ("clang_getDiagnosticSpelling",
3107    [Diagnostic],
3108    _CXString,
3109    _CXString.from_result),
3110
3111   ("clang_getElementType",
3112    [Type],
3113    Type,
3114    Type.from_result),
3115
3116   ("clang_getEnumConstantDeclUnsignedValue",
3117    [Cursor],
3118    c_ulonglong),
3119
3120   ("clang_getEnumConstantDeclValue",
3121    [Cursor],
3122    c_longlong),
3123
3124   ("clang_getEnumDeclIntegerType",
3125    [Cursor],
3126    Type,
3127    Type.from_result),
3128
3129   ("clang_getFile",
3130    [TranslationUnit, c_char_p],
3131    c_object_p),
3132
3133   ("clang_getFileName",
3134    [File],
3135    _CXString), # TODO go through _CXString.from_result?
3136
3137   ("clang_getFileTime",
3138    [File],
3139    c_uint),
3140
3141   ("clang_getIBOutletCollectionType",
3142    [Cursor],
3143    Type,
3144    Type.from_result),
3145
3146   ("clang_getIncludedFile",
3147    [Cursor],
3148    File,
3149    File.from_cursor_result),
3150
3151   ("clang_getInclusions",
3152    [TranslationUnit, callbacks['translation_unit_includes'], py_object]),
3153
3154   ("clang_getInstantiationLocation",
3155    [SourceLocation, POINTER(c_object_p), POINTER(c_uint), POINTER(c_uint),
3156     POINTER(c_uint)]),
3157
3158   ("clang_getLocation",
3159    [TranslationUnit, File, c_uint, c_uint],
3160    SourceLocation),
3161
3162   ("clang_getLocationForOffset",
3163    [TranslationUnit, File, c_uint],
3164    SourceLocation),
3165
3166   ("clang_getNullCursor",
3167    None,
3168    Cursor),
3169
3170   ("clang_getNumArgTypes",
3171    [Type],
3172    c_uint),
3173
3174   ("clang_getNumCompletionChunks",
3175    [c_void_p],
3176    c_int),
3177
3178   ("clang_getNumDiagnostics",
3179    [c_object_p],
3180    c_uint),
3181
3182   ("clang_getNumElements",
3183    [Type],
3184    c_longlong),
3185
3186   ("clang_getNumOverloadedDecls",
3187    [Cursor],
3188    c_uint),
3189
3190   ("clang_getOverloadedDecl",
3191    [Cursor, c_uint],
3192    Cursor,
3193    Cursor.from_cursor_result),
3194
3195   ("clang_getPointeeType",
3196    [Type],
3197    Type,
3198    Type.from_result),
3199
3200   ("clang_getRange",
3201    [SourceLocation, SourceLocation],
3202    SourceRange),
3203
3204   ("clang_getRangeEnd",
3205    [SourceRange],
3206    SourceLocation),
3207
3208   ("clang_getRangeStart",
3209    [SourceRange],
3210    SourceLocation),
3211
3212   ("clang_getResultType",
3213    [Type],
3214    Type,
3215    Type.from_result),
3216
3217   ("clang_getSpecializedCursorTemplate",
3218    [Cursor],
3219    Cursor,
3220    Cursor.from_cursor_result),
3221
3222   ("clang_getTemplateCursorKind",
3223    [Cursor],
3224    c_uint),
3225
3226   ("clang_getTokenExtent",
3227    [TranslationUnit, Token],
3228    SourceRange),
3229
3230   ("clang_getTokenKind",
3231    [Token],
3232    c_uint),
3233
3234   ("clang_getTokenLocation",
3235    [TranslationUnit, Token],
3236    SourceLocation),
3237
3238   ("clang_getTokenSpelling",
3239    [TranslationUnit, Token],
3240    _CXString,
3241    _CXString.from_result),
3242
3243   ("clang_getTranslationUnitCursor",
3244    [TranslationUnit],
3245    Cursor,
3246    Cursor.from_result),
3247
3248   ("clang_getTranslationUnitSpelling",
3249    [TranslationUnit],
3250    _CXString,
3251    _CXString.from_result),
3252
3253   ("clang_getTUResourceUsageName",
3254    [c_uint],
3255    c_char_p),
3256
3257   ("clang_getTypeDeclaration",
3258    [Type],
3259    Cursor,
3260    Cursor.from_result),
3261
3262   ("clang_getTypedefDeclUnderlyingType",
3263    [Cursor],
3264    Type,
3265    Type.from_result),
3266
3267   ("clang_getTypeKindSpelling",
3268    [c_uint],
3269    _CXString,
3270    _CXString.from_result),
3271
3272   ("clang_getTypeSpelling",
3273    [Type],
3274    _CXString,
3275    _CXString.from_result),
3276
3277   ("clang_hashCursor",
3278    [Cursor],
3279    c_uint),
3280
3281   ("clang_isAttribute",
3282    [CursorKind],
3283    bool),
3284
3285   ("clang_isConstQualifiedType",
3286    [Type],
3287    bool),
3288
3289   ("clang_isCursorDefinition",
3290    [Cursor],
3291    bool),
3292
3293   ("clang_isDeclaration",
3294    [CursorKind],
3295    bool),
3296
3297   ("clang_isExpression",
3298    [CursorKind],
3299    bool),
3300
3301   ("clang_isFileMultipleIncludeGuarded",
3302    [TranslationUnit, File],
3303    bool),
3304
3305   ("clang_isFunctionTypeVariadic",
3306    [Type],
3307    bool),
3308
3309   ("clang_isInvalid",
3310    [CursorKind],
3311    bool),
3312
3313   ("clang_isPODType",
3314    [Type],
3315    bool),
3316
3317   ("clang_isPreprocessing",
3318    [CursorKind],
3319    bool),
3320
3321   ("clang_isReference",
3322    [CursorKind],
3323    bool),
3324
3325   ("clang_isRestrictQualifiedType",
3326    [Type],
3327    bool),
3328
3329   ("clang_isStatement",
3330    [CursorKind],
3331    bool),
3332
3333   ("clang_isTranslationUnit",
3334    [CursorKind],
3335    bool),
3336
3337   ("clang_isUnexposed",
3338    [CursorKind],
3339    bool),
3340
3341   ("clang_isVirtualBase",
3342    [Cursor],
3343    bool),
3344
3345   ("clang_isVolatileQualifiedType",
3346    [Type],
3347    bool),
3348
3349   ("clang_parseTranslationUnit",
3350    [Index, c_char_p, c_void_p, c_int, c_void_p, c_int, c_int],
3351    c_object_p),
3352
3353   ("clang_reparseTranslationUnit",
3354    [TranslationUnit, c_int, c_void_p, c_int],
3355    c_int),
3356
3357   ("clang_saveTranslationUnit",
3358    [TranslationUnit, c_char_p, c_uint],
3359    c_int),
3360
3361   ("clang_tokenize",
3362    [TranslationUnit, SourceRange, POINTER(POINTER(Token)), POINTER(c_uint)]),
3363
3364   ("clang_visitChildren",
3365    [Cursor, callbacks['cursor_visit'], py_object],
3366    c_uint),
3367
3368   ("clang_Cursor_getNumArguments",
3369    [Cursor],
3370    c_int),
3371
3372   ("clang_Cursor_getArgument",
3373    [Cursor, c_uint],
3374    Cursor,
3375    Cursor.from_result),
3376
3377   ("clang_Cursor_getNumTemplateArguments",
3378    [Cursor],
3379    c_int),
3380
3381   ("clang_Cursor_getTemplateArgumentKind",
3382    [Cursor, c_uint],
3383    TemplateArgumentKind.from_id),
3384
3385   ("clang_Cursor_getTemplateArgumentType",
3386    [Cursor, c_uint],
3387    Type,
3388    Type.from_result),
3389
3390   ("clang_Cursor_getTemplateArgumentValue",
3391    [Cursor, c_uint],
3392    c_longlong),
3393
3394   ("clang_Cursor_getTemplateArgumentUnsignedValue",
3395    [Cursor, c_uint],
3396    c_ulonglong),
3397
3398   ("clang_Cursor_isAnonymous",
3399    [Cursor],
3400    bool),
3401
3402   ("clang_Cursor_isBitField",
3403    [Cursor],
3404    bool),
3405
3406   ("clang_Cursor_getBriefCommentText",
3407    [Cursor],
3408    _CXString,
3409    _CXString.from_result),
3410
3411   ("clang_Cursor_getRawCommentText",
3412    [Cursor],
3413    _CXString,
3414    _CXString.from_result),
3415
3416   ("clang_Cursor_getOffsetOfField",
3417    [Cursor],
3418    c_longlong),
3419
3420   ("clang_Type_getAlignOf",
3421    [Type],
3422    c_longlong),
3423
3424   ("clang_Type_getClassType",
3425    [Type],
3426    Type,
3427    Type.from_result),
3428
3429   ("clang_Type_getOffsetOf",
3430    [Type, c_char_p],
3431    c_longlong),
3432
3433   ("clang_Type_getSizeOf",
3434    [Type],
3435    c_longlong),
3436
3437   ("clang_Type_getCXXRefQualifier",
3438    [Type],
3439    c_uint),
3440
3441   ("clang_Type_visitFields",
3442    [Type, callbacks['fields_visit'], py_object],
3443    c_uint),
3444 ]
3445
3446 class LibclangError(Exception):
3447     def __init__(self, message):
3448         self.m = message
3449
3450     def __str__(self):
3451         return self.m
3452
3453 def register_function(lib, item, ignore_errors):
3454     # A function may not exist, if these bindings are used with an older or
3455     # incompatible version of libclang.so.
3456     try:
3457         func = getattr(lib, item[0])
3458     except AttributeError as e:
3459         msg = str(e) + ". Please ensure that your python bindings are "\
3460                        "compatible with your libclang.so version."
3461         if ignore_errors:
3462             return
3463         raise LibclangError(msg)
3464
3465     if len(item) >= 2:
3466         func.argtypes = item[1]
3467
3468     if len(item) >= 3:
3469         func.restype = item[2]
3470
3471     if len(item) == 4:
3472         func.errcheck = item[3]
3473
3474 def register_functions(lib, ignore_errors):
3475     """Register function prototypes with a libclang library instance.
3476
3477     This must be called as part of library instantiation so Python knows how
3478     to call out to the shared library.
3479     """
3480
3481     def register(item):
3482         return register_function(lib, item, ignore_errors)
3483
3484     map(register, functionList)
3485
3486 class Config:
3487     library_path = None
3488     library_file = None
3489     compatibility_check = True
3490     loaded = False
3491
3492     @staticmethod
3493     def set_library_path(path):
3494         """Set the path in which to search for libclang"""
3495         if Config.loaded:
3496             raise Exception("library path must be set before before using " \
3497                             "any other functionalities in libclang.")
3498
3499         Config.library_path = path
3500
3501     @staticmethod
3502     def set_library_file(filename):
3503         """Set the exact location of libclang"""
3504         if Config.loaded:
3505             raise Exception("library file must be set before before using " \
3506                             "any other functionalities in libclang.")
3507
3508         Config.library_file = filename
3509
3510     @staticmethod
3511     def set_compatibility_check(check_status):
3512         """ Perform compatibility check when loading libclang
3513
3514         The python bindings are only tested and evaluated with the version of
3515         libclang they are provided with. To ensure correct behavior a (limited)
3516         compatibility check is performed when loading the bindings. This check
3517         will throw an exception, as soon as it fails.
3518
3519         In case these bindings are used with an older version of libclang, parts
3520         that have been stable between releases may still work. Users of the
3521         python bindings can disable the compatibility check. This will cause
3522         the python bindings to load, even though they are written for a newer
3523         version of libclang. Failures now arise if unsupported or incompatible
3524         features are accessed. The user is required to test themselves if the
3525         features they are using are available and compatible between different
3526         libclang versions.
3527         """
3528         if Config.loaded:
3529             raise Exception("compatibility_check must be set before before " \
3530                             "using any other functionalities in libclang.")
3531
3532         Config.compatibility_check = check_status
3533
3534     @CachedProperty
3535     def lib(self):
3536         lib = self.get_cindex_library()
3537         register_functions(lib, not Config.compatibility_check)
3538         Config.loaded = True
3539         return lib
3540
3541     def get_filename(self):
3542         if Config.library_file:
3543             return Config.library_file
3544
3545         import platform
3546         name = platform.system()
3547
3548         if name == 'Darwin':
3549             file = 'libclang.dylib'
3550         elif name == 'Windows':
3551             file = 'libclang.dll'
3552         else:
3553             file = 'libclang.so'
3554
3555         if Config.library_path:
3556             file = Config.library_path + '/' + file
3557
3558         return file
3559
3560     def get_cindex_library(self):
3561         try:
3562             library = cdll.LoadLibrary(self.get_filename())
3563         except OSError as e:
3564             msg = str(e) + ". To provide a path to libclang use " \
3565                            "Config.set_library_path() or " \
3566                            "Config.set_library_file()."
3567             raise LibclangError(msg)
3568
3569         return library
3570
3571     def function_exists(self, name):
3572         try:
3573             getattr(self.lib, name)
3574         except AttributeError:
3575             return False
3576
3577         return True
3578
3579 def register_enumerations():
3580     for name, value in clang.enumerations.TokenKinds:
3581         TokenKind.register(value, name)
3582
3583 conf = Config()
3584 register_enumerations()
3585
3586 __all__ = [
3587     'Config',
3588     'CodeCompletionResults',
3589     'CompilationDatabase',
3590     'CompileCommands',
3591     'CompileCommand',
3592     'CursorKind',
3593     'Cursor',
3594     'Diagnostic',
3595     'File',
3596     'FixIt',
3597     'Index',
3598     'SourceLocation',
3599     'SourceRange',
3600     'TokenKind',
3601     'Token',
3602     'TranslationUnitLoadError',
3603     'TranslationUnit',
3604     'TypeKind',
3605     'Type',
3606 ]