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