2

保存されていないファイルに対しては、完全なコードが (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(}{Placeholder 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]

何が問題なのですか?

4

1 に答える 1

0

unsavedFile->Length を設定するのを忘れていました。ソース ファイルでさえ、暗黙的に長さを設定する必要があるテキスト ファイルです (fe unsavedFiles->Length = strlen(unsavedFile->Contents);) 。

于 2013-10-10T10:43:01.767 に答える