c – 从Clang AST中的CXXConstructExpr中检索模板参数

c – 从Clang AST中的CXXConstructExpr中检索模板参数,第1张

概述假设我有一个像这样的变量声明: std::vector<MyType> myVector(1); 这表示为Clang AST中的CXXConstructExpr.我有一个匹配器找到这个CXXConstructExpr,但我想从中提取MyType的decl. 我尝试了各种各样的东西,但似乎没有任何作用: const CXXConstructExpr* construct = Result.Nodes 假设我有一个像这样的变量声明:

std::vector<MyType> myVector(1);

这表示为Clang AST中的CXXConstructExpr.我有一个匹配器找到这个CXXConstructExpr,但我想从中提取MyType的decl.

我尝试了各种各样的东西,但似乎没有任何作用:

const CXXConstructExpr* construct = Result.Nodes.getNodeAs<CXXConstructExpr>("expr");construct->getConstructor()->getTemplateSpecializationArgs()  // Always nullptrconstruct->getConstructor()->getParent()  // Seems to lose the template parametersconstruct->getConstructor()->getDescribedTemplate()  // Always nullptr
解决方法 这是一个匹配器:

varDecl(  has(    cxxConstructExpr()  ),hasType(    classtemplateSpecializationDecl().bind(sp_dcl_bd_name_)  )).bind(var_bd_name_);

它从VarDecl开始并遍历到类型,这是一个埋在向量的ClasstemplateDecl中的ClasstemplateSpecializationDecl.在回调中,可以从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 BFor variable declared at <col:1,col:20>:vector: template arg 2: class std::__1::allocator<struct B>

完整示例位于代码分析和重构与Clang工具示例repo在github:https://github.com/lanl/CoARCT(请参阅apps / TemplateType.cc)

总结

以上是内存溢出为你收集整理的c – 从Clang AST中的CXXConstructExpr中检索模板参数全部内容,希望文章能够帮你解决c – 从Clang AST中的CXXConstructExpr中检索模板参数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1228859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存