diff options
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
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) { |