Types 如何为AST匹配器设置选项(bool vs_bool)
有没有办法为AST matcher设置LangOptions?我们有以下匹配器:Types 如何为AST匹配器设置选项(bool vs_bool),types,boolean,clang,abstract-syntax-tree,matcher,Types,Boolean,Clang,Abstract Syntax Tree,Matcher,有没有办法为AST matcher设置LangOptions?我们有以下匹配器: 使用名称空间铿锵; 使用名称空间clang::ast_匹配器; 静态llvm::cl::OptionCategory OptionCategory(“选项”); 类CMatcherCallback:公共MatchFinder::MatchCallback { 公众: 虚拟无效运行(常量MatchFinder::MatchResult&result)覆盖 { if(const cxxmethoddel*method=
使用名称空间铿锵;
使用名称空间clang::ast_匹配器;
静态llvm::cl::OptionCategory OptionCategory(“选项”);
类CMatcherCallback:公共MatchFinder::MatchCallback
{
公众:
虚拟无效运行(常量MatchFinder::MatchResult&result)覆盖
{
if(const cxxmethoddel*method=result.Nodes.getNodeAs(“id”))
{
方法->dumpColor();
}
}
};
int main(int argc,常量字符**argv)
{
工具::CommonOptionParser选项Parser(argc、argv、OptionCategory);
工具::ClangTool工具(选项Parser.getCompilations(),
optionsParser.getSourcePathList());
CMatcherCallback回调;
匹配查找器;
finder.addMatcher(cxxmethoddedcl(
hasName(“方法”),
hasParameter(0,parmVarDecl(hasType(asString)(“bool”;)))))
.bind(“id”),
&回调);
int ret=tool.run(tooling::newFrontendActionFactory(&finder.get());
返回ret;
}
它与此方法不匹配:
class-CTest
{
无效法(bool);
};
当我们从hasparmeter(0,parmVarDecl(hasType(asString(“bool”))))
到\u Bool
。因此,似乎Matter在C中而不是C++模式?< /p>回答实际问题
这个答案不会解决原来的问题(解释如下),但解决了问题中所述的问题。如果有人搜索设置选项的方法,这可能会很有用
使用名称空间铿锵;
使用名称空间clang::ast_匹配器;
静态llvm::cl::OptionCategory OptionCategory(“选项”);
类CMatcherCallback:公共MatchFinder::MatchCallback{
公众:
虚拟无效运行(常量MatchFinder::MatchResult&result)覆盖{
if(常数CXxMethodDedCl*方法=
result.Nodes.getNodeAs(“id”)){
方法->dumpColor();
}
}
};
类FinderFrontendAction:public clang::ASTFrontendAction{
公众:
FinderFrontendAction(){
查找器.地址匹配器(
CxxMethodDel(hasName(“方法”),
hasParameter(0,parmVarDecl(hasType(asString)(“bool”;)))))
.bind(“id”),
&回调);
}
std::unique\u ptr
CreateASTConsumer(clang::CompilerInstance&CI,llvm::StringRef)重写{
auto&LO=CI.getLangOpts();
LO.CPlusPlus=true;
LO.Bool=true;//这是您感兴趣的实际选项
return Finder.newASTConsumer();
}
私人:
匹配查找器;
CMatcherCallback回调;
};
int main(int argc,常量字符**argv){
工具::CommonOptionParser选项Parser(argc、argv、OptionCategory);
工具::ClangTool工具(选项Parser.getCompilations(),
optionsParser.getSourcePathList());
内网=
运行(工具::newFrontendActionFactory().get());
返回ret;
}
为什么它不会改变结果
<> Clang理解这是一个C++代码,它自己拥有<代码>布尔O/COD>类型。所以这段代码实际上什么都没有改变。您可以看到,当您打印AST时,它实际上会打印bool
那么,乌布尔来自哪里
这是如何实现asString
matcher的问题。它使用方法(无参数)。此函数的参数化版本接受,它定义了不同类型的打印方式
LangOpts
定义某些类型的打印方式,因为printing policy
是由它构造的,但在调用QualType::getAsString
而不使用打印策略时,就不能这样做。它使用默认的LangOpts
构造函数,并且bool
变成“\u bool”
建议的解决方案
只需处理它并使用“\u Bool”
。否则,您可以实现自己的matcher来克服这个缺点
我希望这能回答你的问题 回答实际问题
这个答案不会解决原来的问题(解释如下),但解决了问题中所述的问题。如果有人搜索设置选项的方法,这可能会很有用
使用名称空间铿锵;
使用名称空间clang::ast_匹配器;
静态llvm::cl::OptionCategory OptionCategory(“选项”);
类CMatcherCallback:公共MatchFinder::MatchCallback{
公众:
虚拟无效运行(常量MatchFinder::MatchResult&result)覆盖{
if(常数CXxMethodDedCl*方法=
result.Nodes.getNodeAs(“id”)){
方法->dumpColor();
}
}
};
类FinderFrontendAction:public clang::ASTFrontendAction{
公众:
FinderFrontendAction(){
查找器.地址匹配器(
CxxMethodDel(hasName(“方法”),
hasParameter(0,parmVarDecl(hasType(asString)(“bool”;)))))
.bind(“id”),
&回调);
}
std::unique\u ptr
CreateASTConsumer(clang::CompilerInstance&CI,llvm::StringRef)重写{
auto&LO=CI.getLangOpts();
LO.CPlusPlus=true;
LO.Bool=true;//这是您感兴趣的实际选项
return Finder.newASTConsumer();
}
私人:
匹配查找器;
CMatcherCallback回调;
};
int main(int argc,常量字符**argv){
工具::CommonOptionParser选项Parser(argc、argv、OptionCategory);
工具::ClangTool工具(选项Parser.getCompilations(),
optionsParser.getSourcePathList());
内网=
运行(工具::newFrontendActionFactory().get());
返回ret;
}
为什么它不会改变结果
<> Clang理解这是一个C++代码,它自己拥有<代码>布尔O/COD>类型。所以这段代码实际上什么都没有改变。您可以看到,当您打印AST时,它实际上会打印bool
那么,乌布尔来自哪里
这是如何实现asString
matcher的问题。它使用方法(无参数)。t的参数化版本