112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===- USRGeneration.cpp - Routines for USR generation --------------------===// 212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// 312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// 512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// 812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 102845a6746f6320994675a9a413ecbe5252d4dc02Argyrios Kyrtzidis#include "clang/Index/USRGeneration.h" 1112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "clang/AST/ASTContext.h" 1212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "clang/AST/DeclTemplate.h" 1312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "clang/AST/DeclVisitor.h" 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Lex/PreprocessingRecord.h" 1512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "llvm/ADT/SmallString.h" 1612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "llvm/Support/Path.h" 1712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "llvm/Support/raw_ostream.h" 1812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 1912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisusing namespace clang; 20e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisusing namespace clang::index; 2112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 2212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 2312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// USR generation. 2412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 2512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \returns true on error. 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool printLoc(llvm::raw_ostream &OS, SourceLocation Loc, 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const SourceManager &SM, bool IncludeOffset) { 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Loc.isInvalid()) { 30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Loc = SM.getExpansionLoc(Loc); 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const std::pair<FileID, unsigned> &Decomposed = SM.getDecomposedLoc(Loc); 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FileEntry *FE = SM.getFileEntryForID(Decomposed.first); 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FE) { 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << llvm::sys::path::filename(FE->getName()); 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // This case really isn't interesting. 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (IncludeOffset) { 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Use the offest into the FileID to represent the location. Using 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // a line/column can cause us to look back at the original source file, 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // which is expensive. 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << '@' << Decomposed.second; 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 5012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisnamespace { 5112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisclass USRGenerator : public ConstDeclVisitor<USRGenerator> { 5212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis SmallVectorImpl<char> &Buf; 5312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm::raw_svector_ostream Out; 5412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool IgnoreResults; 5512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis ASTContext *Context; 5612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool generatedLoc; 5712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 5812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm::DenseMap<const Type *, unsigned> TypeSubstitutions; 5912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 6012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidispublic: 6112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis explicit USRGenerator(ASTContext *Ctx, SmallVectorImpl<char> &Buf) 6212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis : Buf(Buf), 6312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out(Buf), 6412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults(false), 6512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Context(Ctx), 6612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis generatedLoc(false) 6712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis { 6812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Add the USR space prefix. 69e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis Out << getUSRSpacePrefix(); 7012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 7112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 7212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool ignoreResults() const { return IgnoreResults; } 7312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 7412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Visitation methods from generating USRs from AST elements. 7512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitDeclContext(const DeclContext *D); 7612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitFieldDecl(const FieldDecl *D); 7712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitFunctionDecl(const FunctionDecl *D); 7812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNamedDecl(const NamedDecl *D); 7912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNamespaceDecl(const NamespaceDecl *D); 8012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D); 8112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D); 8212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitClassTemplateDecl(const ClassTemplateDecl *D); 8312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCContainerDecl(const ObjCContainerDecl *CD); 8412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCMethodDecl(const ObjCMethodDecl *MD); 8512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCPropertyDecl(const ObjCPropertyDecl *D); 8612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D); 8712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTagDecl(const TagDecl *D); 8812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTypedefDecl(const TypedefDecl *D); 8912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D); 9012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitVarDecl(const VarDecl *D); 9112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D); 9212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D); 934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitLinkageSpecDecl(const LinkageSpecDecl *D) { 9512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 9612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) { 9912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 10012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 10212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUsingDecl(const UsingDecl *D) { 10312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 10412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 10612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D) { 10712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 10812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 11012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D) { 11112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 11212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ShouldGenerateLocation(const NamedDecl *D); 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isLocal(const NamedDecl *D) { 1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return D->getParentFunctionOrMethod() != nullptr; 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 12012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate the string component containing the location of the 12112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// declaration. 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool GenLoc(const Decl *D, bool IncludeOffset); 12312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 12412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// String generation methods used both by the visitation methods 12512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// and from other clients that want to directly generate USRs. These 12612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// methods do not construct complete USRs (which incorporate the parents 12712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// of an AST element), but only the fragments concerning the AST element 12812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// itself. 12912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 13012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR for an Objective-C class. 13112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCClass(StringRef cls) { 132e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCClass(cls, Out); 13312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR for an Objective-C class category. 13612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCCategory(StringRef cls, StringRef cat) { 137e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCCategory(cls, cat, Out); 13812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 14012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR fragment for an Objective-C property. 14112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCProperty(StringRef prop) { 142e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCProperty(prop, Out); 14312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 14512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR for an Objective-C protocol. 14612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCProtocol(StringRef prot) { 147e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCProtocol(prot, Out); 14812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 14912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 15012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitType(QualType T); 15112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateParameterList(const TemplateParameterList *Params); 15212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateName(TemplateName Name); 15312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateArgument(const TemplateArgument &Arg); 15412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 15512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Emit a Decl's name using NamedDecl::printName() and return true if 15612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// the decl had no name. 15712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool EmitDeclName(const NamedDecl *D); 15812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis}; 15912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} // end anonymous namespace 16012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 16112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 16212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// Generating USRs from ASTS. 16312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 16412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 16512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisbool USRGenerator::EmitDeclName(const NamedDecl *D) { 16612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const unsigned startSize = Buf.size(); 16712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D->printName(Out); 16812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const unsigned endSize = Buf.size(); 16912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return startSize == endSize; 17012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 17112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool USRGenerator::ShouldGenerateLocation(const NamedDecl *D) { 173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (D->isExternallyVisible()) 174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (D->getParentFunctionOrMethod()) 176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const SourceManager &SM = Context->getSourceManager(); 178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return !SM.isInSystemHeader(D->getLocation()); 17912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 18012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 18112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitDeclContext(const DeclContext *DC) { 18212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const NamedDecl *D = dyn_cast<NamedDecl>(DC)) 18312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(D); 18412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 18512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 18612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitFieldDecl(const FieldDecl *D) { 18712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The USR for an ivar declared in a class extension is based on the 18812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // ObjCInterfaceDecl, not the ObjCCategoryDecl. 18912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) 19012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(ID); 19112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 19212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 19312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << (isa<ObjCIvarDecl>(D) ? "@" : "@FI@"); 19412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (EmitDeclName(D)) { 19512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Bit fields can be anonymous. 19612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 19712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 19812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 19912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 20012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 20112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitFunctionDecl(const FunctionDecl *D) { 202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) 20312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 20412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 20512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 2060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool IsTemplate = false; 20712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (FunctionTemplateDecl *FunTmpl = D->getDescribedFunctionTemplate()) { 2080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines IsTemplate = true; 20912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@FT@"; 21012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(FunTmpl->getTemplateParameters()); 21112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } else 21212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@F@"; 2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PrintingPolicy Policy(Context->getLangOpts()); 2154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Forward references can have different template argument names. Suppress the 2164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // template argument names in constructors to make their USR more stable. 2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Policy.SuppressTemplateArgsInCXXConstructors = true; 2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D->getDeclName().print(Out, Policy); 21912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 22012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis ASTContext &Ctx = *Context; 2214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if ((!Ctx.getLangOpts().CPlusPlus || D->isExternC()) && 2224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !D->hasAttr<OverloadableAttr>()) 22312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 22412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 22512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TemplateArgumentList * 22612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis SpecArgs = D->getTemplateSpecializationArgs()) { 22712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '<'; 22812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (unsigned I = 0, N = SpecArgs->size(); I != N; ++I) { 22912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 23012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(SpecArgs->get(I)); 23112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 23212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>'; 23312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 23412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 23512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Mangle in type information for the arguments. 2364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto PD : D->parameters()) { 23712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VisitType(PD->getType()); 23912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 24012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (D->isVariadic()) 24112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '.'; 2420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (IsTemplate) { 2430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Function templates can be overloaded by return type, for example: 2440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // \code 2450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // template <class T> typename T::A foo() {} 2460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // template <class T> typename T::B foo() {} 2470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // \endcode 2480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Out << '#'; 2490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines VisitType(D->getReturnType()); 2500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 25112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 25212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) { 25312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (MD->isStatic()) 25412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'S'; 25512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (unsigned quals = MD->getTypeQualifiers()) 25612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << (char)('0' + quals); 2570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines switch (MD->getRefQualifier()) { 2580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case RQ_None: break; 2590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case RQ_LValue: Out << '&'; break; 2600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case RQ_RValue: Out << "&&"; break; 2610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 26212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 26312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 26412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 26512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNamedDecl(const NamedDecl *D) { 26612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 26712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@"; 26812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 26912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (EmitDeclName(D)) { 27012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The string can be empty if the declaration has no name; e.g., it is 27112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // the ParmDecl with no name for declaration of a function pointer type, 27212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // e.g.: void (*f)(void *); 27312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // In this case, don't generate a USR. 27412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 27512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 27612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 27712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 27812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitVarDecl(const VarDecl *D) { 27912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // VarDecls can be declared 'extern' within a function or method body, 28012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // but their enclosing DeclContext is the function, not the TU. We need 28112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // to check the storage class to correctly generate the USR. 282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) 28312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 28412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 28512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 28612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 28712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Variables always have simple names. 28812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis StringRef s = D->getName(); 28912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 29012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The string can be empty if the declaration has no name; e.g., it is 29112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // the ParmDecl with no name for declaration of a function pointer type, e.g.: 29212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // void (*f)(void *); 29312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // In this case, don't generate a USR. 29412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (s.empty()) 29512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 29612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 29712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@' << s; 29812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 29912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 30012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNonTypeTemplateParmDecl( 30112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const NonTypeTemplateParmDecl *D) { 302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GenLoc(D, /*IncludeOffset=*/true); 30312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 30412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 30512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateTemplateParmDecl( 30612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const TemplateTemplateParmDecl *D) { 307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GenLoc(D, /*IncludeOffset=*/true); 30812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 30912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 31012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNamespaceDecl(const NamespaceDecl *D) { 31112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (D->isAnonymousNamespace()) { 31212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@aN"; 31312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 31412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 31512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 31612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 31712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!IgnoreResults) 31812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@N@" << D->getName(); 31912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 32012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 32112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { 32212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitFunctionDecl(D->getTemplatedDecl()); 32312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 32412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 32512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitClassTemplateDecl(const ClassTemplateDecl *D) { 32612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTagDecl(D->getTemplatedDecl()); 32712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 32812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 32912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) { 33012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 33112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!IgnoreResults) 33212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@NA@" << D->getName(); 33312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 33412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 33512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCMethodDecl(const ObjCMethodDecl *D) { 33612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const DeclContext *container = D->getDeclContext(); 33712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ObjCProtocolDecl *pd = dyn_cast<ObjCProtocolDecl>(container)) { 33812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(pd); 33912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 34012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else { 34112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The USR for a method declared in a class extension or category is based on 34212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // the ObjCInterfaceDecl, not the ObjCCategoryDecl. 34312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCInterfaceDecl *ID = D->getClassInterface(); 34412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!ID) { 34512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 34612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 34712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 34812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(ID); 34912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 35012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Ideally we would use 'GenObjCMethod', but this is such a hot path 35112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // for Objective-C code that we don't want to use 35212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // DeclarationName::getAsString(). 35312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << (D->isInstanceMethod() ? "(im)" : "(cm)") 35412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis << DeclarationName(D->getSelector()); 35512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 35612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 35712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCContainerDecl(const ObjCContainerDecl *D) { 35812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getKind()) { 35912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis default: 36012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm_unreachable("Invalid ObjC container."); 36112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCInterface: 36212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCImplementation: 36312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCClass(D->getName()); 36412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 36512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCCategory: { 36612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(D); 36712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCInterfaceDecl *ID = CD->getClassInterface(); 36812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!ID) { 36912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Handle invalid code where the @interface might not 37012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // have been specified. 37112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: We should be able to generate this USR even if the 37212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // @interface isn't available. 37312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 37412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 37512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 37612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Specially handle class extensions, which are anonymous categories. 37712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // We want to mangle in the location to uniquely distinguish them. 37812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (CD->IsClassExtension()) { 37912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "objc(ext)" << ID->getName() << '@'; 380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GenLoc(CD, /*IncludeOffset=*/true); 38112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 38212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 38312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCCategory(ID->getName(), CD->getName()); 38412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 38512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 38612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 38712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCCategoryImpl: { 38812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCCategoryImplDecl *CD = cast<ObjCCategoryImplDecl>(D); 38912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCInterfaceDecl *ID = CD->getClassInterface(); 39012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!ID) { 39112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Handle invalid code where the @interface might not 39212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // have been specified. 39312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: We should be able to generate this USR even if the 39412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // @interface isn't available. 39512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 39612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 39712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 39812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCCategory(ID->getName(), CD->getName()); 39912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 40012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 40112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCProtocol: 40212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCProtocol(cast<ObjCProtocolDecl>(D)->getName()); 40312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 40412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 40512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 40612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 40712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) { 40812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The USR for a property declared in a class extension or category is based 40912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // on the ObjCInterfaceDecl, not the ObjCCategoryDecl. 41012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) 41112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(ID); 41212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 41312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(cast<Decl>(D->getDeclContext())); 41412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCProperty(D->getName()); 41512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 41612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 41712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) { 41812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ObjCPropertyDecl *PD = D->getPropertyDecl()) { 41912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitObjCPropertyDecl(PD); 42012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 42112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 42212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 42312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 42412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 42512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 42612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTagDecl(const TagDecl *D) { 42712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Add the location of the tag decl to handle resolution across 42812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // translation units. 4294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!isa<EnumDecl>(D) && 4304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) 43112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 43212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 43312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D = D->getCanonicalDecl(); 43412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 43512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 43612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool AlreadyStarted = false; 43712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(D)) { 43812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ClassTemplateDecl *ClassTmpl = CXXRecord->getDescribedClassTemplate()) { 43912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis AlreadyStarted = true; 44012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 44112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getTagKind()) { 44212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Interface: 4430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case TTK_Class: 44412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Struct: Out << "@ST"; break; 44512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Union: Out << "@UT"; break; 44612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Enum: llvm_unreachable("enum template"); 44712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 44812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(ClassTmpl->getTemplateParameters()); 44912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } else if (const ClassTemplatePartialSpecializationDecl *PartialSpec 45012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = dyn_cast<ClassTemplatePartialSpecializationDecl>(CXXRecord)) { 45112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis AlreadyStarted = true; 45212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 45312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getTagKind()) { 45412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Interface: 4550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case TTK_Class: 45612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Struct: Out << "@SP"; break; 45712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Union: Out << "@UP"; break; 45812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Enum: llvm_unreachable("enum partial specialization"); 45912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 46012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(PartialSpec->getTemplateParameters()); 46112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 46212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 46312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 46412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!AlreadyStarted) { 46512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getTagKind()) { 46612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Interface: 4670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case TTK_Class: 46812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Struct: Out << "@S"; break; 46912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Union: Out << "@U"; break; 47012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Enum: Out << "@E"; break; 47112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 47212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 47312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 47412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@'; 47512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis assert(Buf.size() > 0); 47612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const unsigned off = Buf.size() - 1; 47712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 47812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (EmitDeclName(D)) { 47912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TypedefNameDecl *TD = D->getTypedefNameForAnonDecl()) { 48012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Buf[off] = 'A'; 48112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@' << *TD; 48212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 4830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines else { 4840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (D->isEmbeddedInDeclarator() && !D->isFreeStanding()) { 4850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines printLoc(Out, D->getLocation(), Context->getSourceManager(), true); 4864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 48712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Buf[off] = 'a'; 4884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (auto *ED = dyn_cast<EnumDecl>(D)) { 4894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Distinguish USRs of anonymous enums by using their first enumerator. 4904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto enum_range = ED->enumerators(); 4914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (enum_range.begin() != enum_range.end()) { 4924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Out << '@' << **enum_range.begin(); 4934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 4944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 4954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 49612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 4970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 49812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 49912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // For a class template specialization, mangle the template arguments. 50012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ClassTemplateSpecializationDecl *Spec 50112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = dyn_cast<ClassTemplateSpecializationDecl>(D)) { 50212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const TemplateArgumentList &Args = Spec->getTemplateInstantiationArgs(); 50312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>'; 50412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (unsigned I = 0, N = Args.size(); I != N; ++I) { 50512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 50612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(Args.get(I)); 50712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 50812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 50912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 51012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 51112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTypedefDecl(const TypedefDecl *D) { 512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) 51312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 51412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const DeclContext *DC = D->getDeclContext(); 51512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const NamedDecl *DCN = dyn_cast<NamedDecl>(DC)) 51612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(DCN); 51712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@T@"; 51812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << D->getName(); 51912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 52012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 52112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) { 522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GenLoc(D, /*IncludeOffset=*/true); 52312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 52412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool USRGenerator::GenLoc(const Decl *D, bool IncludeOffset) { 52612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (generatedLoc) 52712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return IgnoreResults; 52812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis generatedLoc = true; 529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 53012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Guard against null declarations in invalid code. 53112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!D) { 53212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 53312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return true; 53412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 53512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 53612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Use the location of canonical decl. 53712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D = D->getCanonicalDecl(); 53812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IgnoreResults = 540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IgnoreResults || printLoc(Out, D->getLocStart(), 541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Context->getSourceManager(), IncludeOffset); 542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 54312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return IgnoreResults; 54412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 54512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 54612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitType(QualType T) { 54712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // This method mangles in USR information for types. It can possibly 54812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // just reuse the naming-mangling logic used by codegen, although the 54912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // requirements for USRs might not be the same. 55012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis ASTContext &Ctx = *Context; 55112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 55212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis do { 55312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = Ctx.getCanonicalType(T); 55412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Qualifiers Q = T.getQualifiers(); 55512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis unsigned qVal = 0; 55612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Q.hasConst()) 55712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis qVal |= 0x1; 55812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Q.hasVolatile()) 55912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis qVal |= 0x2; 56012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Q.hasRestrict()) 56112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis qVal |= 0x4; 56212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if(qVal) 56312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << ((char) ('0' + qVal)); 56412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 56512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Mangle in ObjC GC qualifiers? 56612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 56712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const PackExpansionType *Expansion = T->getAs<PackExpansionType>()) { 56812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'P'; 56912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = Expansion->getPattern(); 57012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 57112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 57212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const BuiltinType *BT = T->getAs<BuiltinType>()) { 57312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis unsigned char c = '\0'; 57412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (BT->getKind()) { 57512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Void: 57612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'v'; break; 57712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Bool: 57812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'b'; break; 57912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UChar: 58012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'c'; break; 58112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char16: 58212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'q'; break; 58312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char32: 58412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'w'; break; 58512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UShort: 58612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 's'; break; 58712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UInt: 58812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'i'; break; 58912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ULong: 59012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'l'; break; 59112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ULongLong: 59212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'k'; break; 59312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UInt128: 59412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'j'; break; 5950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case BuiltinType::Char_U: 59612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char_S: 59712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'C'; break; 5980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case BuiltinType::SChar: 5990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines c = 'r'; break; 60012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::WChar_S: 60112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::WChar_U: 60212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'W'; break; 60312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Short: 60412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'S'; break; 60512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Int: 60612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'I'; break; 60712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Long: 60812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'L'; break; 60912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::LongLong: 61012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'K'; break; 61112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Int128: 61212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'J'; break; 61312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Half: 61412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'h'; break; 61512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Float: 61612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'f'; break; 61712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Double: 61812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'd'; break; 61912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::LongDouble: 62012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'D'; break; 6214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case BuiltinType::Float128: 6224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar c = 'Q'; break; 62312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::NullPtr: 62412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'n'; break; 62512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#define BUILTIN_TYPE(Id, SingletonId) 62612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: 62712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "clang/AST/BuiltinTypes.def" 62812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Dependent: 6294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case BuiltinType::Id: 6314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Basic/OpenCLImageTypes.def" 63212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLEvent: 63387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLClkEvent: 63487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLQueue: 63587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLNDRange: 63687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLReserveID: 63712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLSampler: 63812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 63912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 64012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ObjCId: 64112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'o'; break; 64212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ObjCClass: 64312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'O'; break; 64412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ObjCSel: 64512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'e'; break; 64612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 64712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << c; 64812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 64912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 65012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 65112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // If we have already seen this (non-built-in) type, use a substitution 65212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // encoding. 65312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm::DenseMap<const Type *, unsigned>::iterator Substitution 65412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = TypeSubstitutions.find(T.getTypePtr()); 65512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Substitution != TypeSubstitutions.end()) { 65612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'S' << Substitution->second << '_'; 65712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 65812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } else { 65912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Record this as a substitution. 66012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis unsigned Number = TypeSubstitutions.size(); 66112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis TypeSubstitutions[T.getTypePtr()] = Number; 66212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 66312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 66412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const PointerType *PT = T->getAs<PointerType>()) { 66512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '*'; 66612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = PT->getPointeeType(); 66712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 66812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 6694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const ObjCObjectPointerType *OPT = T->getAs<ObjCObjectPointerType>()) { 6704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Out << '*'; 6714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar T = OPT->getPointeeType(); 6724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar continue; 6734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 6740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (const RValueReferenceType *RT = T->getAs<RValueReferenceType>()) { 6750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Out << "&&"; 6760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines T = RT->getPointeeType(); 6770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines continue; 6780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 67912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ReferenceType *RT = T->getAs<ReferenceType>()) { 68012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '&'; 68112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = RT->getPointeeType(); 68212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 68312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 68412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const FunctionProtoType *FT = T->getAs<FunctionProtoType>()) { 68512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'F'; 686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VisitType(FT->getReturnType()); 687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &I : FT->param_types()) 688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VisitType(I); 68912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (FT->isVariadic()) 69012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '.'; 69112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 69212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 69312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) { 69412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'B'; 69512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = BT->getPointeeType(); 69612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 69712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 69812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ComplexType *CT = T->getAs<ComplexType>()) { 69912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '<'; 70012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = CT->getElementType(); 70112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 70212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 70312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TagType *TT = T->getAs<TagType>()) { 70412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '$'; 70512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTagDecl(TT->getDecl()); 70612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 70712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 7084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const ObjCInterfaceType *OIT = T->getAs<ObjCInterfaceType>()) { 7094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Out << '$'; 7104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar VisitObjCInterfaceDecl(OIT->getDecl()); 7114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 7124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 7134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const ObjCObjectType *OIT = T->getAs<ObjCObjectType>()) { 7144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Out << 'Q'; 7154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar VisitType(OIT->getBaseType()); 7164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto *Prot : OIT->getProtocols()) 7174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar VisitObjCProtocolDecl(Prot); 7184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 7194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 72012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TemplateTypeParmType *TTP = T->getAs<TemplateTypeParmType>()) { 72112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 't' << TTP->getDepth() << '.' << TTP->getIndex(); 72212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 72312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 72412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TemplateSpecializationType *Spec 72512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = T->getAs<TemplateSpecializationType>()) { 72612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>'; 72712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateName(Spec->getTemplateName()); 72812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << Spec->getNumArgs(); 72912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (unsigned I = 0, N = Spec->getNumArgs(); I != N; ++I) 73012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(Spec->getArg(I)); 73112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 73212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 7330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (const DependentNameType *DNT = T->getAs<DependentNameType>()) { 7340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Out << '^'; 7350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: Encode the qualifier, don't just print it. 7360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines PrintingPolicy PO(Ctx.getLangOpts()); 7370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines PO.SuppressTagKeyword = true; 7380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines PO.SuppressUnwrittenScope = true; 7390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines PO.ConstantArraySizeAsWritten = false; 7400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines PO.AnonymousTagLocations = false; 7410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DNT->getQualifier()->print(Out, PO); 7420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Out << ':' << DNT->getIdentifier()->getName(); 7430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 7440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 7450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (const InjectedClassNameType *InjT = T->getAs<InjectedClassNameType>()) { 7460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines T = InjT->getInjectedSpecializationType(); 7470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines continue; 7480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 74912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 75012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Unhandled type. 75112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << ' '; 75212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 75312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } while (true); 75412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 75512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 75612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateParameterList( 75712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const TemplateParameterList *Params) { 75812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!Params) 75912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 76012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>' << Params->size(); 76112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (TemplateParameterList::const_iterator P = Params->begin(), 76212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis PEnd = Params->end(); 76312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis P != PEnd; ++P) { 76412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 76512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (isa<TemplateTypeParmDecl>(*P)) { 76612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (cast<TemplateTypeParmDecl>(*P)->isParameterPack()) 76712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out<< 'p'; 76812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'T'; 76912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 77012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 77112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 77212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 77312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (NTTP->isParameterPack()) 77412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'p'; 77512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'N'; 77612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(NTTP->getType()); 77712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 77812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 77912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 78012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 78112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (TTP->isParameterPack()) 78212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'p'; 78312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 't'; 78412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(TTP->getTemplateParameters()); 78512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 78612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 78712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 78812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateName(TemplateName Name) { 78912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 79012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (TemplateTemplateParmDecl *TTP 79112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = dyn_cast<TemplateTemplateParmDecl>(Template)) { 79212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 't' << TTP->getDepth() << '.' << TTP->getIndex(); 79312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 79412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 79512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 79612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(Template); 79712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 79812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 79912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 80012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: Visit dependent template names. 80112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 80212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 80312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateArgument(const TemplateArgument &Arg) { 80412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (Arg.getKind()) { 80512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Null: 80612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 80712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 80812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Declaration: 80912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(Arg.getAsDecl()); 81012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 81112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 81212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::NullPtr: 81312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 81412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 81512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::TemplateExpansion: 81612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'P'; // pack expansion of... 81712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Fall through 81812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Template: 81912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateName(Arg.getAsTemplateOrTemplatePattern()); 82012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 82112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 82212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Expression: 82312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: Visit expressions. 82412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 82512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 82612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Pack: 82712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'p' << Arg.pack_size(); 828176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const auto &P : Arg.pack_elements()) 829176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines VisitTemplateArgument(P); 83012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 83112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 83212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Type: 83312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(Arg.getAsType()); 83412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 83512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 83612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Integral: 83712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'V'; 83812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(Arg.getIntegralType()); 83912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << Arg.getAsIntegral(); 84012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 84112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 84212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 84312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 84412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 84512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// USR generation functions. 84612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 84712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 848e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCClass(StringRef Cls, raw_ostream &OS) { 84912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "objc(cs)" << Cls; 85012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 85112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 852e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCCategory(StringRef Cls, StringRef Cat, 853e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis raw_ostream &OS) { 85412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "objc(cy)" << Cls << '@' << Cat; 85512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 85612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 857e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCIvar(StringRef Ivar, raw_ostream &OS) { 85812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << '@' << Ivar; 85912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 86012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 861e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCMethod(StringRef Sel, 862e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis bool IsInstanceMethod, 863e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis raw_ostream &OS) { 86412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << (IsInstanceMethod ? "(im)" : "(cm)") << Sel; 86512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 86612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 867e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCProperty(StringRef Prop, raw_ostream &OS) { 86812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "(py)" << Prop; 86912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 87012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 871e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS) { 87212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "objc(pl)" << Prot; 87312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 87412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 875e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisbool clang::index::generateUSRForDecl(const Decl *D, 876e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis SmallVectorImpl<char> &Buf) { 87712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Don't generate USRs for things with invalid locations. 87812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!D || D->getLocStart().isInvalid()) 87912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return true; 88012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 88112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis USRGenerator UG(&D->getASTContext(), Buf); 88212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis UG.Visit(D); 88312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return UG.ignoreResults(); 88412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 886b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarbool clang::index::generateUSRForMacro(const MacroDefinitionRecord *MD, 887651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const SourceManager &SM, 888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVectorImpl<char> &Buf) { 889651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Don't generate USRs for things with invalid locations. 890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!MD || MD->getLocation().isInvalid()) 891651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 892651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 893651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::raw_svector_ostream Out(Buf); 894651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 895651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Assume that system headers are sane. Don't put source location 896651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // information into the USR if the macro comes from a system header. 897651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation Loc = MD->getLocation(); 898651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ShouldGenerateLocation = !SM.isInSystemHeader(Loc); 899651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 900651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Out << getUSRSpacePrefix(); 901651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ShouldGenerateLocation) 902651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines printLoc(Out, Loc, SM, /*IncludeOffset=*/true); 903651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Out << "@macro@"; 904c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Out << MD->getName()->getName(); 905651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 906651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 907