| 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} | {';', SemiColon} || 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} | {';', SemiColon} || 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) |