1d7933e6f29b4c93df8263df21ff5e2e1dd0cecb8Argyrios Kyrtzidisfrom clang.cindex import Index, CursorKind, TypeKind
290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
390859ae3b6acbdc48113cddb95984e3472a51772Daniel DunbarkInput = """\
490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar// FIXME: Find nicer way to drop builtins and other cruft.
590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbarint start_decl;
690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
790859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbarstruct s0 {
890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  int a;
990859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  int b;
1090859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar};
1190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
1290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbarstruct s1;
1390859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
1490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbarvoid f0(int a0, int a1) {
1590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  int l0, l1;
1690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
1790859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  if (a0)
1890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    return;
1990859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
2090859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  for (;;) {
2190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    break;
2290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar  }
2390859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar}
2490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar"""
2590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
2690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbardef test_get_children():
272791dfc0fcbff64dbdaccde433b75c7226528b8dDaniel Dunbar    index = Index.create()
2890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    tu = index.parse('t.c', unsaved_files = [('t.c',kInput)])
2990859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
3090859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    # Skip until past start_decl.
3190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    it = tu.cursor.get_children()
3290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    while it.next().spelling != 'start_decl':
3390859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar        pass
3490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
3590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    tu_nodes = list(it)
3690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
3790859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert len(tu_nodes) == 3
3890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
3990859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].kind == CursorKind.STRUCT_DECL
4090859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].spelling == 's0'
4190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].is_definition() == True
4290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].location.file.name == 't.c'
4390859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].location.line == 4
4490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[0].location.column == 8
4590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
4690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    s0_nodes = list(tu_nodes[0].get_children())
4790859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert len(s0_nodes) == 2
4890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert s0_nodes[0].kind == CursorKind.FIELD_DECL
4990859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert s0_nodes[0].spelling == 'a'
50d7933e6f29b4c93df8263df21ff5e2e1dd0cecb8Argyrios Kyrtzidis    assert s0_nodes[0].type.kind == TypeKind.INT
5190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert s0_nodes[1].kind == CursorKind.FIELD_DECL
5290859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert s0_nodes[1].spelling == 'b'
53d7933e6f29b4c93df8263df21ff5e2e1dd0cecb8Argyrios Kyrtzidis    assert s0_nodes[1].type.kind == TypeKind.INT
5490859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
5590859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[1].kind == CursorKind.STRUCT_DECL
5690859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[1].spelling == 's1'
57b60a2bebb5f3048f6c53d4f3997ebd84493a2d98Douglas Gregor    assert tu_nodes[1].displayname == 's1'
5890859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[1].is_definition() == False
5990859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar
6090859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[2].kind == CursorKind.FUNCTION_DECL
6190859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[2].spelling == 'f0'
62b60a2bebb5f3048f6c53d4f3997ebd84493a2d98Douglas Gregor    assert tu_nodes[2].displayname == 'f0(int, int)'
6390859ae3b6acbdc48113cddb95984e3472a51772Daniel Dunbar    assert tu_nodes[2].is_definition() == True
64