11f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc# This file provides common utility functions for the test suite.
21f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
31f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom clang.cindex import Cursor
4fbf620bc2b7812e826f04befa31d3a48a86210baGregory Szorcfrom clang.cindex import TranslationUnit
51f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
6411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisdef get_tu(source, lang='c', all_warnings=False, flags=[]):
71f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    """Obtain a translation unit from source and language.
81f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
91f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    By default, the translation unit is created from source file "t.<ext>"
101f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    where <ext> is the default file extension for the specified language. By
111f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    default it is C, so "t.c" is the default file name.
121f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
131f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    Supported languages are {c, cpp, objc}.
141f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
151f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    all_warnings is a convenience argument to enable all compiler warnings.
161f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    """
17411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    args = list(flags)
181f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    name = 't.c'
191f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    if lang == 'cpp':
201f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc        name = 't.cpp'
215b82b9606d9e36134724d5638efbc9d60fc8be90Anders Waldenborg        args.append('-std=c++11')
221f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    elif lang == 'objc':
231f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc        name = 't.m'
241f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    elif lang != 'c':
251f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc        raise Exception('Unknown language: %s' % lang)
261f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
271f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    if all_warnings:
285b82b9606d9e36134724d5638efbc9d60fc8be90Anders Waldenborg        args += ['-Wall', '-Wextra']
291f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
30fbf620bc2b7812e826f04befa31d3a48a86210baGregory Szorc    return TranslationUnit.from_source(name, args, unsaved_files=[(name,
31fbf620bc2b7812e826f04befa31d3a48a86210baGregory Szorc                                       source)])
321f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
331f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcdef get_cursor(source, spelling):
341f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    """Obtain a cursor from a source object.
351f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
361f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    This provides a convenient search mechanism to find a cursor with specific
371f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    spelling within a source. The first argument can be either a
381f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    TranslationUnit or Cursor instance.
391f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
401f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    If the cursor is not found, None is returned.
411f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    """
42ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    # Convenience for calling on a TU.
43ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    root_cursor = source if isinstance(source, Cursor) else source.cursor
44ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
45ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for cursor in root_cursor.walk_preorder():
461f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc        if cursor.spelling == spelling:
471f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc            return cursor
481f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
491f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    return None
50ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
51667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimekdef get_cursors(source, spelling):
52667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    """Obtain all cursors from a source object with a specific spelling.
531f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
54ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    This provides a convenient search mechanism to find all cursors with
55ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    specific spelling within a source. The first argument can be either a
56667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    TranslationUnit or Cursor instance.
57667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek
58667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    If no cursors are found, an empty list is returned.
59667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    """
60ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    # Convenience for calling on a TU.
61ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    root_cursor = source if isinstance(source, Cursor) else source.cursor
62ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
63667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    cursors = []
64ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for cursor in root_cursor.walk_preorder():
65667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek        if cursor.spelling == spelling:
66667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek            cursors.append(cursor)
67667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek
68667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    return cursors
69667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek
701f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
711f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc__all__ = [
721f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    'get_cursor',
73667fd80de4c3b7b143ba98a3b73e9b9b200f6af0Manuel Klimek    'get_cursors',
741f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    'get_tu',
751f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc]
76