[cfe-dev] code complete not working for unsaved file
Anton Smirnov
dev at antonsmirnov.name
Thu Oct 10 01:23:44 PDT 2013
My bad: i forgot to set length of unsaved file content:
unsavedFile->Length = strlen((char*)unsavedFile->Contents);
Sorry for noise.
2013/10/10 Anton Smirnov <dev at antonsmirnov.name>
> 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/5affe5ea/attachment.html>
More information about the cfe-dev
mailing list