[llvm-branch-commits] [cfe-branch] r119667 - /cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp
Daniel Dunbar
daniel at zuster.org
Wed Nov 17 18:38:22 PST 2010
Author: ddunbar
Date: Wed Nov 17 20:38:22 2010
New Revision: 119667
URL: http://llvm.org/viewvc/llvm-project?rev=119667&view=rev
Log:
Merge r119591:
--
Author: Ted Kremenek <kremenek at apple.com>
Date: Thu Nov 18 00:02:32 2010 +0000
CursorVisitor: migrate handling of
'DependentScopeDeclRefExpr' and
'CXXDependentScopeMemberExpr' to the
data-recursion algorithm.
Modified:
cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp
Modified: cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp?rev=119667&r1=119666&r2=119667&view=diff
==============================================================================
--- cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp (original)
+++ cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp Wed Nov 17 20:38:22 2010
@@ -138,14 +138,19 @@
enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind,
TypeLocVisitKind, OverloadExprPartsKind,
DeclRefExprPartsKind, LabelRefVisitKind,
- ExplicitTemplateArgsVisitKind };
+ ExplicitTemplateArgsVisitKind,
+ NestedNameSpecifierVisitKind,
+ DeclarationNameInfoVisitKind };
protected:
- void *dataA;
- void *dataB;
+ void *data[3];
CXCursor parent;
Kind K;
- VisitorJob(CXCursor C, Kind k, void *d1, void *d2 = 0)
- : dataA(d1), dataB(d2), parent(C), K(k) {}
+ VisitorJob(CXCursor C, Kind k, void *d1, void *d2 = 0, void *d3 = 0)
+ : parent(C), K(k) {
+ data[0] = d1;
+ data[1] = d2;
+ data[2] = d3;
+ }
public:
Kind getKind() const { return K; }
const CXCursor &getParent() const { return parent; }
@@ -342,8 +347,6 @@
bool VisitOffsetOfExpr(OffsetOfExpr *E);
bool VisitDesignatedInitExpr(DesignatedInitExpr *E);
bool VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
- bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
- bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
// Data-recursive visitor functions.
bool IsInRegionOfInterest(CXCursor C);
@@ -1532,61 +1535,6 @@
return false;
}
-bool CursorVisitor::VisitDependentScopeDeclRefExpr(
- DependentScopeDeclRefExpr *E) {
- // Visit the nested-name-specifier.
- if (NestedNameSpecifier *Qualifier = E->getQualifier())
- if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange()))
- return true;
-
- // Visit the declaration name.
- if (VisitDeclarationNameInfo(E->getNameInfo()))
- return true;
-
- // Visit the explicitly-specified template arguments.
- if (const ExplicitTemplateArgumentList *ArgList
- = E->getOptionalExplicitTemplateArgs()) {
- for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
- *ArgEnd = Arg + ArgList->NumTemplateArgs;
- Arg != ArgEnd; ++Arg) {
- if (VisitTemplateArgumentLoc(*Arg))
- return true;
- }
- }
-
- return false;
-}
-
-bool CursorVisitor::VisitCXXDependentScopeMemberExpr(
- CXXDependentScopeMemberExpr *E) {
- // Visit the base expression, if there is one.
- if (!E->isImplicitAccess() &&
- Visit(MakeCXCursor(E->getBase(), StmtParent, TU)))
- return true;
-
- // Visit the nested-name-specifier.
- if (NestedNameSpecifier *Qualifier = E->getQualifier())
- if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange()))
- return true;
-
- // Visit the declaration name.
- if (VisitDeclarationNameInfo(E->getMemberNameInfo()))
- return true;
-
- // Visit the explicitly-specified template arguments.
- if (const ExplicitTemplateArgumentList *ArgList
- = E->getOptionalExplicitTemplateArgs()) {
- for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
- *ArgEnd = Arg + ArgList->NumTemplateArgs;
- Arg != ArgEnd; ++Arg) {
- if (VisitTemplateArgumentLoc(*Arg))
- return true;
- }
- }
-
- return false;
-}
-
bool CursorVisitor::VisitAttributes(Decl *D) {
for (AttrVec::const_iterator i = D->attr_begin(), e = D->attr_end();
i != e; ++i)
@@ -1606,7 +1554,7 @@
public:\
NAME(DATA *d, CXCursor parent) : VisitorJob(parent, VisitorJob::KIND, d) {} \
static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\
- DATA *get() const { return static_cast<DATA*>(dataA); }\
+ DATA *get() const { return static_cast<DATA*>(data[0]); }\
};
DEF_JOB(StmtVisit, Stmt, StmtVisitKind)
@@ -1625,8 +1573,8 @@
static bool classof(const VisitorJob *VJ) {
return VJ->getKind() == DeclVisitKind;
}
- Decl *get() const { return static_cast<Decl*>(dataA); }
- bool isFirst() const { return dataB ? true : false; }
+ Decl *get() const { return static_cast<Decl*>(data[0]); }
+ bool isFirst() const { return data[1] ? true : false; }
};
class TypeLocVisit : public VisitorJob {
public:
@@ -1639,8 +1587,8 @@
}
TypeLoc get() const {
- QualType T = QualType::getFromOpaquePtr(dataA);
- return TypeLoc(T, dataB);
+ QualType T = QualType::getFromOpaquePtr(data[0]);
+ return TypeLoc(T, data[1]);
}
};
@@ -1653,9 +1601,49 @@
static bool classof(const VisitorJob *VJ) {
return VJ->getKind() == VisitorJob::LabelRefVisitKind;
}
- LabelStmt *get() const { return static_cast<LabelStmt*>(dataA); }
+ LabelStmt *get() const { return static_cast<LabelStmt*>(data[0]); }
SourceLocation getLoc() const {
- return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) dataB); }
+ return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]); }
+};
+class NestedNameSpecifierVisit : public VisitorJob {
+public:
+ NestedNameSpecifierVisit(NestedNameSpecifier *NS, SourceRange R,
+ CXCursor parent)
+ : VisitorJob(parent, VisitorJob::NestedNameSpecifierVisitKind,
+ NS, (void*) R.getBegin().getRawEncoding(),
+ (void*) R.getEnd().getRawEncoding()) {}
+ static bool classof(const VisitorJob *VJ) {
+ return VJ->getKind() == VisitorJob::NestedNameSpecifierVisitKind;
+ }
+ NestedNameSpecifier *get() const {
+ return static_cast<NestedNameSpecifier*>(data[0]);
+ }
+ SourceRange getSourceRange() const {
+ SourceLocation A =
+ SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]);
+ SourceLocation B =
+ SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[2]);
+ return SourceRange(A, B);
+ }
+};
+class DeclarationNameInfoVisit : public VisitorJob {
+public:
+ DeclarationNameInfoVisit(Stmt *S, CXCursor parent)
+ : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {}
+ static bool classof(const VisitorJob *VJ) {
+ return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind;
+ }
+ DeclarationNameInfo get() const {
+ Stmt *S = static_cast<Stmt*>(data[0]);
+ switch (S->getStmtClass()) {
+ default:
+ llvm_unreachable("Unhandled Stmt");
+ case Stmt::CXXDependentScopeMemberExprClass:
+ return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo();
+ case Stmt::DependentScopeDeclRefExprClass:
+ return cast<DependentScopeDeclRefExpr>(S)->getNameInfo();
+ }
+ }
};
class EnqueueVisitor : public StmtVisitor<EnqueueVisitor, void> {
@@ -1670,6 +1658,7 @@
void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
void VisitCompoundStmt(CompoundStmt *S);
void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { /* Do nothing. */ }
+ void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
void VisitCXXNewExpr(CXXNewExpr *E);
void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
@@ -1679,6 +1668,7 @@
void VisitCXXUuidofExpr(CXXUuidofExpr *E);
void VisitDeclRefExpr(DeclRefExpr *D);
void VisitDeclStmt(DeclStmt *S);
+ void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
void VisitExplicitCastExpr(ExplicitCastExpr *E);
void VisitForStmt(ForStmt *FS);
void VisitGotoStmt(GotoStmt *GS);
@@ -1698,6 +1688,8 @@
void VisitVAArgExpr(VAArgExpr *E);
private:
+ void AddDeclarationNameInfo(Stmt *S);
+ void AddNestedNameSpecifier(NestedNameSpecifier *NS, SourceRange R);
void AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A);
void AddStmt(Stmt *S);
void AddDecl(Decl *D, bool isFirst = true);
@@ -1706,6 +1698,16 @@
};
} // end anonyous namespace
+void EnqueueVisitor::AddDeclarationNameInfo(Stmt *S) {
+ // 'S' should always be non-null, since it comes from the
+ // statement we are visiting.
+ WL.push_back(DeclarationNameInfoVisit(S, Parent));
+}
+void EnqueueVisitor::AddNestedNameSpecifier(NestedNameSpecifier *N,
+ SourceRange R) {
+ if (N)
+ WL.push_back(NestedNameSpecifierVisit(N, R, Parent));
+}
void EnqueueVisitor::AddStmt(Stmt *S) {
if (S)
WL.push_back(StmtVisit(S, Parent));
@@ -1753,6 +1755,15 @@
AddStmt(*I);
}
}
+void EnqueueVisitor::
+VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) {
+ AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
+ AddDeclarationNameInfo(E);
+ if (NestedNameSpecifier *Qualifier = E->getQualifier())
+ AddNestedNameSpecifier(Qualifier, E->getQualifierRange());
+ if (!E->isImplicitAccess())
+ AddStmt(E->getBase());
+}
void EnqueueVisitor::VisitCXXNewExpr(CXXNewExpr *E) {
// Enqueue the initializer or constructor arguments.
for (unsigned I = E->getNumConstructorArgs(); I > 0; --I)
@@ -1800,6 +1811,12 @@
}
WL.push_back(DeclRefExprParts(DR, Parent));
}
+void EnqueueVisitor::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
+ AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
+ AddDeclarationNameInfo(E);
+ if (NestedNameSpecifier *Qualifier = E->getQualifier())
+ AddNestedNameSpecifier(Qualifier, E->getQualifierRange());
+}
void EnqueueVisitor::VisitDeclStmt(DeclStmt *S) {
unsigned size = WL.size();
bool isFirst = true;
@@ -1961,6 +1978,18 @@
return true;
continue;
}
+ case VisitorJob::NestedNameSpecifierVisitKind: {
+ NestedNameSpecifierVisit *V = cast<NestedNameSpecifierVisit>(&LI);
+ if (VisitNestedNameSpecifier(V->get(), V->getSourceRange()))
+ return true;
+ continue;
+ }
+ case VisitorJob::DeclarationNameInfoVisitKind: {
+ if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI)
+ ->get()))
+ return true;
+ continue;
+ }
case VisitorJob::StmtVisitKind: {
Stmt *S = cast<StmtVisit>(&LI)->get();
if (!S)
@@ -1975,8 +2004,6 @@
case Stmt::OffsetOfExprClass:
case Stmt::DesignatedInitExprClass:
case Stmt::CXXPseudoDestructorExprClass:
- case Stmt::DependentScopeDeclRefExprClass:
- case Stmt::CXXDependentScopeMemberExprClass:
if (Visit(Cursor))
return true;
break;
More information about the llvm-branch-commits
mailing list