Types 如何为AST匹配器设置选项(bool vs_bool)

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=

有没有办法为AST matcher设置LangOptions?我们有以下匹配器:

使用名称空间铿锵;
使用名称空间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的参数化版本