2

我有我自己的递归 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;
}

这只是一个例子。即使有一种方法可以在没有标记的情况下获取命名空间名称的位置,但我对更全局的方法感兴趣。


有没有办法“跳转”到声明源范围内的标记并遍历它们?

4

0 回答 0