1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesimport ctypes
2a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorcimport gc
3a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
41f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom clang.cindex import CursorKind
5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesfrom clang.cindex import TemplateArgumentKind
6a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorcfrom clang.cindex import TranslationUnit
71f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom clang.cindex import TypeKind
81f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom .util import get_cursor
9667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimekfrom .util import get_cursors
101f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom .util import get_tu
1190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
1290859ae3b6acbdc48113cddb95984e3472a51772Daniel DunbarkInput = """\
1390859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbarstruct s0 {
1490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  int a;
1590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  int b;
1690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar};
1790859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
1890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbarstruct s1;
1990859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
2090859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbarvoid f0(int a0, int a1) {
2190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  int l0, l1;
2290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
2390859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  if (a0)
2490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    return;
2590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
2690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  for (;;) {
2790859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    break;
2890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  }
2990859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar}
3090859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar"""
3190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
3290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbardef test_get_children():
331f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu(kInput)
341f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
3590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    it = tu.cursor.get_children()
3690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    tu_nodes = list(it)
3790859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
3890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert len(tu_nodes) == 3
39a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    for cursor in tu_nodes:
40a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc        assert cursor.translation_unit is not None
4190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
42e75f33063e72f4ca87b8ba17580d5ca4c90d9e80Gregory Szorc    assert tu_nodes[0] != tu_nodes[1]
4390859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].kind == CursorKind.STRUCT_DECL
4490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].spelling == 's0'
4590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].is_definition() == True
4690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].location.file.name == 't.c'
476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    assert tu_nodes[0].location.line == 1
4890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].location.column == 8
4964e7bdc1d4c8c2f40f32e699014e85fbe1be57f7Tobias Grosser    assert tu_nodes[0].hash > 0
50a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    assert tu_nodes[0].translation_unit is not None
5190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
5290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    s0_nodes = list(tu_nodes[0].get_children())
5390859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert len(s0_nodes) == 2
5490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert s0_nodes[0].kind == CursorKind.FIELD_DECL
5590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert s0_nodes[0].spelling == 'a'
56d7933e6f29b4c93df8263df21ff5e2e1dd0cecb8Argyrios Kyrtzidis    assert s0_nodes[0].type.kind == TypeKind.INT
5790859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert s0_nodes[1].kind == CursorKind.FIELD_DECL
5890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert s0_nodes[1].spelling == 'b'
59d7933e6f29b4c93df8263df21ff5e2e1dd0cecb8Argyrios Kyrtzidis    assert s0_nodes[1].type.kind == TypeKind.INT
6090859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
6190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[1].kind == CursorKind.STRUCT_DECL
6290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[1].spelling == 's1'
63b60a2bebb5f3048f6c53d4f3997ebd84493a2d98Douglas Gregor    assert tu_nodes[1].displayname == 's1'
6490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[1].is_definition() == False
6590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
6690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[2].kind == CursorKind.FUNCTION_DECL
6790859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[2].spelling == 'f0'
68b60a2bebb5f3048f6c53d4f3997ebd84493a2d98Douglas Gregor    assert tu_nodes[2].displayname == 'f0(int, int)'
6990859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[2].is_definition() == True
7028d939ffd6877f8a2c6a5b6704df792319f3878eTobias Grosser
71a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorcdef test_references():
72a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    """Ensure that references to TranslationUnit are kept."""
73a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    tu = get_tu('int x;')
74a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    cursors = list(tu.cursor.get_children())
75a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    assert len(cursors) > 0
76a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
77a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    cursor = cursors[0]
78a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    assert isinstance(cursor.translation_unit, TranslationUnit)
79a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
80a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    # Delete reference to TU and perform a full GC.
81a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    del tu
82a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    gc.collect()
83a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    assert isinstance(cursor.translation_unit, TranslationUnit)
84a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
85a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    # If the TU was destroyed, this should cause a segfault.
86a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    parent = cursor.semantic_parent
87a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
882c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorcdef test_canonical():
892c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc    source = 'struct X; struct X; struct X { int member; };'
902c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc    tu = get_tu(source)
912c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc
922c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc    cursors = []
932c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc    for cursor in tu.cursor.get_children():
942c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc        if cursor.spelling == 'X':
952c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc            cursors.append(cursor)
962c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc
972c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc    assert len(cursors) == 3
982c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc    assert cursors[1].canonical == cursors[2].canonical
992c40835c21cd435f183da3d4754aff6beeaef9f6Gregory Szorc
100e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorcdef test_is_static_method():
101e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    """Ensure Cursor.is_static_method works."""
102e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc
103e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    source = 'class X { static void foo(); void bar(); };'
104e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    tu = get_tu(source, lang='cpp')
105e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc
106e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    cls = get_cursor(tu, 'X')
107e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    foo = get_cursor(tu, 'foo')
108e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    bar = get_cursor(tu, 'bar')
109e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    assert cls is not None
110e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    assert foo is not None
111e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    assert bar is not None
112e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc
113e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    assert foo.is_static_method()
114e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc    assert not bar.is_static_method()
115e65b34deb1f8f7c80765f1c00476e7609bb9eadaGregory Szorc
11628d939ffd6877f8a2c6a5b6704df792319f3878eTobias Grosserdef test_underlying_type():
1171f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu('typedef int foo;')
1181f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    typedef = get_cursor(tu, 'foo')
1191f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert typedef is not None
12028d939ffd6877f8a2c6a5b6704df792319f3878eTobias Grosser
12128d939ffd6877f8a2c6a5b6704df792319f3878eTobias Grosser    assert typedef.kind.is_declaration()
12228d939ffd6877f8a2c6a5b6704df792319f3878eTobias Grosser    underlying = typedef.underlying_typedef_type
12328d939ffd6877f8a2c6a5b6704df792319f3878eTobias Grosser    assert underlying.kind == TypeKind.INT
124eb9ff2ea9ed829809cb177e74238301cfc2750caTobias Grosser
125667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel KlimekkParentTest = """\
126667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek        class C {
127667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek            void f();
128667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek        }
129fd04a6a88255ce3a90e5f73aef69c08bb5a35677Gregory Szorc
130667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek        void C::f() { }
131667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    """
132667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimekdef test_semantic_parent():
133667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    tu = get_tu(kParentTest, 'cpp')
134667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    curs = get_cursors(tu, 'f')
135667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    decl = get_cursor(tu, 'C')
136667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    assert(len(curs) == 2)
137667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    assert(curs[0].semantic_parent == curs[1].semantic_parent)
138fd04a6a88255ce3a90e5f73aef69c08bb5a35677Gregory Szorc    assert(curs[0].semantic_parent == decl)
139667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek
140667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimekdef test_lexical_parent():
141667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    tu = get_tu(kParentTest, 'cpp')
142667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    curs = get_cursors(tu, 'f')
143667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    decl = get_cursor(tu, 'C')
144667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    assert(len(curs) == 2)
145667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    assert(curs[0].lexical_parent != curs[1].lexical_parent)
146fd04a6a88255ce3a90e5f73aef69c08bb5a35677Gregory Szorc    assert(curs[0].lexical_parent == decl)
147667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    assert(curs[1].lexical_parent == tu.cursor)
148667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek
149eb9ff2ea9ed829809cb177e74238301cfc2750caTobias Grosserdef test_enum_type():
1501f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu('enum TEST { FOO=1, BAR=2 };')
1511f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    enum = get_cursor(tu, 'TEST')
1521f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert enum is not None
153eb9ff2ea9ed829809cb177e74238301cfc2750caTobias Grosser
154eb9ff2ea9ed829809cb177e74238301cfc2750caTobias Grosser    assert enum.kind == CursorKind.ENUM_DECL
155eb9ff2ea9ed829809cb177e74238301cfc2750caTobias Grosser    enum_type = enum.enum_type
156eb9ff2ea9ed829809cb177e74238301cfc2750caTobias Grosser    assert enum_type.kind == TypeKind.UINT
1575cc6787b1ce76fc3b6e5fc6c2729f0dbfaf6c749Gregory Szorc
15851c8bac81e103f334f0dafb1bf2d4c335ac3a28bAnders Waldenborgdef test_enum_type_cpp():
15951c8bac81e103f334f0dafb1bf2d4c335ac3a28bAnders Waldenborg    tu = get_tu('enum TEST : long long { FOO=1, BAR=2 };', lang="cpp")
16051c8bac81e103f334f0dafb1bf2d4c335ac3a28bAnders Waldenborg    enum = get_cursor(tu, 'TEST')
16151c8bac81e103f334f0dafb1bf2d4c335ac3a28bAnders Waldenborg    assert enum is not None
16251c8bac81e103f334f0dafb1bf2d4c335ac3a28bAnders Waldenborg
16351c8bac81e103f334f0dafb1bf2d4c335ac3a28bAnders Waldenborg    assert enum.kind == CursorKind.ENUM_DECL
16451c8bac81e103f334f0dafb1bf2d4c335ac3a28bAnders Waldenborg    assert enum.enum_type.kind == TypeKind.LONGLONG
16551c8bac81e103f334f0dafb1bf2d4c335ac3a28bAnders Waldenborg
1665cc6787b1ce76fc3b6e5fc6c2729f0dbfaf6c749Gregory Szorcdef test_objc_type_encoding():
1675cc6787b1ce76fc3b6e5fc6c2729f0dbfaf6c749Gregory Szorc    tu = get_tu('int i;', lang='objc')
1685cc6787b1ce76fc3b6e5fc6c2729f0dbfaf6c749Gregory Szorc    i = get_cursor(tu, 'i')
1695cc6787b1ce76fc3b6e5fc6c2729f0dbfaf6c749Gregory Szorc
1705cc6787b1ce76fc3b6e5fc6c2729f0dbfaf6c749Gregory Szorc    assert i is not None
1715cc6787b1ce76fc3b6e5fc6c2729f0dbfaf6c749Gregory Szorc    assert i.objc_type_encoding == 'i'
172bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
173bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborgdef test_enum_values():
174bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    tu = get_tu('enum TEST { SPAM=1, EGG, HAM = EGG * 20};')
175bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    enum = get_cursor(tu, 'TEST')
176bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert enum is not None
177bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
178bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert enum.kind == CursorKind.ENUM_DECL
179bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
180bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    enum_constants = list(enum.get_children())
181bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert len(enum_constants) == 3
182bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
183bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    spam, egg, ham = enum_constants
184bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
185bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert spam.kind == CursorKind.ENUM_CONSTANT_DECL
186bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert spam.enum_value == 1
187bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert egg.kind == CursorKind.ENUM_CONSTANT_DECL
188bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert egg.enum_value == 2
189bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert ham.kind == CursorKind.ENUM_CONSTANT_DECL
190bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert ham.enum_value == 40
191bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
192bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborgdef test_enum_values_cpp():
193bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    tu = get_tu('enum TEST : long long { SPAM = -1, HAM = 0x10000000000};', lang="cpp")
194bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    enum = get_cursor(tu, 'TEST')
195bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert enum is not None
196bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
197bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert enum.kind == CursorKind.ENUM_DECL
198bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
199bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    enum_constants = list(enum.get_children())
200bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert len(enum_constants) == 2
201bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
202bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    spam, ham = enum_constants
203bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
204bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert spam.kind == CursorKind.ENUM_CONSTANT_DECL
205bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert spam.enum_value == -1
206bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert ham.kind == CursorKind.ENUM_CONSTANT_DECL
207bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg    assert ham.enum_value == 0x10000000000
208bbc2e090996cdf51f0e7a4235f6e0ca65c95d514Anders Waldenborg
209228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborgdef test_annotation_attribute():
210228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg    tu = get_tu('int foo (void) __attribute__ ((annotate("here be annotation attribute")));')
211228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg
212228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg    foo = get_cursor(tu, 'foo')
213228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg    assert foo is not None
214228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg
215228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg    for c in foo.get_children():
216228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg        if c.kind == CursorKind.ANNOTATE_ATTR:
217228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg            assert c.displayname == "here be annotation attribute"
218228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg            break
219228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg    else:
220228e5703a69dbbfdb481fee0e2e4edad8f92e5feAnders Waldenborg        assert False, "Couldn't find annotation"
2211e370ab68e5b69fc40a782ee5ce01ec2c6857879Gregory Szorc
2221e370ab68e5b69fc40a782ee5ce01ec2c6857879Gregory Szorcdef test_result_type():
2231e370ab68e5b69fc40a782ee5ce01ec2c6857879Gregory Szorc    tu = get_tu('int foo();')
2241e370ab68e5b69fc40a782ee5ce01ec2c6857879Gregory Szorc    foo = get_cursor(tu, 'foo')
2251e370ab68e5b69fc40a782ee5ce01ec2c6857879Gregory Szorc
2261e370ab68e5b69fc40a782ee5ce01ec2c6857879Gregory Szorc    assert foo is not None
2271e370ab68e5b69fc40a782ee5ce01ec2c6857879Gregory Szorc    t = foo.result_type
2281e370ab68e5b69fc40a782ee5ce01ec2c6857879Gregory Szorc    assert t.kind == TypeKind.INT
229be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorc
230be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorcdef test_get_tokens():
231be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorc    """Ensure we can map cursors back to tokens."""
232be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorc    tu = get_tu('int foo(int i);')
233be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorc    foo = get_cursor(tu, 'foo')
234be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorc
235be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorc    tokens = list(foo.get_tokens())
236be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorc    assert len(tokens) == 7
237be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorc    assert tokens[0].spelling == 'int'
238be51e43ba2c57b8032286af4e8713485b6dc78c3Gregory Szorc    assert tokens[1].spelling == 'foo'
239b03b57d14983f90adb85f662812ba5742cfe45f2Gregory Szorc
240b03b57d14983f90adb85f662812ba5742cfe45f2Gregory Szorcdef test_get_arguments():
241b03b57d14983f90adb85f662812ba5742cfe45f2Gregory Szorc    tu = get_tu('void foo(int i, int j);')
242b03b57d14983f90adb85f662812ba5742cfe45f2Gregory Szorc    foo = get_cursor(tu, 'foo')
243b03b57d14983f90adb85f662812ba5742cfe45f2Gregory Szorc    arguments = list(foo.get_arguments())
244b03b57d14983f90adb85f662812ba5742cfe45f2Gregory Szorc
245b03b57d14983f90adb85f662812ba5742cfe45f2Gregory Szorc    assert len(arguments) == 2
246b03b57d14983f90adb85f662812ba5742cfe45f2Gregory Szorc    assert arguments[0].spelling == "i"
247b03b57d14983f90adb85f662812ba5742cfe45f2Gregory Szorc    assert arguments[1].spelling == "j"
248d829379ed95cdce29497118c6c6c39bd7f62f307Argyrios Kyrtzidis
249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HineskTemplateArgTest = """\
250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        template <int kInt, typename T, bool kBool>
251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        void foo();
252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        template<>
254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        void foo<-7, float, true>();
255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    """
256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesdef test_get_num_template_arguments():
258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    tu = get_tu(kTemplateArgTest, lang='cpp')
259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foos = get_cursors(tu, 'foo')
260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foos[1].get_num_template_arguments() == 3
262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
263176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesdef test_get_template_argument_kind():
264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    tu = get_tu(kTemplateArgTest, lang='cpp')
265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foos = get_cursors(tu, 'foo')
266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foos[1].get_template_argument_kind(0) == TemplateArgumentKind.INTEGRAL
268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foos[1].get_template_argument_kind(1) == TemplateArgumentKind.TYPE
269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foos[1].get_template_argument_kind(2) == TemplateArgumentKind.INTEGRAL
270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesdef test_get_template_argument_type():
272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    tu = get_tu(kTemplateArgTest, lang='cpp')
273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foos = get_cursors(tu, 'foo')
274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foos[1].get_template_argument_type(1).kind == TypeKind.FLOAT
276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesdef test_get_template_argument_value():
278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    tu = get_tu(kTemplateArgTest, lang='cpp')
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foos = get_cursors(tu, 'foo')
280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foos[1].get_template_argument_value(0) == -7
282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foos[1].get_template_argument_value(2) == True
283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesdef test_get_template_argument_unsigned_value():
285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    tu = get_tu(kTemplateArgTest, lang='cpp')
286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foos = get_cursors(tu, 'foo')
287176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
288176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foos[1].get_template_argument_unsigned_value(0) == 2 ** 32 - 7
289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foos[1].get_template_argument_unsigned_value(2) == True
290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
291d829379ed95cdce29497118c6c6c39bd7f62f307Argyrios Kyrtzidisdef test_referenced():
292d829379ed95cdce29497118c6c6c39bd7f62f307Argyrios Kyrtzidis    tu = get_tu('void foo(); void bar() { foo(); }')
293d829379ed95cdce29497118c6c6c39bd7f62f307Argyrios Kyrtzidis    foo = get_cursor(tu, 'foo')
294d829379ed95cdce29497118c6c6c39bd7f62f307Argyrios Kyrtzidis    bar = get_cursor(tu, 'bar')
295d829379ed95cdce29497118c6c6c39bd7f62f307Argyrios Kyrtzidis    for c in bar.get_children():
296d829379ed95cdce29497118c6c6c39bd7f62f307Argyrios Kyrtzidis        if c.kind == CursorKind.CALL_EXPR:
297d829379ed95cdce29497118c6c6c39bd7f62f307Argyrios Kyrtzidis            assert c.referenced.spelling == foo.spelling
298d829379ed95cdce29497118c6c6c39bd7f62f307Argyrios Kyrtzidis            break
299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesdef test_mangled_name():
301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    kInputForMangling = """\
302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int foo(int, int);
303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    """
304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    tu = get_tu(kInputForMangling, lang='cpp')
305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo = get_cursor(tu, 'foo')
306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    # Since libclang does not link in targets, we cannot pass a triple to it
308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    # and force the target. To enable this test to pass on all platforms, accept
309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    # all valid manglings.
310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    # [c-index-test handles this by running the source through clang, emitting
311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    #  an AST file and running libclang on that AST file]
312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    assert foo.mangled_name in ('_Z3fooii', '__Z3fooii', '?foo@@YAHHH')
313