77 lines · python
1# This file provides common utility functions for the test suite.2 3from clang.cindex import Cursor, TranslationUnit4 5 6def get_tu(source, lang="c", all_warnings=False, flags=[]):7 """Obtain a translation unit from source and language.8 9 By default, the translation unit is created from source file "t.<ext>"10 where <ext> is the default file extension for the specified language. By11 default it is C, so "t.c" is the default file name.12 13 Supported languages are {c, cpp, objc}.14 15 all_warnings is a convenience argument to enable all compiler warnings.16 """17 args = list(flags)18 name = "t.c"19 if lang == "cpp":20 name = "t.cpp"21 args.append("-std=c++11")22 elif lang == "objc":23 name = "t.m"24 elif lang != "c":25 raise Exception("Unknown language: %s" % lang)26 27 if all_warnings:28 args += ["-Wall", "-Wextra"]29 30 return TranslationUnit.from_source(name, args, unsaved_files=[(name, source)])31 32 33def get_cursor(source, spelling):34 """Obtain a cursor from a source object.35 36 This provides a convenient search mechanism to find a cursor with specific37 spelling within a source. The first argument can be either a38 TranslationUnit or Cursor instance.39 40 If the cursor is not found, None is returned.41 """42 # Convenience for calling on a TU.43 root_cursor = source if isinstance(source, Cursor) else source.cursor44 45 for cursor in root_cursor.walk_preorder():46 if cursor.spelling == spelling:47 return cursor48 49 return None50 51 52def get_cursors(source, spelling):53 """Obtain all cursors from a source object with a specific spelling.54 55 This provides a convenient search mechanism to find all cursors with56 specific spelling within a source. The first argument can be either a57 TranslationUnit or Cursor instance.58 59 If no cursors are found, an empty list is returned.60 """61 # Convenience for calling on a TU.62 root_cursor = source if isinstance(source, Cursor) else source.cursor63 64 cursors = []65 for cursor in root_cursor.walk_preorder():66 if cursor.spelling == spelling:67 cursors.append(cursor)68 69 return cursors70 71 72__all__ = [73 "get_cursor",74 "get_cursors",75 "get_tu",76]77