2009-03-30 22:58:21 +00:00
|
|
|
//===--- TemplateName.h - C++ Template Name Representation-------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file defines the TemplateName interface and subclasses.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
2009-04-02 06:07:12 +00:00
|
|
|
|
2009-03-30 22:58:21 +00:00
|
|
|
#include "clang/AST/TemplateName.h"
|
|
|
|
#include "clang/AST/DeclTemplate.h"
|
|
|
|
#include "clang/AST/NestedNameSpecifier.h"
|
2009-05-29 20:38:28 +00:00
|
|
|
#include "clang/AST/PrettyPrinter.h"
|
2010-04-08 00:03:06 +00:00
|
|
|
#include "clang/Basic/Diagnostic.h"
|
2009-06-30 01:26:17 +00:00
|
|
|
#include "clang/Basic/LangOptions.h"
|
2009-03-30 22:58:21 +00:00
|
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace clang;
|
2010-04-08 00:03:06 +00:00
|
|
|
using namespace llvm;
|
2009-03-30 22:58:21 +00:00
|
|
|
|
2010-06-19 19:28:53 +00:00
|
|
|
TemplateName::NameKind TemplateName::getKind() const {
|
|
|
|
if (Storage.is<TemplateDecl *>())
|
|
|
|
return Template;
|
|
|
|
if (Storage.is<OverloadedTemplateStorage *>())
|
|
|
|
return OverloadedTemplate;
|
|
|
|
if (Storage.is<QualifiedTemplateName *>())
|
|
|
|
return QualifiedTemplate;
|
|
|
|
assert(Storage.is<DependentTemplateName *>() && "There's a case unhandled!");
|
|
|
|
return DependentTemplate;
|
|
|
|
}
|
|
|
|
|
2009-03-30 22:58:21 +00:00
|
|
|
TemplateDecl *TemplateName::getAsTemplateDecl() const {
|
|
|
|
if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
|
|
|
|
return Template;
|
2009-09-09 15:08:12 +00:00
|
|
|
|
2009-03-30 22:58:21 +00:00
|
|
|
if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
|
|
|
|
return QTN->getTemplateDecl();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TemplateName::isDependent() const {
|
|
|
|
if (TemplateDecl *Template = getAsTemplateDecl()) {
|
2009-09-09 15:08:12 +00:00
|
|
|
return isa<TemplateTemplateParmDecl>(Template) ||
|
2009-07-29 18:26:50 +00:00
|
|
|
Template->getDeclContext()->isDependentContext();
|
2009-03-30 22:58:21 +00:00
|
|
|
}
|
|
|
|
|
2009-12-02 08:04:21 +00:00
|
|
|
assert(!getAsOverloadedTemplate() &&
|
|
|
|
"overloaded templates shouldn't survive to here");
|
2009-09-09 15:08:12 +00:00
|
|
|
|
2009-03-30 22:58:21 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2009-09-09 15:08:12 +00:00
|
|
|
void
|
2009-05-29 20:38:28 +00:00
|
|
|
TemplateName::print(llvm::raw_ostream &OS, const PrintingPolicy &Policy,
|
|
|
|
bool SuppressNNS) const {
|
2009-03-30 22:58:21 +00:00
|
|
|
if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
|
2010-04-17 09:33:03 +00:00
|
|
|
OS << Template;
|
2009-03-30 22:58:21 +00:00
|
|
|
else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
|
2009-04-01 00:28:59 +00:00
|
|
|
if (!SuppressNNS)
|
2009-05-29 20:38:28 +00:00
|
|
|
QTN->getQualifier()->print(OS, Policy);
|
2009-03-30 22:58:21 +00:00
|
|
|
if (QTN->hasTemplateKeyword())
|
|
|
|
OS << "template ";
|
2010-04-17 09:33:03 +00:00
|
|
|
OS << QTN->getDecl();
|
2009-03-30 22:58:21 +00:00
|
|
|
} else if (DependentTemplateName *DTN = getAsDependentTemplateName()) {
|
2009-09-09 00:23:06 +00:00
|
|
|
if (!SuppressNNS && DTN->getQualifier())
|
2009-05-29 20:38:28 +00:00
|
|
|
DTN->getQualifier()->print(OS, Policy);
|
2009-03-30 22:58:21 +00:00
|
|
|
OS << "template ";
|
2009-11-04 00:56:37 +00:00
|
|
|
|
|
|
|
if (DTN->isIdentifier())
|
|
|
|
OS << DTN->getIdentifier()->getName();
|
|
|
|
else
|
|
|
|
OS << "operator " << getOperatorSpelling(DTN->getOperator());
|
2009-03-30 22:58:21 +00:00
|
|
|
}
|
|
|
|
}
|
2009-03-31 18:38:02 +00:00
|
|
|
|
2010-04-08 00:03:06 +00:00
|
|
|
const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
|
|
|
|
TemplateName N) {
|
|
|
|
std::string NameStr;
|
|
|
|
raw_string_ostream OS(NameStr);
|
|
|
|
LangOptions LO;
|
|
|
|
LO.CPlusPlus = true;
|
|
|
|
LO.Bool = true;
|
|
|
|
N.print(OS, PrintingPolicy(LO));
|
|
|
|
OS.flush();
|
|
|
|
return DB << NameStr;
|
|
|
|
}
|
|
|
|
|
2009-03-31 20:22:05 +00:00
|
|
|
void TemplateName::dump() const {
|
2009-06-30 01:26:17 +00:00
|
|
|
LangOptions LO; // FIXME!
|
|
|
|
LO.CPlusPlus = true;
|
|
|
|
LO.Bool = true;
|
|
|
|
print(llvm::errs(), PrintingPolicy(LO));
|
2009-03-31 18:38:02 +00:00
|
|
|
}
|