]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/AST/TemplateName.cpp
Update clang to r86025.
[FreeBSD/FreeBSD.git] / lib / AST / TemplateName.cpp
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->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
81 void TemplateName::dump() const {
82   LangOptions LO;  // FIXME!
83   LO.CPlusPlus = true;
84   LO.Bool = true;
85   print(llvm::errs(), PrintingPolicy(LO));
86 }
87
88 TemplateDecl *QualifiedTemplateName::getTemplateDecl() const {
89   return dyn_cast<TemplateDecl>(Template);
90 }
91
92 OverloadedFunctionDecl *
93 QualifiedTemplateName::getOverloadedFunctionDecl() const {
94   return dyn_cast<OverloadedFunctionDecl>(Template);
95 }
96