aboutsummaryrefslogtreecommitdiff
path: root/tools/libclang/CIndex.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-09-02 20:35:02 +0000
committerDouglas Gregor <dgregor@apple.com>2010-09-02 20:35:02 +0000
commit8947a7501ee34577a020591d32f701e4b0656cb7 (patch)
treeedd6d4920e4f7582657d82a4de87ca207b3d7240 /tools/libclang/CIndex.cpp
parent159e091e52d579f6b0d18f87b8ad505cac46e8f7 (diff)
Visit the nested-name-specifier and explicitly-specified template
arguments of a DeclRefExpr. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112854 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/libclang/CIndex.cpp')
-rw-r--r--tools/libclang/CIndex.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 89aa92cf7d..6367de34a3 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -369,7 +369,7 @@ public:
// bool VisitSwitchCase(SwitchCase *S);
// Expression visitors
- // FIXME: DeclRefExpr with template arguments, nested-name-specifier
+ bool VisitDeclRefExpr(DeclRefExpr *E);
// FIXME: MemberExpr with template arguments, nested-name-specifier
bool VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
bool VisitBlockExpr(BlockExpr *B);
@@ -1438,6 +1438,29 @@ bool CursorVisitor::VisitForStmt(ForStmt *S) {
return false;
}
+bool CursorVisitor::VisitDeclRefExpr(DeclRefExpr *E) {
+ // Visit nested-name-specifier, if present.
+ if (NestedNameSpecifier *Qualifier = E->getQualifier())
+ if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange()))
+ return true;
+
+ // Visit declaration name.
+ if (VisitDeclarationNameInfo(E->getNameInfo()))
+ return true;
+
+ // Visit explicitly-specified template arguments.
+ if (E->hasExplicitTemplateArgs()) {
+ ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs();
+ for (TemplateArgumentLoc *Arg = Args.getTemplateArgs(),
+ *ArgEnd = Arg + Args.NumTemplateArgs;
+ Arg != ArgEnd; ++Arg)
+ if (VisitTemplateArgumentLoc(*Arg))
+ return true;
+ }
+
+ return false;
+}
+
bool CursorVisitor::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
if (Visit(MakeCXCursor(E->getArg(0), StmtParent, TU)))
return true;