Полный Clang не работает для несохраненных файлов?

Я обнаружил, что код завершения не работает (через libclang-c) для несохраненных файлов (но отлично работает для сохраненных файлов).

Код (не все):

// 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;
}

Исходный файл (сохраненный файл, в точности соответствует несохраненному содержимому файла):

struct TempStruct { int a; bool b; }; int main() { TempStruct str; str. /*complete here*/ return 1; }

Выход:

Начиная ----

файл командной строки: ../test/test_complete.cpp =============
TU = 0x7fff5d75aaf0, файл = .. / test / test_complete.cpp завершен в строке = 1, столбец = 72
результаты = [0x7fec7b509510, количество = 5]
FieldDecl: {ResultType int} {TypedText a} (35) FieldDecl: {ResultType bool} {TypedText b} (35)
CXXMethod: {ResultType TempStruct } {TypedText operator =} {LeftParen (} {Заполнитель const tempStruct } {RightParen)} (34)
StructDecl: {TypedText TempStruct} {Text ::} (75)
CXXDestructor: {ResultType void} {TypedText ~ TempStruct} {LeftParen (} {RightParen)} (34)

несохраненный файл =============
TU = 0x7fff5d75aaf0, файл = temp.cpp завершено в строке = 1, столбец = 72
результаты = [0x7fec7b5043d0, количество = 0]

Есть мысли что не так?

1

Решение

Я забыл установить unsavedFile-> Length. Даже исходные файлы — это текстовые файлы, которые вы должны установить длиной неявно (например, unsavedFiles->Length = strlen(unsavedFile->Contents); )

0

Другие решения

Других решений пока нет …