diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-12-05 08:19:32 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-12-05 08:19:32 +0000 |
commit | 9ef5775a949d2c78ba01169d0eca962f5d7c1ae7 (patch) | |
tree | b5449b4ac390544b73b20cb0b3864dab91a40150 /clang/tools | |
parent | 011e6a5f44f7085279da2afde76f7041825b8b88 (diff) | |
download | bcm5719-llvm-9ef5775a949d2c78ba01169d0eca962f5d7c1ae7.tar.gz bcm5719-llvm-9ef5775a949d2c78ba01169d0eca962f5d7c1ae7.zip |
[libclang] Record ranges skipped by the preprocessor and expose them with libclang.
Patch by Erik Verbruggen!
llvm-svn: 196487
Diffstat (limited to 'clang/tools')
-rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 14 | ||||
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 41 | ||||
-rw-r--r-- | clang/tools/libclang/libclang.exports | 2 |
3 files changed, 57 insertions, 0 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 58eb0def3e3..40794308065 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -3183,6 +3183,7 @@ int perform_token_annotation(int argc, const char **argv) { CXSourceLocation startLoc, endLoc; CXFile file = 0; CXCursor *cursors = 0; + CXSkippedRanges *skipped_ranges = 0; unsigned i; input += strlen("-test-annotate-tokens="); @@ -3271,6 +3272,19 @@ int perform_token_annotation(int argc, const char **argv) { goto teardown; } + skipped_ranges = clang_getSkippedRanges(TU, file); + for (i = 0; i != skipped_ranges->count; ++i) { + unsigned start_line, start_column, end_line, end_column; + clang_getSpellingLocation(clang_getRangeStart(skipped_ranges->ranges[i]), + 0, &start_line, &start_column, 0); + clang_getSpellingLocation(clang_getRangeEnd(skipped_ranges->ranges[i]), + 0, &end_line, &end_column, 0); + printf("Skipping: "); + PrintExtent(stdout, start_line, start_column, end_line, end_column); + printf("\n"); + } + clang_disposeSkippedRanges(skipped_ranges); + for (i = 0; i != num_tokens; ++i) { const char *kind = "<unknown>"; CXString spelling = clang_getTokenSpelling(TU, tokens[i]); diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 656fbd1b1b7..c8bff739356 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -6494,6 +6494,47 @@ void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) { delete (MemUsageEntries*) usage.data; } +CXSkippedRanges *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) { + CXSkippedRanges *skipped = new CXSkippedRanges; + skipped->count = 0; + skipped->ranges = 0; + + if (!file) + return skipped; + + ASTUnit *astUnit = cxtu::getASTUnit(TU); + PreprocessingRecord *ppRec = astUnit->getPreprocessor().getPreprocessingRecord(); + if (!ppRec) + return skipped; + + ASTContext &Ctx = astUnit->getASTContext(); + SourceManager &sm = Ctx.getSourceManager(); + FileEntry *fileEntry = static_cast<FileEntry *>(file); + FileID wantedFileID = sm.translateFile(fileEntry); + + const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges(); + std::vector<SourceRange> wantedRanges; + for (std::vector<SourceRange>::const_iterator i = SkippedRanges.begin(), ei = SkippedRanges.end(); + i != ei; ++i) { + if (sm.getFileID(i->getBegin()) == wantedFileID || sm.getFileID(i->getEnd()) == wantedFileID) + wantedRanges.push_back(*i); + } + + skipped->count = wantedRanges.size(); + skipped->ranges = new CXSourceRange[skipped->count]; + for (unsigned i = 0, ei = skipped->count; i != ei; ++i) + skipped->ranges[i] = cxloc::translateSourceRange(Ctx, wantedRanges[i]); + + return skipped; +} + +void clang_disposeSkippedRanges(CXSkippedRanges *skipped) { + if (skipped) { + delete[] skipped->ranges; + delete skipped; + } +} + } // end extern "C" void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) { diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index 9bf26c979d2..896228ad3c5 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -101,6 +101,7 @@ clang_disposeDiagnosticSet clang_disposeIndex clang_disposeOverriddenCursors clang_disposeCXPlatformAvailability +clang_disposeSkippedRanges clang_disposeString clang_disposeTokens clang_disposeTranslationUnit @@ -207,6 +208,7 @@ clang_getRangeStart clang_getRemappings clang_getRemappingsFromFileList clang_getResultType +clang_getSkippedRanges clang_getSpecializedCursorTemplate clang_getSpellingLocation clang_getTUResourceUsageName |