2009-03-31 06:58:21 +08: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 "llvm/Support/raw_ostream.h"
|
2009-04-01 02:38:02 +08:00
|
|
|
#include <stdio.h>
|
2009-03-31 06:58:21 +08:00
|
|
|
|
|
|
|
using namespace clang;
|
|
|
|
|
|
|
|
TemplateDecl *TemplateName::getAsTemplateDecl() const {
|
|
|
|
if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
|
|
|
|
return Template;
|
|
|
|
|
|
|
|
if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
|
|
|
|
return QTN->getTemplateDecl();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TemplateName::isDependent() const {
|
|
|
|
if (TemplateDecl *Template = getAsTemplateDecl()) {
|
|
|
|
// FIXME: We don't yet have a notion of dependent
|
|
|
|
// declarations. When we do, check that. This hack won't last
|
|
|
|
// long!.
|
|
|
|
return isa<TemplateTemplateParmDecl>(Template);
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TemplateName::Print(llvm::raw_ostream &OS) const {
|
|
|
|
if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
|
|
|
|
OS << Template->getIdentifier()->getName();
|
|
|
|
else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
|
|
|
|
QTN->getQualifier()->Print(OS);
|
|
|
|
if (QTN->hasTemplateKeyword())
|
|
|
|
OS << "template ";
|
|
|
|
OS << QTN->getTemplateDecl()->getIdentifier()->getName();
|
|
|
|
} else if (DependentTemplateName *DTN = getAsDependentTemplateName()) {
|
|
|
|
DTN->getQualifier()->Print(OS);
|
|
|
|
OS << "template ";
|
|
|
|
OS << DTN->getName()->getName();
|
|
|
|
}
|
|
|
|
}
|
2009-04-01 02:38:02 +08:00
|
|
|
|
|
|
|
void TemplateName::Dump() const {
|
|
|
|
std::string Result;
|
|
|
|
{
|
|
|
|
llvm::raw_string_ostream OS(Result);
|
|
|
|
Print(OS);
|
|
|
|
}
|
|
|
|
fprintf(stderr, "%s", Result.c_str());
|
|
|
|
}
|