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