我正在使用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
)?
答案 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
方法从哪里获取此信息