[英]Retrieve template parameters from CXXConstructExpr in Clang AST
說我有一個這樣的變量聲明:
std::vector<MyType> myVector(1);
在Clang AST中將其表示為CXXConstructExpr
。 我有一個匹配器,可以找到此CXXConstructExpr
,但我想從中提取MyType
的decl。
我已經嘗試過各種方法,但是似乎沒有任何效果:
const CXXConstructExpr* construct = Result.Nodes.getNodeAs<CXXConstructExpr>("expr");
construct->getConstructor()->getTemplateSpecializationArgs() // Always nullptr
construct->getConstructor()->getParent() // Seems to lose the template parameters
construct->getConstructor()->getDescribedTemplate() // Always nullptr
這是一個匹配器:
varDecl(
has(
cxxConstructExpr()
)
,hasType(
classTemplateSpecializationDecl().bind(sp_dcl_bd_name_)
)
).bind(var_bd_name_);
它開始與VarDecl和橫梁的類型,這是一個ClassTemplateSpecializationDecl
埋在載體的ClassTemplateDecl
。 在回調中,可以從ClassTemplateSpecializationDecl
到模板參數列表,然后對各個模板參數進行操作:
using CTSD = ClassTemplateSpecializationDecl;
CTSD * spec_decl =
const_cast<CTSD *>(result.Nodes.getNodeAs<CTSD>(sp_dcl_bd_name_));
VarDecl * var_decl =
const_cast<VarDecl *>(result.Nodes.getNodeAs<VarDecl>(var_bd_name_));
if(spec_decl && var_decl) {
// get the template args
TemplateArgumentList const &tal(spec_decl->getTemplateArgs());
for(unsigned i = 0; i < tal.size(); ++i){
TemplateArgument const &ta(tal[i]);
// is this arg a type arg? If so, get that type
TemplateArgument::ArgKind k(ta.getKind());
std::string argName = "";
if(k==TemplateArgument::ArgKind::Type){
QualType t = ta.getAsType();
argName = t.getAsString();
}
// Could do similar actions for integral args, etc...
std::cout << "For variable declared at "
<< corct::sourceRangeAsString(var_decl->getSourceRange(),&sm) << ":"
<< spec_decl->getNameAsString()
<< ": template arg " << (i+1) << ": " << argName << std::endl;
} // for template args
} // if
對於此代碼:
struct B{int b_;};
std::vector<B> vb(1);
這將產生:
For variable declared at <line:14:1, col:20>:vector: template arg 1: struct B
For variable declared at <col:1, col:20>:vector: template arg 2: class std::__1::allocator<struct B>
完整的示例在github上的代碼分析和使用Clang工具重構示例存儲庫中: https : //github.com/lanl/CoARCT (請參閱apps / TemplateType.cc)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.