diff options
author | rdivacky <rdivacky@FreeBSD.org> | 2010-03-03 17:28:16 +0000 |
---|---|---|
committer | rdivacky <rdivacky@FreeBSD.org> | 2010-03-03 17:28:16 +0000 |
commit | df90325d4c0a65ee64d2dae3ed9b5b34f7418533 (patch) | |
tree | e1a885aadfd80632f5bd70d4bd2d37e715e35a79 /tools/c-index-test | |
parent | fd035e6496665b1f1197868e21cb0a4594e8db6e (diff) | |
download | FreeBSD-src-df90325d4c0a65ee64d2dae3ed9b5b34f7418533.zip FreeBSD-src-df90325d4c0a65ee64d2dae3ed9b5b34f7418533.tar.gz |
Update clang to 97654.
Diffstat (limited to 'tools/c-index-test')
-rw-r--r-- | tools/c-index-test/c-index-test.c | 468 |
1 files changed, 238 insertions, 230 deletions
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index d4771c7..967afb7 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, @@ -40,12 +36,12 @@ 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; - } + } return 1; } @@ -66,20 +62,20 @@ int parse_remapped_files(int argc, const char **argv, int start_arg, int prefix_len = strlen("-remap-file="); *unsaved_files = 0; *num_unsaved_files = 0; - + /* Count the number of remapped files. */ for (arg = start_arg; arg < argc; ++arg) { if (strncmp(argv[arg], "-remap-file=", prefix_len)) break; - + ++*num_unsaved_files; } - + if (*num_unsaved_files == 0) return 0; - + *unsaved_files - = (struct CXUnsavedFile *)malloc(sizeof(struct CXUnsavedFile) * + = (struct CXUnsavedFile *)malloc(sizeof(struct CXUnsavedFile) * *num_unsaved_files); for (arg = start_arg, i = 0; i != *num_unsaved_files; ++i, ++arg) { struct CXUnsavedFile *unsaved = *unsaved_files + i; @@ -90,14 +86,14 @@ int parse_remapped_files(int argc, const char **argv, int start_arg, FILE *to_file; const char *semi = strchr(arg_string, ';'); if (!semi) { - fprintf(stderr, + fprintf(stderr, "error: -remap-file=from;to argument is missing semicolon\n"); free_remapped_files(*unsaved_files, i); *unsaved_files = 0; *num_unsaved_files = 0; return -1; } - + /* Open the file that we're remapping to. */ to_file = fopen(semi + 1, "r"); if (!to_file) { @@ -108,12 +104,12 @@ int parse_remapped_files(int argc, const char **argv, int start_arg, *num_unsaved_files = 0; return -1; } - + /* Determine the length of the file we're remapping to. */ fseek(to_file, 0, SEEK_END); unsaved->Length = ftell(to_file); fseek(to_file, 0, SEEK_SET); - + /* Read the contents of the file we're remapping to. */ contents = (char *)malloc(unsaved->Length + 1); if (fread(contents, 1, unsaved->Length, to_file) != unsaved->Length) { @@ -127,10 +123,10 @@ int parse_remapped_files(int argc, const char **argv, int start_arg, } contents[unsaved->Length] = 0; unsaved->Contents = contents; - + /* Close the file. */ fclose(to_file); - + /* Copy the file name that we're remapping from. */ filename_len = semi - arg_string; filename = (char *)malloc(filename_len + 1); @@ -138,7 +134,7 @@ int parse_remapped_files(int argc, const char **argv, int start_arg, filename[filename_len] = 0; unsaved->Filename = filename; } - + return 0; } @@ -147,17 +143,23 @@ int parse_remapped_files(int argc, const char **argv, int start_arg, /******************************************************************************/ static void PrintCursor(CXCursor Cursor) { - if (clang_isInvalid(Cursor.kind)) - printf("Invalid Cursor => %s", clang_getCursorKindSpelling(Cursor.kind)); + if (clang_isInvalid(Cursor.kind)) { + CXString ks = clang_getCursorKindSpelling(Cursor.kind); + printf("Invalid Cursor => %s", clang_getCString(ks)); + clang_disposeString(ks); + } else { - CXString string; + CXString string, ks; CXCursor Referenced; unsigned line, column; + + ks = clang_getCursorKindSpelling(Cursor.kind); string = clang_getCursorSpelling(Cursor); - printf("%s=%s", clang_getCursorKindSpelling(Cursor.kind), - clang_getCString(string)); + printf("%s=%s", clang_getCString(ks), + clang_getCString(string)); + clang_disposeString(ks); clang_disposeString(string); - + Referenced = clang_getCursorReferenced(Cursor); if (!clang_equalCursors(Referenced, clang_getNullCursor())) { CXSourceLocation Loc = clang_getCursorLocation(Referenced); @@ -170,15 +172,21 @@ static void PrintCursor(CXCursor Cursor) { } } -static const char* GetCursorSource(CXCursor Cursor) { +static const char* GetCursorSource(CXCursor Cursor) { CXSourceLocation Loc = clang_getCursorLocation(Cursor); - const char *source; + CXString source; CXFile file; clang_getInstantiationLocation(Loc, &file, 0, 0, 0); source = clang_getFileName(file); - if (!source) - return "<invalid loc>"; - return basename(source); + if (!clang_getCString(source)) { + clang_disposeString(source); + return "<invalid loc>"; + } + else { + const char *b = basename(clang_getCString(source)); + clang_disposeString(source); + return b; + } } /******************************************************************************/ @@ -187,122 +195,68 @@ 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; - enum CXDiagnosticSeverity severity = clang_getDiagnosticSeverity(Diagnostic); + CXString Msg; + unsigned display_opts = CXDiagnostic_DisplaySourceLocation + | CXDiagnostic_DisplayColumn | CXDiagnostic_DisplaySourceRanges; + unsigned i, num_fixits; - /* Ignore diagnostics that should be ignored. */ - if (severity == CXDiagnostic_Ignored) + if (clang_getDiagnosticSeverity(Diagnostic) == CXDiagnostic_Ignored) return; + + Msg = clang_formatDiagnostic(Diagnostic, display_opts); + fprintf(stderr, "%s\n", clang_getCString(Msg)); + clang_disposeString(Msg); - /* Print file:line:column. */ clang_getInstantiationLocation(clang_getDiagnosticLocation(Diagnostic), - &file, &line, &column, 0); - if (file) { - unsigned i, n; - unsigned printed_any_ranges = 0; - - fprintf(out, "%s:%d:%d:", clang_getFileName(file), line, column); - - n = clang_getDiagnosticNumRanges(Diagnostic); - for (i = 0; i != n; ++i) { - CXFile start_file, end_file; - CXSourceRange range = clang_getDiagnosticRange(Diagnostic, i); - - unsigned start_line, start_column, end_line, end_column; - clang_getInstantiationLocation(clang_getRangeStart(range), - &start_file, &start_line, &start_column,0); - clang_getInstantiationLocation(clang_getRangeEnd(range), - &end_file, &end_line, &end_column, 0); - - if (start_file != end_file || start_file != file) - continue; - - PrintExtent(out, start_line, start_column, end_line, end_column); - printed_any_ranges = 1; - } - if (printed_any_ranges) - fprintf(out, ":"); - - fprintf(out, " "); - } - - /* Print warning/error/etc. */ - switch (severity) { - case CXDiagnostic_Ignored: assert(0 && "impossible"); break; - case CXDiagnostic_Note: fprintf(out, "note: "); break; - case CXDiagnostic_Warning: fprintf(out, "warning: "); break; - case CXDiagnostic_Error: fprintf(out, "error: "); break; - case CXDiagnostic_Fatal: fprintf(out, "fatal error: "); break; - } - - text = clang_getDiagnosticSpelling(Diagnostic); - if (clang_getCString(text)) - fprintf(out, "%s\n", clang_getCString(text)); - else - fprintf(out, "<no diagnostic text>\n"); - clang_disposeString(text); - - if (file) { - unsigned i, num_fixits = clang_getDiagnosticNumFixIts(Diagnostic); - for (i = 0; i != num_fixits; ++i) { - switch (clang_getDiagnosticFixItKind(Diagnostic, i)) { - case CXFixIt_Insertion: { - CXSourceLocation insertion_loc; - CXFile insertion_file; - unsigned insertion_line, insertion_column; - text = clang_getDiagnosticFixItInsertion(Diagnostic, i, &insertion_loc); - clang_getInstantiationLocation(insertion_loc, &insertion_file, - &insertion_line, &insertion_column, 0); - if (insertion_file == file) - fprintf(out, "FIX-IT: Insert \"%s\" at %d:%d\n", - clang_getCString(text), insertion_line, insertion_column); - clang_disposeString(text); - break; - } + &file, 0, 0, 0); + if (!file) + return; - case CXFixIt_Removal: { - CXFile start_file, end_file; - unsigned start_line, start_column, end_line, end_column; - CXSourceRange remove_range - = clang_getDiagnosticFixItRemoval(Diagnostic, i); - clang_getInstantiationLocation(clang_getRangeStart(remove_range), - &start_file, &start_line, &start_column, - 0); - clang_getInstantiationLocation(clang_getRangeEnd(remove_range), - &end_file, &end_line, &end_column, 0); - if (start_file == file && end_file == file) { - fprintf(out, "FIX-IT: Remove "); - PrintExtent(out, start_line, start_column, end_line, end_column); - fprintf(out, "\n"); - } - break; - } - - case CXFixIt_Replacement: { - CXFile start_file, end_file; - unsigned start_line, start_column, end_line, end_column; - CXSourceRange remove_range; - text = clang_getDiagnosticFixItReplacement(Diagnostic, i,&remove_range); - clang_getInstantiationLocation(clang_getRangeStart(remove_range), - &start_file, &start_line, &start_column, - 0); - clang_getInstantiationLocation(clang_getRangeEnd(remove_range), - &end_file, &end_line, &end_column, 0); - if (start_file == end_file) { - fprintf(out, "FIX-IT: Replace "); - PrintExtent(out, start_line, start_column, end_line, end_column); - fprintf(out, " with \"%s\"\n", clang_getCString(text)); - } - clang_disposeString(text); - break; + num_fixits = clang_getDiagnosticNumFixIts(Diagnostic); + for (i = 0; i != num_fixits; ++i) { + CXSourceRange range; + CXString insertion_text = clang_getDiagnosticFixIt(Diagnostic, i, &range); + CXSourceLocation start = clang_getRangeStart(range); + CXSourceLocation end = clang_getRangeEnd(range); + unsigned start_line, start_column, end_line, end_column; + CXFile start_file, end_file; + clang_getInstantiationLocation(start, &start_file, &start_line, + &start_column, 0); + clang_getInstantiationLocation(end, &end_file, &end_line, &end_column, 0); + if (clang_equalLocations(start, end)) { + /* Insertion. */ + if (start_file == file) + fprintf(out, "FIX-IT: Insert \"%s\" at %d:%d\n", + clang_getCString(insertion_text), start_line, start_column); + } else if (strcmp(clang_getCString(insertion_text), "") == 0) { + /* Removal. */ + if (start_file == file && end_file == file) { + fprintf(out, "FIX-IT: Remove "); + PrintExtent(out, start_line, start_column, end_line, end_column); + fprintf(out, "\n"); } + } else { + /* Replacement. */ + if (start_file == end_file) { + fprintf(out, "FIX-IT: Replace "); + PrintExtent(out, start_line, start_column, end_line, end_column); + fprintf(out, " with \"%s\"\n", clang_getCString(insertion_text)); } + break; } + clang_disposeString(insertion_text); + } +} + +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); } } @@ -316,7 +270,7 @@ static void PrintCursorExtent(CXCursor C) { CXSourceRange extent = clang_getCursorExtent(C); CXFile begin_file, end_file; unsigned begin_line, begin_column, end_line, end_column; - + clang_getInstantiationLocation(clang_getRangeStart(extent), &begin_file, &begin_line, &begin_column, 0); clang_getInstantiationLocation(clang_getRangeEnd(extent), @@ -335,7 +289,7 @@ typedef struct { } VisitorData; -enum CXChildVisitResult FilteredPrintingVisitor(CXCursor Cursor, +enum CXChildVisitResult FilteredPrintingVisitor(CXCursor Cursor, CXCursor Parent, CXClientData ClientData) { VisitorData *Data = (VisitorData *)ClientData; @@ -347,14 +301,14 @@ enum CXChildVisitResult FilteredPrintingVisitor(CXCursor Cursor, GetCursorSource(Cursor), line, column); PrintCursor(Cursor); PrintCursorExtent(Cursor); - printf("\n"); + printf("\n"); return CXChildVisit_Recurse; } - + return CXChildVisit_Continue; } -static enum CXChildVisitResult FunctionScanVisitor(CXCursor Cursor, +static enum CXChildVisitResult FunctionScanVisitor(CXCursor Cursor, CXCursor Parent, CXClientData ClientData) { const char *startBuf, *endBuf; @@ -376,19 +330,20 @@ static enum CXChildVisitResult FunctionScanVisitor(CXCursor Cursor, while (startBuf < endBuf) { CXSourceLocation Loc; CXFile file; - const char *source = 0; - + CXString source; + if (*startBuf == '\n') { startBuf++; curLine++; curColumn = 1; } else if (*startBuf != '\t') curColumn++; - + Loc = clang_getCursorLocation(Cursor); clang_getInstantiationLocation(Loc, &file, 0, 0, 0); + source = clang_getFileName(file); - if (source) { + if (clang_getCString(source)) { CXSourceLocation RefLoc = clang_getLocation(Data->TU, file, curLine, curColumn); Ref = clang_getCursor(Data->TU, RefLoc); @@ -401,9 +356,10 @@ static enum CXChildVisitResult FunctionScanVisitor(CXCursor Cursor, printf("\n"); } } + clang_disposeString(source); startBuf++; } - + return CXChildVisit_Continue; } @@ -416,18 +372,19 @@ enum CXChildVisitResult USRVisitor(CXCursor C, CXCursor parent, VisitorData *Data = (VisitorData *)ClientData; if (!Data->Filter || (C.kind == *(enum CXCursorKind *)Data->Filter)) { CXString USR = clang_getCursorUSR(C); - if (!USR.Spelling) { + if (!clang_getCString(USR)) { clang_disposeString(USR); return CXChildVisit_Continue; } - printf("// %s: %s %s", FileCheckPrefix, GetCursorSource(C), USR.Spelling); + printf("// %s: %s %s", FileCheckPrefix, GetCursorSource(C), + clang_getCString(USR)); PrintCursorExtent(C); printf("\n"); clang_disposeString(USR); - + return CXChildVisit_Recurse; - } - + } + return CXChildVisit_Continue; } @@ -437,21 +394,55 @@ enum CXChildVisitResult USRVisitor(CXCursor C, CXCursor parent, void InclusionVisitor(CXFile includedFile, CXSourceLocation *includeStack, unsigned includeStackLen, CXClientData data) { - + unsigned i; - printf("file: %s\nincluded by:\n", clang_getFileName(includedFile)); + CXString fname; + + fname = clang_getFileName(includedFile); + printf("file: %s\nincluded by:\n", clang_getCString(fname)); + clang_disposeString(fname); + for (i = 0; i < includeStackLen; ++i) { CXFile includingFile; unsigned line, column; clang_getInstantiationLocation(includeStack[i], &includingFile, &line, &column, 0); - printf(" %s:%d:%d\n", clang_getFileName(includingFile), line, column); + fname = clang_getFileName(includingFile); + printf(" %s:%d:%d\n", clang_getCString(fname), line, column); + clang_disposeString(fname); } printf("\n"); } void PrintInclusionStack(CXTranslationUnit TU) { - clang_getInclusions(TU, InclusionVisitor, NULL); + clang_getInclusions(TU, InclusionVisitor, NULL); +} + +/******************************************************************************/ +/* Linkage testing. */ +/******************************************************************************/ + +static enum CXChildVisitResult PrintLinkage(CXCursor cursor, CXCursor p, + CXClientData d) { + const char *linkage = 0; + + if (clang_isInvalid(clang_getCursorKind(cursor))) + return CXChildVisit_Recurse; + + switch (clang_getCursorLinkage(cursor)) { + case CXLinkage_Invalid: break; + case CXLinkage_NoLinkage: linkage = "NoLinkage"; + case CXLinkage_Internal: linkage = "Internal"; + case CXLinkage_UniqueExternal: linkage = "UniqueExternal"; + case CXLinkage_External: linkage = "External"; + } + + if (linkage) { + PrintCursor(cursor); + printf("linkage=%s\n", linkage); + } + + return CXChildVisit_Recurse; } /******************************************************************************/ @@ -462,15 +453,15 @@ static int perform_test_load(CXIndex Idx, CXTranslationUnit TU, const char *filter, const char *prefix, CXCursorVisitor Visitor, PostVisitTU PV) { - + if (prefix) - FileCheckPrefix = prefix; + FileCheckPrefix = prefix; if (Visitor) { enum CXCursorKind K = CXCursor_NotImplemented; enum CXCursorKind *ck = &K; VisitorData Data; - + /* Perform some simple filtering. */ if (!strcmp(filter, "all") || !strcmp(filter, "local")) ck = NULL; else if (!strcmp(filter, "none")) K = (enum CXCursorKind) ~0; @@ -484,15 +475,16 @@ static int perform_test_load(CXIndex Idx, CXTranslationUnit TU, fprintf(stderr, "Unknown filter for -test-load-tu: %s\n", filter); return 1; } - + Data.TU = TU; Data.Filter = ck; clang_visitChildren(clang_getTranslationUnitCursor(TU), Visitor, &Data); } - + if (PV) PV(TU); + PrintDiagnostics(TU); clang_disposeTranslationUnit(TU); return 0; } @@ -503,9 +495,10 @@ int perform_test_load_tu(const char *file, const char *filter, CXIndex Idx; CXTranslationUnit TU; int result; - Idx = clang_createIndex(/* excludeDeclsFromPCH */ - !strcmp(filter, "local") ? 1 : 0); - + Idx = clang_createIndex(/* excludeDeclsFromPCH */ + !strcmp(filter, "local") ? 1 : 0, + /* displayDiagnosics=*/1); + if (!CreateTranslationUnit(Idx, file, &TU)) { clang_disposeIndex(Idx); return 1; @@ -526,9 +519,10 @@ int perform_test_load_source(int argc, const char **argv, struct CXUnsavedFile *unsaved_files = 0; int num_unsaved_files = 0; int result; - + Idx = clang_createIndex(/* excludeDeclsFromPCH */ - !strcmp(filter, "local") ? 1 : 0); + !strcmp(filter, "local") ? 1 : 0, + /* displayDiagnosics=*/1); if (UseExternalASTs && strlen(UseExternalASTs)) clang_setUseExternalASTGeneration(Idx, 1); @@ -538,13 +532,11 @@ int perform_test_load_source(int argc, const char **argv, return -1; } - TU = clang_createTranslationUnitFromSourceFile(Idx, 0, - argc - num_unsaved_files, + TU = clang_createTranslationUnitFromSourceFile(Idx, 0, + 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); @@ -583,20 +575,21 @@ static int perform_file_scan(const char *ast_file, const char *source_file, CXFile file; unsigned line = 1, col = 1; unsigned start_line = 1, start_col = 1; - - if (!(Idx = clang_createIndex(/* excludeDeclsFromPCH */ 1))) { + + if (!(Idx = clang_createIndex(/* excludeDeclsFromPCH */ 1, + /* displayDiagnosics=*/1))) { fprintf(stderr, "Could not create Index\n"); return 1; } - + if (!CreateTranslationUnit(Idx, ast_file, &TU)) return 1; - + if ((fp = fopen(source_file, "r")) == NULL) { fprintf(stderr, "Could not open '%s'\n", source_file); return 1; } - + file = clang_getFile(TU, source_file); for (;;) { CXCursor cursor; @@ -624,7 +617,7 @@ static int perform_file_scan(const char *ast_file, const char *source_file, prevCursor = cursor; } - + fclose(fp); return 0; } @@ -636,7 +629,7 @@ static int perform_file_scan(const char *ast_file, const char *source_file, /* Parse file:line:column from the input string. Returns 0 on success, non-zero on failure. If successful, the pointer *filename will contain newly-allocated memory (that will be owned by the caller) to store the file name. */ -int parse_file_line_column(const char *input, char **filename, unsigned *line, +int parse_file_line_column(const char *input, char **filename, unsigned *line, unsigned *column, unsigned *second_line, unsigned *second_column) { /* Find the second colon. */ @@ -660,11 +653,11 @@ int parse_file_line_column(const char *input, char **filename, unsigned *line, /* Parse the next line or column. */ values[num_values - i - 1] = strtol(last_colon + 1, &endptr, 10); if (*endptr != 0 && *endptr != ':') { - fprintf(stderr, "could not parse %s in '%s'\n", + fprintf(stderr, "could not parse %s in '%s'\n", (i % 2 ? "column" : "line"), input); return 1; } - + if (i + 1 == num_values) break; @@ -673,9 +666,9 @@ int parse_file_line_column(const char *input, char **filename, unsigned *line, while (prev_colon != input && *prev_colon != ':') --prev_colon; if (prev_colon == input) { - fprintf(stderr, "could not parse %s in '%s'\n", + fprintf(stderr, "could not parse %s in '%s'\n", (i % 2 == 0? "column" : "line"), input); - return 1; + return 1; } last_colon = prev_colon; @@ -683,7 +676,7 @@ int parse_file_line_column(const char *input, char **filename, unsigned *line, *line = values[0]; *column = values[1]; - + if (second_line && second_column) { *second_line = values[2]; *second_column = values[3]; @@ -721,40 +714,47 @@ clang_getCompletionChunkKindSpelling(enum CXCompletionChunkKind Kind) { case CXCompletionChunk_HorizontalSpace: return "HorizontalSpace"; case CXCompletionChunk_VerticalSpace: return "VerticalSpace"; } - + return "Unknown"; } void print_completion_string(CXCompletionString completion_string, FILE *file) { int I, N; - + N = clang_getNumCompletionChunks(completion_string); for (I = 0; I != N; ++I) { - const char *text = 0; + CXString text; + const char *cstr; enum CXCompletionChunkKind Kind = clang_getCompletionChunkKind(completion_string, I); - + if (Kind == CXCompletionChunk_Optional) { fprintf(file, "{Optional "); print_completion_string( - clang_getCompletionChunkCompletionString(completion_string, I), + clang_getCompletionChunkCompletionString(completion_string, I), file); fprintf(file, "}"); continue; } - + text = clang_getCompletionChunkText(completion_string, I); - fprintf(file, "{%s %s}", + cstr = clang_getCString(text); + fprintf(file, "{%s %s}", clang_getCompletionChunkKindSpelling(Kind), - text? text : ""); + cstr ? cstr : ""); + clang_disposeString(text); } + } void print_completion_result(CXCompletionResult *completion_result, CXClientData client_data) { FILE *file = (FILE *)client_data; - fprintf(file, "%s:", - clang_getCursorKindSpelling(completion_result->CursorKind)); + CXString ks = clang_getCursorKindSpelling(completion_result->CursorKind); + + fprintf(file, "%s:", clang_getCString(ks)); + clang_disposeString(ks); + print_completion_string(completion_result->CompletionString, file); fprintf(file, "\n"); } @@ -771,31 +771,36 @@ int perform_code_completion(int argc, const char **argv) { CXCodeCompleteResults *results = 0; input += strlen("-code-completion-at="); - if ((errorCode = parse_file_line_column(input, &filename, &line, &column, + if ((errorCode = parse_file_line_column(input, &filename, &line, &column, 0, 0))) return errorCode; if (parse_remapped_files(argc, argv, 2, &unsaved_files, &num_unsaved_files)) return -1; - CIdx = clang_createIndex(0); - results = clang_codeComplete(CIdx, - argv[argc - 1], argc - num_unsaved_files - 3, - argv + num_unsaved_files + 2, + CIdx = clang_createIndex(0, 1); + results = clang_codeComplete(CIdx, + 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); } clang_disposeIndex(CIdx); free(filename); - + free_remapped_files(unsaved_files, num_unsaved_files); return 0; @@ -817,52 +822,51 @@ int inspect_cursor_at(int argc, const char **argv) { CursorSourceLocation *Locations = 0; unsigned NumLocations = 0, Loc; - /* Count the number of locations. */ + /* Count the number of locations. */ while (strstr(argv[NumLocations+1], "-cursor-at=") == argv[NumLocations+1]) ++NumLocations; - + /* Parse the locations. */ assert(NumLocations > 0 && "Unable to count locations?"); Locations = (CursorSourceLocation *)malloc( NumLocations * sizeof(CursorSourceLocation)); for (Loc = 0; Loc < NumLocations; ++Loc) { const char *input = argv[Loc + 1] + strlen("-cursor-at="); - if ((errorCode = parse_file_line_column(input, &Locations[Loc].filename, - &Locations[Loc].line, + if ((errorCode = parse_file_line_column(input, &Locations[Loc].filename, + &Locations[Loc].line, &Locations[Loc].column, 0, 0))) return errorCode; } - - if (parse_remapped_files(argc, argv, NumLocations + 1, &unsaved_files, + + if (parse_remapped_files(argc, argv, NumLocations + 1, &unsaved_files, &num_unsaved_files)) return -1; - - CIdx = clang_createIndex(0); + + CIdx = clang_createIndex(0, 1); TU = clang_createTranslationUnitFromSourceFile(CIdx, argv[argc - 1], 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; } - + for (Loc = 0; Loc < NumLocations; ++Loc) { CXFile file = clang_getFile(TU, Locations[Loc].filename); if (!file) continue; - - Cursor = clang_getCursor(TU, - clang_getLocation(TU, file, Locations[Loc].line, - Locations[Loc].column)); + + Cursor = clang_getCursor(TU, + clang_getLocation(TU, file, Locations[Loc].line, + Locations[Loc].column)); PrintCursor(Cursor); printf("\n"); free(Locations[Loc].filename); } - + + PrintDiagnostics(TU); clang_disposeTranslationUnit(TU); clang_disposeIndex(CIdx); free(Locations); @@ -896,21 +900,19 @@ int perform_token_annotation(int argc, const char **argv) { if (parse_remapped_files(argc, argv, 2, &unsaved_files, &num_unsaved_files)) return -1; - CIdx = clang_createIndex(0); + CIdx = clang_createIndex(0, 1); TU = clang_createTranslationUnitFromSourceFile(CIdx, argv[argc - 1], 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); free(filename); free_remapped_files(unsaved_files, num_unsaved_files); return -1; - } + } errorCode = 0; file = clang_getFile(TU, filename); @@ -922,18 +924,18 @@ int perform_token_annotation(int argc, const char **argv) { startLoc = clang_getLocation(TU, file, line, column); if (clang_equalLocations(clang_getNullLocation(), startLoc)) { - fprintf(stderr, "invalid source location %s:%d:%d\n", filename, line, + fprintf(stderr, "invalid source location %s:%d:%d\n", filename, line, column); errorCode = -1; - goto teardown; + goto teardown; } endLoc = clang_getLocation(TU, file, second_line, second_column); if (clang_equalLocations(clang_getNullLocation(), endLoc)) { - fprintf(stderr, "invalid source location %s:%d:%d\n", filename, + fprintf(stderr, "invalid source location %s:%d:%d\n", filename, second_line, second_column); errorCode = -1; - goto teardown; + goto teardown; } range = clang_getRange(startLoc, endLoc); @@ -953,7 +955,7 @@ int perform_token_annotation(int argc, const char **argv) { case CXToken_Literal: kind = "Literal"; break; case CXToken_Comment: kind = "Comment"; break; } - clang_getInstantiationLocation(clang_getRangeStart(extent), + clang_getInstantiationLocation(clang_getRangeStart(extent), 0, &start_line, &start_column, 0); clang_getInstantiationLocation(clang_getRangeEnd(extent), 0, &end_line, &end_column, 0); @@ -968,6 +970,7 @@ int perform_token_annotation(int argc, const char **argv) { free(cursors); teardown: + PrintDiagnostics(TU); clang_disposeTranslationUnit(TU); clang_disposeIndex(CIdx); free(filename); @@ -1002,7 +1005,8 @@ static void print_usage(void) { fprintf(stderr, " c-index-test -test-annotate-tokens=<range> {<args>}*\n" " c-index-test -test-inclusion-stack-source {<args>}*\n" - " c-index-test -test-inclusion-stack-tu <AST file>\n\n" + " c-index-test -test-inclusion-stack-tu <AST file>\n" + " c-index-test -test-print-linkage-source {<args>}*\n\n" " <symbol filter> values:\n%s", " all - load all symbols, including those from PCH\n" " local - load all symbols except those in PCH\n" @@ -1015,6 +1019,7 @@ static void print_usage(void) { } int main(int argc, const char **argv) { + clang_enableStackTraces(); if (argc > 2 && strstr(argv[1], "-code-completion-at=") == argv[1]) return perform_code_completion(argc, argv); if (argc > 2 && strstr(argv[1], "-cursor-at=") == argv[1]) @@ -1041,7 +1046,10 @@ int main(int argc, const char **argv) { else if (argc > 2 && strcmp(argv[1], "-test-inclusion-stack-tu") == 0) return perform_test_load_tu(argv[2], "all", NULL, NULL, PrintInclusionStack); - + else if (argc > 2 && strcmp(argv[1], "-test-print-linkage-source") == 0) + return perform_test_load_source(argc - 2, argv + 2, "all", PrintLinkage, + NULL); + print_usage(); return 1; } |