freebsd-skq/lib/AST/TemplateName.cpp

97 lines
3.0 KiB
C++
Raw Normal View History

2009-06-02 17:58:47 +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.
//
//===----------------------------------------------------------------------===//
#include "clang/AST/TemplateName.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/NestedNameSpecifier.h"
#include "clang/AST/PrettyPrinter.h"
2009-07-04 13:58:54 +00:00
#include "clang/Basic/LangOptions.h"
2009-06-02 17:58:47 +00:00
#include "llvm/Support/raw_ostream.h"
using namespace clang;
TemplateDecl *TemplateName::getAsTemplateDecl() const {
if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
return Template;
2009-10-14 18:03:49 +00:00
2009-06-02 17:58:47 +00:00
if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
return QTN->getTemplateDecl();
return 0;
}
2009-10-14 18:03:49 +00:00
OverloadedFunctionDecl *TemplateName::getAsOverloadedFunctionDecl() const {
if (OverloadedFunctionDecl *Ovl
= Storage.dyn_cast<OverloadedFunctionDecl *>())
return Ovl;
if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
return QTN->getOverloadedFunctionDecl();
return 0;
}
2009-06-02 17:58:47 +00:00
bool TemplateName::isDependent() const {
if (TemplateDecl *Template = getAsTemplateDecl()) {
2009-10-14 18:03:49 +00:00
return isa<TemplateTemplateParmDecl>(Template) ||
Template->getDeclContext()->isDependentContext();
2009-06-02 17:58:47 +00:00
}
2009-10-14 18:03:49 +00:00
if (OverloadedFunctionDecl *Ovl = getAsOverloadedFunctionDecl())
return Ovl->getDeclContext()->isDependentContext();
2009-06-02 17:58:47 +00:00
return true;
}
2009-10-14 18:03:49 +00:00
void
2009-06-02 17:58:47 +00:00
TemplateName::print(llvm::raw_ostream &OS, const PrintingPolicy &Policy,
bool SuppressNNS) const {
if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
2009-11-04 15:04:32 +00:00
OS << Template->getNameAsString();
2009-10-14 18:03:49 +00:00
else if (OverloadedFunctionDecl *Ovl
= Storage.dyn_cast<OverloadedFunctionDecl *>())
OS << Ovl->getNameAsString();
2009-06-02 17:58:47 +00:00
else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
if (!SuppressNNS)
QTN->getQualifier()->print(OS, Policy);
if (QTN->hasTemplateKeyword())
OS << "template ";
2009-10-14 18:03:49 +00:00
OS << QTN->getDecl()->getNameAsString();
2009-06-02 17:58:47 +00:00
} else if (DependentTemplateName *DTN = getAsDependentTemplateName()) {
2009-10-14 18:03:49 +00:00
if (!SuppressNNS && DTN->getQualifier())
2009-06-02 17:58:47 +00:00
DTN->getQualifier()->print(OS, Policy);
OS << "template ";
2009-11-04 15:04:32 +00:00
if (DTN->isIdentifier())
OS << DTN->getIdentifier()->getName();
else
OS << "operator " << getOperatorSpelling(DTN->getOperator());
2009-06-02 17:58:47 +00:00
}
}
void TemplateName::dump() const {
2009-07-04 13:58:54 +00:00
LangOptions LO; // FIXME!
LO.CPlusPlus = true;
LO.Bool = true;
print(llvm::errs(), PrintingPolicy(LO));
2009-06-02 17:58:47 +00:00
}
2009-10-14 18:03:49 +00:00
TemplateDecl *QualifiedTemplateName::getTemplateDecl() const {
return dyn_cast<TemplateDecl>(Template);
}
OverloadedFunctionDecl *
QualifiedTemplateName::getOverloadedFunctionDecl() const {
return dyn_cast<OverloadedFunctionDecl>(Template);
}