diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-02-18 18:08:43 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-02-18 18:08:43 +0000 |
commit | a88084b78fd4ca5d3d858c14b02414f8cc399f02 (patch) | |
tree | 8d45285d7831d594f76f9a0a1edaa4436b090ac5 /tools/c-index-test/c-index-test.c | |
parent | 8b6765fb563a5b03d128d8f53b9b3986128a3405 (diff) |
Rework how CIndex handles diagnostics. Rather than using a callback,
we attach diagnostics to translation units and code-completion
results, so they can be queried at any time.
To facilitate this, the new StoredDiagnostic class stores a diagnostic
in a serializable/deserializable form, and ASTUnit knows how to
capture diagnostics in this stored form. CIndex's CXDiagnostic is a
thin wrapper around StoredDiagnostic, providing a C interface to
stored or de-serialized diagnostics.
I've XFAIL'd one test case temporarily, because currently we end up
storing diagnostics in an ASTUnit that's never returned to the user
(because it contains errors). I'll introduce a temporary fix for this
soon; the real fix will be to allow us to return and query invalid ASTs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96592 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/c-index-test/c-index-test.c')
-rw-r--r-- | tools/c-index-test/c-index-test.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 640375aaea..b983d3a4de 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -28,10 +28,6 @@ char *basename(const char* path) extern char *basename(const char *); #endif -static void PrintDiagnosticCallback(CXDiagnostic Diagnostic, - CXClientData ClientData); - - static void PrintExtent(FILE *out, unsigned begin_line, unsigned begin_column, unsigned end_line, unsigned end_column) { fprintf(out, "[%d:%d - %d:%d]", begin_line, begin_column, @@ -41,7 +37,7 @@ static void PrintExtent(FILE *out, unsigned begin_line, unsigned begin_column, static unsigned CreateTranslationUnit(CXIndex Idx, const char *file, CXTranslationUnit *TU) { - *TU = clang_createTranslationUnit(Idx, file, PrintDiagnosticCallback, stderr); + *TU = clang_createTranslationUnit(Idx, file); if (!TU) { fprintf(stderr, "Unable to load translation unit from '%s'!\n", file); return 0; @@ -199,9 +195,8 @@ static const char* GetCursorSource(CXCursor Cursor) { typedef void (*PostVisitTU)(CXTranslationUnit); -static void PrintDiagnosticCallback(CXDiagnostic Diagnostic, - CXClientData ClientData) { - FILE *out = (FILE *)ClientData; +void PrintDiagnostic(CXDiagnostic Diagnostic) { + FILE *out = stderr; CXFile file; unsigned line, column; CXString text; @@ -321,6 +316,15 @@ static void PrintDiagnosticCallback(CXDiagnostic Diagnostic, } } +void PrintDiagnostics(CXTranslationUnit TU) { + int i, n = clang_getNumDiagnostics(TU); + for (i = 0; i != n; ++i) { + CXDiagnostic Diag = clang_getDiagnostic(TU, i); + PrintDiagnostic(Diag); + clang_disposeDiagnostic(Diag); + } +} + /******************************************************************************/ /* Logic for testing traversal. */ /******************************************************************************/ @@ -518,6 +522,7 @@ static int perform_test_load(CXIndex Idx, CXTranslationUnit TU, if (PV) PV(TU); + PrintDiagnostics(TU); clang_disposeTranslationUnit(TU); return 0; } @@ -567,9 +572,7 @@ int perform_test_load_source(int argc, const char **argv, argc - num_unsaved_files, argv + num_unsaved_files, num_unsaved_files, - unsaved_files, - PrintDiagnosticCallback, - stderr); + unsaved_files); if (!TU) { fprintf(stderr, "Unable to load translation unit!\n"); clang_disposeIndex(Idx); @@ -815,13 +818,18 @@ int perform_code_completion(int argc, const char **argv) { argv[argc - 1], argc - num_unsaved_files - 3, argv + num_unsaved_files + 2, num_unsaved_files, unsaved_files, - filename, line, column, - PrintDiagnosticCallback, stderr); + filename, line, column); if (results) { unsigned i, n = results->NumResults; for (i = 0; i != n; ++i) print_completion_result(results->Results + i, stdout); + n = clang_codeCompleteGetNumDiagnostics(results); + for (i = 0; i != n; ++i) { + CXDiagnostic diag = clang_codeCompleteGetDiagnostic(results, i); + PrintDiagnostic(diag); + clang_disposeDiagnostic(diag); + } clang_disposeCodeCompleteResults(results); } @@ -874,9 +882,7 @@ int inspect_cursor_at(int argc, const char **argv) { argc - num_unsaved_files - 2 - NumLocations, argv + num_unsaved_files + 1 + NumLocations, num_unsaved_files, - unsaved_files, - PrintDiagnosticCallback, - stderr); + unsaved_files); if (!TU) { fprintf(stderr, "unable to parse input\n"); return -1; @@ -895,6 +901,7 @@ int inspect_cursor_at(int argc, const char **argv) { free(Locations[Loc].filename); } + PrintDiagnostics(TU); clang_disposeTranslationUnit(TU); clang_disposeIndex(CIdx); free(Locations); @@ -933,9 +940,7 @@ int perform_token_annotation(int argc, const char **argv) { argc - num_unsaved_files - 3, argv + num_unsaved_files + 2, num_unsaved_files, - unsaved_files, - PrintDiagnosticCallback, - stderr); + unsaved_files); if (!TU) { fprintf(stderr, "unable to parse input\n"); clang_disposeIndex(CIdx); @@ -1000,6 +1005,7 @@ int perform_token_annotation(int argc, const char **argv) { free(cursors); teardown: + PrintDiagnostics(TU); clang_disposeTranslationUnit(TU); clang_disposeIndex(CIdx); free(filename); |