bool UnnecessaryIncludeFinder::VisitTemplateSpecializationTypeLoc ( TemplateSpecializationTypeLoc typeLoc) { CXXRecordDecl* pCXXRecordDecl = typeLoc.getTypePtr()->getAsCXXRecordDecl(); if (pCXXRecordDecl) { markUsed(pCXXRecordDecl->getLocation(), typeLoc.getTemplateNameLoc()); } return true; }
bool RemoveNamespaceRewriteVisitor::VisitTemplateSpecializationTypeLoc( TemplateSpecializationTypeLoc TSPLoc) { const Type *Ty = TSPLoc.getTypePtr(); const TemplateSpecializationType *TST = dyn_cast<TemplateSpecializationType>(Ty); TransAssert(TST && "Bad TemplateSpecializationType!"); TemplateName TplName = TST->getTemplateName(); const TemplateDecl *TplD = TplName.getAsTemplateDecl(); TransAssert(TplD && "Invalid TemplateDecl!"); NamedDecl *ND = TplD->getTemplatedDecl(); // in some cases, ND could be NULL, e.g., the // template template parameter code below: // template<template<class> class BBB> // struct AAA { // template <class T> // struct CCC { // static BBB<T> a; // }; // }; // where we don't know BBB if (!ND) return true; const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(ND); if (!CXXRD) return true; std::string Name; if (ConsumerInstance->getNewName(CXXRD, Name)) { SourceLocation LocStart = TSPLoc.getTemplateNameLoc(); ConsumerInstance->TheRewriter.ReplaceText( LocStart, CXXRD->getNameAsString().size(), Name); } return true; }