# This file provides common utility functions for the test suite. from clang.cindex import Cursor from clang.cindex import TranslationUnit def get_tu(source, lang='c', all_warnings=False, flags=[]): """Obtain a translation unit from source and language. By default, the translation unit is created from source file "t.<ext>" where <ext> is the default file extension for the specified language. By default it is C, so "t.c" is the default file name. Supported languages are {c, cpp, objc}. all_warnings is a convenience argument to enable all compiler warnings. """ args = list(flags) name = 't.c' if lang == 'cpp': name = 't.cpp' args.append('-std=c++11') elif lang == 'objc': name = 't.m' elif lang != 'c': raise Exception('Unknown language: %s' % lang) if all_warnings: args += ['-Wall', '-Wextra'] return TranslationUnit.from_source(name, args, unsaved_files=[(name, source)]) def get_cursor(source, spelling): """Obtain a cursor from a source object. This provides a convenient search mechanism to find a cursor with specific spelling within a source. The first argument can be either a TranslationUnit or Cursor instance. If the cursor is not found, None is returned. """ # Convenience for calling on a TU. root_cursor = source if isinstance(source, Cursor) else source.cursor for cursor in root_cursor.walk_preorder(): if cursor.spelling == spelling: return cursor return None def get_cursors(source, spelling): """Obtain all cursors from a source object with a specific spelling. This provides a convenient search mechanism to find all cursors with specific spelling within a source. The first argument can be either a TranslationUnit or Cursor instance. If no cursors are found, an empty list is returned. """ # Convenience for calling on a TU. root_cursor = source if isinstance(source, Cursor) else source.cursor cursors = [] for cursor in root_cursor.walk_preorder(): if cursor.spelling == spelling: cursors.append(cursor) return cursors __all__ = [ 'get_cursor', 'get_cursors', 'get_tu', ]