CIndexUSRs.cpp revision bd9482d859a74bf2c45ef8b8aedec61c0e1c8374
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===- CIndexUSR.cpp - Clang-C Source Indexing Library --------------------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file implements the generation and use of USRs from CXEntities. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "CIndexer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "CXCursor.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "CXString.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/DeclTemplate.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/DeclVisitor.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Frontend/ASTUnit.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Lex/PreprocessingRecord.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/SmallString.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/Support/raw_ostream.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace clang; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace clang::cxstring; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// USR generation. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class USRGenerator : public DeclVisitor<USRGenerator> { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::OwningPtr<llvm::SmallString<128> > OwnedBuf; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SmallVectorImpl<char> &Buf; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::raw_svector_ostream Out; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IgnoreResults; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASTContext *Context; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool generatedLoc; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::DenseMap<const Type *, unsigned> TypeSubstitutions; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit USRGenerator(ASTContext *Ctx = 0, SmallVectorImpl<char> *extBuf = 0) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : OwnedBuf(extBuf ? 0 : new llvm::SmallString<128>()), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Buf(extBuf ? *extBuf : *OwnedBuf.get()), 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out(Buf), 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IgnoreResults(false), 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Context(Ctx), 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generatedLoc(false) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add the USR space prefix. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << "c:"; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StringRef str() { 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Out.str(); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) USRGenerator* operator->() { return this; } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename T> 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::raw_svector_ostream &operator<<(const T &x) { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << x; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Out; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ignoreResults() const { return IgnoreResults; } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Visitation methods from generating USRs from AST elements. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitDeclContext(DeclContext *D); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void VisitFieldDecl(FieldDecl *D); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitFunctionDecl(FunctionDecl *D); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitNamedDecl(NamedDecl *D); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitNamespaceDecl(NamespaceDecl *D); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void VisitNamespaceAliasDecl(NamespaceAliasDecl *D); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitFunctionTemplateDecl(FunctionTemplateDecl *D); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitClassTemplateDecl(ClassTemplateDecl *D); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitObjCContainerDecl(ObjCContainerDecl *CD); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void VisitObjCMethodDecl(ObjCMethodDecl *MD); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitObjCPropertyDecl(ObjCPropertyDecl *D); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitTagDecl(TagDecl *D); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void VisitTypedefDecl(TypedefDecl *D); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitVarDecl(VarDecl *D); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitLinkageSpecDecl(LinkageSpecDecl *D) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitUsingDecl(UsingDecl *D) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Generate the string component containing the location of the 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// declaration. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GenLoc(const Decl *D); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// String generation methods used both by the visitation methods 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// and from other clients that want to directly generate USRs. These 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// methods do not construct complete USRs (which incorporate the parents 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// of an AST element), but only the fragments concerning the AST element 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// itself. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Generate a USR for an Objective-C class. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GenObjCClass(StringRef cls); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Generate a USR for an Objective-C class category. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GenObjCCategory(StringRef cls, StringRef cat); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Generate a USR fragment for an Objective-C instance variable. The 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// complete USR can be created by concatenating the USR for the 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// encompassing class with this USR fragment. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GenObjCIvar(StringRef ivar); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Generate a USR fragment for an Objective-C method. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GenObjCMethod(StringRef sel, bool isInstanceMethod); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Generate a USR fragment for an Objective-C property. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GenObjCProperty(StringRef prop); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Generate a USR for an Objective-C protocol. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GenObjCProtocol(StringRef prot); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitType(QualType T); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitTemplateParameterList(const TemplateParameterList *Params); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitTemplateName(TemplateName Name); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VisitTemplateArgument(const TemplateArgument &Arg); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Emit a Decl's name using NamedDecl::printName() and return true if 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// the decl had no name. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool EmitDeclName(const NamedDecl *D); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end anonymous namespace 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generating USRs from ASTS. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool USRGenerator::EmitDeclName(const NamedDecl *D) { 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Out.flush(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned startSize = Buf.size(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) D->printName(Out); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out.flush(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned endSize = Buf.size(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return startSize == endSize; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool InAnonymousNamespace(const Decl *D) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(D->getDeclContext())) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ND->isAnonymousNamespace(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool ShouldGenerateLocation(const NamedDecl *D) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return D->getLinkage() != ExternalLinkage && !InAnonymousNamespace(D); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitDeclContext(DeclContext *DC) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NamedDecl *D = dyn_cast<NamedDecl>(DC)) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Visit(D); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitFieldDecl(FieldDecl *D) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The USR for an ivar declared in a class extension is based on the 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ObjCInterfaceDecl, not the ObjCCategoryDecl. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Visit(ID); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitDeclContext(D->getDeclContext()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << (isa<ObjCIvarDecl>(D) ? "@" : "@FI@"); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EmitDeclName(D)) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bit fields can be anonymous. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitFunctionDecl(FunctionDecl *D) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldGenerateLocation(D) && GenLoc(D)) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitDeclContext(D->getDeclContext()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FunctionTemplateDecl *FunTmpl = D->getDescribedFunctionTemplate()) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "@FT@"; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTemplateParameterList(FunTmpl->getTemplateParameters()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "@F@"; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) D->printName(Out); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASTContext &Ctx = *Context; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Ctx.getLangOptions().CPlusPlus || D->isExternC()) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mangle in type information for the arguments. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (FunctionDecl::param_iterator I = D->param_begin(), E = D->param_end(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) I != E; ++I) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '#'; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ParmVarDecl *PD = *I) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitType(PD->getType()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (D->isVariadic()) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '.'; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '#'; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (MD->isStatic()) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 'S'; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unsigned quals = MD->getTypeQualifiers()) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << (char)('0' + quals); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitNamedDecl(NamedDecl *D) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitDeclContext(D->getDeclContext()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "@"; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EmitDeclName(D)) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The string can be empty if the declaration has no name; e.g., it is 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ParmDecl with no name for declaration of a function pointer type, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // e.g.: void (*f)(void *); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In this case, don't generate a USR. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitVarDecl(VarDecl *D) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // VarDecls can be declared 'extern' within a function or method body, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but their enclosing DeclContext is the function, not the TU. We need 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to check the storage class to correctly generate the USR. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldGenerateLocation(D) && GenLoc(D)) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitDeclContext(D->getDeclContext()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Variables always have simple names. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringRef s = D->getName(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The string can be empty if the declaration has no name; e.g., it is 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ParmDecl with no name for declaration of a function pointer type, e.g.: 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // void (*f)(void *); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In this case, don't generate a USR. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (s.empty()) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '@' << s; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenLoc(D); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenLoc(D); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitNamespaceDecl(NamespaceDecl *D) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (D->isAnonymousNamespace()) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "@aN"; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitDeclContext(D->getDeclContext()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IgnoreResults) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "@N@" << D->getName(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitFunctionDecl(D->getTemplatedDecl()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitClassTemplateDecl(ClassTemplateDecl *D) { 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) VisitTagDecl(D->getTemplatedDecl()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitDeclContext(D->getDeclContext()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IgnoreResults) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "@NA@" << D->getName(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitObjCMethodDecl(ObjCMethodDecl *D) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeclContext *container = D->getDeclContext(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ObjCProtocolDecl *pd = dyn_cast<ObjCProtocolDecl>(container)) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Visit(pd); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The USR for a method declared in a class extension or category is based on 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ObjCInterfaceDecl, not the ObjCCategoryDecl. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCInterfaceDecl *ID = D->getClassInterface(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ID) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Visit(ID); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ideally we would use 'GenObjCMethod', but this is such a hot path 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for Objective-C code that we don't want to use 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DeclarationName::getAsString(). 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << (D->isInstanceMethod() ? "(im)" : "(cm)"); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeclarationName N(D->getSelector()); 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) N.printName(Out); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitObjCContainerDecl(ObjCContainerDecl *D) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (D->getKind()) { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm_unreachable("Invalid ObjC container."); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Decl::ObjCInterface: 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Decl::ObjCImplementation: 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenObjCClass(D->getName()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Decl::ObjCCategory: { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(D); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCInterfaceDecl *ID = CD->getClassInterface(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ID) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle invalid code where the @interface might not 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have been specified. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: We should be able to generate this USR even if the 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // @interface isn't available. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specially handle class extensions, which are anonymous categories. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want to mangle in the location to uniquely distinguish them. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CD->IsClassExtension()) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "objc(ext)" << ID->getName() << '@'; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenLoc(CD); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenObjCCategory(ID->getName(), CD->getName()); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Decl::ObjCCategoryImpl: { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCCategoryImplDecl *CD = cast<ObjCCategoryImplDecl>(D); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjCInterfaceDecl *ID = CD->getClassInterface(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ID) { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle invalid code where the @interface might not 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have been specified. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: We should be able to generate this USR even if the 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // @interface isn't available. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenObjCCategory(ID->getName(), CD->getName()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Decl::ObjCProtocol: 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenObjCProtocol(cast<ObjCProtocolDecl>(D)->getName()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The USR for a property declared in a class extension or category is based 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on the ObjCInterfaceDecl, not the ObjCCategoryDecl. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Visit(ID); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Visit(cast<Decl>(D->getDeclContext())); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenObjCProperty(D->getName()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ObjCPropertyDecl *PD = D->getPropertyDecl()) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitObjCPropertyDecl(PD); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitTagDecl(TagDecl *D) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the location of the tag decl to handle resolution across 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // translation units. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldGenerateLocation(D) && GenLoc(D)) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) D = D->getCanonicalDecl(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitDeclContext(D->getDeclContext()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AlreadyStarted = false; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(D)) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ClassTemplateDecl *ClassTmpl = CXXRecord->getDescribedClassTemplate()) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AlreadyStarted = true; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (D->getTagKind()) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Struct: Out << "@ST"; break; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Class: Out << "@CT"; break; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Union: Out << "@UT"; break; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Enum: llvm_unreachable("enum template"); break; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTemplateParameterList(ClassTmpl->getTemplateParameters()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ClassTemplatePartialSpecializationDecl *PartialSpec 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) = dyn_cast<ClassTemplatePartialSpecializationDecl>(CXXRecord)) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AlreadyStarted = true; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (D->getTagKind()) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Struct: Out << "@SP"; break; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Class: Out << "@CP"; break; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Union: Out << "@UP"; break; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Enum: llvm_unreachable("enum partial specialization"); break; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTemplateParameterList(PartialSpec->getTemplateParameters()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!AlreadyStarted) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (D->getTagKind()) { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Struct: Out << "@S"; break; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Class: Out << "@C"; break; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Union: Out << "@U"; break; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TTK_Enum: Out << "@E"; break; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << '@'; 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out.flush(); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(Buf.size() > 0); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const unsigned off = Buf.size() - 1; 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (EmitDeclName(D)) { 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (const TypedefNameDecl *TD = D->getTypedefNameForAnonDecl()) { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Buf[off] = 'A'; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << '@' << *TD; 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Buf[off] = 'a'; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For a class template specialization, mangle the template arguments. 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ClassTemplateSpecializationDecl *Spec 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) = dyn_cast<ClassTemplateSpecializationDecl>(D)) { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TemplateArgumentList &Args = Spec->getTemplateInstantiationArgs(); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << '>'; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned I = 0, N = Args.size(); I != N; ++I) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '#'; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTemplateArgument(Args.get(I)); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitTypedefDecl(TypedefDecl *D) { 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldGenerateLocation(D) && GenLoc(D)) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeclContext *DC = D->getDeclContext(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NamedDecl *DCN = dyn_cast<NamedDecl>(DC)) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Visit(DCN); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "@T@"; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << D->getName(); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenLoc(D); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool USRGenerator::GenLoc(const Decl *D) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (generatedLoc) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IgnoreResults; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generatedLoc = true; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guard against null declarations in invalid code. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!D) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the location of canonical decl. 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) D = D->getCanonicalDecl(); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SourceManager &SM = Context->getSourceManager(); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation L = D->getLocStart(); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (L.isInvalid()) { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L = SM.getExpansionLoc(L); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::pair<FileID, unsigned> &Decomposed = SM.getDecomposedLoc(L); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileEntry *FE = SM.getFileEntryForID(Decomposed.first); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FE) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << llvm::sys::path::filename(FE->getName()); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This case really isn't interesting. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IgnoreResults = true; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the offest into the FileID to represent the location. Using 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a line/column can cause us to look back at the original source file, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which is expensive. 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '@' << Decomposed.second; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IgnoreResults; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitType(QualType T) { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method mangles in USR information for types. It can possibly 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just reuse the naming-mangling logic used by codegen, although the 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // requirements for USRs might not be the same. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASTContext &Ctx = *Context; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T = Ctx.getCanonicalType(T); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Qualifiers Q = T.getQualifiers(); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned qVal = 0; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Q.hasConst()) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qVal |= 0x1; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Q.hasVolatile()) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qVal |= 0x2; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Q.hasRestrict()) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qVal |= 0x4; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(qVal) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << ((char) ('0' + qVal)); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mangle in ObjC GC qualifiers? 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const PackExpansionType *Expansion = T->getAs<PackExpansionType>()) { 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << 'P'; 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) T = Expansion->getPattern(); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const BuiltinType *BT = T->getAs<BuiltinType>()) { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char c = '\0'; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (BT->getKind()) { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::Void: 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 'v'; break; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::Bool: 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 'b'; break; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::Char_U: 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::UChar: 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 'c'; break; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::Char16: 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 'q'; break; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::Char32: 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 'w'; break; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::UShort: 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 's'; break; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::UInt: 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'i'; break; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::ULong: 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'l'; break; 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::ULongLong: 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'k'; break; 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::UInt128: 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'j'; break; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::Char_S: 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::SChar: 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'C'; break; 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::WChar_S: 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::WChar_U: 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'W'; break; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::Short: 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'S'; break; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::Int: 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 'I'; break; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::Long: 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'L'; break; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::LongLong: 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'K'; break; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::Int128: 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'J'; break; 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::Half: 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'h'; break; 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::Float: 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 'f'; break; 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::Double: 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'd'; break; 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::LongDouble: 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'D'; break; 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::NullPtr: 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'n'; break; 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BUILTIN_TYPE(Id, SingletonId) 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/AST/BuiltinTypes.def" 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::Dependent: 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IgnoreResults = true; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::ObjCId: 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'o'; break; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BuiltinType::ObjCClass: 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'O'; break; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BuiltinType::ObjCSel: 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 'e'; break; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << c; 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we have already seen this (non-built-in) type, use a substitution 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // encoding. 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::DenseMap<const Type *, unsigned>::iterator Substitution 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) = TypeSubstitutions.find(T.getTypePtr()); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Substitution != TypeSubstitutions.end()) { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << 'S' << Substitution->second << '_'; 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Record this as a substitution. 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned Number = TypeSubstitutions.size(); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TypeSubstitutions[T.getTypePtr()] = Number; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (const PointerType *PT = T->getAs<PointerType>()) { 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << '*'; 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) T = PT->getPointeeType(); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (const ReferenceType *RT = T->getAs<ReferenceType>()) { 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << '&'; 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) T = RT->getPointeeType(); 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (const FunctionProtoType *FT = T->getAs<FunctionProtoType>()) { 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << 'F'; 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VisitType(FT->getResultType()); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (FunctionProtoType::arg_type_iterator 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) I = FT->arg_type_begin(), E = FT->arg_type_end(); I!=E; ++I) { 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitType(*I); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (FT->isVariadic()) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '.'; 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) { 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 'B'; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T = BT->getPointeeType(); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const ComplexType *CT = T->getAs<ComplexType>()) { 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '<'; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T = CT->getElementType(); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const TagType *TT = T->getAs<TagType>()) { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '$'; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTagDecl(TT->getDecl()); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (const TemplateTypeParmType *TTP = T->getAs<TemplateTypeParmType>()) { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 't' << TTP->getDepth() << '.' << TTP->getIndex(); 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (const TemplateSpecializationType *Spec 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) = T->getAs<TemplateSpecializationType>()) { 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << '>'; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTemplateName(Spec->getTemplateName()); 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << Spec->getNumArgs(); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned I = 0, N = Spec->getNumArgs(); I != N; ++I) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTemplateArgument(Spec->getArg(I)); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unhandled type. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << ' '; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (true); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitTemplateParameterList( 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TemplateParameterList *Params) { 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!Params) 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << '>' << Params->size(); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (TemplateParameterList::const_iterator P = Params->begin(), 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PEnd = Params->end(); 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) P != PEnd; ++P) { 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Out << '#'; 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (isa<TemplateTypeParmDecl>(*P)) { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cast<TemplateTypeParmDecl>(*P)->isParameterPack()) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out<< 'p'; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 'T'; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NTTP->isParameterPack()) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 'p'; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 'N'; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitType(NTTP->getType()); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TTP->isParameterPack()) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 'p'; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 't'; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTemplateParameterList(TTP->getTemplateParameters()); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitTemplateName(TemplateName Name) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TemplateTemplateParmDecl *TTP 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) = dyn_cast<TemplateTemplateParmDecl>(Template)) { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 't' << TTP->getDepth() << '.' << TTP->getIndex(); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Visit(Template); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: Visit dependent template names. 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::VisitTemplateArgument(const TemplateArgument &Arg) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (Arg.getKind()) { 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TemplateArgument::Null: 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TemplateArgument::Declaration: 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Decl *D = Arg.getAsDecl()) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Visit(D); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TemplateArgument::TemplateExpansion: 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 'P'; // pack expansion of... 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fall through 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TemplateArgument::Template: 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTemplateName(Arg.getAsTemplateOrTemplatePattern()); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TemplateArgument::Expression: 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: Visit expressions. 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TemplateArgument::Pack: 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 'p' << Arg.pack_size(); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (TemplateArgument::pack_iterator P = Arg.pack_begin(), PEnd = Arg.pack_end(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P != PEnd; ++P) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitTemplateArgument(*P); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TemplateArgument::Type: 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitType(Arg.getAsType()); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TemplateArgument::Integral: 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << 'V'; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitType(Arg.getIntegralType()); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << *Arg.getAsIntegral(); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// General purpose USR generation methods. 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::GenObjCClass(StringRef cls) { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "objc(cs)" << cls; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::GenObjCCategory(StringRef cls, StringRef cat) { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "objc(cy)" << cls << '@' << cat; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::GenObjCIvar(StringRef ivar) { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << '@' << ivar; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::GenObjCMethod(StringRef meth, bool isInstanceMethod) { 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << (isInstanceMethod ? "(im)" : "(cm)") << meth; 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::GenObjCProperty(StringRef prop) { 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "(py)" << prop; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void USRGenerator::GenObjCProtocol(StringRef prot) { 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Out << "objc(pl)" << prot; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API hooks. 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline StringRef extractUSRSuffix(StringRef s) { 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return s.startswith("c:") ? s.substr(2) : ""; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool cxcursor::getDeclCursorUSR(const Decl *D, SmallVectorImpl<char> &Buf) { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't generate USRs for things with invalid locations. 79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!D || D->getLocStart().isInvalid()) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the cursor has 'NoLinkage'. 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ND->getLinkage()) { 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ExternalLinkage: 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate USRs for all entities with external linkage. 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NoLinkage: 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UniqueExternalLinkage: 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We allow enums, typedefs, and structs that have no linkage to 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have USRs that are anchored to the file they were defined in 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g., the header). This is a little gross, but in principal 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enums/anonymous structs/etc. defined in a common header file 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are referred to across multiple translation units. 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isa<TagDecl>(ND) || isa<TypedefDecl>(ND) || 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isa<EnumConstantDecl>(ND) || isa<FieldDecl>(ND) || 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isa<VarDecl>(ND) || isa<NamespaceDecl>(ND)) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fall-through. 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case InternalLinkage: 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isa<FunctionDecl>(ND)) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USRGenerator UG(&D->getASTContext(), &Buf); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG->Visit(const_cast<Decl*>(D)); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (UG->ignoreResults()) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXString clang_getCursorUSR(CXCursor C) { 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CXCursorKind &K = clang_getCursorKind(C); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (clang_isDeclaration(K)) { 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Decl *D = cxcursor::getCursorDecl(C); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!D) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(""); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CXTranslationUnit TU = cxcursor::getCursorTU(C); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!TU) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(""); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CXStringBuf *buf = cxstring::getCXStringBuf(TU); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buf) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(""); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Ignore = cxcursor::getDeclCursorUSR(D, buf->Data); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Ignore) { 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposeCXStringBuf(buf); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(""); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the C-string, but don't make a copy since it is already in 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the string buffer. 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->Data.push_back('\0'); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(buf); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (K == CXCursor_MacroDefinition) { 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CXTranslationUnit TU = cxcursor::getCursorTU(C); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!TU) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(""); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CXStringBuf *buf = cxstring::getCXStringBuf(TU); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buf) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(""); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USRGenerator UG(&cxcursor::getCursorASTUnit(C)->getASTContext(), 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &buf->Data); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG << "macro@" 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << cxcursor::getCursorMacroDefinition(C)->getName()->getNameStart(); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->Data.push_back('\0'); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(buf); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(""); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CXString clang_constructUSR_ObjCIvar(const char *name, CXString classUSR) { 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) USRGenerator UG; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG << extractUSRSuffix(clang_getCString(classUSR)); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG->GenObjCIvar(name); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(UG.str(), true); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXString clang_constructUSR_ObjCMethod(const char *name, 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned isInstanceMethod, 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CXString classUSR) { 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USRGenerator UG; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG << extractUSRSuffix(clang_getCString(classUSR)); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG->GenObjCMethod(name, isInstanceMethod); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(UG.str(), true); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXString clang_constructUSR_ObjCClass(const char *name) { 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USRGenerator UG; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG->GenObjCClass(name); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(UG.str(), true); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXString clang_constructUSR_ObjCProtocol(const char *name) { 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USRGenerator UG; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG->GenObjCProtocol(name); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(UG.str(), true); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXString clang_constructUSR_ObjCCategory(const char *class_name, 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *category_name) { 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USRGenerator UG; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG->GenObjCCategory(class_name, category_name); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(UG.str(), true); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXString clang_constructUSR_ObjCProperty(const char *property, 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CXString classUSR) { 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USRGenerator UG; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG << extractUSRSuffix(clang_getCString(classUSR)); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UG->GenObjCProperty(property); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return createCXString(UG.str(), true); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end extern "C" 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)