| # 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. |
| """ |
| children = [] |
| if isinstance(source, Cursor): |
| children = source.get_children() |
| else: |
| # Assume TU |
| children = source.cursor.get_children() |
| |
| for cursor in children: |
| if cursor.spelling == spelling: |
| return cursor |
| |
| # Recurse into children. |
| result = get_cursor(cursor, spelling) |
| if result is not None: |
| return result |
| |
| 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. |
| """ |
| cursors = [] |
| children = [] |
| if isinstance(source, Cursor): |
| children = source.get_children() |
| else: |
| # Assume TU |
| children = source.cursor.get_children() |
| |
| for cursor in children: |
| if cursor.spelling == spelling: |
| cursors.append(cursor) |
| |
| # Recurse into children. |
| cursors.extend(get_cursors(cursor, spelling)) |
| |
| return cursors |
| |
| |
| |
| |
| __all__ = [ |
| 'get_cursor', |
| 'get_cursors', |
| 'get_tu', |
| ] |