C++;/llvm/clang:需要关于重构工具方法的一般建议 < >我想创建一个工具,它检查C++源文件中方法实现的顺序是否与相应的头文件中方法声明的顺序相匹配。

C++;/llvm/clang:需要关于重构工具方法的一般建议 < >我想创建一个工具,它检查C++源文件中方法实现的顺序是否与相应的头文件中方法声明的顺序相匹配。,c++,c++11,clang,C++,C++11,Clang,这是我到目前为止所用代码的简化版本: /#包含和名称空间语句被截断 //错误处理和日志输出也被截断 静态llvm::cl::OptionCategory ClangOrderCategory(“ClangOrder选项”); 静态cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage); 静态cl::extrahelp MoreHelp(“\n更多帮助文本…”); DeclarationMatcher MethodMatcher=CxM

这是我到目前为止所用代码的简化版本:

/#包含和名称空间语句被截断
//错误处理和日志输出也被截断
静态llvm::cl::OptionCategory ClangOrderCategory(“ClangOrder选项”);
静态cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
静态cl::extrahelp MoreHelp(“\n更多帮助文本…”);
DeclarationMatcher MethodMatcher=CxMethodDeccl(除非是(isImplicit())).bind(“methodDeclaration”);
类MethodPrinter:公共MatchFinder::MatchCallback
{
公众:
虚拟无效运行(常量MatchFinder::MatchResult和result)
{
const cxxmethoddel*decl=result.Nodes.getNodeAs(“方法声明”);
//获取父声明,即方法的类
常量CXXRecordDecl*parentDecl=decl->getParent();
std::string parentName=parentDecl->getnameastring();
SourceLocation=decl->getLocation();
SourceManager&manager=result.Context->getSourceManager();
std::string filename=manager.getFilename(location.str();
//删除路径并仅保留文件名
filename=filename.substr(filename.find_last_of(“/”)+1,filename.length());
int lineNumber=manager.getSpellingLineNumber(位置);
声明nameInfo nameInfo=decl->getNameInfo();
std::string methodName=nameInfo.getName().getAsString();
//TODO:这取决于类名==文件名。[cpp | h],包括大小写
if(filename==parentName+“.h”)
{
//TODO:在某种列表中存储方法名和行号
}
其他的
如果(文件名==parentName+“.cpp”)
{
//TODO:将方法名和行号存储在第二个列表中
}
//TODO:比较列表以验证方法顺序是否相同
}
};
int main(int argc,常量字符**argv)
{
CommonOptionParser选项Parser(argc、argv、ClangOrderCategory);
ClangTool工具(选项Parser.getCompilations(),
OptionsParser.getSourcePathList());
方法打印机;
匹配查找器;
Finder.addMatcher(MethodMatcher和Printer);
return Tool.run(newFrontendActionFactory(&Finder.get());
}
这显然有很多缺点,但适用于包含头文件的一个源文件的非常简单的测试集。但是,只要源文件包含更多文件,就会为每个
#include
中遇到的每个方法调用
run(…)

我似乎找不到从
run(…)
中访问
Tool
的方法,因此我无法确定当前正在处理的文件。我也研究了,但这只得到了方法实现,而不是声明

在使用
clangformat
clangtidy
之后,我的印象是
clang-*
工具的使用概念通常是一次处理一个文件,并使用shell来查找xargs左右

现在我开始认为我的一般方法是错误的。这通常是怎么做的

有没有比我更了解clang的人可以分享他们对如何解决这个问题的想法