TemplateName.cpp revision 3b6afbb99a1c44b4076f8e15fb7311405941b306
17532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//===--- TemplateName.h - C++ Template Name Representation-------*- C++ -*-===//
27532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
37532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//                     The LLVM Compiler Infrastructure
47532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
57532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor// This file is distributed under the University of Illinois Open Source
67532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor// License. See LICENSE.TXT for details.
77532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
87532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//===----------------------------------------------------------------------===//
97532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//  This file defines the TemplateName interface and subclasses.
117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
127532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//===----------------------------------------------------------------------===//
13c960ee31c7e22a157a8cd31c92d9a9aa945e1e96Chris Lattner
147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "clang/AST/TemplateName.h"
157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "clang/AST/DeclTemplate.h"
167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "clang/AST/NestedNameSpecifier.h"
17d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor#include "clang/AST/PrettyPrinter.h"
18e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner#include "clang/Basic/LangOptions.h"
197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "llvm/Support/raw_ostream.h"
207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorusing namespace clang;
217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateDecl *TemplateName::getAsTemplateDecl() const {
237532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return Template;
257532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return QTN->getTemplateDecl();
287532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  return 0;
307532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
317532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
32d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas GregorOverloadedFunctionDecl *TemplateName::getAsOverloadedFunctionDecl() const {
33d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  if (OverloadedFunctionDecl *Ovl
34d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor        = Storage.dyn_cast<OverloadedFunctionDecl *>())
35d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    return Ovl;
36d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
37d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
38d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    return QTN->getOverloadedFunctionDecl();
39d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
40d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  return 0;
41d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor}
42d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
437532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorbool TemplateName::isDependent() const {
447532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (TemplateDecl *Template = getAsTemplateDecl()) {
45d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    return isa<TemplateTemplateParmDecl>(Template) ||
46d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor      Template->getDeclContext()->isDependentContext();
477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
49d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  if (OverloadedFunctionDecl *Ovl = getAsOverloadedFunctionDecl())
50d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    return Ovl->getDeclContext()->isDependentContext();
51d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  return true;
537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
55d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid
56d249e1d1f1498b81314459ceda19d6ff25c278adDouglas GregorTemplateName::print(llvm::raw_ostream &OS, const PrintingPolicy &Policy,
57d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                    bool SuppressNNS) const {
587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    OS << Template->getIdentifier()->getName();
60d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  else if (OverloadedFunctionDecl *Ovl
61d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor             = Storage.dyn_cast<OverloadedFunctionDecl *>())
62d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    OS << Ovl->getNameAsString();
637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
641734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor    if (!SuppressNNS)
65d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      QTN->getQualifier()->print(OS, Policy);
667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    if (QTN->hasTemplateKeyword())
677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor      OS << "template ";
68d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    OS << QTN->getDecl()->getNameAsString();
697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  } else if (DependentTemplateName *DTN = getAsDependentTemplateName()) {
703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!SuppressNNS && DTN->getQualifier())
71d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      DTN->getQualifier()->print(OS, Policy);
727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    OS << "template ";
73d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    // FIXME: Shouldn't we have a more general kind of name?
747532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    OS << DTN->getName()->getName();
757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
77de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor
789bde77309fd2f9f7a53446e374472c48c81f5182Douglas Gregorvoid TemplateName::dump() const {
79e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  LangOptions LO;  // FIXME!
80e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  LO.CPlusPlus = true;
81e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  LO.Bool = true;
82e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  print(llvm::errs(), PrintingPolicy(LO));
83de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor}
84d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
85d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas GregorTemplateDecl *QualifiedTemplateName::getTemplateDecl() const {
86d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  return dyn_cast<TemplateDecl>(Template);
87d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor}
88d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
89d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas GregorOverloadedFunctionDecl *
90d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas GregorQualifiedTemplateName::getOverloadedFunctionDecl() const {
91d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  return dyn_cast<OverloadedFunctionDecl>(Template);
92d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor}
93d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
94