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