[libclang] Make clang_annotateTokens use "file-targeted" deserialization and avoid
unnecessary deserializations.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144792 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 25d0c5b..42adfa1 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -315,6 +315,14 @@
assert(CompRes == RangeOverlap);
VisitedAtLeastOnce = true;
+
+ if (isa<ObjCContainerDecl>(D)) {
+ FileDI_current = &DIt;
+ FileDE_current = DE;
+ } else {
+ FileDI_current = 0;
+ }
+
if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
break;
}
@@ -838,6 +846,27 @@
return false;
}
+template <typename DeclIt>
+static void addRangedDeclsInContainer(DeclIt *DI_current, DeclIt DE_current,
+ SourceManager &SM, SourceLocation EndLoc,
+ SmallVectorImpl<Decl *> &Decls) {
+ DeclIt next = *DI_current;
+ while (++next != DE_current) {
+ Decl *D_next = *next;
+ if (!D_next)
+ break;
+ SourceLocation L = D_next->getLocStart();
+ if (!L.isValid())
+ break;
+ if (SM.isBeforeInTranslationUnit(L, EndLoc)) {
+ *DI_current = next;
+ Decls.push_back(D_next);
+ continue;
+ }
+ break;
+ }
+}
+
namespace {
struct ContainerDeclsSort {
SourceManager &SM;
@@ -856,7 +885,7 @@
// an @implementation can lexically contain Decls that are not properly
// nested in the AST. When we identify such cases, we need to retrofit
// this nesting here.
- if (!DI_current)
+ if (!DI_current && !FileDI_current)
return VisitDeclContext(D);
// Scan the Decls that immediately come after the container
@@ -867,20 +896,12 @@
SourceLocation EndLoc = D->getSourceRange().getEnd();
SourceManager &SM = AU->getSourceManager();
if (EndLoc.isValid()) {
- DeclContext::decl_iterator next = *DI_current;
- while (++next != DE_current) {
- Decl *D_next = *next;
- if (!D_next)
- break;
- SourceLocation L = D_next->getLocStart();
- if (!L.isValid())
- break;
- if (SM.isBeforeInTranslationUnit(L, EndLoc)) {
- *DI_current = next;
- DeclsInContainer.push_back(D_next);
- continue;
- }
- break;
+ if (DI_current) {
+ addRangedDeclsInContainer(DI_current, DE_current, SM, EndLoc,
+ DeclsInContainer);
+ } else {
+ addRangedDeclsInContainer(FileDI_current, FileDE_current, SM, EndLoc,
+ DeclsInContainer);
}
}
@@ -4517,10 +4538,7 @@
void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
- void AnnotateTokens(CXCursor parent);
- void AnnotateTokens() {
- AnnotateTokens(clang_getTranslationUnitCursor(AnnotateVis.getTU()));
- }
+ void AnnotateTokens();
/// \brief Determine whether the annotator saw any cursors that have
/// context-sensitive keywords.
@@ -4530,10 +4548,10 @@
};
}
-void AnnotateTokensWorker::AnnotateTokens(CXCursor parent) {
+void AnnotateTokensWorker::AnnotateTokens() {
// Walk the AST within the region of interest, annotating tokens
// along the way.
- VisitChildren(parent);
+ AnnotateVis.visitFileRegion();
for (unsigned I = 0 ; I < TokIdx ; ++I) {
AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]);
@@ -4549,6 +4567,9 @@
const CXCursor &C = clang_getNullCursor();
for (unsigned I = TokIdx ; I < NumTokens ; ++I) {
+ if (I < PreprocessingTokIdx && clang_isPreprocessing(Cursors[I].kind))
+ continue;
+
AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]);
Cursors[I] = (Pos == Annotated.end()) ? C : Pos->second;
}