使用 clang Libtooling API 打印完全限定类型的参数 (ParmVarDecl) 或字段 (FieldDecl)

Print a fully qualified type of a parameter (ParmVarDecl) or a field (FieldDecl) with clang Libtooling API

类似于这个问题:Print the type of a parameter (ParmVarDecl) with clang API,我想将 parameter/field 类型作为字符串,但重要的是我希望该类型是完全限定的,例如对于

namespace n {
class A {};
class B {
    void f(std::vector<A> a) {}
    std::vector<A> m_a;
};
} // n

我想要 std::vector<n::A>,而不是 std::vector<A>

我试过这个解决方案:http://clang-developers.42468.n3.nabble.com/Getting-the-fully-scoped-type-of-a-function-parameter-td4028221.html(getAsCXXRecordDecl() 和 getQualifiedNameAsString()),但在这两种情况下 decl.getType()->getAsCXXRecordDecl() returns nullptr 对我来说。

更新:此外,此解决方案 没有帮助,因为我正在使用的 clang 7 中没有 PrintCanonicalTypes。

我想我必须升级到 clang 8 再试一次。

PrintCanonicalTypes 标志确实有助于打印完全限定的 method/function 参数(结合 decl.getOriginalType().getCanonicalType().getAsString(...))。

对于字段,我使用字段名称的 decltype() 而不是显式类型,这对我有用(因为我不需要类型本身,而是生成的代码来编译)。