使用 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()
而不是显式类型,这对我有用(因为我不需要类型本身,而是生成的代码来编译)。
类似于这个问题: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 8 再试一次。
PrintCanonicalTypes
标志确实有助于打印完全限定的 method/function 参数(结合 decl.getOriginalType().getCanonicalType().getAsString(...)
)。
对于字段,我使用字段名称的 decltype()
而不是显式类型,这对我有用(因为我不需要类型本身,而是生成的代码来编译)。