[cfe-dev] code complete not working for unsaved file

Anton Smirnov dev at antonsmirnov.name
Wed Oct 9 22:34:10 PDT 2013


Anyone? Should i create bug?


2013/10/8 Anton Smirnov <dev at antonsmirnov.name>

> Hello.
>
> I've found code complete is not working (via libclang-c) for unsaved files
> (but works great for saved files).
>
> Code (not all):
>
> // show complete options
> void showComplete(CXTranslationUnit TU, char *src_filename, unsigned
> filesize, CXUnsavedFile *file, int line, int column)
> {
>     fprintf(stderr, "TU=%p, file=%s complete at line=%i, column=%i\n",
> &TU, src_filename, line, column);
>
>     CXCodeCompleteResults *results =
>         clang_codeCompleteAt(TU, src_filename, line, column, file, (file
> == NULL ? 0 : 1), clang_defaultCodeCompleteOptions());
>
>     if (results) {
>         fprintf(stderr, "results=[%p, count=%i]\n", results->Results,
> results->NumResults);
>
>         /* Sort the code-completion results based on the typed text. */
>       clang_sortCodeCompletionResults(results->Results,
> results->NumResults);
>
>       for (int i = 0; i < results->NumResults; i++)
>         print_completion_result(results->Results + i, stdout);
>     } else {
>         fprintf(stderr, "no complete results\n");
>     }
>
>     clang_disposeCodeCompleteResults(results);
> }
>
> int main(int argc, char** argv)
> {
>     std::cout << "Starting ----" << std::endl;
>
>     CXIndex index = clang_createIndex(false, false);
>     char * filename = argv[1];
>
>     fprintf(stderr, "\ncommand-line file: %s =============\n", filename);
>     CXTranslationUnit commandLineTu = clang_parseTranslationUnit(index,
> filename, 0, 0, 0, 0, CXTranslationUnit_None);
>     showComplete(commandLineTu, filename, 0, NULL, 1, 72);
>     clang_disposeTranslationUnit(commandLineTu);
>
>     // unsaved file tu
>     fprintf(stderr, "\nunsaved file =============\n");
>     CXUnsavedFile *unsavedFile = new CXUnsavedFile;
>     unsavedFile->Filename = "temp.cpp";
>     unsavedFile->Contents = "struct TempStruct { int a; bool b; }; int
> main() { TempStruct str; str. /*complete here*/ return 1; }";
>     CXTranslationUnit in_memory_tu = clang_parseTranslationUnit(index,
> unsavedFile->Filename, NULL, 0, unsavedFile, 1, CXTranslationUnit_None);
>     int column = strchr(unsavedFile->Contents, '.') -
> unsavedFile->Contents + 1 + 1; // + 1 (length of '.') + 1 (next symbol)
>     showComplete(in_memory_tu, (char*)unsavedFile->Filename,
> strlen(unsavedFile->Contents), unsavedFile, 1, column);
>
>     clang_disposeTranslationUnit(in_memory_tu);
>     clang_disposeIndex(index);
>
>     return 0;
> }
>
> Source file (saved file, is exactly equals to unsaved file content):
> struct TempStruct { int a; bool b; }; int main() { TempStruct str; str.
> /*complete here*/ return 1; }
>
> Output:
> Starting ----
>
> command-line file: ../test/test_complete.cpp =============
> TU=0x7fff5d75aaf0, file=../test/test_complete.cpp complete at line=1,
> column=72
> results=[0x7fec7b509510, count=5]
> FieldDecl:{ResultType int}{TypedText a} (35)
> FieldDecl:{ResultType bool}{TypedText b} (35)
> CXXMethod:{ResultType TempStruct &}{TypedText operator=}{LeftParen
> (}{Placeholder const TempStruct &}{RightParen )} (34)
> StructDecl:{TypedText TempStruct}{Text ::} (75)
> CXXDestructor:{ResultType void}{TypedText ~TempStruct}{LeftParen
> (}{RightParen )} (34)
>
> unsaved file =============
> TU=0x7fff5d75aaf0, file=temp.cpp complete at line=1, column=72
> results=[0x7fec7b5043d0, count=0]
>
>
> Any thoughts what's wrong?
>
> Anton
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20131010/677d5d57/attachment.html>


More information about the cfe-dev mailing list