diff options
Diffstat (limited to 'gnu/llvm/tools/clang/bindings/python/tests')
28 files changed, 0 insertions, 2438 deletions
diff --git a/gnu/llvm/tools/clang/bindings/python/tests/CMakeLists.txt b/gnu/llvm/tools/clang/bindings/python/tests/CMakeLists.txt deleted file mode 100644 index 7af6503f158..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/CMakeLists.txt +++ /dev/null @@ -1,46 +0,0 @@ -# Test target to run Python test suite from main build. - -add_custom_target(check-clang-python - COMMAND ${CMAKE_COMMAND} -E env - CLANG_LIBRARY_PATH=$<TARGET_FILE_DIR:libclang> - ${PYTHON_EXECUTABLE} -m unittest discover - DEPENDS libclang - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..) - -set(RUN_PYTHON_TESTS TRUE) -set_target_properties(check-clang-python PROPERTIES FOLDER "Clang tests") - -# Tests require libclang.so which is only built with LLVM_ENABLE_PIC=ON -if(NOT LLVM_ENABLE_PIC) - set(RUN_PYTHON_TESTS FALSE) -endif() - -# Do not try to run if libclang was built with ASan because -# the sanitizer library will likely be loaded too late to perform -# interception and will then fail. -# We could use LD_PRELOAD/DYLD_INSERT_LIBRARIES but this isn't -# portable so its easier just to not run the tests when building -# with ASan. -list(FIND LLVM_USE_SANITIZER "Address" LLVM_USE_ASAN_INDEX) -if(NOT LLVM_USE_ASAN_INDEX EQUAL -1) - set(RUN_PYTHON_TESTS FALSE) -endif() - -# Tests fail on Windows, and need someone knowledgeable to fix. -# It's not clear whether it's a test or a valid binding problem. -if(WIN32) - set(RUN_PYTHON_TESTS FALSE) -endif() - -# AArch64 and Hexagon have known test failures that need to be -# addressed. -# SystemZ has broken Python/FFI interface: -# https://reviews.llvm.org/D52840#1265716 -if(${LLVM_NATIVE_ARCH} MATCHES "^(AArch64|Hexagon|SystemZ)$") - set(RUN_PYTHON_TESTS FALSE) -endif() - -if(RUN_PYTHON_TESTS) - set_property(GLOBAL APPEND PROPERTY - LLVM_ADDITIONAL_TEST_TARGETS check-clang-python) -endif() diff --git a/gnu/llvm/tools/clang/bindings/python/tests/__init__.py b/gnu/llvm/tools/clang/bindings/python/tests/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/__init__.py +++ /dev/null diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/compile_commands.json b/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/compile_commands.json deleted file mode 100644 index 944150bf7ba..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/compile_commands.json +++ /dev/null @@ -1,17 +0,0 @@ -[ -{ - "directory": "/home/john.doe/MyProject", - "command": "clang++ -o project.o -c /home/john.doe/MyProject/project.cpp", - "file": "/home/john.doe/MyProject/project.cpp" -}, -{ - "directory": "/home/john.doe/MyProjectA", - "command": "clang++ -o project2.o -c /home/john.doe/MyProject/project2.cpp", - "file": "/home/john.doe/MyProject/project2.cpp" -}, -{ - "directory": "/home/john.doe/MyProjectB", - "command": "clang++ -DFEATURE=1 -o project2-feature.o -c /home/john.doe/MyProject/project2.cpp", - "file": "/home/john.doe/MyProject/project2.cpp" -} -] diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/header1.h b/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/header1.h deleted file mode 100644 index b4eacbee375..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/header1.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef HEADER1 -#define HEADER1 - -#include "header3.h" - -#endif diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/header2.h b/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/header2.h deleted file mode 100644 index c4eddc0c562..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/header2.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef HEADER2 -#define HEADER2 - -#include "header3.h" - -#endif diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/header3.h b/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/header3.h deleted file mode 100644 index 6dca764860e..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/header3.h +++ /dev/null @@ -1,3 +0,0 @@ -// Not a guarded header! - -void f(); diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/hello.cpp b/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/hello.cpp deleted file mode 100644 index 7ef086e56b2..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/hello.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "stdio.h" - -int main(int argc, char* argv[]) { - printf("hello world\n"); - return 0; -} diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/include.cpp b/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/include.cpp deleted file mode 100644 index 60cfdaae4d0..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/include.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "header1.h" -#include "header2.h" -#include "header1.h" - -int main() { } diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/parse_arguments.c b/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/parse_arguments.c deleted file mode 100644 index 7196486c78a..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/INPUTS/parse_arguments.c +++ /dev/null @@ -1,2 +0,0 @@ -int DECL_ONE = 1; -int DECL_TWO = 2; diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/__init__.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/__init__.py +++ /dev/null diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_access_specifiers.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_access_specifiers.py deleted file mode 100644 index e36424f240a..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_access_specifiers.py +++ /dev/null @@ -1,41 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import AccessSpecifier -from clang.cindex import Cursor -from clang.cindex import TranslationUnit - -from .util import get_cursor -from .util import get_tu - -import unittest - - -class TestAccessSpecifiers(unittest.TestCase): - def test_access_specifiers(self): - """Ensure that C++ access specifiers are available on cursors""" - - tu = get_tu(""" -class test_class { -public: - void public_member_function(); -protected: - void protected_member_function(); -private: - void private_member_function(); -}; -""", lang = 'cpp') - - test_class = get_cursor(tu, "test_class") - self.assertEqual(test_class.access_specifier, AccessSpecifier.INVALID) - - public = get_cursor(tu.cursor, "public_member_function") - self.assertEqual(public.access_specifier, AccessSpecifier.PUBLIC) - - protected = get_cursor(tu.cursor, "protected_member_function") - self.assertEqual(protected.access_specifier, AccessSpecifier.PROTECTED) - - private = get_cursor(tu.cursor, "private_member_function") - self.assertEqual(private.access_specifier, AccessSpecifier.PRIVATE) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_cdb.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_cdb.py deleted file mode 100644 index 589fc72856b..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_cdb.py +++ /dev/null @@ -1,130 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import CompilationDatabase -from clang.cindex import CompilationDatabaseError -from clang.cindex import CompileCommands -from clang.cindex import CompileCommand -import os -import gc -import unittest -import sys -from .util import skip_if_no_fspath -from .util import str_to_path - - -kInputsDir = os.path.join(os.path.dirname(__file__), 'INPUTS') - - -@unittest.skipIf(sys.platform == 'win32', "TODO: Fix these tests on Windows") -class TestCDB(unittest.TestCase): - def test_create_fail(self): - """Check we fail loading a database with an assertion""" - path = os.path.dirname(__file__) - with self.assertRaises(CompilationDatabaseError) as cm: - cdb = CompilationDatabase.fromDirectory(path) - e = cm.exception - self.assertEqual(e.cdb_error, - CompilationDatabaseError.ERROR_CANNOTLOADDATABASE) - - def test_create(self): - """Check we can load a compilation database""" - cdb = CompilationDatabase.fromDirectory(kInputsDir) - - def test_lookup_succeed(self): - """Check we get some results if the file exists in the db""" - cdb = CompilationDatabase.fromDirectory(kInputsDir) - cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp') - self.assertNotEqual(len(cmds), 0) - - @skip_if_no_fspath - def test_lookup_succeed_pathlike(self): - """Same as test_lookup_succeed, but with PathLikes""" - cdb = CompilationDatabase.fromDirectory(str_to_path(kInputsDir)) - cmds = cdb.getCompileCommands(str_to_path('/home/john.doe/MyProject/project.cpp')) - self.assertNotEqual(len(cmds), 0) - - def test_all_compilecommand(self): - """Check we get all results from the db""" - cdb = CompilationDatabase.fromDirectory(kInputsDir) - cmds = cdb.getAllCompileCommands() - self.assertEqual(len(cmds), 3) - expected = [ - { 'wd': '/home/john.doe/MyProject', - 'file': '/home/john.doe/MyProject/project.cpp', - 'line': ['clang++', '-o', 'project.o', '-c', - '/home/john.doe/MyProject/project.cpp']}, - { 'wd': '/home/john.doe/MyProjectA', - 'file': '/home/john.doe/MyProject/project2.cpp', - 'line': ['clang++', '-o', 'project2.o', '-c', - '/home/john.doe/MyProject/project2.cpp']}, - { 'wd': '/home/john.doe/MyProjectB', - 'file': '/home/john.doe/MyProject/project2.cpp', - 'line': ['clang++', '-DFEATURE=1', '-o', 'project2-feature.o', '-c', - '/home/john.doe/MyProject/project2.cpp']}, - - ] - for i in range(len(cmds)): - self.assertEqual(cmds[i].directory, expected[i]['wd']) - self.assertEqual(cmds[i].filename, expected[i]['file']) - for arg, exp in zip(cmds[i].arguments, expected[i]['line']): - self.assertEqual(arg, exp) - - def test_1_compilecommand(self): - """Check file with single compile command""" - cdb = CompilationDatabase.fromDirectory(kInputsDir) - file = '/home/john.doe/MyProject/project.cpp' - cmds = cdb.getCompileCommands(file) - self.assertEqual(len(cmds), 1) - self.assertEqual(cmds[0].directory, os.path.dirname(file)) - self.assertEqual(cmds[0].filename, file) - expected = [ 'clang++', '-o', 'project.o', '-c', - '/home/john.doe/MyProject/project.cpp'] - for arg, exp in zip(cmds[0].arguments, expected): - self.assertEqual(arg, exp) - - def test_2_compilecommand(self): - """Check file with 2 compile commands""" - cdb = CompilationDatabase.fromDirectory(kInputsDir) - cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project2.cpp') - self.assertEqual(len(cmds), 2) - expected = [ - { 'wd': '/home/john.doe/MyProjectA', - 'line': ['clang++', '-o', 'project2.o', '-c', - '/home/john.doe/MyProject/project2.cpp']}, - { 'wd': '/home/john.doe/MyProjectB', - 'line': ['clang++', '-DFEATURE=1', '-o', 'project2-feature.o', '-c', - '/home/john.doe/MyProject/project2.cpp']} - ] - for i in range(len(cmds)): - self.assertEqual(cmds[i].directory, expected[i]['wd']) - for arg, exp in zip(cmds[i].arguments, expected[i]['line']): - self.assertEqual(arg, exp) - - def test_compilecommand_iterator_stops(self): - """Check that iterator stops after the correct number of elements""" - cdb = CompilationDatabase.fromDirectory(kInputsDir) - count = 0 - for cmd in cdb.getCompileCommands('/home/john.doe/MyProject/project2.cpp'): - count += 1 - self.assertLessEqual(count, 2) - - def test_compilationDB_references(self): - """Ensure CompilationsCommands are independent of the database""" - cdb = CompilationDatabase.fromDirectory(kInputsDir) - cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp') - del cdb - gc.collect() - workingdir = cmds[0].directory - - def test_compilationCommands_references(self): - """Ensure CompilationsCommand keeps a reference to CompilationCommands""" - cdb = CompilationDatabase.fromDirectory(kInputsDir) - cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp') - del cdb - cmd0 = cmds[0] - del cmds - gc.collect() - workingdir = cmd0.directory diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_code_completion.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_code_completion.py deleted file mode 100644 index e0b41577aeb..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_code_completion.py +++ /dev/null @@ -1,112 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import TranslationUnit - -import unittest -from .util import skip_if_no_fspath -from .util import str_to_path - - -class TestCodeCompletion(unittest.TestCase): - def check_completion_results(self, cr, expected): - self.assertIsNotNone(cr) - self.assertEqual(len(cr.diagnostics), 0) - - completions = [str(c) for c in cr.results] - - for c in expected: - self.assertIn(c, completions) - - def test_code_complete(self): - files = [('fake.c', """ -/// Aaa. -int test1; - -/// Bbb. -void test2(void); - -void f() { - -} -""")] - - tu = TranslationUnit.from_source('fake.c', ['-std=c99'], unsaved_files=files, - options=TranslationUnit.PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION) - - cr = tu.codeComplete('fake.c', 9, 1, unsaved_files=files, include_brief_comments=True) - - expected = [ - "{'int', ResultType} | {'test1', TypedText} || Priority: 50 || Availability: Available || Brief comment: Aaa.", - "{'void', ResultType} | {'test2', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 50 || Availability: Available || Brief comment: Bbb.", - "{'return', TypedText} || Priority: 40 || Availability: Available || Brief comment: None" - ] - self.check_completion_results(cr, expected) - - @skip_if_no_fspath - def test_code_complete_pathlike(self): - files = [(str_to_path('fake.c'), """ -/// Aaa. -int test1; - -/// Bbb. -void test2(void); - -void f() { - -} -""")] - - tu = TranslationUnit.from_source(str_to_path('fake.c'), ['-std=c99'], unsaved_files=files, - options=TranslationUnit.PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION) - - cr = tu.codeComplete(str_to_path('fake.c'), 9, 1, unsaved_files=files, include_brief_comments=True) - - expected = [ - "{'int', ResultType} | {'test1', TypedText} || Priority: 50 || Availability: Available || Brief comment: Aaa.", - "{'void', ResultType} | {'test2', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 50 || Availability: Available || Brief comment: Bbb.", - "{'return', TypedText} || Priority: 40 || Availability: Available || Brief comment: None" - ] - self.check_completion_results(cr, expected) - - def test_code_complete_availability(self): - files = [('fake.cpp', """ -class P { -protected: - int member; -}; - -class Q : public P { -public: - using P::member; -}; - -void f(P x, Q y) { - x.; // member is inaccessible - y.; // member is accessible -} -""")] - - tu = TranslationUnit.from_source('fake.cpp', ['-std=c++98'], unsaved_files=files) - - cr = tu.codeComplete('fake.cpp', 12, 5, unsaved_files=files) - - expected = [ - "{'const', TypedText} || Priority: 50 || Availability: Available || Brief comment: None", - "{'volatile', TypedText} || Priority: 50 || Availability: Available || Brief comment: None", - "{'operator', TypedText} || Priority: 40 || Availability: Available || Brief comment: None", - "{'P', TypedText} || Priority: 50 || Availability: Available || Brief comment: None", - "{'Q', TypedText} || Priority: 50 || Availability: Available || Brief comment: None" - ] - self.check_completion_results(cr, expected) - - cr = tu.codeComplete('fake.cpp', 13, 5, unsaved_files=files) - expected = [ - "{'P', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None", - "{'P &', ResultType} | {'operator=', TypedText} | {'(', LeftParen} | {'const P &', Placeholder} | {')', RightParen} || Priority: 79 || Availability: Available || Brief comment: None", - "{'int', ResultType} | {'member', TypedText} || Priority: 35 || Availability: NotAccessible || Brief comment: None", - "{'void', ResultType} | {'~P', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 79 || Availability: Available || Brief comment: None" - ] - self.check_completion_results(cr, expected) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_comment.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_comment.py deleted file mode 100644 index 73fb617ae16..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_comment.py +++ /dev/null @@ -1,47 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import TranslationUnit -from tests.cindex.util import get_cursor - -import unittest - - -class TestComment(unittest.TestCase): - def test_comment(self): - files = [('fake.c', """ -/// Aaa. -int test1; - -/// Bbb. -/// x -void test2(void); - -void f() { - -} -""")] - # make a comment-aware TU - tu = TranslationUnit.from_source('fake.c', ['-std=c99'], unsaved_files=files, - options=TranslationUnit.PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION) - test1 = get_cursor(tu, 'test1') - self.assertIsNotNone(test1, "Could not find test1.") - self.assertTrue(test1.type.is_pod()) - raw = test1.raw_comment - brief = test1.brief_comment - self.assertEqual(raw, """/// Aaa.""") - self.assertEqual(brief, """Aaa.""") - - test2 = get_cursor(tu, 'test2') - raw = test2.raw_comment - brief = test2.brief_comment - self.assertEqual(raw, """/// Bbb.\n/// x""") - self.assertEqual(brief, """Bbb. x""") - - f = get_cursor(tu, 'f') - raw = f.raw_comment - brief = f.brief_comment - self.assertIsNone(raw) - self.assertIsNone(brief) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_cursor.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_cursor.py deleted file mode 100644 index ef875e97247..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_cursor.py +++ /dev/null @@ -1,569 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -import ctypes -import gc -import unittest - -from clang.cindex import AvailabilityKind -from clang.cindex import CursorKind -from clang.cindex import TemplateArgumentKind -from clang.cindex import TranslationUnit -from clang.cindex import TypeKind -from .util import get_cursor -from .util import get_cursors -from .util import get_tu - - -kInput = """\ -struct s0 { - int a; - int b; -}; - -struct s1; - -void f0(int a0, int a1) { - int l0, l1; - - if (a0) - return; - - for (;;) { - break; - } -} -""" - -kParentTest = """\ - class C { - void f(); - } - - void C::f() { } - """ - -kTemplateArgTest = """\ - template <int kInt, typename T, bool kBool> - void foo(); - - template<> - void foo<-7, float, true>(); - """ - -class TestCursor(unittest.TestCase): - def test_get_children(self): - tu = get_tu(kInput) - - it = tu.cursor.get_children() - tu_nodes = list(it) - - self.assertEqual(len(tu_nodes), 3) - for cursor in tu_nodes: - self.assertIsNotNone(cursor.translation_unit) - - self.assertNotEqual(tu_nodes[0], tu_nodes[1]) - self.assertEqual(tu_nodes[0].kind, CursorKind.STRUCT_DECL) - self.assertEqual(tu_nodes[0].spelling, 's0') - self.assertEqual(tu_nodes[0].is_definition(), True) - self.assertEqual(tu_nodes[0].location.file.name, 't.c') - self.assertEqual(tu_nodes[0].location.line, 1) - self.assertEqual(tu_nodes[0].location.column, 8) - self.assertGreater(tu_nodes[0].hash, 0) - self.assertIsNotNone(tu_nodes[0].translation_unit) - - s0_nodes = list(tu_nodes[0].get_children()) - self.assertEqual(len(s0_nodes), 2) - self.assertEqual(s0_nodes[0].kind, CursorKind.FIELD_DECL) - self.assertEqual(s0_nodes[0].spelling, 'a') - self.assertEqual(s0_nodes[0].type.kind, TypeKind.INT) - self.assertEqual(s0_nodes[1].kind, CursorKind.FIELD_DECL) - self.assertEqual(s0_nodes[1].spelling, 'b') - self.assertEqual(s0_nodes[1].type.kind, TypeKind.INT) - - self.assertEqual(tu_nodes[1].kind, CursorKind.STRUCT_DECL) - self.assertEqual(tu_nodes[1].spelling, 's1') - self.assertEqual(tu_nodes[1].displayname, 's1') - self.assertEqual(tu_nodes[1].is_definition(), False) - - self.assertEqual(tu_nodes[2].kind, CursorKind.FUNCTION_DECL) - self.assertEqual(tu_nodes[2].spelling, 'f0') - self.assertEqual(tu_nodes[2].displayname, 'f0(int, int)') - self.assertEqual(tu_nodes[2].is_definition(), True) - - def test_references(self): - """Ensure that references to TranslationUnit are kept.""" - tu = get_tu('int x;') - cursors = list(tu.cursor.get_children()) - self.assertGreater(len(cursors), 0) - - cursor = cursors[0] - self.assertIsInstance(cursor.translation_unit, TranslationUnit) - - # Delete reference to TU and perform a full GC. - del tu - gc.collect() - self.assertIsInstance(cursor.translation_unit, TranslationUnit) - - # If the TU was destroyed, this should cause a segfault. - parent = cursor.semantic_parent - - def test_canonical(self): - source = 'struct X; struct X; struct X { int member; };' - tu = get_tu(source) - - cursors = [] - for cursor in tu.cursor.get_children(): - if cursor.spelling == 'X': - cursors.append(cursor) - - self.assertEqual(len(cursors), 3) - self.assertEqual(cursors[1].canonical, cursors[2].canonical) - - def test_is_const_method(self): - """Ensure Cursor.is_const_method works.""" - source = 'class X { void foo() const; void bar(); };' - tu = get_tu(source, lang='cpp') - - cls = get_cursor(tu, 'X') - foo = get_cursor(tu, 'foo') - bar = get_cursor(tu, 'bar') - self.assertIsNotNone(cls) - self.assertIsNotNone(foo) - self.assertIsNotNone(bar) - - self.assertTrue(foo.is_const_method()) - self.assertFalse(bar.is_const_method()) - - def test_is_converting_constructor(self): - """Ensure Cursor.is_converting_constructor works.""" - source = 'class X { explicit X(int); X(double); X(); };' - tu = get_tu(source, lang='cpp') - - xs = get_cursors(tu, 'X') - - self.assertEqual(len(xs), 4) - self.assertEqual(xs[0].kind, CursorKind.CLASS_DECL) - cs = xs[1:] - self.assertEqual(cs[0].kind, CursorKind.CONSTRUCTOR) - self.assertEqual(cs[1].kind, CursorKind.CONSTRUCTOR) - self.assertEqual(cs[2].kind, CursorKind.CONSTRUCTOR) - - self.assertFalse(cs[0].is_converting_constructor()) - self.assertTrue(cs[1].is_converting_constructor()) - self.assertFalse(cs[2].is_converting_constructor()) - - - def test_is_copy_constructor(self): - """Ensure Cursor.is_copy_constructor works.""" - source = 'class X { X(); X(const X&); X(X&&); };' - tu = get_tu(source, lang='cpp') - - xs = get_cursors(tu, 'X') - self.assertEqual(xs[0].kind, CursorKind.CLASS_DECL) - cs = xs[1:] - self.assertEqual(cs[0].kind, CursorKind.CONSTRUCTOR) - self.assertEqual(cs[1].kind, CursorKind.CONSTRUCTOR) - self.assertEqual(cs[2].kind, CursorKind.CONSTRUCTOR) - - self.assertFalse(cs[0].is_copy_constructor()) - self.assertTrue(cs[1].is_copy_constructor()) - self.assertFalse(cs[2].is_copy_constructor()) - - def test_is_default_constructor(self): - """Ensure Cursor.is_default_constructor works.""" - source = 'class X { X(); X(int); };' - tu = get_tu(source, lang='cpp') - - xs = get_cursors(tu, 'X') - self.assertEqual(xs[0].kind, CursorKind.CLASS_DECL) - cs = xs[1:] - self.assertEqual(cs[0].kind, CursorKind.CONSTRUCTOR) - self.assertEqual(cs[1].kind, CursorKind.CONSTRUCTOR) - - self.assertTrue(cs[0].is_default_constructor()) - self.assertFalse(cs[1].is_default_constructor()) - - def test_is_move_constructor(self): - """Ensure Cursor.is_move_constructor works.""" - source = 'class X { X(); X(const X&); X(X&&); };' - tu = get_tu(source, lang='cpp') - - xs = get_cursors(tu, 'X') - self.assertEqual(xs[0].kind, CursorKind.CLASS_DECL) - cs = xs[1:] - self.assertEqual(cs[0].kind, CursorKind.CONSTRUCTOR) - self.assertEqual(cs[1].kind, CursorKind.CONSTRUCTOR) - self.assertEqual(cs[2].kind, CursorKind.CONSTRUCTOR) - - self.assertFalse(cs[0].is_move_constructor()) - self.assertFalse(cs[1].is_move_constructor()) - self.assertTrue(cs[2].is_move_constructor()) - - def test_is_default_method(self): - """Ensure Cursor.is_default_method works.""" - source = 'class X { X() = default; }; class Y { Y(); };' - tu = get_tu(source, lang='cpp') - - xs = get_cursors(tu, 'X') - ys = get_cursors(tu, 'Y') - - self.assertEqual(len(xs), 2) - self.assertEqual(len(ys), 2) - - xc = xs[1] - yc = ys[1] - - self.assertTrue(xc.is_default_method()) - self.assertFalse(yc.is_default_method()) - - def test_is_mutable_field(self): - """Ensure Cursor.is_mutable_field works.""" - source = 'class X { int x_; mutable int y_; };' - tu = get_tu(source, lang='cpp') - - cls = get_cursor(tu, 'X') - x_ = get_cursor(tu, 'x_') - y_ = get_cursor(tu, 'y_') - self.assertIsNotNone(cls) - self.assertIsNotNone(x_) - self.assertIsNotNone(y_) - - self.assertFalse(x_.is_mutable_field()) - self.assertTrue(y_.is_mutable_field()) - - def test_is_static_method(self): - """Ensure Cursor.is_static_method works.""" - - source = 'class X { static void foo(); void bar(); };' - tu = get_tu(source, lang='cpp') - - cls = get_cursor(tu, 'X') - foo = get_cursor(tu, 'foo') - bar = get_cursor(tu, 'bar') - self.assertIsNotNone(cls) - self.assertIsNotNone(foo) - self.assertIsNotNone(bar) - - self.assertTrue(foo.is_static_method()) - self.assertFalse(bar.is_static_method()) - - def test_is_pure_virtual_method(self): - """Ensure Cursor.is_pure_virtual_method works.""" - source = 'class X { virtual void foo() = 0; virtual void bar(); };' - tu = get_tu(source, lang='cpp') - - cls = get_cursor(tu, 'X') - foo = get_cursor(tu, 'foo') - bar = get_cursor(tu, 'bar') - self.assertIsNotNone(cls) - self.assertIsNotNone(foo) - self.assertIsNotNone(bar) - - self.assertTrue(foo.is_pure_virtual_method()) - self.assertFalse(bar.is_pure_virtual_method()) - - def test_is_virtual_method(self): - """Ensure Cursor.is_virtual_method works.""" - source = 'class X { virtual void foo(); void bar(); };' - tu = get_tu(source, lang='cpp') - - cls = get_cursor(tu, 'X') - foo = get_cursor(tu, 'foo') - bar = get_cursor(tu, 'bar') - self.assertIsNotNone(cls) - self.assertIsNotNone(foo) - self.assertIsNotNone(bar) - - self.assertTrue(foo.is_virtual_method()) - self.assertFalse(bar.is_virtual_method()) - - def test_is_abstract_record(self): - """Ensure Cursor.is_abstract_record works.""" - source = 'struct X { virtual void x() = 0; }; struct Y : X { void x(); };' - tu = get_tu(source, lang='cpp') - - cls = get_cursor(tu, 'X') - self.assertTrue(cls.is_abstract_record()) - - cls = get_cursor(tu, 'Y') - self.assertFalse(cls.is_abstract_record()) - - def test_is_scoped_enum(self): - """Ensure Cursor.is_scoped_enum works.""" - source = 'class X {}; enum RegularEnum {}; enum class ScopedEnum {};' - tu = get_tu(source, lang='cpp') - - cls = get_cursor(tu, 'X') - regular_enum = get_cursor(tu, 'RegularEnum') - scoped_enum = get_cursor(tu, 'ScopedEnum') - self.assertIsNotNone(cls) - self.assertIsNotNone(regular_enum) - self.assertIsNotNone(scoped_enum) - - self.assertFalse(cls.is_scoped_enum()) - self.assertFalse(regular_enum.is_scoped_enum()) - self.assertTrue(scoped_enum.is_scoped_enum()) - - def test_underlying_type(self): - tu = get_tu('typedef int foo;') - typedef = get_cursor(tu, 'foo') - self.assertIsNotNone(typedef) - - self.assertTrue(typedef.kind.is_declaration()) - underlying = typedef.underlying_typedef_type - self.assertEqual(underlying.kind, TypeKind.INT) - - def test_semantic_parent(self): - tu = get_tu(kParentTest, 'cpp') - curs = get_cursors(tu, 'f') - decl = get_cursor(tu, 'C') - self.assertEqual(len(curs), 2) - self.assertEqual(curs[0].semantic_parent, curs[1].semantic_parent) - self.assertEqual(curs[0].semantic_parent, decl) - - def test_lexical_parent(self): - tu = get_tu(kParentTest, 'cpp') - curs = get_cursors(tu, 'f') - decl = get_cursor(tu, 'C') - self.assertEqual(len(curs), 2) - self.assertNotEqual(curs[0].lexical_parent, curs[1].lexical_parent) - self.assertEqual(curs[0].lexical_parent, decl) - self.assertEqual(curs[1].lexical_parent, tu.cursor) - - def test_enum_type(self): - tu = get_tu('enum TEST { FOO=1, BAR=2 };') - enum = get_cursor(tu, 'TEST') - self.assertIsNotNone(enum) - - self.assertEqual(enum.kind, CursorKind.ENUM_DECL) - enum_type = enum.enum_type - self.assertIn(enum_type.kind, (TypeKind.UINT, TypeKind.INT)) - - def test_enum_type_cpp(self): - tu = get_tu('enum TEST : long long { FOO=1, BAR=2 };', lang="cpp") - enum = get_cursor(tu, 'TEST') - self.assertIsNotNone(enum) - - self.assertEqual(enum.kind, CursorKind.ENUM_DECL) - self.assertEqual(enum.enum_type.kind, TypeKind.LONGLONG) - - def test_objc_type_encoding(self): - tu = get_tu('int i;', lang='objc') - i = get_cursor(tu, 'i') - - self.assertIsNotNone(i) - self.assertEqual(i.objc_type_encoding, 'i') - - def test_enum_values(self): - tu = get_tu('enum TEST { SPAM=1, EGG, HAM = EGG * 20};') - enum = get_cursor(tu, 'TEST') - self.assertIsNotNone(enum) - - self.assertEqual(enum.kind, CursorKind.ENUM_DECL) - - enum_constants = list(enum.get_children()) - self.assertEqual(len(enum_constants), 3) - - spam, egg, ham = enum_constants - - self.assertEqual(spam.kind, CursorKind.ENUM_CONSTANT_DECL) - self.assertEqual(spam.enum_value, 1) - self.assertEqual(egg.kind, CursorKind.ENUM_CONSTANT_DECL) - self.assertEqual(egg.enum_value, 2) - self.assertEqual(ham.kind, CursorKind.ENUM_CONSTANT_DECL) - self.assertEqual(ham.enum_value, 40) - - def test_enum_values_cpp(self): - tu = get_tu('enum TEST : long long { SPAM = -1, HAM = 0x10000000000};', lang="cpp") - enum = get_cursor(tu, 'TEST') - self.assertIsNotNone(enum) - - self.assertEqual(enum.kind, CursorKind.ENUM_DECL) - - enum_constants = list(enum.get_children()) - self.assertEqual(len(enum_constants), 2) - - spam, ham = enum_constants - - self.assertEqual(spam.kind, CursorKind.ENUM_CONSTANT_DECL) - self.assertEqual(spam.enum_value, -1) - self.assertEqual(ham.kind, CursorKind.ENUM_CONSTANT_DECL) - self.assertEqual(ham.enum_value, 0x10000000000) - - def test_annotation_attribute(self): - tu = get_tu('int foo (void) __attribute__ ((annotate("here be annotation attribute")));') - - foo = get_cursor(tu, 'foo') - self.assertIsNotNone(foo) - - for c in foo.get_children(): - if c.kind == CursorKind.ANNOTATE_ATTR: - self.assertEqual(c.displayname, "here be annotation attribute") - break - else: - self.fail("Couldn't find annotation") - - def test_annotation_template(self): - annotation = '__attribute__ ((annotate("annotation")))' - for source, kind in [ - ('int foo (T value) %s;', CursorKind.FUNCTION_TEMPLATE), - ('class %s foo {};', CursorKind.CLASS_TEMPLATE), - ]: - source = 'template<typename T> ' + (source % annotation) - tu = get_tu(source, lang="cpp") - - foo = get_cursor(tu, 'foo') - self.assertIsNotNone(foo) - self.assertEqual(foo.kind, kind) - - for c in foo.get_children(): - if c.kind == CursorKind.ANNOTATE_ATTR: - self.assertEqual(c.displayname, "annotation") - break - else: - self.fail("Couldn't find annotation for {}".format(kind)) - - def test_result_type(self): - tu = get_tu('int foo();') - foo = get_cursor(tu, 'foo') - - self.assertIsNotNone(foo) - t = foo.result_type - self.assertEqual(t.kind, TypeKind.INT) - - def test_result_type_objc_method_decl(self): - code = """\ - @interface Interface : NSObject - -(void)voidMethod; - @end - """ - tu = get_tu(code, lang='objc') - cursor = get_cursor(tu, 'voidMethod') - result_type = cursor.result_type - self.assertEqual(cursor.kind, CursorKind.OBJC_INSTANCE_METHOD_DECL) - self.assertEqual(result_type.kind, TypeKind.VOID) - - def test_availability(self): - tu = get_tu('class A { A(A const&) = delete; };', lang='cpp') - - # AvailabilityKind.AVAILABLE - cursor = get_cursor(tu, 'A') - self.assertEqual(cursor.kind, CursorKind.CLASS_DECL) - self.assertEqual(cursor.availability, AvailabilityKind.AVAILABLE) - - # AvailabilityKind.NOT_AVAILABLE - cursors = get_cursors(tu, 'A') - for c in cursors: - if c.kind == CursorKind.CONSTRUCTOR: - self.assertEqual(c.availability, AvailabilityKind.NOT_AVAILABLE) - break - else: - self.fail("Could not find cursor for deleted constructor") - - # AvailabilityKind.DEPRECATED - tu = get_tu('void test() __attribute__((deprecated));', lang='cpp') - cursor = get_cursor(tu, 'test') - self.assertEqual(cursor.availability, AvailabilityKind.DEPRECATED) - - # AvailabilityKind.NOT_ACCESSIBLE is only used in the code completion results - - def test_get_tokens(self): - """Ensure we can map cursors back to tokens.""" - tu = get_tu('int foo(int i);') - foo = get_cursor(tu, 'foo') - - tokens = list(foo.get_tokens()) - self.assertEqual(len(tokens), 6) - self.assertEqual(tokens[0].spelling, 'int') - self.assertEqual(tokens[1].spelling, 'foo') - - def test_get_token_cursor(self): - """Ensure we can map tokens to cursors.""" - tu = get_tu('class A {}; int foo(A var = A());', lang='cpp') - foo = get_cursor(tu, 'foo') - - for cursor in foo.walk_preorder(): - if cursor.kind.is_expression() and not cursor.kind.is_statement(): - break - else: - self.fail("Could not find default value expression") - - tokens = list(cursor.get_tokens()) - self.assertEqual(len(tokens), 4, [t.spelling for t in tokens]) - self.assertEqual(tokens[0].spelling, '=') - self.assertEqual(tokens[1].spelling, 'A') - self.assertEqual(tokens[2].spelling, '(') - self.assertEqual(tokens[3].spelling, ')') - t_cursor = tokens[1].cursor - self.assertEqual(t_cursor.kind, CursorKind.TYPE_REF) - r_cursor = t_cursor.referenced # should not raise an exception - self.assertEqual(r_cursor.kind, CursorKind.CLASS_DECL) - - def test_get_arguments(self): - tu = get_tu('void foo(int i, int j);') - foo = get_cursor(tu, 'foo') - arguments = list(foo.get_arguments()) - - self.assertEqual(len(arguments), 2) - self.assertEqual(arguments[0].spelling, "i") - self.assertEqual(arguments[1].spelling, "j") - - def test_get_num_template_arguments(self): - tu = get_tu(kTemplateArgTest, lang='cpp') - foos = get_cursors(tu, 'foo') - - self.assertEqual(foos[1].get_num_template_arguments(), 3) - - def test_get_template_argument_kind(self): - tu = get_tu(kTemplateArgTest, lang='cpp') - foos = get_cursors(tu, 'foo') - - self.assertEqual(foos[1].get_template_argument_kind(0), TemplateArgumentKind.INTEGRAL) - self.assertEqual(foos[1].get_template_argument_kind(1), TemplateArgumentKind.TYPE) - self.assertEqual(foos[1].get_template_argument_kind(2), TemplateArgumentKind.INTEGRAL) - - def test_get_template_argument_type(self): - tu = get_tu(kTemplateArgTest, lang='cpp') - foos = get_cursors(tu, 'foo') - - self.assertEqual(foos[1].get_template_argument_type(1).kind, TypeKind.FLOAT) - - def test_get_template_argument_value(self): - tu = get_tu(kTemplateArgTest, lang='cpp') - foos = get_cursors(tu, 'foo') - - self.assertEqual(foos[1].get_template_argument_value(0), -7) - self.assertEqual(foos[1].get_template_argument_value(2), True) - - def test_get_template_argument_unsigned_value(self): - tu = get_tu(kTemplateArgTest, lang='cpp') - foos = get_cursors(tu, 'foo') - - self.assertEqual(foos[1].get_template_argument_unsigned_value(0), 2 ** 32 - 7) - self.assertEqual(foos[1].get_template_argument_unsigned_value(2), True) - - def test_referenced(self): - tu = get_tu('void foo(); void bar() { foo(); }') - foo = get_cursor(tu, 'foo') - bar = get_cursor(tu, 'bar') - for c in bar.get_children(): - if c.kind == CursorKind.CALL_EXPR: - self.assertEqual(c.referenced.spelling, foo.spelling) - break - - def test_mangled_name(self): - kInputForMangling = """\ - int foo(int, int); - """ - tu = get_tu(kInputForMangling, lang='cpp') - foo = get_cursor(tu, 'foo') - - # Since libclang does not link in targets, we cannot pass a triple to it - # and force the target. To enable this test to pass on all platforms, accept - # all valid manglings. - # [c-index-test handles this by running the source through clang, emitting - # an AST file and running libclang on that AST file] - self.assertIn(foo.mangled_name, ('_Z3fooii', '__Z3fooii', '?foo@@YAHHH', '?foo@@YAHHH@Z')) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_cursor_kind.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_cursor_kind.py deleted file mode 100644 index e6b9558b3cc..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_cursor_kind.py +++ /dev/null @@ -1,58 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import CursorKind - -import unittest - - -class TestCursorKind(unittest.TestCase): - def test_name(self): - self.assertTrue(CursorKind.UNEXPOSED_DECL.name is 'UNEXPOSED_DECL') - - def test_get_all_kinds(self): - kinds = CursorKind.get_all_kinds() - self.assertIn(CursorKind.UNEXPOSED_DECL, kinds) - self.assertIn(CursorKind.TRANSLATION_UNIT, kinds) - self.assertIn(CursorKind.VARIABLE_REF, kinds) - self.assertIn(CursorKind.LAMBDA_EXPR, kinds) - self.assertIn(CursorKind.OBJ_BOOL_LITERAL_EXPR, kinds) - self.assertIn(CursorKind.OBJ_SELF_EXPR, kinds) - self.assertIn(CursorKind.MS_ASM_STMT, kinds) - self.assertIn(CursorKind.MODULE_IMPORT_DECL, kinds) - self.assertIn(CursorKind.TYPE_ALIAS_TEMPLATE_DECL, kinds) - - def test_kind_groups(self): - """Check that every kind classifies to exactly one group.""" - - self.assertTrue(CursorKind.UNEXPOSED_DECL.is_declaration()) - self.assertTrue(CursorKind.TYPE_REF.is_reference()) - self.assertTrue(CursorKind.DECL_REF_EXPR.is_expression()) - self.assertTrue(CursorKind.UNEXPOSED_STMT.is_statement()) - self.assertTrue(CursorKind.INVALID_FILE.is_invalid()) - - self.assertTrue(CursorKind.TRANSLATION_UNIT.is_translation_unit()) - self.assertFalse(CursorKind.TYPE_REF.is_translation_unit()) - - self.assertTrue(CursorKind.PREPROCESSING_DIRECTIVE.is_preprocessing()) - self.assertFalse(CursorKind.TYPE_REF.is_preprocessing()) - - self.assertTrue(CursorKind.UNEXPOSED_DECL.is_unexposed()) - self.assertFalse(CursorKind.TYPE_REF.is_unexposed()) - - for k in CursorKind.get_all_kinds(): - group = [n for n in ('is_declaration', 'is_reference', 'is_expression', - 'is_statement', 'is_invalid', 'is_attribute') - if getattr(k, n)()] - - if k in ( CursorKind.TRANSLATION_UNIT, - CursorKind.MACRO_DEFINITION, - CursorKind.MACRO_INSTANTIATION, - CursorKind.INCLUSION_DIRECTIVE, - CursorKind.PREPROCESSING_DIRECTIVE, - CursorKind.OVERLOAD_CANDIDATE): - self.assertEqual(len(group), 0) - else: - self.assertEqual(len(group), 1) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_diagnostics.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_diagnostics.py deleted file mode 100644 index c17d5b28efe..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_diagnostics.py +++ /dev/null @@ -1,110 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import * -from .util import get_tu - -import unittest - - -# FIXME: We need support for invalid translation units to test better. - - -class TestDiagnostics(unittest.TestCase): - def test_diagnostic_warning(self): - tu = get_tu('int f0() {}\n') - self.assertEqual(len(tu.diagnostics), 1) - self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Warning) - self.assertEqual(tu.diagnostics[0].location.line, 1) - self.assertEqual(tu.diagnostics[0].location.column, 11) - self.assertEqual(tu.diagnostics[0].spelling, - 'control reaches end of non-void function') - - def test_diagnostic_note(self): - # FIXME: We aren't getting notes here for some reason. - tu = get_tu('#define A x\nvoid *A = 1;\n') - self.assertEqual(len(tu.diagnostics), 1) - self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Warning) - self.assertEqual(tu.diagnostics[0].location.line, 2) - self.assertEqual(tu.diagnostics[0].location.column, 7) - self.assertIn('incompatible', tu.diagnostics[0].spelling) -# self.assertEqual(tu.diagnostics[1].severity, Diagnostic.Note) -# self.assertEqual(tu.diagnostics[1].location.line, 1) -# self.assertEqual(tu.diagnostics[1].location.column, 11) -# self.assertEqual(tu.diagnostics[1].spelling, 'instantiated from') - - def test_diagnostic_fixit(self): - tu = get_tu('struct { int f0; } x = { f0 : 1 };') - self.assertEqual(len(tu.diagnostics), 1) - self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Warning) - self.assertEqual(tu.diagnostics[0].location.line, 1) - self.assertEqual(tu.diagnostics[0].location.column, 26) - self.assertRegexpMatches(tu.diagnostics[0].spelling, - 'use of GNU old-style.*') - self.assertEqual(len(tu.diagnostics[0].fixits), 1) - self.assertEqual(tu.diagnostics[0].fixits[0].range.start.line, 1) - self.assertEqual(tu.diagnostics[0].fixits[0].range.start.column, 26) - self.assertEqual(tu.diagnostics[0].fixits[0].range.end.line, 1) - self.assertEqual(tu.diagnostics[0].fixits[0].range.end.column, 30) - self.assertEqual(tu.diagnostics[0].fixits[0].value, '.f0 = ') - - def test_diagnostic_range(self): - tu = get_tu('void f() { int i = "a"; }') - self.assertEqual(len(tu.diagnostics), 1) - self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Warning) - self.assertEqual(tu.diagnostics[0].location.line, 1) - self.assertEqual(tu.diagnostics[0].location.column, 16) - self.assertRegexpMatches(tu.diagnostics[0].spelling, - 'incompatible pointer to.*') - self.assertEqual(len(tu.diagnostics[0].fixits), 0) - self.assertEqual(len(tu.diagnostics[0].ranges), 1) - self.assertEqual(tu.diagnostics[0].ranges[0].start.line, 1) - self.assertEqual(tu.diagnostics[0].ranges[0].start.column, 20) - self.assertEqual(tu.diagnostics[0].ranges[0].end.line, 1) - self.assertEqual(tu.diagnostics[0].ranges[0].end.column, 23) - with self.assertRaises(IndexError): - tu.diagnostics[0].ranges[1].start.line - - def test_diagnostic_category(self): - """Ensure that category properties work.""" - tu = get_tu('int f(int i) { return 7; }', all_warnings=True) - self.assertEqual(len(tu.diagnostics), 1) - d = tu.diagnostics[0] - - self.assertEqual(d.severity, Diagnostic.Warning) - self.assertEqual(d.location.line, 1) - self.assertEqual(d.location.column, 11) - - self.assertEqual(d.category_number, 2) - self.assertEqual(d.category_name, 'Semantic Issue') - - def test_diagnostic_option(self): - """Ensure that category option properties work.""" - tu = get_tu('int f(int i) { return 7; }', all_warnings=True) - self.assertEqual(len(tu.diagnostics), 1) - d = tu.diagnostics[0] - - self.assertEqual(d.option, '-Wunused-parameter') - self.assertEqual(d.disable_option, '-Wno-unused-parameter') - - def test_diagnostic_children(self): - tu = get_tu('void f(int x) {} void g() { f(); }') - self.assertEqual(len(tu.diagnostics), 1) - d = tu.diagnostics[0] - - children = d.children - self.assertEqual(len(children), 1) - self.assertEqual(children[0].severity, Diagnostic.Note) - self.assertRegexpMatches(children[0].spelling, - '.*declared here') - self.assertEqual(children[0].location.line, 1) - self.assertEqual(children[0].location.column, 1) - - def test_diagnostic_string_repr(self): - tu = get_tu('struct MissingSemicolon{}') - self.assertEqual(len(tu.diagnostics), 1) - d = tu.diagnostics[0] - - self.assertEqual(repr(d), '<Diagnostic severity 3, location <SourceLocation file \'t.c\', line 1, column 26>, spelling "expected \';\' after struct">') diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_exception_specification_kind.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_exception_specification_kind.py deleted file mode 100644 index 6c13f70fb25..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_exception_specification_kind.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -import clang.cindex -from clang.cindex import ExceptionSpecificationKind -from .util import get_tu - -import unittest - - -def find_function_declarations(node, declarations=[]): - if node.kind == clang.cindex.CursorKind.FUNCTION_DECL: - declarations.append((node.spelling, node.exception_specification_kind)) - for child in node.get_children(): - declarations = find_function_declarations(child, declarations) - return declarations - - -class TestExceptionSpecificationKind(unittest.TestCase): - def test_exception_specification_kind(self): - source = """int square1(int x); - int square2(int x) noexcept; - int square3(int x) noexcept(noexcept(x * x));""" - - tu = get_tu(source, lang='cpp', flags=['-std=c++14']) - - declarations = find_function_declarations(tu.cursor) - expected = [ - ('square1', ExceptionSpecificationKind.NONE), - ('square2', ExceptionSpecificationKind.BASIC_NOEXCEPT), - ('square3', ExceptionSpecificationKind.COMPUTED_NOEXCEPT) - ] - self.assertListEqual(declarations, expected) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_file.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_file.py deleted file mode 100644 index a146fe5c923..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_file.py +++ /dev/null @@ -1,18 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import Index, File - -import unittest - - -class TestFile(unittest.TestCase): - def test_file(self): - index = Index.create() - tu = index.parse('t.c', unsaved_files = [('t.c', "")]) - file = File.from_name(tu, "t.c") - self.assertEqual(str(file), "t.c") - self.assertEqual(file.name, "t.c") - self.assertEqual(repr(file), "<File: t.c>") diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_index.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_index.py deleted file mode 100644 index 46aafcf222e..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_index.py +++ /dev/null @@ -1,26 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import * -import os -import unittest - - -kInputsDir = os.path.join(os.path.dirname(__file__), 'INPUTS') - - -class TestIndex(unittest.TestCase): - def test_create(self): - index = Index.create() - - # FIXME: test Index.read - - def test_parse(self): - index = Index.create() - self.assertIsInstance(index, Index) - tu = index.parse(os.path.join(kInputsDir, 'hello.cpp')) - self.assertIsInstance(tu, TranslationUnit) - tu = index.parse(None, ['-c', os.path.join(kInputsDir, 'hello.cpp')]) - self.assertIsInstance(tu, TranslationUnit) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_linkage.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_linkage.py deleted file mode 100644 index cdd97fc2df0..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_linkage.py +++ /dev/null @@ -1,38 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import LinkageKind -from clang.cindex import Cursor -from clang.cindex import TranslationUnit - -from .util import get_cursor -from .util import get_tu - -import unittest - - -class TestLinkage(unittest.TestCase): - def test_linkage(self): - """Ensure that linkage specifers are available on cursors""" - - tu = get_tu(""" -void foo() { int no_linkage; } -static int internal; -namespace { struct unique_external_type {} } -unique_external_type unique_external; -extern int external; -""", lang = 'cpp') - - no_linkage = get_cursor(tu.cursor, 'no_linkage') - self.assertEqual(no_linkage.linkage, LinkageKind.NO_LINKAGE) - - internal = get_cursor(tu.cursor, 'internal') - self.assertEqual(internal.linkage, LinkageKind.INTERNAL) - - unique_external = get_cursor(tu.cursor, 'unique_external') - self.assertEqual(unique_external.linkage, LinkageKind.UNIQUE_EXTERNAL) - - external = get_cursor(tu.cursor, 'external') - self.assertEqual(external.linkage, LinkageKind.EXTERNAL) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_location.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_location.py deleted file mode 100644 index fbe9770d7eb..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_location.py +++ /dev/null @@ -1,105 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import Cursor -from clang.cindex import File -from clang.cindex import SourceLocation -from clang.cindex import SourceRange -from .util import get_cursor -from .util import get_tu - -import unittest - - -baseInput="int one;\nint two;\n" - - -class TestLocation(unittest.TestCase): - def assert_location(self, loc, line, column, offset): - self.assertEqual(loc.line, line) - self.assertEqual(loc.column, column) - self.assertEqual(loc.offset, offset) - - def test_location(self): - tu = get_tu(baseInput) - one = get_cursor(tu, 'one') - two = get_cursor(tu, 'two') - - self.assertIsNotNone(one) - self.assertIsNotNone(two) - - self.assert_location(one.location,line=1,column=5,offset=4) - self.assert_location(two.location,line=2,column=5,offset=13) - - # adding a linebreak at top should keep columns same - tu = get_tu('\n' + baseInput) - one = get_cursor(tu, 'one') - two = get_cursor(tu, 'two') - - self.assertIsNotNone(one) - self.assertIsNotNone(two) - - self.assert_location(one.location,line=2,column=5,offset=5) - self.assert_location(two.location,line=3,column=5,offset=14) - - # adding a space should affect column on first line only - tu = get_tu(' ' + baseInput) - one = get_cursor(tu, 'one') - two = get_cursor(tu, 'two') - - self.assert_location(one.location,line=1,column=6,offset=5) - self.assert_location(two.location,line=2,column=5,offset=14) - - # define the expected location ourselves and see if it matches - # the returned location - tu = get_tu(baseInput) - - file = File.from_name(tu, 't.c') - location = SourceLocation.from_position(tu, file, 1, 5) - cursor = Cursor.from_location(tu, location) - - one = get_cursor(tu, 'one') - self.assertIsNotNone(one) - self.assertEqual(one, cursor) - - # Ensure locations referring to the same entity are equivalent. - location2 = SourceLocation.from_position(tu, file, 1, 5) - self.assertEqual(location, location2) - location3 = SourceLocation.from_position(tu, file, 1, 4) - self.assertNotEqual(location2, location3) - - offset_location = SourceLocation.from_offset(tu, file, 5) - cursor = Cursor.from_location(tu, offset_location) - verified = False - for n in [n for n in tu.cursor.get_children() if n.spelling == 'one']: - self.assertEqual(n, cursor) - verified = True - - self.assertTrue(verified) - - def test_extent(self): - tu = get_tu(baseInput) - one = get_cursor(tu, 'one') - two = get_cursor(tu, 'two') - - self.assert_location(one.extent.start,line=1,column=1,offset=0) - self.assert_location(one.extent.end,line=1,column=8,offset=7) - self.assertEqual(baseInput[one.extent.start.offset:one.extent.end.offset], "int one") - - self.assert_location(two.extent.start,line=2,column=1,offset=9) - self.assert_location(two.extent.end,line=2,column=8,offset=16) - self.assertEqual(baseInput[two.extent.start.offset:two.extent.end.offset], "int two") - - file = File.from_name(tu, 't.c') - location1 = SourceLocation.from_position(tu, file, 1, 1) - location2 = SourceLocation.from_position(tu, file, 1, 8) - - range1 = SourceRange.from_locations(location1, location2) - range2 = SourceRange.from_locations(location1, location2) - self.assertEqual(range1, range2) - - location3 = SourceLocation.from_position(tu, file, 1, 6) - range3 = SourceRange.from_locations(location1, location3) - self.assertNotEqual(range1, range3) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_tls_kind.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_tls_kind.py deleted file mode 100644 index c828ac83a46..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_tls_kind.py +++ /dev/null @@ -1,54 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import TLSKind -from clang.cindex import Cursor -from clang.cindex import TranslationUnit - -from .util import get_cursor -from .util import get_tu - -import unittest - - -class TestTLSKind(unittest.TestCase): - def test_tls_kind(self): - """Ensure that thread-local storage kinds are available on cursors.""" - - tu = get_tu(""" -int tls_none; -thread_local int tls_dynamic; -_Thread_local int tls_static; -""", lang = 'cpp') - - tls_none = get_cursor(tu.cursor, 'tls_none') - self.assertEqual(tls_none.tls_kind, TLSKind.NONE) - - tls_dynamic = get_cursor(tu.cursor, 'tls_dynamic') - self.assertEqual(tls_dynamic.tls_kind, TLSKind.DYNAMIC) - - tls_static = get_cursor(tu.cursor, 'tls_static') - self.assertEqual(tls_static.tls_kind, TLSKind.STATIC) - - # The following case tests '__declspec(thread)'. Since it is a Microsoft - # specific extension, specific flags are required for the parser to pick - # these up. - flags = ['-fms-extensions', '-target', 'x86_64-unknown-windows-win32', - '-fms-compatibility-version=18'] - tu = get_tu(""" -__declspec(thread) int tls_declspec_msvc18; -""", lang = 'cpp', flags=flags) - - tls_declspec_msvc18 = get_cursor(tu.cursor, 'tls_declspec_msvc18') - self.assertEqual(tls_declspec_msvc18.tls_kind, TLSKind.STATIC) - - flags = ['-fms-extensions', '-target', 'x86_64-unknown-windows-win32', - '-fms-compatibility-version=19'] - tu = get_tu(""" -__declspec(thread) int tls_declspec_msvc19; -""", lang = 'cpp', flags=flags) - - tls_declspec_msvc19 = get_cursor(tu.cursor, 'tls_declspec_msvc19') - self.assertEqual(tls_declspec_msvc19.tls_kind, TLSKind.DYNAMIC) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_token_kind.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_token_kind.py deleted file mode 100644 index 904e007cafc..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_token_kind.py +++ /dev/null @@ -1,49 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import TokenKind - -import unittest - - -class TestTokenKind(unittest.TestCase): - def test_constructor(self): - """Ensure TokenKind constructor works as expected.""" - - t = TokenKind(5, 'foo') - - self.assertEqual(t.value, 5) - self.assertEqual(t.name, 'foo') - - def test_bad_register(self): - """Ensure a duplicate value is rejected for registration.""" - - with self.assertRaises(ValueError): - TokenKind.register(2, 'foo') - - def test_unknown_value(self): - """Ensure trying to fetch an unknown value raises.""" - - with self.assertRaises(ValueError): - TokenKind.from_value(-1) - - def test_registration(self): - """Ensure that items registered appear as class attributes.""" - self.assertTrue(hasattr(TokenKind, 'LITERAL')) - literal = TokenKind.LITERAL - - self.assertIsInstance(literal, TokenKind) - - def test_from_value(self): - """Ensure registered values can be obtained from from_value().""" - t = TokenKind.from_value(3) - self.assertIsInstance(t, TokenKind) - self.assertEqual(t, TokenKind.LITERAL) - - def test_repr(self): - """Ensure repr() works.""" - - r = repr(TokenKind.LITERAL) - self.assertEqual(r, 'TokenKind.LITERAL') diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_tokens.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_tokens.py deleted file mode 100644 index dd6d3a3259e..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_tokens.py +++ /dev/null @@ -1,59 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from clang.cindex import CursorKind -from clang.cindex import Index -from clang.cindex import SourceLocation -from clang.cindex import SourceRange -from clang.cindex import TokenKind - -from .util import get_tu - -import unittest - - -class TestTokens(unittest.TestCase): - def test_token_to_cursor(self): - """Ensure we can obtain a Cursor from a Token instance.""" - tu = get_tu('int i = 5;') - r = tu.get_extent('t.c', (0, 9)) - tokens = list(tu.get_tokens(extent=r)) - - self.assertEqual(len(tokens), 4) - self.assertEqual(tokens[1].spelling, 'i') - self.assertEqual(tokens[1].kind, TokenKind.IDENTIFIER) - - cursor = tokens[1].cursor - self.assertEqual(cursor.kind, CursorKind.VAR_DECL) - self.assertEqual(tokens[1].cursor, tokens[2].cursor) - - def test_token_location(self): - """Ensure Token.location works.""" - - tu = get_tu('int foo = 10;') - r = tu.get_extent('t.c', (0, 11)) - - tokens = list(tu.get_tokens(extent=r)) - self.assertEqual(len(tokens), 4) - - loc = tokens[1].location - self.assertIsInstance(loc, SourceLocation) - self.assertEqual(loc.line, 1) - self.assertEqual(loc.column, 5) - self.assertEqual(loc.offset, 4) - - def test_token_extent(self): - """Ensure Token.extent works.""" - tu = get_tu('int foo = 10;') - r = tu.get_extent('t.c', (0, 11)) - - tokens = list(tu.get_tokens(extent=r)) - self.assertEqual(len(tokens), 4) - - extent = tokens[1].extent - self.assertIsInstance(extent, SourceRange) - - self.assertEqual(extent.start.offset, 4) - self.assertEqual(extent.end.offset, 7) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_translation_unit.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_translation_unit.py deleted file mode 100644 index f3e770a9361..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_translation_unit.py +++ /dev/null @@ -1,338 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -from contextlib import contextmanager -import gc -import os -import sys -import tempfile -import unittest - -from clang.cindex import CursorKind -from clang.cindex import Cursor -from clang.cindex import File -from clang.cindex import Index -from clang.cindex import SourceLocation -from clang.cindex import SourceRange -from clang.cindex import TranslationUnitSaveError -from clang.cindex import TranslationUnitLoadError -from clang.cindex import TranslationUnit -from .util import get_cursor -from .util import get_tu -from .util import skip_if_no_fspath -from .util import str_to_path - - -kInputsDir = os.path.join(os.path.dirname(__file__), 'INPUTS') - - -@contextmanager -def save_tu(tu): - """Convenience API to save a TranslationUnit to a file. - - Returns the filename it was saved to. - """ - with tempfile.NamedTemporaryFile() as t: - tu.save(t.name) - yield t.name - - -@contextmanager -def save_tu_pathlike(tu): - """Convenience API to save a TranslationUnit to a file. - - Returns the filename it was saved to. - """ - with tempfile.NamedTemporaryFile() as t: - tu.save(str_to_path(t.name)) - yield t.name - - -class TestTranslationUnit(unittest.TestCase): - def test_spelling(self): - path = os.path.join(kInputsDir, 'hello.cpp') - tu = TranslationUnit.from_source(path) - self.assertEqual(tu.spelling, path) - - def test_cursor(self): - path = os.path.join(kInputsDir, 'hello.cpp') - tu = get_tu(path) - c = tu.cursor - self.assertIsInstance(c, Cursor) - self.assertIs(c.kind, CursorKind.TRANSLATION_UNIT) - - def test_parse_arguments(self): - path = os.path.join(kInputsDir, 'parse_arguments.c') - tu = TranslationUnit.from_source(path, ['-DDECL_ONE=hello', '-DDECL_TWO=hi']) - spellings = [c.spelling for c in tu.cursor.get_children()] - self.assertEqual(spellings[-2], 'hello') - self.assertEqual(spellings[-1], 'hi') - - def test_reparse_arguments(self): - path = os.path.join(kInputsDir, 'parse_arguments.c') - tu = TranslationUnit.from_source(path, ['-DDECL_ONE=hello', '-DDECL_TWO=hi']) - tu.reparse() - spellings = [c.spelling for c in tu.cursor.get_children()] - self.assertEqual(spellings[-2], 'hello') - self.assertEqual(spellings[-1], 'hi') - - def test_unsaved_files(self): - tu = TranslationUnit.from_source('fake.c', ['-I./'], unsaved_files = [ - ('fake.c', """ -#include "fake.h" -int x; -int SOME_DEFINE; -"""), - ('./fake.h', """ -#define SOME_DEFINE y -""") - ]) - spellings = [c.spelling for c in tu.cursor.get_children()] - self.assertEqual(spellings[-2], 'x') - self.assertEqual(spellings[-1], 'y') - - def test_unsaved_files_2(self): - if sys.version_info.major >= 3: - from io import StringIO - else: - from io import BytesIO as StringIO - tu = TranslationUnit.from_source('fake.c', unsaved_files = [ - ('fake.c', StringIO('int x;'))]) - spellings = [c.spelling for c in tu.cursor.get_children()] - self.assertEqual(spellings[-1], 'x') - - @skip_if_no_fspath - def test_from_source_accepts_pathlike(self): - tu = TranslationUnit.from_source(str_to_path('fake.c'), ['-Iincludes'], unsaved_files = [ - (str_to_path('fake.c'), """ -#include "fake.h" - int x; - int SOME_DEFINE; - """), - (str_to_path('includes/fake.h'), """ -#define SOME_DEFINE y - """) - ]) - spellings = [c.spelling for c in tu.cursor.get_children()] - self.assertEqual(spellings[-2], 'x') - self.assertEqual(spellings[-1], 'y') - - def assert_normpaths_equal(self, path1, path2): - """ Compares two paths for equality after normalizing them with - os.path.normpath - """ - self.assertEqual(os.path.normpath(path1), - os.path.normpath(path2)) - - def test_includes(self): - def eq(expected, actual): - if not actual.is_input_file: - self.assert_normpaths_equal(expected[0], actual.source.name) - self.assert_normpaths_equal(expected[1], actual.include.name) - else: - self.assert_normpaths_equal(expected[1], actual.include.name) - - src = os.path.join(kInputsDir, 'include.cpp') - h1 = os.path.join(kInputsDir, "header1.h") - h2 = os.path.join(kInputsDir, "header2.h") - h3 = os.path.join(kInputsDir, "header3.h") - inc = [(src, h1), (h1, h3), (src, h2), (h2, h3)] - - tu = TranslationUnit.from_source(src) - for i in zip(inc, tu.get_includes()): - eq(i[0], i[1]) - - def test_inclusion_directive(self): - src = os.path.join(kInputsDir, 'include.cpp') - h1 = os.path.join(kInputsDir, "header1.h") - h2 = os.path.join(kInputsDir, "header2.h") - h3 = os.path.join(kInputsDir, "header3.h") - inc = [h1, h3, h2, h3, h1] - - tu = TranslationUnit.from_source(src, options=TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD) - inclusion_directive_files = [c.get_included_file().name for c in tu.cursor.get_children() if c.kind == CursorKind.INCLUSION_DIRECTIVE] - for i in zip(inc, inclusion_directive_files): - self.assert_normpaths_equal(i[0], i[1]) - - def test_save(self): - """Ensure TranslationUnit.save() works.""" - - tu = get_tu('int foo();') - - with save_tu(tu) as path: - self.assertTrue(os.path.exists(path)) - self.assertGreater(os.path.getsize(path), 0) - - @skip_if_no_fspath - def test_save_pathlike(self): - """Ensure TranslationUnit.save() works with PathLike filename.""" - - tu = get_tu('int foo();') - - with save_tu_pathlike(tu) as path: - self.assertTrue(os.path.exists(path)) - self.assertGreater(os.path.getsize(path), 0) - - def test_save_translation_errors(self): - """Ensure that saving to an invalid directory raises.""" - - tu = get_tu('int foo();') - - path = '/does/not/exist/llvm-test.ast' - self.assertFalse(os.path.exists(os.path.dirname(path))) - - with self.assertRaises(TranslationUnitSaveError) as cm: - tu.save(path) - ex = cm.exception - expected = TranslationUnitSaveError.ERROR_UNKNOWN - self.assertEqual(ex.save_error, expected) - - def test_load(self): - """Ensure TranslationUnits can be constructed from saved files.""" - - tu = get_tu('int foo();') - self.assertEqual(len(tu.diagnostics), 0) - with save_tu(tu) as path: - self.assertTrue(os.path.exists(path)) - self.assertGreater(os.path.getsize(path), 0) - - tu2 = TranslationUnit.from_ast_file(filename=path) - self.assertEqual(len(tu2.diagnostics), 0) - - foo = get_cursor(tu2, 'foo') - self.assertIsNotNone(foo) - - # Just in case there is an open file descriptor somewhere. - del tu2 - - @skip_if_no_fspath - def test_load_pathlike(self): - """Ensure TranslationUnits can be constructed from saved files - - PathLike variant.""" - tu = get_tu('int foo();') - self.assertEqual(len(tu.diagnostics), 0) - with save_tu(tu) as path: - tu2 = TranslationUnit.from_ast_file(filename=str_to_path(path)) - self.assertEqual(len(tu2.diagnostics), 0) - - foo = get_cursor(tu2, 'foo') - self.assertIsNotNone(foo) - - # Just in case there is an open file descriptor somewhere. - del tu2 - - def test_index_parse(self): - path = os.path.join(kInputsDir, 'hello.cpp') - index = Index.create() - tu = index.parse(path) - self.assertIsInstance(tu, TranslationUnit) - - def test_get_file(self): - """Ensure tu.get_file() works appropriately.""" - - tu = get_tu('int foo();') - - f = tu.get_file('t.c') - self.assertIsInstance(f, File) - self.assertEqual(f.name, 't.c') - - with self.assertRaises(Exception): - f = tu.get_file('foobar.cpp') - - @skip_if_no_fspath - def test_get_file_pathlike(self): - """Ensure tu.get_file() works appropriately with PathLike filenames.""" - - tu = get_tu('int foo();') - - f = tu.get_file(str_to_path('t.c')) - self.assertIsInstance(f, File) - self.assertEqual(f.name, 't.c') - - with self.assertRaises(Exception): - f = tu.get_file(str_to_path('foobar.cpp')) - - def test_get_source_location(self): - """Ensure tu.get_source_location() works.""" - - tu = get_tu('int foo();') - - location = tu.get_location('t.c', 2) - self.assertIsInstance(location, SourceLocation) - self.assertEqual(location.offset, 2) - self.assertEqual(location.file.name, 't.c') - - location = tu.get_location('t.c', (1, 3)) - self.assertIsInstance(location, SourceLocation) - self.assertEqual(location.line, 1) - self.assertEqual(location.column, 3) - self.assertEqual(location.file.name, 't.c') - - def test_get_source_range(self): - """Ensure tu.get_source_range() works.""" - - tu = get_tu('int foo();') - - r = tu.get_extent('t.c', (1,4)) - self.assertIsInstance(r, SourceRange) - self.assertEqual(r.start.offset, 1) - self.assertEqual(r.end.offset, 4) - self.assertEqual(r.start.file.name, 't.c') - self.assertEqual(r.end.file.name, 't.c') - - r = tu.get_extent('t.c', ((1,2), (1,3))) - self.assertIsInstance(r, SourceRange) - self.assertEqual(r.start.line, 1) - self.assertEqual(r.start.column, 2) - self.assertEqual(r.end.line, 1) - self.assertEqual(r.end.column, 3) - self.assertEqual(r.start.file.name, 't.c') - self.assertEqual(r.end.file.name, 't.c') - - start = tu.get_location('t.c', 0) - end = tu.get_location('t.c', 5) - - r = tu.get_extent('t.c', (start, end)) - self.assertIsInstance(r, SourceRange) - self.assertEqual(r.start.offset, 0) - self.assertEqual(r.end.offset, 5) - self.assertEqual(r.start.file.name, 't.c') - self.assertEqual(r.end.file.name, 't.c') - - def test_get_tokens_gc(self): - """Ensures get_tokens() works properly with garbage collection.""" - - tu = get_tu('int foo();') - r = tu.get_extent('t.c', (0, 10)) - tokens = list(tu.get_tokens(extent=r)) - - self.assertEqual(tokens[0].spelling, 'int') - gc.collect() - self.assertEqual(tokens[0].spelling, 'int') - - del tokens[1] - gc.collect() - self.assertEqual(tokens[0].spelling, 'int') - - # May trigger segfault if we don't do our job properly. - del tokens - gc.collect() - gc.collect() # Just in case. - - def test_fail_from_source(self): - path = os.path.join(kInputsDir, 'non-existent.cpp') - try: - tu = TranslationUnit.from_source(path) - except TranslationUnitLoadError: - tu = None - self.assertEqual(tu, None) - - def test_fail_from_ast_file(self): - path = os.path.join(kInputsDir, 'non-existent.ast') - try: - tu = TranslationUnit.from_ast_file(path) - except TranslationUnitLoadError: - tu = None - self.assertEqual(tu, None) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_type.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_type.py deleted file mode 100644 index bcdbeff9d99..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/test_type.py +++ /dev/null @@ -1,468 +0,0 @@ -import os -from clang.cindex import Config -if 'CLANG_LIBRARY_PATH' in os.environ: - Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) - -import gc -import unittest - -from clang.cindex import CursorKind -from clang.cindex import TranslationUnit -from clang.cindex import TypeKind -from .util import get_cursor -from .util import get_tu - - -kInput = """\ - -typedef int I; - -struct teststruct { - int a; - I b; - long c; - unsigned long d; - signed long e; - const int f; - int *g; - int ***h; -}; - -""" - - -constarrayInput=""" -struct teststruct { - void *A[2]; -}; -""" - - -class TestType(unittest.TestCase): - def test_a_struct(self): - tu = get_tu(kInput) - - teststruct = get_cursor(tu, 'teststruct') - self.assertIsNotNone(teststruct, "Could not find teststruct.") - fields = list(teststruct.get_children()) - - self.assertEqual(fields[0].kind, CursorKind.FIELD_DECL) - self.assertIsNotNone(fields[0].translation_unit) - self.assertEqual(fields[0].spelling, 'a') - self.assertFalse(fields[0].type.is_const_qualified()) - self.assertEqual(fields[0].type.kind, TypeKind.INT) - self.assertEqual(fields[0].type.get_canonical().kind, TypeKind.INT) - self.assertEqual(fields[0].type.get_typedef_name(), '') - - self.assertEqual(fields[1].kind, CursorKind.FIELD_DECL) - self.assertIsNotNone(fields[1].translation_unit) - self.assertEqual(fields[1].spelling, 'b') - self.assertFalse(fields[1].type.is_const_qualified()) - self.assertEqual(fields[1].type.kind, TypeKind.TYPEDEF) - self.assertEqual(fields[1].type.get_canonical().kind, TypeKind.INT) - self.assertEqual(fields[1].type.get_declaration().spelling, 'I') - self.assertEqual(fields[1].type.get_typedef_name(), 'I') - - self.assertEqual(fields[2].kind, CursorKind.FIELD_DECL) - self.assertIsNotNone(fields[2].translation_unit) - self.assertEqual(fields[2].spelling, 'c') - self.assertFalse(fields[2].type.is_const_qualified()) - self.assertEqual(fields[2].type.kind, TypeKind.LONG) - self.assertEqual(fields[2].type.get_canonical().kind, TypeKind.LONG) - self.assertEqual(fields[2].type.get_typedef_name(), '') - - self.assertEqual(fields[3].kind, CursorKind.FIELD_DECL) - self.assertIsNotNone(fields[3].translation_unit) - self.assertEqual(fields[3].spelling, 'd') - self.assertFalse(fields[3].type.is_const_qualified()) - self.assertEqual(fields[3].type.kind, TypeKind.ULONG) - self.assertEqual(fields[3].type.get_canonical().kind, TypeKind.ULONG) - self.assertEqual(fields[3].type.get_typedef_name(), '') - - self.assertEqual(fields[4].kind, CursorKind.FIELD_DECL) - self.assertIsNotNone(fields[4].translation_unit) - self.assertEqual(fields[4].spelling, 'e') - self.assertFalse(fields[4].type.is_const_qualified()) - self.assertEqual(fields[4].type.kind, TypeKind.LONG) - self.assertEqual(fields[4].type.get_canonical().kind, TypeKind.LONG) - self.assertEqual(fields[4].type.get_typedef_name(), '') - - self.assertEqual(fields[5].kind, CursorKind.FIELD_DECL) - self.assertIsNotNone(fields[5].translation_unit) - self.assertEqual(fields[5].spelling, 'f') - self.assertTrue(fields[5].type.is_const_qualified()) - self.assertEqual(fields[5].type.kind, TypeKind.INT) - self.assertEqual(fields[5].type.get_canonical().kind, TypeKind.INT) - self.assertEqual(fields[5].type.get_typedef_name(), '') - - self.assertEqual(fields[6].kind, CursorKind.FIELD_DECL) - self.assertIsNotNone(fields[6].translation_unit) - self.assertEqual(fields[6].spelling, 'g') - self.assertFalse(fields[6].type.is_const_qualified()) - self.assertEqual(fields[6].type.kind, TypeKind.POINTER) - self.assertEqual(fields[6].type.get_pointee().kind, TypeKind.INT) - self.assertEqual(fields[6].type.get_typedef_name(), '') - - self.assertEqual(fields[7].kind, CursorKind.FIELD_DECL) - self.assertIsNotNone(fields[7].translation_unit) - self.assertEqual(fields[7].spelling, 'h') - self.assertFalse(fields[7].type.is_const_qualified()) - self.assertEqual(fields[7].type.kind, TypeKind.POINTER) - self.assertEqual(fields[7].type.get_pointee().kind, TypeKind.POINTER) - self.assertEqual(fields[7].type.get_pointee().get_pointee().kind, TypeKind.POINTER) - self.assertEqual(fields[7].type.get_pointee().get_pointee().get_pointee().kind, TypeKind.INT) - self.assertEqual(fields[7].type.get_typedef_name(), '') - - def test_references(self): - """Ensure that a Type maintains a reference to a TranslationUnit.""" - - tu = get_tu('int x;') - children = list(tu.cursor.get_children()) - self.assertGreater(len(children), 0) - - cursor = children[0] - t = cursor.type - - self.assertIsInstance(t.translation_unit, TranslationUnit) - - # Delete main TranslationUnit reference and force a GC. - del tu - gc.collect() - self.assertIsInstance(t.translation_unit, TranslationUnit) - - # If the TU was destroyed, this should cause a segfault. - decl = t.get_declaration() - - def testConstantArray(self): - tu = get_tu(constarrayInput) - - teststruct = get_cursor(tu, 'teststruct') - self.assertIsNotNone(teststruct, "Didn't find teststruct??") - fields = list(teststruct.get_children()) - self.assertEqual(fields[0].spelling, 'A') - self.assertEqual(fields[0].type.kind, TypeKind.CONSTANTARRAY) - self.assertIsNotNone(fields[0].type.get_array_element_type()) - self.assertEqual(fields[0].type.get_array_element_type().kind, TypeKind.POINTER) - self.assertEqual(fields[0].type.get_array_size(), 2) - - def test_equal(self): - """Ensure equivalence operators work on Type.""" - source = 'int a; int b; void *v;' - tu = get_tu(source) - - a = get_cursor(tu, 'a') - b = get_cursor(tu, 'b') - v = get_cursor(tu, 'v') - - self.assertIsNotNone(a) - self.assertIsNotNone(b) - self.assertIsNotNone(v) - - self.assertEqual(a.type, b.type) - self.assertNotEqual(a.type, v.type) - - self.assertNotEqual(a.type, None) - self.assertNotEqual(a.type, 'foo') - - def test_type_spelling(self): - """Ensure Type.spelling works.""" - tu = get_tu('int c[5]; void f(int i[]); int x; int v[x];') - c = get_cursor(tu, 'c') - i = get_cursor(tu, 'i') - x = get_cursor(tu, 'x') - v = get_cursor(tu, 'v') - self.assertIsNotNone(c) - self.assertIsNotNone(i) - self.assertIsNotNone(x) - self.assertIsNotNone(v) - self.assertEqual(c.type.spelling, "int [5]") - self.assertEqual(i.type.spelling, "int []") - self.assertEqual(x.type.spelling, "int") - self.assertEqual(v.type.spelling, "int [x]") - - def test_typekind_spelling(self): - """Ensure TypeKind.spelling works.""" - tu = get_tu('int a;') - a = get_cursor(tu, 'a') - - self.assertIsNotNone(a) - self.assertEqual(a.type.kind.spelling, 'Int') - - def test_function_argument_types(self): - """Ensure that Type.argument_types() works as expected.""" - tu = get_tu('void f(int, int);') - f = get_cursor(tu, 'f') - self.assertIsNotNone(f) - - args = f.type.argument_types() - self.assertIsNotNone(args) - self.assertEqual(len(args), 2) - - t0 = args[0] - self.assertIsNotNone(t0) - self.assertEqual(t0.kind, TypeKind.INT) - - t1 = args[1] - self.assertIsNotNone(t1) - self.assertEqual(t1.kind, TypeKind.INT) - - args2 = list(args) - self.assertEqual(len(args2), 2) - self.assertEqual(t0, args2[0]) - self.assertEqual(t1, args2[1]) - - def test_argument_types_string_key(self): - """Ensure that non-int keys raise a TypeError.""" - tu = get_tu('void f(int, int);') - f = get_cursor(tu, 'f') - self.assertIsNotNone(f) - - args = f.type.argument_types() - self.assertEqual(len(args), 2) - - with self.assertRaises(TypeError): - args['foo'] - - def test_argument_types_negative_index(self): - """Ensure that negative indexes on argument_types Raises an IndexError.""" - tu = get_tu('void f(int, int);') - f = get_cursor(tu, 'f') - args = f.type.argument_types() - - with self.assertRaises(IndexError): - args[-1] - - def test_argument_types_overflow_index(self): - """Ensure that indexes beyond the length of Type.argument_types() raise.""" - tu = get_tu('void f(int, int);') - f = get_cursor(tu, 'f') - args = f.type.argument_types() - - with self.assertRaises(IndexError): - args[2] - - def test_argument_types_invalid_type(self): - """Ensure that obtaining argument_types on a Type without them raises.""" - tu = get_tu('int i;') - i = get_cursor(tu, 'i') - self.assertIsNotNone(i) - - with self.assertRaises(Exception): - i.type.argument_types() - - def test_is_pod(self): - """Ensure Type.is_pod() works.""" - tu = get_tu('int i; void f();') - i = get_cursor(tu, 'i') - f = get_cursor(tu, 'f') - - self.assertIsNotNone(i) - self.assertIsNotNone(f) - - self.assertTrue(i.type.is_pod()) - self.assertFalse(f.type.is_pod()) - - def test_function_variadic(self): - """Ensure Type.is_function_variadic works.""" - - source =""" -#include <stdarg.h> - - void foo(int a, ...); - void bar(int a, int b); - """ - - tu = get_tu(source) - foo = get_cursor(tu, 'foo') - bar = get_cursor(tu, 'bar') - - self.assertIsNotNone(foo) - self.assertIsNotNone(bar) - - self.assertIsInstance(foo.type.is_function_variadic(), bool) - self.assertTrue(foo.type.is_function_variadic()) - self.assertFalse(bar.type.is_function_variadic()) - - def test_element_type(self): - """Ensure Type.element_type works.""" - tu = get_tu('int c[5]; void f(int i[]); int x; int v[x];') - c = get_cursor(tu, 'c') - i = get_cursor(tu, 'i') - v = get_cursor(tu, 'v') - self.assertIsNotNone(c) - self.assertIsNotNone(i) - self.assertIsNotNone(v) - - self.assertEqual(c.type.kind, TypeKind.CONSTANTARRAY) - self.assertEqual(c.type.element_type.kind, TypeKind.INT) - self.assertEqual(i.type.kind, TypeKind.INCOMPLETEARRAY) - self.assertEqual(i.type.element_type.kind, TypeKind.INT) - self.assertEqual(v.type.kind, TypeKind.VARIABLEARRAY) - self.assertEqual(v.type.element_type.kind, TypeKind.INT) - - def test_invalid_element_type(self): - """Ensure Type.element_type raises if type doesn't have elements.""" - tu = get_tu('int i;') - i = get_cursor(tu, 'i') - self.assertIsNotNone(i) - with self.assertRaises(Exception): - i.element_type - - def test_element_count(self): - """Ensure Type.element_count works.""" - tu = get_tu('int i[5]; int j;') - i = get_cursor(tu, 'i') - j = get_cursor(tu, 'j') - - self.assertIsNotNone(i) - self.assertIsNotNone(j) - - self.assertEqual(i.type.element_count, 5) - - with self.assertRaises(Exception): - j.type.element_count - - def test_is_volatile_qualified(self): - """Ensure Type.is_volatile_qualified works.""" - - tu = get_tu('volatile int i = 4; int j = 2;') - - i = get_cursor(tu, 'i') - j = get_cursor(tu, 'j') - - self.assertIsNotNone(i) - self.assertIsNotNone(j) - - self.assertIsInstance(i.type.is_volatile_qualified(), bool) - self.assertTrue(i.type.is_volatile_qualified()) - self.assertFalse(j.type.is_volatile_qualified()) - - def test_is_restrict_qualified(self): - """Ensure Type.is_restrict_qualified works.""" - - tu = get_tu('struct s { void * restrict i; void * j; };') - - i = get_cursor(tu, 'i') - j = get_cursor(tu, 'j') - - self.assertIsNotNone(i) - self.assertIsNotNone(j) - - self.assertIsInstance(i.type.is_restrict_qualified(), bool) - self.assertTrue(i.type.is_restrict_qualified()) - self.assertFalse(j.type.is_restrict_qualified()) - - def test_record_layout(self): - """Ensure Cursor.type.get_size, Cursor.type.get_align and - Cursor.type.get_offset works.""" - - source =""" - struct a { - long a1; - long a2:3; - long a3:4; - long long a4; - }; - """ - tries=[(['-target','i386-linux-gnu'],(4,16,0,32,35,64)), - (['-target','nvptx64-unknown-unknown'],(8,24,0,64,67,128)), - (['-target','i386-pc-win32'],(8,16,0,32,35,64)), - (['-target','msp430-none-none'],(2,14,0,32,35,48))] - for flags, values in tries: - align,total,a1,a2,a3,a4 = values - - tu = get_tu(source, flags=flags) - teststruct = get_cursor(tu, 'a') - fields = list(teststruct.get_children()) - - self.assertEqual(teststruct.type.get_align(), align) - self.assertEqual(teststruct.type.get_size(), total) - self.assertEqual(teststruct.type.get_offset(fields[0].spelling), a1) - self.assertEqual(teststruct.type.get_offset(fields[1].spelling), a2) - self.assertEqual(teststruct.type.get_offset(fields[2].spelling), a3) - self.assertEqual(teststruct.type.get_offset(fields[3].spelling), a4) - self.assertEqual(fields[0].is_bitfield(), False) - self.assertEqual(fields[1].is_bitfield(), True) - self.assertEqual(fields[1].get_bitfield_width(), 3) - self.assertEqual(fields[2].is_bitfield(), True) - self.assertEqual(fields[2].get_bitfield_width(), 4) - self.assertEqual(fields[3].is_bitfield(), False) - - def test_offset(self): - """Ensure Cursor.get_record_field_offset works in anonymous records""" - source=""" - struct Test { - struct {int a;} typeanon; - struct { - int bariton; - union { - int foo; - }; - }; - int bar; - };""" - tries=[(['-target','i386-linux-gnu'],(4,16,0,32,64,96)), - (['-target','nvptx64-unknown-unknown'],(8,24,0,32,64,96)), - (['-target','i386-pc-win32'],(8,16,0,32,64,96)), - (['-target','msp430-none-none'],(2,14,0,32,64,96))] - for flags, values in tries: - align,total,f1,bariton,foo,bar = values - tu = get_tu(source) - teststruct = get_cursor(tu, 'Test') - children = list(teststruct.get_children()) - fields = list(teststruct.type.get_fields()) - self.assertEqual(children[0].kind, CursorKind.STRUCT_DECL) - self.assertNotEqual(children[0].spelling, "typeanon") - self.assertEqual(children[1].spelling, "typeanon") - self.assertEqual(fields[0].kind, CursorKind.FIELD_DECL) - self.assertEqual(fields[1].kind, CursorKind.FIELD_DECL) - self.assertTrue(fields[1].is_anonymous()) - self.assertEqual(teststruct.type.get_offset("typeanon"), f1) - self.assertEqual(teststruct.type.get_offset("bariton"), bariton) - self.assertEqual(teststruct.type.get_offset("foo"), foo) - self.assertEqual(teststruct.type.get_offset("bar"), bar) - - def test_decay(self): - """Ensure decayed types are handled as the original type""" - - tu = get_tu("void foo(int a[]);") - foo = get_cursor(tu, 'foo') - a = foo.type.argument_types()[0] - - self.assertEqual(a.kind, TypeKind.INCOMPLETEARRAY) - self.assertEqual(a.element_type.kind, TypeKind.INT) - self.assertEqual(a.get_canonical().kind, TypeKind.INCOMPLETEARRAY) - - def test_addrspace(self): - """Ensure the address space can be queried""" - tu = get_tu('__attribute__((address_space(2))) int testInteger = 3;', 'c') - - testInteger = get_cursor(tu, 'testInteger') - - self.assertIsNotNone(testInteger, "Could not find testInteger.") - self.assertEqual(testInteger.type.get_address_space(), 2) - - def test_template_arguments(self): - source = """ - class Foo { - }; - template <typename T> - class Template { - }; - Template<Foo> instance; - int bar; - """ - tu = get_tu(source, lang='cpp') - - # Varible with a template argument. - cursor = get_cursor(tu, 'instance') - cursor_type = cursor.type - self.assertEqual(cursor.kind, CursorKind.VAR_DECL) - self.assertEqual(cursor_type.spelling, 'Template<Foo>') - self.assertEqual(cursor_type.get_num_template_arguments(), 1) - template_type = cursor_type.get_template_argument_type(0) - self.assertEqual(template_type.spelling, 'Foo') - - # Variable without a template argument. - cursor = get_cursor(tu, 'bar') - self.assertEqual(cursor.get_num_template_arguments(), -1) diff --git a/gnu/llvm/tools/clang/bindings/python/tests/cindex/util.py b/gnu/llvm/tools/clang/bindings/python/tests/cindex/util.py deleted file mode 100644 index 57e17941c55..00000000000 --- a/gnu/llvm/tools/clang/bindings/python/tests/cindex/util.py +++ /dev/null @@ -1,90 +0,0 @@ -# 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', -] |
