From: Ted Kremenek Date: Thu, 18 Nov 2010 00:02:32 +0000 (+0000) Subject: CursorVisitor: migrate handling of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f64d80306144f978148ba92f36f7cea7b671dd34;p=clang CursorVisitor: migrate handling of 'DependentScopeDeclRefExpr' and 'CXXDependentScopeMemberExpr' to the data-recursion algorithm. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119591 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 6b094122f2..1256b6381f 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -138,14 +138,19 @@ public: 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 @@ public: 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 @@ bool CursorVisitor::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 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 @@ class NAME : public VisitorJob {\ 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(dataA); }\ + DATA *get() const { return static_cast(data[0]); }\ }; DEF_JOB(StmtVisit, Stmt, StmtVisitKind) @@ -1625,8 +1573,8 @@ public: static bool classof(const VisitorJob *VJ) { return VJ->getKind() == DeclVisitKind; } - Decl *get() const { return static_cast(dataA); } - bool isFirst() const { return dataB ? true : false; } + Decl *get() const { return static_cast(data[0]); } + bool isFirst() const { return data[1] ? true : false; } }; class TypeLocVisit : public VisitorJob { public: @@ -1639,8 +1587,8 @@ public: } 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 @@ public: static bool classof(const VisitorJob *VJ) { return VJ->getKind() == VisitorJob::LabelRefVisitKind; } - LabelStmt *get() const { return static_cast(dataA); } + LabelStmt *get() const { return static_cast(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(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(data[0]); + switch (S->getStmtClass()) { + default: + llvm_unreachable("Unhandled Stmt"); + case Stmt::CXXDependentScopeMemberExprClass: + return cast(S)->getMemberNameInfo(); + case Stmt::DependentScopeDeclRefExprClass: + return cast(S)->getNameInfo(); + } + } }; class EnqueueVisitor : public StmtVisitor { @@ -1670,6 +1658,7 @@ public: 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 @@ public: 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 @@ public: 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 @@ private: }; } // 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 @@ void EnqueueVisitor::VisitCompoundStmt(CompoundStmt *S) { 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 @@ void EnqueueVisitor::VisitDeclRefExpr(DeclRefExpr *DR) { } 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 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { return true; continue; } + case VisitorJob::NestedNameSpecifierVisitKind: { + NestedNameSpecifierVisit *V = cast(&LI); + if (VisitNestedNameSpecifier(V->get(), V->getSourceRange())) + return true; + continue; + } + case VisitorJob::DeclarationNameInfoVisitKind: { + if (VisitDeclarationNameInfo(cast(&LI) + ->get())) + return true; + continue; + } case VisitorJob::StmtVisitKind: { Stmt *S = cast(&LI)->get(); if (!S) @@ -1975,8 +2004,6 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { case Stmt::OffsetOfExprClass: case Stmt::DesignatedInitExprClass: case Stmt::CXXPseudoDestructorExprClass: - case Stmt::DependentScopeDeclRefExprClass: - case Stmt::CXXDependentScopeMemberExprClass: if (Visit(Cursor)) return true; break;