Comment.cpp revision af19a6aaa2959ef5e76f19d51e87ef523bdeedde
18d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===--- Comment.cpp - Comment AST node implementation --------------------===//
28d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//
38d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//                     The LLVM Compiler Infrastructure
48d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//
58d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// This file is distributed under the University of Illinois Open Source
68d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// License. See LICENSE.TXT for details.
78d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//
88d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===----------------------------------------------------------------------===//
98d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/Comment.h"
111ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko#include "clang/AST/Decl.h"
121ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko#include "clang/AST/DeclObjC.h"
131ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko#include "clang/AST/DeclTemplate.h"
148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/Support/ErrorHandling.h"
15fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko#include "llvm/Support/raw_ostream.h"
168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang {
188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments {
198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoconst char *Comment::getCommentKindName() const {
218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  switch (getCommentKind()) {
228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  case NoCommentKind: return "NoCommentKind";
238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT)
248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \
258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  case CLASS##Kind: \
268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    return #CLASS;
278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc"
288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT
298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT
308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  }
318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  llvm_unreachable("Unknown comment kind!");
328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
34fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenkovoid Comment::dump() const {
35fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko  // It is important that Comment::dump() is defined in a different TU than
36fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko  // Comment::dump(raw_ostream, SourceManager).  If both functions were defined
37fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko  // in CommentDumper.cpp, that object file would be removed by linker because
38fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko  // none of its functions are referenced by other object files, despite the
39fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko  // LLVM_ATTRIBUTE_USED.
40fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko  dump(llvm::errs(), NULL);
41fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko}
42fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko
43fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenkovoid Comment::dump(SourceManager &SM) const {
44fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko  dump(llvm::errs(), &SM);
45fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko}
46fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko
478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace {
488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkostruct good {};
498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkostruct bad {};
508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate <typename T>
528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkogood implements_child_begin_end(Comment::child_iterator (T::*)() const) {
538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  return good();
548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkostatic inline bad implements_child_begin_end(
578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                      Comment::child_iterator (Comment::*)() const) {
588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  return bad();
598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ASSERT_IMPLEMENTS_child_begin(function) \
628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  (void) sizeof(good(implements_child_begin_end(function)))
638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkostatic inline void CheckCommentASTNodes() {
658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT)
668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \
678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_IMPLEMENTS_child_begin(&CLASS::child_begin); \
688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_IMPLEMENTS_child_begin(&CLASS::child_end);
698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc"
708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT
718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT
728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ASSERT_IMPLEMENTS_child_begin
758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end unnamed namespace
778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri GribenkoComment::child_iterator Comment::child_begin() const {
798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  switch (getCommentKind()) {
808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  case NoCommentKind: llvm_unreachable("comment without a kind");
818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT)
828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \
838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  case CLASS##Kind: \
848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    return static_cast<const CLASS *>(this)->child_begin();
858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc"
868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT
878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT
888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  }
894d48b5c1d58c381e6e0c719701ef433b530e0e1aMatt Beaumont-Gay  llvm_unreachable("Unknown comment kind!");
908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri GribenkoComment::child_iterator Comment::child_end() const {
938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  switch (getCommentKind()) {
948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  case NoCommentKind: llvm_unreachable("comment without a kind");
958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT)
968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \
978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  case CLASS##Kind: \
988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    return static_cast<const CLASS *>(this)->child_end();
998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc"
1008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT
1018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT
1028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  }
1034d48b5c1d58c381e6e0c719701ef433b530e0e1aMatt Beaumont-Gay  llvm_unreachable("Unknown comment kind!");
1048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
1058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1060f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkobool TextComment::isWhitespaceNoCache() const {
107a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  for (StringRef::const_iterator I = Text.begin(), E = Text.end();
108a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko       I != E; ++I) {
109a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    const char C = *I;
110a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    if (C != ' ' && C != '\n' && C != '\r' &&
111a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko        C != '\t' && C != '\f' && C != '\v')
112a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko      return false;
113a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  }
114a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  return true;
115a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko}
116a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1170f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkobool ParagraphComment::isWhitespaceNoCache() const {
118a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  for (child_iterator I = child_begin(), E = child_end(); I != E; ++I) {
119a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    if (const TextComment *TC = dyn_cast<TextComment>(*I)) {
120a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko      if (!TC->isWhitespace())
121a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko        return false;
122858e69fe1305bdffb76a200c0f498685f11e65aeDmitri Gribenko    } else
123858e69fe1305bdffb76a200c0f498685f11e65aeDmitri Gribenko      return false;
124a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  }
125a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  return true;
126a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko}
127a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
128a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoconst char *ParamCommandComment::getDirectionAsString(PassDirection D) {
129a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  switch (D) {
130a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  case ParamCommandComment::In:
131a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    return "[in]";
132a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  case ParamCommandComment::Out:
133a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    return "[out]";
134a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  case ParamCommandComment::InOut:
135a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    return "[in,out]";
136a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  }
137a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  llvm_unreachable("unknown PassDirection");
138a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko}
1398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1401ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenkovoid DeclInfo::fill() {
1411ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  assert(!IsFilled);
1421ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko
1431ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  // Set defaults.
144af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko  Kind = FunctionKind;
1451ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  IsTemplateDecl = false;
1461ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  IsTemplateSpecialization = false;
1471ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  IsTemplatePartialSpecialization = false;
1481ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  IsInstanceMethod = false;
1491ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  IsClassMethod = false;
1501ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  ParamVars = ArrayRef<const ParmVarDecl *>();
1511ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  TemplateParameters = NULL;
1521ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko
1531ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  if (!ThisDecl) {
1541ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    // Defaults are OK.
1551ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ThisDecl)) {
156af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = FunctionKind;
1571ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
1581ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko                                              FD->getNumParams());
1591ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    unsigned NumLists = FD->getNumTemplateParameterLists();
1601ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    if (NumLists != 0) {
1611ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko      IsTemplateDecl = true;
1621ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko      IsTemplateSpecialization = true;
1631ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko      TemplateParameters =
1641ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko          FD->getTemplateParameterList(NumLists - 1);
1651ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    }
1661ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko
1671ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1681ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko      IsInstanceMethod = MD->isInstance();
1691ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko      IsClassMethod = !IsInstanceMethod;
1701ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    }
1711ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  } else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(ThisDecl)) {
172af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = FunctionKind;
1731ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    ParamVars = ArrayRef<const ParmVarDecl *>(MD->param_begin(),
1741ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko                                              MD->param_size());
1751ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    IsInstanceMethod = MD->isInstanceMethod();
1761ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    IsClassMethod = !IsInstanceMethod;
1771ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  } else if (const FunctionTemplateDecl *FTD =
1781ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko                 dyn_cast<FunctionTemplateDecl>(ThisDecl)) {
179af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = FunctionKind;
1801ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    IsTemplateDecl = true;
1811ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    const FunctionDecl *FD = FTD->getTemplatedDecl();
1821ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
1831ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko                                              FD->getNumParams());
1841ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    TemplateParameters = FTD->getTemplateParameters();
1851ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  } else if (const ClassTemplateDecl *CTD =
1861ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko                 dyn_cast<ClassTemplateDecl>(ThisDecl)) {
187af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = ClassKind;
1881ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    IsTemplateDecl = true;
1891ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    TemplateParameters = CTD->getTemplateParameters();
1901ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  } else if (const ClassTemplatePartialSpecializationDecl *CTPSD =
1911ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko                 dyn_cast<ClassTemplatePartialSpecializationDecl>(ThisDecl)) {
192af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = ClassKind;
1931ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    IsTemplateDecl = true;
1941ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    IsTemplatePartialSpecialization = true;
1951ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    TemplateParameters = CTPSD->getTemplateParameters();
1961ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  } else if (isa<ClassTemplateSpecializationDecl>(ThisDecl)) {
197af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = ClassKind;
1981ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    IsTemplateDecl = true;
1991ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko    IsTemplateSpecialization = true;
200af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko  } else if (isa<RecordDecl>(ThisDecl)) {
201af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = ClassKind;
202af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko  } else if (isa<VarDecl>(ThisDecl) || isa<FieldDecl>(ThisDecl)) {
203af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = VariableKind;
204af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko  } else if (isa<NamespaceDecl>(ThisDecl)) {
205af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = NamespaceKind;
206af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko  } else if (isa<TypedefNameDecl>(ThisDecl)) {
207af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = TypedefKind;
208967e5d7ebb775a93f9c200d19d557d18bf945f10Dmitri Gribenko  } else if (const TypeAliasTemplateDecl *TAT =
209967e5d7ebb775a93f9c200d19d557d18bf945f10Dmitri Gribenko                 dyn_cast<TypeAliasTemplateDecl>(ThisDecl)) {
210af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko    Kind = TypedefKind;
211967e5d7ebb775a93f9c200d19d557d18bf945f10Dmitri Gribenko    IsTemplateDecl = true;
212967e5d7ebb775a93f9c200d19d557d18bf945f10Dmitri Gribenko    TemplateParameters = TAT->getTemplateParameters();
2131ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  }
2141ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  IsFilled = true;
2151ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko}
2161ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko
2178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments
2188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang
219af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko
220