【问题标题】:CLang Libtooling: fetching datatype of a variable inside clang::VarDecl, clang::FieldDecl or clang::ParmVarDeclCLang Libtooling:在 clang::VarDecl、clang::FieldDecl 或 clang::ParmVarDecl 中获取变量的数据类型
【发布时间】:2013-12-21 14:10:02
【问题描述】:

我正在开发 CLang 3.5。我正在尝试获取有关在 C++ 项目中声明的变量的信息。

如何在clang::VarDeclclang::FieldDeclclang::ParmVarDecl 对象中获取变量的数据类型或限定类名称?我试图在此处提供的clang::VarDecl 的文档中找到一个可以返回变量的数据类型或类名的函数。

http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html

我还尝试查看 $LLVM/tools/clang/tools/clang-check/ClangCheck.cpp 的代码,因为在传递 cmd arg --ast-dump 时,它显示了有关每个 AST 节点的所有信息,包括声明的所有变量。我想知道如何访问所有这些信息。

我正在使用ASTMatchers 来查找我的变量声明,它们是:

fieldDecl().bind("field")
parmVarDecl().bind("param")
varDecl().bind("var")

谁能告诉我如何获取所有已删除变量的数据类型?

【问题讨论】:

  • 我应该添加更多细节吗?如果我要问一些非常明显的问题,请提供一些相关教程的链接。或者至少告诉我,如果我想了解解析和访问 CLang 源代码中的 AST,从哪个类开始。
  • 尝试查看 llvm/tools/clang/unittests/AST 并查看处理遍历 AST 的代码。我个人觉得这个链接很有帮助:clang.llvm.org/docs/LibASTMatchersTutorial.html

标签: c++ clang libclang libtooling


【解决方案1】:

最近在学习Clang,看了这个问题后写了一些代码。它可能会对你有所帮助。

完整的源代码在github.com (见 ex04.cc)

DeclarationMatcher FieldDeclMatcher =
    clang::ast_matchers::fieldDecl().bind("field_decl");

class LoopPrinter : public MatchFinder::MatchCallback
{
public :
    virtual void run(const MatchFinder::MatchResult& result)
    {
        if (const clang::FieldDecl* fd
            = result.Nodes.getNodeAs<clang::FieldDecl>("field_decl"))
        {
            std::cout << "======== FieldDecl found ======" << std::endl;

            const clang::RecordDecl* rd = fd->getParent();
            const clang::QualType qt = fd->getType();
            const clang::Type* t = qt.getTypePtr();

            std::cout << "FieldDecl found '"
                      << fd->getQualifiedNameAsString() << " "
                      << fd->getName().str() << "' in '"
                      << rd->getName().str() << "'. "
                      << "is Builtintype = " << t->isBuiltinType() << " "
                      << std::endl << std::endl;
        }

    } // end of run()
};

【讨论】:

  • 您能否告诉我检索ParmVarDecl 的初始值的最佳方法是什么? PVD-&gt;getInit()PVD-&gt;evaluateValue() 返回 NULL,因此对我来说是一个段错误。完整问题在这里:stackoverflow.com/questions/64050621/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
相关资源
最近更新 更多