USRGeneration.cpp revision e8458342d936c55b69806ea58d4a28bcb7c53d1a
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" 1412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "llvm/ADT/SmallString.h" 1512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "llvm/Support/Path.h" 1612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "llvm/Support/raw_ostream.h" 1712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 1812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisusing namespace clang; 19e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisusing namespace clang::index; 2012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 2112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 2212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// USR generation. 2312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 2412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 2512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisnamespace { 2612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisclass USRGenerator : public ConstDeclVisitor<USRGenerator> { 2712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis SmallVectorImpl<char> &Buf; 2812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm::raw_svector_ostream Out; 2912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool IgnoreResults; 3012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis ASTContext *Context; 3112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool generatedLoc; 3212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 3312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm::DenseMap<const Type *, unsigned> TypeSubstitutions; 3412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 3512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidispublic: 3612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis explicit USRGenerator(ASTContext *Ctx, SmallVectorImpl<char> &Buf) 3712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis : Buf(Buf), 3812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out(Buf), 3912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults(false), 4012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Context(Ctx), 4112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis generatedLoc(false) 4212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis { 4312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Add the USR space prefix. 44e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis Out << getUSRSpacePrefix(); 4512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 4612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 4712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool ignoreResults() const { return IgnoreResults; } 4812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 4912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Visitation methods from generating USRs from AST elements. 5012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitDeclContext(const DeclContext *D); 5112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitFieldDecl(const FieldDecl *D); 5212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitFunctionDecl(const FunctionDecl *D); 5312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNamedDecl(const NamedDecl *D); 5412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNamespaceDecl(const NamespaceDecl *D); 5512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D); 5612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D); 5712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitClassTemplateDecl(const ClassTemplateDecl *D); 5812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCContainerDecl(const ObjCContainerDecl *CD); 5912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCMethodDecl(const ObjCMethodDecl *MD); 6012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCPropertyDecl(const ObjCPropertyDecl *D); 6112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D); 6212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTagDecl(const TagDecl *D); 6312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTypedefDecl(const TypedefDecl *D); 6412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D); 6512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitVarDecl(const VarDecl *D); 6612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D); 6712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D); 6812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitLinkageSpecDecl(const LinkageSpecDecl *D) { 6912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 7012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 7112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) { 7212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 7312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 7412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUsingDecl(const UsingDecl *D) { 7512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 7612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 7712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D) { 7812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 7912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 8012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D) { 8112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 8212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 8312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 8412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate the string component containing the location of the 8512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// declaration. 8612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool GenLoc(const Decl *D); 8712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 8812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// String generation methods used both by the visitation methods 8912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// and from other clients that want to directly generate USRs. These 9012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// methods do not construct complete USRs (which incorporate the parents 9112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// of an AST element), but only the fragments concerning the AST element 9212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// itself. 9312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 9412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR for an Objective-C class. 9512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCClass(StringRef cls) { 96e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCClass(cls, Out); 9712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 9812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR for an Objective-C class category. 9912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCCategory(StringRef cls, StringRef cat) { 100e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCCategory(cls, cat, Out); 10112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 10212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR fragment for an Objective-C instance variable. The 10312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// complete USR can be created by concatenating the USR for the 10412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// encompassing class with this USR fragment. 10512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCIvar(StringRef ivar) { 106e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCIvar(ivar, Out); 10712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 10812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR fragment for an Objective-C method. 10912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCMethod(StringRef sel, bool isInstanceMethod) { 110e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCMethod(sel, isInstanceMethod, Out); 11112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 11212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR fragment for an Objective-C property. 11312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCProperty(StringRef prop) { 114e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCProperty(prop, Out); 11512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 11612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR for an Objective-C protocol. 11712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCProtocol(StringRef prot) { 118e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCProtocol(prot, Out); 11912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 12012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 12112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitType(QualType T); 12212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateParameterList(const TemplateParameterList *Params); 12312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateName(TemplateName Name); 12412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateArgument(const TemplateArgument &Arg); 12512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 12612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Emit a Decl's name using NamedDecl::printName() and return true if 12712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// the decl had no name. 12812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool EmitDeclName(const NamedDecl *D); 12912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis}; 13012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 13112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} // end anonymous namespace 13212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 13312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 13412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// Generating USRs from ASTS. 13512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 13612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 13712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisbool USRGenerator::EmitDeclName(const NamedDecl *D) { 13812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out.flush(); 13912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const unsigned startSize = Buf.size(); 14012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D->printName(Out); 14112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out.flush(); 14212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const unsigned endSize = Buf.size(); 14312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return startSize == endSize; 14412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 14512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 14612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisstatic inline bool ShouldGenerateLocation(const NamedDecl *D) { 14712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return !D->isExternallyVisible(); 14812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 14912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 15012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitDeclContext(const DeclContext *DC) { 15112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const NamedDecl *D = dyn_cast<NamedDecl>(DC)) 15212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(D); 15312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 15412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 15512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitFieldDecl(const FieldDecl *D) { 15612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The USR for an ivar declared in a class extension is based on the 15712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // ObjCInterfaceDecl, not the ObjCCategoryDecl. 15812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) 15912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(ID); 16012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 16112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 16212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << (isa<ObjCIvarDecl>(D) ? "@" : "@FI@"); 16312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (EmitDeclName(D)) { 16412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Bit fields can be anonymous. 16512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 16612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 16712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 16812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 16912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 17012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitFunctionDecl(const FunctionDecl *D) { 17112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ShouldGenerateLocation(D) && GenLoc(D)) 17212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 17312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 17412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 17512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (FunctionTemplateDecl *FunTmpl = D->getDescribedFunctionTemplate()) { 17612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@FT@"; 17712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(FunTmpl->getTemplateParameters()); 17812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } else 17912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@F@"; 18012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D->printName(Out); 18112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 18212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis ASTContext &Ctx = *Context; 18312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!Ctx.getLangOpts().CPlusPlus || D->isExternC()) 18412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 18512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 18612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TemplateArgumentList * 18712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis SpecArgs = D->getTemplateSpecializationArgs()) { 18812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '<'; 18912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (unsigned I = 0, N = SpecArgs->size(); I != N; ++I) { 19012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 19112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(SpecArgs->get(I)); 19212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 19312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>'; 19412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 19512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 19612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Mangle in type information for the arguments. 19712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (FunctionDecl::param_const_iterator I = D->param_begin(), 19812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis E = D->param_end(); 19912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis I != E; ++I) { 20012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 20112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ParmVarDecl *PD = *I) 20212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(PD->getType()); 20312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 20412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (D->isVariadic()) 20512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '.'; 20612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 20712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) { 20812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (MD->isStatic()) 20912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'S'; 21012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (unsigned quals = MD->getTypeQualifiers()) 21112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << (char)('0' + quals); 21212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 21312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 21412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 21512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNamedDecl(const NamedDecl *D) { 21612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 21712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@"; 21812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 21912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (EmitDeclName(D)) { 22012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The string can be empty if the declaration has no name; e.g., it is 22112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // the ParmDecl with no name for declaration of a function pointer type, 22212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // e.g.: void (*f)(void *); 22312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // In this case, don't generate a USR. 22412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 22512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 22612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 22712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 22812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitVarDecl(const VarDecl *D) { 22912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // VarDecls can be declared 'extern' within a function or method body, 23012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // but their enclosing DeclContext is the function, not the TU. We need 23112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // to check the storage class to correctly generate the USR. 23212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ShouldGenerateLocation(D) && GenLoc(D)) 23312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 23412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 23512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 23612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 23712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Variables always have simple names. 23812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis StringRef s = D->getName(); 23912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 24012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The string can be empty if the declaration has no name; e.g., it is 24112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // the ParmDecl with no name for declaration of a function pointer type, e.g.: 24212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // void (*f)(void *); 24312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // In this case, don't generate a USR. 24412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (s.empty()) 24512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 24612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 24712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@' << s; 24812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 24912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 25012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNonTypeTemplateParmDecl( 25112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const NonTypeTemplateParmDecl *D) { 25212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenLoc(D); 25312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 25412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 25512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 25612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateTemplateParmDecl( 25712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const TemplateTemplateParmDecl *D) { 25812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenLoc(D); 25912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 26012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 26112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 26212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNamespaceDecl(const NamespaceDecl *D) { 26312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (D->isAnonymousNamespace()) { 26412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@aN"; 26512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 26612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 26712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 26812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 26912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!IgnoreResults) 27012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@N@" << D->getName(); 27112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 27212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 27312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { 27412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitFunctionDecl(D->getTemplatedDecl()); 27512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 27612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 27712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitClassTemplateDecl(const ClassTemplateDecl *D) { 27812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTagDecl(D->getTemplatedDecl()); 27912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 28012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 28112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) { 28212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 28312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!IgnoreResults) 28412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@NA@" << D->getName(); 28512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 28612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 28712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCMethodDecl(const ObjCMethodDecl *D) { 28812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const DeclContext *container = D->getDeclContext(); 28912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ObjCProtocolDecl *pd = dyn_cast<ObjCProtocolDecl>(container)) { 29012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(pd); 29112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 29212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else { 29312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The USR for a method declared in a class extension or category is based on 29412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // the ObjCInterfaceDecl, not the ObjCCategoryDecl. 29512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCInterfaceDecl *ID = D->getClassInterface(); 29612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!ID) { 29712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 29812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 29912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 30012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(ID); 30112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 30212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Ideally we would use 'GenObjCMethod', but this is such a hot path 30312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // for Objective-C code that we don't want to use 30412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // DeclarationName::getAsString(). 30512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << (D->isInstanceMethod() ? "(im)" : "(cm)") 30612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis << DeclarationName(D->getSelector()); 30712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 30812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 30912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCContainerDecl(const ObjCContainerDecl *D) { 31012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getKind()) { 31112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis default: 31212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm_unreachable("Invalid ObjC container."); 31312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCInterface: 31412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCImplementation: 31512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCClass(D->getName()); 31612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 31712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCCategory: { 31812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(D); 31912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCInterfaceDecl *ID = CD->getClassInterface(); 32012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!ID) { 32112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Handle invalid code where the @interface might not 32212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // have been specified. 32312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: We should be able to generate this USR even if the 32412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // @interface isn't available. 32512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 32612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 32712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 32812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Specially handle class extensions, which are anonymous categories. 32912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // We want to mangle in the location to uniquely distinguish them. 33012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (CD->IsClassExtension()) { 33112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "objc(ext)" << ID->getName() << '@'; 33212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenLoc(CD); 33312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 33412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 33512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCCategory(ID->getName(), CD->getName()); 33612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 33712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 33812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 33912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCCategoryImpl: { 34012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCCategoryImplDecl *CD = cast<ObjCCategoryImplDecl>(D); 34112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCInterfaceDecl *ID = CD->getClassInterface(); 34212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!ID) { 34312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Handle invalid code where the @interface might not 34412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // have been specified. 34512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: We should be able to generate this USR even if the 34612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // @interface isn't available. 34712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 34812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 34912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 35012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCCategory(ID->getName(), CD->getName()); 35112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 35212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 35312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCProtocol: 35412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCProtocol(cast<ObjCProtocolDecl>(D)->getName()); 35512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 35612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 35712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 35812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 35912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) { 36012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The USR for a property declared in a class extension or category is based 36112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // on the ObjCInterfaceDecl, not the ObjCCategoryDecl. 36212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) 36312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(ID); 36412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 36512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(cast<Decl>(D->getDeclContext())); 36612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCProperty(D->getName()); 36712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 36812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 36912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) { 37012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ObjCPropertyDecl *PD = D->getPropertyDecl()) { 37112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitObjCPropertyDecl(PD); 37212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 37312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 37412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 37512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 37612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 37712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 37812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTagDecl(const TagDecl *D) { 37912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Add the location of the tag decl to handle resolution across 38012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // translation units. 38112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ShouldGenerateLocation(D) && GenLoc(D)) 38212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 38312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 38412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D = D->getCanonicalDecl(); 38512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 38612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 38712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool AlreadyStarted = false; 38812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(D)) { 38912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ClassTemplateDecl *ClassTmpl = CXXRecord->getDescribedClassTemplate()) { 39012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis AlreadyStarted = true; 39112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 39212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getTagKind()) { 39312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Interface: 39412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Struct: Out << "@ST"; break; 39512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Class: Out << "@CT"; break; 39612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Union: Out << "@UT"; break; 39712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Enum: llvm_unreachable("enum template"); 39812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 39912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(ClassTmpl->getTemplateParameters()); 40012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } else if (const ClassTemplatePartialSpecializationDecl *PartialSpec 40112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = dyn_cast<ClassTemplatePartialSpecializationDecl>(CXXRecord)) { 40212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis AlreadyStarted = true; 40312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 40412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getTagKind()) { 40512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Interface: 40612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Struct: Out << "@SP"; break; 40712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Class: Out << "@CP"; break; 40812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Union: Out << "@UP"; break; 40912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Enum: llvm_unreachable("enum partial specialization"); 41012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 41112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(PartialSpec->getTemplateParameters()); 41212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 41312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 41412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 41512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!AlreadyStarted) { 41612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getTagKind()) { 41712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Interface: 41812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Struct: Out << "@S"; break; 41912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Class: Out << "@C"; break; 42012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Union: Out << "@U"; break; 42112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Enum: Out << "@E"; break; 42212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 42312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 42412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 42512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@'; 42612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out.flush(); 42712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis assert(Buf.size() > 0); 42812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const unsigned off = Buf.size() - 1; 42912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 43012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (EmitDeclName(D)) { 43112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TypedefNameDecl *TD = D->getTypedefNameForAnonDecl()) { 43212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Buf[off] = 'A'; 43312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@' << *TD; 43412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 43512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 43612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Buf[off] = 'a'; 43712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 43812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 43912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // For a class template specialization, mangle the template arguments. 44012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ClassTemplateSpecializationDecl *Spec 44112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = dyn_cast<ClassTemplateSpecializationDecl>(D)) { 44212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const TemplateArgumentList &Args = Spec->getTemplateInstantiationArgs(); 44312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>'; 44412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (unsigned I = 0, N = Args.size(); I != N; ++I) { 44512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 44612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(Args.get(I)); 44712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 44812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 44912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 45012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 45112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTypedefDecl(const TypedefDecl *D) { 45212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ShouldGenerateLocation(D) && GenLoc(D)) 45312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 45412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const DeclContext *DC = D->getDeclContext(); 45512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const NamedDecl *DCN = dyn_cast<NamedDecl>(DC)) 45612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(DCN); 45712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@T@"; 45812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << D->getName(); 45912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 46012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 46112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) { 46212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenLoc(D); 46312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 46412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 46512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 46612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisbool USRGenerator::GenLoc(const Decl *D) { 46712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (generatedLoc) 46812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return IgnoreResults; 46912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis generatedLoc = true; 47012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 47112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Guard against null declarations in invalid code. 47212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!D) { 47312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 47412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return true; 47512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 47612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 47712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Use the location of canonical decl. 47812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D = D->getCanonicalDecl(); 47912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 48012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const SourceManager &SM = Context->getSourceManager(); 48112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis SourceLocation L = D->getLocStart(); 48212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (L.isInvalid()) { 48312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 48412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return true; 48512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 48612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis L = SM.getExpansionLoc(L); 48712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const std::pair<FileID, unsigned> &Decomposed = SM.getDecomposedLoc(L); 48812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const FileEntry *FE = SM.getFileEntryForID(Decomposed.first); 48912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (FE) { 49012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << llvm::sys::path::filename(FE->getName()); 49112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 49212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else { 49312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // This case really isn't interesting. 49412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 49512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return true; 49612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 49712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Use the offest into the FileID to represent the location. Using 49812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // a line/column can cause us to look back at the original source file, 49912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // which is expensive. 50012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@' << Decomposed.second; 50112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return IgnoreResults; 50212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 50312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 50412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitType(QualType T) { 50512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // This method mangles in USR information for types. It can possibly 50612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // just reuse the naming-mangling logic used by codegen, although the 50712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // requirements for USRs might not be the same. 50812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis ASTContext &Ctx = *Context; 50912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 51012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis do { 51112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = Ctx.getCanonicalType(T); 51212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Qualifiers Q = T.getQualifiers(); 51312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis unsigned qVal = 0; 51412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Q.hasConst()) 51512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis qVal |= 0x1; 51612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Q.hasVolatile()) 51712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis qVal |= 0x2; 51812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Q.hasRestrict()) 51912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis qVal |= 0x4; 52012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if(qVal) 52112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << ((char) ('0' + qVal)); 52212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 52312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Mangle in ObjC GC qualifiers? 52412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 52512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const PackExpansionType *Expansion = T->getAs<PackExpansionType>()) { 52612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'P'; 52712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = Expansion->getPattern(); 52812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 52912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 53012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const BuiltinType *BT = T->getAs<BuiltinType>()) { 53112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis unsigned char c = '\0'; 53212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (BT->getKind()) { 53312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Void: 53412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'v'; break; 53512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Bool: 53612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'b'; break; 53712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char_U: 53812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UChar: 53912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'c'; break; 54012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char16: 54112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'q'; break; 54212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char32: 54312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'w'; break; 54412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UShort: 54512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 's'; break; 54612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UInt: 54712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'i'; break; 54812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ULong: 54912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'l'; break; 55012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ULongLong: 55112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'k'; break; 55212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UInt128: 55312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'j'; break; 55412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char_S: 55512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::SChar: 55612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'C'; break; 55712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::WChar_S: 55812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::WChar_U: 55912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'W'; break; 56012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Short: 56112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'S'; break; 56212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Int: 56312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'I'; break; 56412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Long: 56512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'L'; break; 56612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::LongLong: 56712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'K'; break; 56812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Int128: 56912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'J'; break; 57012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Half: 57112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'h'; break; 57212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Float: 57312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'f'; break; 57412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Double: 57512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'd'; break; 57612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::LongDouble: 57712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'D'; break; 57812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::NullPtr: 57912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'n'; break; 58012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#define BUILTIN_TYPE(Id, SingletonId) 58112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: 58212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "clang/AST/BuiltinTypes.def" 58312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Dependent: 58412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage1d: 58512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage1dArray: 58612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage1dBuffer: 58712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage2d: 58812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage2dArray: 58912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage3d: 59012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLEvent: 59112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLSampler: 59212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 59312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 59412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ObjCId: 59512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'o'; break; 59612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ObjCClass: 59712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'O'; break; 59812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ObjCSel: 59912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'e'; break; 60012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 60112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << c; 60212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 60312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 60412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 60512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // If we have already seen this (non-built-in) type, use a substitution 60612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // encoding. 60712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm::DenseMap<const Type *, unsigned>::iterator Substitution 60812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = TypeSubstitutions.find(T.getTypePtr()); 60912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Substitution != TypeSubstitutions.end()) { 61012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'S' << Substitution->second << '_'; 61112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 61212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } else { 61312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Record this as a substitution. 61412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis unsigned Number = TypeSubstitutions.size(); 61512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis TypeSubstitutions[T.getTypePtr()] = Number; 61612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 61712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 61812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const PointerType *PT = T->getAs<PointerType>()) { 61912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '*'; 62012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = PT->getPointeeType(); 62112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 62212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 62312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ReferenceType *RT = T->getAs<ReferenceType>()) { 62412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '&'; 62512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = RT->getPointeeType(); 62612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 62712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 62812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const FunctionProtoType *FT = T->getAs<FunctionProtoType>()) { 62912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'F'; 63012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(FT->getResultType()); 63112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (FunctionProtoType::arg_type_iterator 63212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis I = FT->arg_type_begin(), E = FT->arg_type_end(); I!=E; ++I) { 63312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(*I); 63412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 63512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (FT->isVariadic()) 63612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '.'; 63712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 63812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 63912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) { 64012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'B'; 64112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = BT->getPointeeType(); 64212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 64312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 64412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ComplexType *CT = T->getAs<ComplexType>()) { 64512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '<'; 64612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = CT->getElementType(); 64712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 64812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 64912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TagType *TT = T->getAs<TagType>()) { 65012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '$'; 65112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTagDecl(TT->getDecl()); 65212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 65312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 65412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TemplateTypeParmType *TTP = T->getAs<TemplateTypeParmType>()) { 65512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 't' << TTP->getDepth() << '.' << TTP->getIndex(); 65612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 65712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 65812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TemplateSpecializationType *Spec 65912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = T->getAs<TemplateSpecializationType>()) { 66012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>'; 66112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateName(Spec->getTemplateName()); 66212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << Spec->getNumArgs(); 66312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (unsigned I = 0, N = Spec->getNumArgs(); I != N; ++I) 66412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(Spec->getArg(I)); 66512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 66612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 66712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 66812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Unhandled type. 66912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << ' '; 67012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 67112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } while (true); 67212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 67312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 67412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateParameterList( 67512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const TemplateParameterList *Params) { 67612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!Params) 67712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 67812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>' << Params->size(); 67912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (TemplateParameterList::const_iterator P = Params->begin(), 68012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis PEnd = Params->end(); 68112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis P != PEnd; ++P) { 68212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 68312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (isa<TemplateTypeParmDecl>(*P)) { 68412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (cast<TemplateTypeParmDecl>(*P)->isParameterPack()) 68512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out<< 'p'; 68612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'T'; 68712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 68812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 68912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 69012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 69112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (NTTP->isParameterPack()) 69212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'p'; 69312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'N'; 69412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(NTTP->getType()); 69512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 69612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 69712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 69812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 69912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (TTP->isParameterPack()) 70012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'p'; 70112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 't'; 70212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(TTP->getTemplateParameters()); 70312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 70412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 70512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 70612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateName(TemplateName Name) { 70712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 70812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (TemplateTemplateParmDecl *TTP 70912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = dyn_cast<TemplateTemplateParmDecl>(Template)) { 71012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 't' << TTP->getDepth() << '.' << TTP->getIndex(); 71112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 71212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 71312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 71412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(Template); 71512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 71612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 71712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 71812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: Visit dependent template names. 71912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 72012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 72112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateArgument(const TemplateArgument &Arg) { 72212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (Arg.getKind()) { 72312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Null: 72412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 72512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 72612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Declaration: 72712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(Arg.getAsDecl()); 72812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 72912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 73012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::NullPtr: 73112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 73212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 73312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::TemplateExpansion: 73412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'P'; // pack expansion of... 73512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Fall through 73612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Template: 73712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateName(Arg.getAsTemplateOrTemplatePattern()); 73812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 73912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 74012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Expression: 74112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: Visit expressions. 74212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 74312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 74412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Pack: 74512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'p' << Arg.pack_size(); 74612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (TemplateArgument::pack_iterator P = Arg.pack_begin(), PEnd = Arg.pack_end(); 74712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis P != PEnd; ++P) 74812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(*P); 74912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 75012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 75112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Type: 75212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(Arg.getAsType()); 75312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 75412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 75512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Integral: 75612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'V'; 75712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(Arg.getIntegralType()); 75812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << Arg.getAsIntegral(); 75912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 76012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 76112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 76212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 76312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 76412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// USR generation functions. 76512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 76612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 767e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCClass(StringRef Cls, raw_ostream &OS) { 76812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "objc(cs)" << Cls; 76912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 77012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 771e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCCategory(StringRef Cls, StringRef Cat, 772e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis raw_ostream &OS) { 77312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "objc(cy)" << Cls << '@' << Cat; 77412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 77512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 776e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCIvar(StringRef Ivar, raw_ostream &OS) { 77712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << '@' << Ivar; 77812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 77912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 780e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCMethod(StringRef Sel, 781e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis bool IsInstanceMethod, 782e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis raw_ostream &OS) { 78312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << (IsInstanceMethod ? "(im)" : "(cm)") << Sel; 78412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 78512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 786e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCProperty(StringRef Prop, raw_ostream &OS) { 78712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "(py)" << Prop; 78812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 78912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 790e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS) { 79112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "objc(pl)" << Prot; 79212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 79312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 794e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisbool clang::index::generateUSRForDecl(const Decl *D, 795e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis SmallVectorImpl<char> &Buf) { 79612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Don't generate USRs for things with invalid locations. 79712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!D || D->getLocStart().isInvalid()) 79812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return true; 79912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 80012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis USRGenerator UG(&D->getASTContext(), Buf); 80112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis UG.Visit(D); 80212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return UG.ignoreResults(); 80312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 804