| # This file provides common utility functions for the test suite. |
| |
| import os |
| |
| HAS_FSPATH = hasattr(os, "fspath") |
| |
| if HAS_FSPATH: |
| from pathlib import Path as str_to_path |
| else: |
| str_to_path = None |
| |
| import unittest |
| |
| 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 |
| |
| |
| skip_if_no_fspath = unittest.skipUnless( |
| HAS_FSPATH, "Requires file system path protocol / Python 3.6+" |
| ) |
| |
| __all__ = [ |
| "get_cursor", |
| "get_cursors", |
| "get_tu", |
| "skip_if_no_fspath", |
| "str_to_path", |
| ] |