1 //===--- TemplateName.h - C++ Template Name Representation-------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the TemplateName interface and subclasses. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/AST/TemplateName.h" 15 #include "clang/AST/DeclTemplate.h" 16 #include "clang/AST/NestedNameSpecifier.h" 17 #include "clang/AST/PrettyPrinter.h" 18 #include "clang/Basic/LangOptions.h" 19 #include "llvm/Support/raw_ostream.h" 20 using namespace clang; 21 22 TemplateDecl *TemplateName::getAsTemplateDecl() const { 23 if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>()) 24 return Template; 25 26 if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) 27 return QTN->getTemplateDecl(); 28 29 return 0; 30 } 31 32 OverloadedFunctionDecl *TemplateName::getAsOverloadedFunctionDecl() const { 33 if (OverloadedFunctionDecl *Ovl 34 = Storage.dyn_cast<OverloadedFunctionDecl *>()) 35 return Ovl; 36 37 if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) 38 return QTN->getOverloadedFunctionDecl(); 39 40 return 0; 41 } 42 43 bool TemplateName::isDependent() const { 44 if (TemplateDecl *Template = getAsTemplateDecl()) { 45 return isa<TemplateTemplateParmDecl>(Template) || 46 Template->getDeclContext()->isDependentContext(); 47 } 48 49 if (OverloadedFunctionDecl *Ovl = getAsOverloadedFunctionDecl()) 50 return Ovl->getDeclContext()->isDependentContext(); 51 52 return true; 53 } 54 55 void 56 TemplateName::print(llvm::raw_ostream &OS, const PrintingPolicy &Policy, 57 bool SuppressNNS) const { 58 if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>()) 59 OS << Template->getIdentifier()->getName(); 60 else if (OverloadedFunctionDecl *Ovl 61 = Storage.dyn_cast<OverloadedFunctionDecl *>()) 62 OS << Ovl->getNameAsString(); 63 else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) { 64 if (!SuppressNNS) 65 QTN->getQualifier()->print(OS, Policy); 66 if (QTN->hasTemplateKeyword()) 67 OS << "template "; 68 OS << QTN->getDecl()->getNameAsString(); 69 } else if (DependentTemplateName *DTN = getAsDependentTemplateName()) { 70 if (!SuppressNNS) 71 DTN->getQualifier()->print(OS, Policy); 72 OS << "template "; 73 // FIXME: Shouldn't we have a more general kind of name? 74 OS << DTN->getName()->getName(); 75 } 76 } 77 78 void TemplateName::dump() const { 79 LangOptions LO; // FIXME! 80 LO.CPlusPlus = true; 81 LO.Bool = true; 82 print(llvm::errs(), PrintingPolicy(LO)); 83 } 84 85 TemplateDecl *QualifiedTemplateName::getTemplateDecl() const { 86 return dyn_cast<TemplateDecl>(Template); 87 } 88 89 OverloadedFunctionDecl * 90 QualifiedTemplateName::getOverloadedFunctionDecl() const { 91 return dyn_cast<OverloadedFunctionDecl>(Template); 92 } 93 94