1c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkofrom clang.cindex import TranslationUnit 2c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko 3724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerdef check_completion_results(cr, expected): 4724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer assert cr is not None 5724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer assert len(cr.diagnostics) == 0 6724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer 7724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer completions = [str(c) for c in cr.results] 8724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer 9724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer for c in expected: 10724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer assert c in completions 11724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer 12c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkodef test_code_complete(): 13c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko files = [('fake.c', """ 14c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko/// Aaa. 15c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkoint test1; 16c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko 17c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko/// Bbb. 18c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkovoid test2(void); 19c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko 20c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenkovoid f() { 21c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko 22c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko} 23c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko""")] 24c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko 25c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko tu = TranslationUnit.from_source('fake.c', ['-std=c99'], unsaved_files=files, 26c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko options=TranslationUnit.PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION) 27c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko 28c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko cr = tu.codeComplete('fake.c', 9, 1, unsaved_files=files, include_brief_comments=True) 29c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko 30c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko expected = [ 31c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko "{'int', ResultType} | {'test1', TypedText} || Priority: 50 || Availability: Available || Brief comment: Aaa.", 32c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko "{'void', ResultType} | {'test2', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 50 || Availability: Available || Brief comment: Bbb.", 33c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko "{'return', TypedText} || Priority: 40 || Availability: Available || Brief comment: None" 34c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko ] 35724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer check_completion_results(cr, expected) 36c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko 37724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerdef test_code_complete_availability(): 38724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer files = [('fake.cpp', """ 39724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerclass P { 40724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerprotected: 41724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer int member; 42724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer}; 43c69e067f24aa64a277ca4d6048a3165cbb23dbe7Dmitri Gribenko 44724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerclass Q : public P { 45724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramerpublic: 46724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer using P::member; 47724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer}; 48724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer 49724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramervoid f(P x, Q y) { 50724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer x.; // member is inaccessible 51724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer y.; // member is accessible 52724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer} 53724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer""")] 54724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer 55724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer tu = TranslationUnit.from_source('fake.cpp', ['-std=c++98'], unsaved_files=files) 56724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer 57724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer cr = tu.codeComplete('fake.cpp', 12, 5, unsaved_files=files) 58724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer 59724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer expected = [ 60724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer "{'const', TypedText} || Priority: 40 || Availability: Available || Brief comment: None", 61724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer "{'volatile', TypedText} || Priority: 40 || Availability: Available || Brief comment: None", 62724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer "{'operator', TypedText} || Priority: 40 || Availability: Available || Brief comment: None", 63724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer "{'P', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None", 64724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer "{'Q', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None" 65724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer ] 66724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer check_completion_results(cr, expected) 67724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer 68724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer cr = tu.codeComplete('fake.cpp', 13, 5, unsaved_files=files) 69724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer expected = [ 70724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer "{'P', TypedText} | {'::', Text} || Priority: 75 || Availability: Available || Brief comment: None", 71724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer "{'P &', ResultType} | {'operator=', TypedText} | {'(', LeftParen} | {'const P &', Placeholder} | {')', RightParen} || Priority: 34 || Availability: Available || Brief comment: None", 72724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer "{'int', ResultType} | {'member', TypedText} || Priority: 35 || Availability: NotAccessible || Brief comment: None", 73724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer "{'void', ResultType} | {'~P', TypedText} | {'(', LeftParen} | {')', RightParen} || Priority: 34 || Availability: Available || Brief comment: None" 74724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer ] 75724d0dcc4d3765591b4586e7d064b2cba92ba43eBenjamin Kramer check_completion_results(cr, expected) 76