public:
enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind,
TypeLocVisitKind, OverloadExprPartsKind,
- DeclRefExprPartsKind, LabelRefVisitKind };
+ DeclRefExprPartsKind, LabelRefVisitKind,
+ ExplicitTemplateArgsVisitKind };
protected:
void *dataA;
void *dataB;
DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind)
DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind)
+DEF_JOB(ExplicitTemplateArgsVisit, ExplicitTemplateArgumentList,
+ ExplicitTemplateArgsVisitKind)
#undef DEF_JOB
class DeclVisit : public VisitorJob {
Decl *get() const { return static_cast<Decl*>(dataA); }
bool isFirst() const { return dataB ? true : false; }
};
-
class TypeLocVisit : public VisitorJob {
public:
TypeLocVisit(TypeLoc tl, CXCursor parent) :
void VisitVAArgExpr(VAArgExpr *E);
private:
+ void AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A);
void AddStmt(Stmt *S);
void AddDecl(Decl *D, bool isFirst = true);
void AddTypeLoc(TypeSourceInfo *TI);
if (D)
WL.push_back(DeclVisit(D, Parent, isFirst));
}
+void EnqueueVisitor::
+ AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A) {
+ if (A)
+ WL.push_back(ExplicitTemplateArgsVisit(
+ const_cast<ExplicitTemplateArgumentList*>(A), Parent));
+}
void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) {
if (TI)
WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
AddTypeLoc(E->getTypeSourceInfo());
}
void EnqueueVisitor::VisitDeclRefExpr(DeclRefExpr *DR) {
+ if (DR->hasExplicitTemplateArgs()) {
+ AddExplicitTemplateArgs(&DR->getExplicitTemplateArgs());
+ }
WL.push_back(DeclRefExprParts(DR, Parent));
}
void EnqueueVisitor::VisitDeclStmt(DeclStmt *S) {
AddTypeLoc(M->getClassReceiverTypeInfo());
}
void EnqueueVisitor::VisitOverloadExpr(OverloadExpr *E) {
+ AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
WL.push_back(OverloadExprParts(E, Parent));
}
void EnqueueVisitor::VisitStmt(Stmt *S) {
continue;
}
+ case VisitorJob::ExplicitTemplateArgsVisitKind: {
+ const ExplicitTemplateArgumentList *ArgList =
+ cast<ExplicitTemplateArgsVisit>(&LI)->get();
+ for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
+ *ArgEnd = Arg + ArgList->NumTemplateArgs;
+ Arg != ArgEnd; ++Arg) {
+ if (VisitTemplateArgumentLoc(*Arg))
+ return true;
+ }
+ continue;
+ }
case VisitorJob::TypeLocVisitKind: {
// Perform default visitation for TypeLocs.
if (Visit(cast<TypeLocVisit>(&LI)->get()))
// Visit declaration name.
if (VisitDeclarationNameInfo(DR->getNameInfo()))
return true;
- // Visit explicitly-specified template arguments.
- if (DR->hasExplicitTemplateArgs()) {
- ExplicitTemplateArgumentList &Args = DR->getExplicitTemplateArgs();
- for (TemplateArgumentLoc *Arg = Args.getTemplateArgs(),
- *ArgEnd = Arg + Args.NumTemplateArgs;
- Arg != ArgEnd; ++Arg)
- if (VisitTemplateArgumentLoc(*Arg))
- return true;
- }
continue;
}
case VisitorJob::OverloadExprPartsKind: {
// Visit the overloaded declaration reference.
if (Visit(MakeCursorOverloadedDeclRef(O, TU)))
return true;
- // Visit the explicitly-specified template arguments.
- if (const ExplicitTemplateArgumentList *ArgList
- = O->getOptionalExplicitTemplateArgs()) {
- for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
- *ArgEnd = Arg + ArgList->NumTemplateArgs;
- Arg != ArgEnd; ++Arg) {
- if (VisitTemplateArgumentLoc(*Arg))
- return true;
- }
- }
continue;
}
}