summaryrefslogtreecommitdiffstats
path: root/bindings
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2014-10-15 17:05:31 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2014-10-15 17:05:31 +0000
commit763069ac81d376e544b40a844a70e5e984e10bf4 (patch)
tree5b081535d201c7147d81b3edb7e2b304b17a5de1 /bindings
parent822389da583d9d67f46e84552ecb580c49abcda7 (diff)
[libclang] Add function to retrieve storage class in libclang.
Patch by guibufolo! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219809 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'bindings')
-rw-r--r--bindings/python/clang/cindex.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/bindings/python/clang/cindex.py b/bindings/python/clang/cindex.py
index 8bcf9c3bda..5792effea5 100644
--- a/bindings/python/clang/cindex.py
+++ b/bindings/python/clang/cindex.py
@@ -1247,6 +1247,17 @@ class Cursor(Structure):
return self._extent
@property
+ def storage_class(self):
+ """
+ Retrieves the storage class (if any) of the entity pointed at by the
+ cursor.
+ """
+ if not hasattr(self, '_storage_class'):
+ self._storage_class = conf.lib.clang_Cursor_getStorageClass(self)
+
+ return StorageClass.from_id(self._storage_class)
+
+ @property
def access_specifier(self):
"""
Retrieves the access specifier (if any) of the entity pointed at by the
@@ -1510,6 +1521,56 @@ class Cursor(Structure):
res._tu = args[0]._tu
return res
+class StorageClass(object):
+ """
+ Describes the storage class of a declaration
+ """
+
+ # The unique kind objects, index by id.
+ _kinds = []
+ _name_map = None
+
+ def __init__(self, value):
+ if value >= len(StorageClass._kinds):
+ StorageClass._kinds += [None] * (value - len(StorageClass._kinds) + 1)
+ if StorageClass._kinds[value] is not None:
+ raise ValueError,'StorageClass already loaded'
+ self.value = value
+ StorageClass._kinds[value] = self
+ StorageClass._name_map = None
+
+ def from_param(self):
+ return self.value
+
+ @property
+ def name(self):
+ """Get the enumeration name of this storage class."""
+ if self._name_map is None:
+ self._name_map = {}
+ for key,value in StorageClass.__dict__.items():
+ if isinstance(value,StorageClass):
+ self._name_map[value] = key
+ return self._name_map[self]
+
+ @staticmethod
+ def from_id(id):
+ if id >= len(StorageClass._kinds) or not StorageClass._kinds[id]:
+ raise ValueError,'Unknown storage class %d' % id
+ return StorageClass._kinds[id]
+
+ def __repr__(self):
+ return 'StorageClass.%s' % (self.name,)
+
+StorageClass.INVALID = StorageClass(0)
+StorageClass.NONE = StorageClass(1)
+StorageClass.EXTERN = StorageClass(2)
+StorageClass.STATIC = StorageClass(3)
+StorageClass.PRIVATEEXTERN = StorageClass(4)
+StorageClass.OPENCLWORKGROUPLOCAL = StorageClass(5)
+StorageClass.AUTO = StorageClass(6)
+StorageClass.REGISTER = StorageClass(7)
+
+
### C++ access specifiers ###
class AccessSpecifier(BaseEnumeration):