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/LangOptions.h"
19 #include "llvm/Support/raw_ostream.h"
20 using namespace clang;
22 TemplateDecl *TemplateName::getAsTemplateDecl() const {
23 if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
26 if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
27 return QTN->getTemplateDecl();
32 OverloadedFunctionDecl *TemplateName::getAsOverloadedFunctionDecl() const {
33 if (OverloadedFunctionDecl *Ovl
34 = Storage.dyn_cast<OverloadedFunctionDecl *>())
37 if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
38 return QTN->getOverloadedFunctionDecl();
43 bool TemplateName::isDependent() const {
44 if (TemplateDecl *Template = getAsTemplateDecl()) {
45 return isa<TemplateTemplateParmDecl>(Template) ||
46 Template->getDeclContext()->isDependentContext();
49 if (OverloadedFunctionDecl *Ovl = getAsOverloadedFunctionDecl())
50 return Ovl->getDeclContext()->isDependentContext();
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->getNameAsString();
60 else if (OverloadedFunctionDecl *Ovl
61 = Storage.dyn_cast<OverloadedFunctionDecl *>())
62 OS << Ovl->getNameAsString();
63 else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
65 QTN->getQualifier()->print(OS, Policy);
66 if (QTN->hasTemplateKeyword())
68 OS << QTN->getDecl()->getNameAsString();
69 } else if (DependentTemplateName *DTN = getAsDependentTemplateName()) {
70 if (!SuppressNNS && DTN->getQualifier())
71 DTN->getQualifier()->print(OS, Policy);
74 if (DTN->isIdentifier())
75 OS << DTN->getIdentifier()->getName();
77 OS << "operator " << getOperatorSpelling(DTN->getOperator());
81 void TemplateName::dump() const {
82 LangOptions LO; // FIXME!
85 print(llvm::errs(), PrintingPolicy(LO));
88 TemplateDecl *QualifiedTemplateName::getTemplateDecl() const {
89 return dyn_cast<TemplateDecl>(Template);
92 OverloadedFunctionDecl *
93 QualifiedTemplateName::getOverloadedFunctionDecl() const {
94 return dyn_cast<OverloadedFunctionDecl>(Template);