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