summaryrefslogtreecommitdiffstats
path: root/clang/tools
diff options
context:
space:
mode:
Diffstat (limited to 'clang/tools')
-rw-r--r--clang/tools/c-index-test/c-index-test.c14
-rw-r--r--clang/tools/libclang/CIndex.cpp41
-rw-r--r--clang/tools/libclang/libclang.exports2
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
OpenPOWER on IntegriCloud