如何在Clang中获取TemplateTypeParmType的名称?

时间:2016-05-23 09:44:05

标签: templates clang abstract-syntax-tree

我正在使用Clang打印出有关AST的一些信息。

例如:

template<typename T>
class Slices : public Fruit {
  T fruit;
  int numberOfSlices;
  public: 
    Slices(T fruit, int numberOfSlices)
      : fruit(fruit), numberOfSlices(numberOfSlices) {
    }
    std::string getName() {
      return "Sliced " + fruit.getName();
    }
    int getNumberOfSlices() {
      return numberOfSlices;
    }
};

应打印如下内容:

template<typename T>
Slices
  Fields: 
    T fruit;
    int numberOfSlices
  Methods: 
...

我已经在TemplateTypeParmType T处写了一个访问T fruit节点的访问者。

但是,此节点似乎没有附加任何标识符。这些都是null

x->getDecl()
x->getIdentifier()

如何从此节点中提取模板名称(此处为T)?

1 个答案:

答案 0 :(得分:2)

如果您还拥有该类型的QualType(您可以从FieldDecl获取每个字段等),您只需拨打getAsString()即可。如果没有,你可以创建一个没有限定符的,即

auto name = clang::QualType(type, 0).getAsString();

当然,缺少限定符信息(例如const)。确保您拥有的类型不是规范类型(http://clang.llvm.org/docs/InternalsManual.html#canonical-types),否则您只会得到type-parameter-0-0这样的名称。

我还没有找到获取decl或标识符的方法,但如果您愿意使用调试器逐步执行clang代码,您可以找到getAsString方法从哪里获取此信息