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