12312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidisfrom clang.cindex import Index, CursorKind, TypeKind 22312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 32312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios KyrtzidiskInput = """\ 42312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 52312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidistypedef int I; 62312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 72312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidisstruct teststruct { 82312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis int a; 92312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis I b; 102312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis long c; 112312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis unsigned long d; 122312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis signed long e; 132312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis const int f; 142312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis int *g; 152312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis int ***h; 162312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis}; 172312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 182312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis""" 192312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 202312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidisdef test_a_struct(): 212312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis index = Index.create() 222312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis tu = index.parse('t.c', unsaved_files = [('t.c',kInput)]) 232312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 242312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis for n in tu.cursor.get_children(): 252312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis if n.spelling == 'teststruct': 262312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis fields = list(n.get_children()) 272312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 282312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert all(x.kind == CursorKind.FIELD_DECL for x in fields) 292312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 302312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[0].spelling == 'a' 312312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert not fields[0].type.is_const_qualified() 322312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[0].type.kind == TypeKind.INT 332312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[0].type.get_canonical().kind == TypeKind.INT 342312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 352312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[1].spelling == 'b' 362312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert not fields[1].type.is_const_qualified() 372312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[1].type.kind == TypeKind.TYPEDEF 382312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[1].type.get_canonical().kind == TypeKind.INT 392312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[1].type.get_declaration().spelling == 'I' 402312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 412312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[2].spelling == 'c' 422312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert not fields[2].type.is_const_qualified() 432312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[2].type.kind == TypeKind.LONG 442312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[2].type.get_canonical().kind == TypeKind.LONG 452312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 462312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[3].spelling == 'd' 472312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert not fields[3].type.is_const_qualified() 482312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[3].type.kind == TypeKind.ULONG 492312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[3].type.get_canonical().kind == TypeKind.ULONG 502312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 512312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[4].spelling == 'e' 522312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert not fields[4].type.is_const_qualified() 532312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[4].type.kind == TypeKind.LONG 542312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[4].type.get_canonical().kind == TypeKind.LONG 552312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 562312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[5].spelling == 'f' 572312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[5].type.is_const_qualified() 582312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[5].type.kind == TypeKind.INT 592312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[5].type.get_canonical().kind == TypeKind.INT 602312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 612312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[6].spelling == 'g' 622312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert not fields[6].type.is_const_qualified() 632312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[6].type.kind == TypeKind.POINTER 642312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[6].type.get_pointee().kind == TypeKind.INT 652312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 662312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[7].spelling == 'h' 672312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert not fields[7].type.is_const_qualified() 682312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[7].type.kind == TypeKind.POINTER 692312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[7].type.get_pointee().kind == TypeKind.POINTER 702312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[7].type.get_pointee().get_pointee().kind == TypeKind.POINTER 712312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert fields[7].type.get_pointee().get_pointee().get_pointee().kind == TypeKind.INT 722312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 732312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis break 742312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis 752312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis else: 762312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis assert False, "Didn't find teststruct??" 7738d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor 7838d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor 7938d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas GregorconstarrayInput=""" 8038d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregorstruct teststruct { 8138d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor void *A[2]; 8238d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor}; 8338d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor""" 8438d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregordef testConstantArray(): 8538d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor index = Index.create() 8638d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor tu = index.parse('t.c', unsaved_files = [('t.c',constarrayInput)]) 8738d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor 8838d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor for n in tu.cursor.get_children(): 8938d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor if n.spelling == 'teststruct': 9038d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor fields = list(n.get_children()) 9138d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor assert fields[0].spelling == 'A' 9238d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor assert fields[0].type.kind == TypeKind.CONSTANTARRAY 9313102ffbb00f1397fa02950e0cbc82d17be21792Douglas Gregor assert fields[0].type.get_array_element_type() is not None 9413102ffbb00f1397fa02950e0cbc82d17be21792Douglas Gregor assert fields[0].type.get_array_element_type().kind == TypeKind.POINTER 9513102ffbb00f1397fa02950e0cbc82d17be21792Douglas Gregor assert fields[0].type.get_array_size() == 2 9613102ffbb00f1397fa02950e0cbc82d17be21792Douglas Gregor 9738d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor break 9838d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor else: 9938d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor assert False, "Didn't find teststruct??" 100