sag*_*rgp 8 c++ clang libtooling
我正在编写一个libtooling重构工具.我有一个类,比方说Foo
,在一个标题中定义foo.h
.我想看看是否foo.h
包含在文件中.目前,要检查是否bar.cc
包含foo.h
,我只是匹配使用recordDecl(hasName("Foo"))
.这是有效的,因为预处理class Foo { ... };
后将存在于bar.cc
AST 内部,如果bar.cc
包含foo.h
.
但是,如果,例如,bar.cc
包括cat.h
哪些包括,则这不起作用foo.h
.我想bar.cc
明确包括foo.h
.
此外,我希望能够匹配#define
宏.
我编写工具的方式使得这两个目标无法实现,因为我匹配的AST已经过预处理.我正在努力做甚么可能吗?我Preprocessor
在Clang的Doxygen页面上找到了类参考,但我还没有找到我正在寻找的东西.
sag*_*rgp 11
我在Clang的Doxygen和代码中挖掘后想出了这个.我需要和PPCallbacks
班级一起使用Preprocessor
班级.一个例子如下.请注意,这不能保证是功能代码段,但它说明了一般用法.欲了解更多信息,请参阅锵的PPCallbacks文档,同时还为文档addPPCallbacks和getPPCallbacks在铿锵::预处理.
class Find_Includes : public PPCallbacks
{
public:
bool has_include;
void InclusionDirective(
SourceLocation hash_loc,
const Token &include_token,
StringRef file_name,
bool is_angled,
CharSourceRange filename_range,
const FileEntry *file,
StringRef search_path,
StringRef relative_path,
const Module *imported)
{
// do something with the include
has_include = true;
}
};
class Include_Matching_Action : public ASTFrontendAction
{
bool BeginSourceFileAction(CompilerInstance &ci, StringRef)
{
std::unique_ptr<Find_Includes> find_includes_callback(new Find_Includes());
Preprocessor &pp = ci.getPreprocessor();
pp.addPPCallbacks(std::move(find_includes_callback));
return true;
}
void EndSourceFileAction()
{
CompilerInstance &ci = getCompilerInstance();
Preprocessor &pp = ci.getPreprocessor();
Find_Includes *find_includes_callback = static_cast<Find_Includes>(pp.getPPCallbacks());
// do whatever you want with the callback now
if (find_includes_callback->has_include)
std::cout << "Found at least one include" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1779 次 |
最近记录: |