TemplateName.cpp revision ca1bdd7c269a2390d43c040a60511edd017ee130
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" 20using namespace clang; 21 22TemplateDecl *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 32OverloadedFunctionDecl *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 43bool 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 55void 56TemplateName::print(llvm::raw_ostream &OS, const PrintingPolicy &Policy, 57 bool SuppressNNS) const { 58 if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>()) 59 OS << Template->getNameAsString(); 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 && DTN->getQualifier()) 71 DTN->getQualifier()->print(OS, Policy); 72 OS << "template "; 73 74 if (DTN->isIdentifier()) 75 OS << DTN->getIdentifier()->getName(); 76 else 77 OS << "operator " << getOperatorSpelling(DTN->getOperator()); 78 } 79} 80 81void TemplateName::dump() const { 82 LangOptions LO; // FIXME! 83 LO.CPlusPlus = true; 84 LO.Bool = true; 85 print(llvm::errs(), PrintingPolicy(LO)); 86} 87 88TemplateDecl *QualifiedTemplateName::getTemplateDecl() const { 89 return dyn_cast<TemplateDecl>(Template); 90} 91 92OverloadedFunctionDecl * 93QualifiedTemplateName::getOverloadedFunctionDecl() const { 94 return dyn_cast<OverloadedFunctionDecl>(Template); 95} 96 97