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