From: Douglas Gregor Date: Mon, 9 Nov 2009 16:04:45 +0000 (+0000) Subject: Minor cleanup for CIndex-based code-completion: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ac738567fdf4df636b9e76c5a2d3dc3d6f80235;p=clang Minor cleanup for CIndex-based code-completion: - Provide an actual test for code-completion via CIndex. - Actually print optional strings in c-index-test - Export clang_getCompletionChunkCompletionString from CIndex git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86550 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Index/code-completion.cpp b/test/Index/code-completion.cpp new file mode 100644 index 0000000000..875c746525 --- /dev/null +++ b/test/Index/code-completion.cpp @@ -0,0 +1,51 @@ +// Code-completion through the C interface + +struct X { + int member; +}; + +struct Y { + float member; + void memfunc(int i = 17); +}; + +struct Z : X, Y { + double member; + operator int() const; +}; + +struct Z get_Z(); + +void test_Z() { + // RUN: c-index-test -code-completion-at=%s:21:11 %s | FileCheck -check-prefix=CHECK-MEMBER %s + get_Z().member = 17; +} + + +float& overloaded(int i, long second); +double& overloaded(float f, int second); +int& overloaded(Z z, int second); + +void test_overloaded() { + // RUN: c-index-test -code-completion-at=%s:31:18 %s | FileCheck -check-prefix=CHECK-OVERLOAD %s + overloaded(Z(), 0); +} + +// CHECK-MEMBER: FieldDecl:{TypedText member} +// CHECK-MEMBER: FunctionDecl:{Informative Y::}{TypedText memfunc}{LeftParen (}{Optional {Placeholder int i}}{RightParen )} +// CHECK-MEMBER: FunctionDecl:{Informative X::}{TypedText ~X}{LeftParen (}{RightParen )} +// CHECK-MEMBER: FunctionDecl:{Informative Y::}{TypedText ~Y}{LeftParen (}{RightParen )} +// CHECK-MEMBER: FunctionDecl:{TypedText ~Z}{LeftParen (}{RightParen )} +// CHECK-MEMBER: FunctionDecl:{TypedText operator int}{LeftParen (}{RightParen )} +// CHECK-MEMBER: FunctionDecl:{TypedText operator=}{LeftParen (}{Placeholder struct Z const &}{RightParen )} +// CHECK-MEMBER: StructDecl:{TypedText X}{Text ::} +// CHECK-MEMBER: StructDecl:{TypedText Y}{Text ::} +// CHECK-MEMBER: StructDecl:{TypedText Z}{Text ::} +// CHECK-MEMBER: FieldDecl:{Text X::}{TypedText member} +// CHECK-MEMBER: FieldDecl:{Text Y::}{TypedText member} +// CHECK-MEMBER: FunctionDecl:{Text X::}{TypedText operator=}{LeftParen (}{Placeholder struct X const &}{RightParen )} +// CHECK-MEMBER: FunctionDecl:{Text Y::}{TypedText operator=}{LeftParen (}{Placeholder struct Y const &}{RightParen )} + +// CHECK-OVERLOAD: NotImplemented:{Text overloaded}{LeftParen (}{Text struct Z z}{Comma , }{CurrentParameter int second}{RightParen )} +// CHECK-OVERLOAD: NotImplemented:{Text overloaded}{LeftParen (}{Text int i}{Comma , }{CurrentParameter long second}{RightParen )} +// CHECK-OVERLOAD: NotImplemented:{Text overloaded}{LeftParen (}{Text float f}{Comma , }{CurrentParameter int second}{RightParen )} diff --git a/tools/CIndex/CIndex.exports b/tools/CIndex/CIndex.exports index ba977c1c85..302324bdee 100644 --- a/tools/CIndex/CIndex.exports +++ b/tools/CIndex/CIndex.exports @@ -4,6 +4,7 @@ _clang_createTranslationUnit _clang_createTranslationUnitFromSourceFile _clang_disposeIndex _clang_disposeTranslationUnit +_clang_getCompletionChunkCompletionString _clang_getCompletionChunkKind _clang_getCompletionChunkText _clang_getCursor diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 82653357b1..0df590d849 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -158,24 +158,37 @@ clang_getCompletionChunkKindSpelling(enum CXCompletionChunkKind Kind) { return "Unknown"; } -void print_completion_result(CXCompletionResult *completion_result, - CXClientData client_data) { - FILE *file = (FILE *)client_data; +void print_completion_string(CXCompletionString completion_string, FILE *file) { int I, N; - - fprintf(file, "%s:", - clang_getCursorKindSpelling(completion_result->CursorKind)); - N = clang_getNumCompletionChunks(completion_result->CompletionString); + + N = clang_getNumCompletionChunks(completion_string); for (I = 0; I != N; ++I) { - const char *text - = clang_getCompletionChunkText(completion_result->CompletionString, I); - enum CXCompletionChunkKind Kind - = clang_getCompletionChunkKind(completion_result->CompletionString, I); + = clang_getCompletionChunkKind(completion_string, I); + + if (Kind == CXCompletionChunk_Optional) { + fprintf(file, "{Optional "); + print_completion_string( + clang_getCompletionChunkCompletionString(completion_string, I), + file); + fprintf(file, "}"); + continue; + } + + const char *text + = clang_getCompletionChunkText(completion_string, I); fprintf(file, "{%s %s}", clang_getCompletionChunkKindSpelling(Kind), text? text : ""); } +} + +void print_completion_result(CXCompletionResult *completion_result, + CXClientData client_data) { + FILE *file = (FILE *)client_data; + fprintf(file, "%s:", + clang_getCursorKindSpelling(completion_result->CursorKind)); + print_completion_string(completion_result->CompletionString, file); fprintf(file, "\n"); }