1 //===--- TemplateName.h - C++ Template Name Representation-------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the TemplateName interface and subclasses.
12 //===----------------------------------------------------------------------===//
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/Diagnostic.h"
19 #include "clang/Basic/LangOptions.h"
20 #include "llvm/Support/raw_ostream.h"
21 using namespace clang;
24 TemplateName::NameKind TemplateName::getKind() const {
25 if (Storage.is<TemplateDecl *>())
27 if (Storage.is<OverloadedTemplateStorage *>())
28 return OverloadedTemplate;
29 if (Storage.is<QualifiedTemplateName *>())
30 return QualifiedTemplate;
31 assert(Storage.is<DependentTemplateName *>() && "There's a case unhandled!");
32 return DependentTemplate;
35 TemplateDecl *TemplateName::getAsTemplateDecl() const {
36 if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
39 if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
40 return QTN->getTemplateDecl();
45 bool TemplateName::isDependent() const {
46 if (TemplateDecl *Template = getAsTemplateDecl()) {
47 return isa<TemplateTemplateParmDecl>(Template) ||
48 Template->getDeclContext()->isDependentContext();
51 assert(!getAsOverloadedTemplate() &&
52 "overloaded templates shouldn't survive to here");
58 TemplateName::print(llvm::raw_ostream &OS, const PrintingPolicy &Policy,
59 bool SuppressNNS) const {
60 if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
62 else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
64 QTN->getQualifier()->print(OS, Policy);
65 if (QTN->hasTemplateKeyword())
68 } else if (DependentTemplateName *DTN = getAsDependentTemplateName()) {
69 if (!SuppressNNS && DTN->getQualifier())
70 DTN->getQualifier()->print(OS, Policy);
73 if (DTN->isIdentifier())
74 OS << DTN->getIdentifier()->getName();
76 OS << "operator " << getOperatorSpelling(DTN->getOperator());
80 const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
83 raw_string_ostream OS(NameStr);
87 N.print(OS, PrintingPolicy(LO));
92 void TemplateName::dump() const {
93 LangOptions LO; // FIXME!
96 print(llvm::errs(), PrintingPolicy(LO));