我有我自己的递归 AST 访问者类,clang::ASTContext
里面有对象:
class Visitor : public clang::RecursiveASTVisitor<Visitor> {
public:
Visitor(const clang::ASTContext& context) : context_(context) {}
private:
const clang::ASTContext& context_;
};
然后我想访问,例如,所有命名空间声明并着色它们的名称:
bool VisitNamespaceDecl(clang::NamespaceDecl* decl) {
const auto& sm = context_.getSourceManager();
auto loc = decl->getLocStart();
if (!sm.isInMainFile(loc)) {
return true;
}
if (!sm.isMacroBodyExpansion(loc)) {
auto line = sm.getSpellingLineNumber(loc);
auto column = sm.getSpellingColumnNumber(loc);
// Colorify the "namespace" keyword itself.
// TODO: how to get location of the name token after "namespace" keyword?
}
return true;
}
这只是一个例子。即使有一种方法可以在没有标记的情况下获取命名空间名称的位置,但我对更全局的方法感兴趣。
有没有办法“跳转”到声明源范围内的标记并遍历它们?