如何在Clang AST中的SourceLocation之后找到字符的SourceLocation?

时间:2017-07-11 23:51:45

标签: c++ clang abstract-syntax-tree lexer

我正在尝试使用Clang Lexer库来查找令牌的位置(特别是命名空间声明的左括号)。我的想法(因为NamespaceDecl没有它的方法)是在命名空间声明开始后找到第一个左括号的位置。但是,看看Lexer API,我在访问AST时似乎无法找到一种简单易行的方法。任何建议/替代品,而不必像重新分析代码那样做一些激烈的事情?

1 个答案:

答案 0 :(得分:2)

这是一种找到支具的方法。在我的测试中,它适用于命名空间和匿名命名空间。

// Assuming ns_decl is pointer to the NamespaceDecl
// sm is reference to the SourceManager
... in addition to the usual headers:
#include "clang/Basic/TokenKinds.h"    // for clang::tok
#include "clang/Lex/Lexer.h"           // for Lexer
...
  clang::LangOptions lopt;
  bool skipNewLines = false;
  SourceLocation locToUse = ns_decl->isAnonymousNamespace() ?
    ns_decl->getLocStart() : ns_decl->getLocation();
  SourceLocation next_loc(
    clang::Lexer::findLocationAfterToken(
      locToUse,clang::tok::l_brace, sm,lopt,skipNewLines));

在像

这样的声明中
namespace NOPQ  {
  void f(int){}
}

namespace
   ABCD
     {
  void g(float){}
}

namespace {
  void h(int){}
}

next_loc将对应于NOPQ的第1行,第18列; ABCD第7行,第7栏;和第11行,第12列为匿名ns。