问题标签 [libtooling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - CLang Libtooling:在 clang::VarDecl、clang::FieldDecl 或 clang::ParmVarDecl 中获取变量的数据类型
我正在研究 CLang 3.5。我正在尝试获取有关在 C++ 项目中声明的变量的信息。
如何获取 a或objectclang::VarDecl
中变量的数据类型或限定类名?我试图找到一个函数,它可以在此处提供的文档中返回变量的数据类型或类名。clang::FieldDecl
clang::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
用来查找我的变量声明,它们是:
谁能告诉我如何获得所有变量的数据类型?
c++ - 从clang中的FunctionDecl类获取参数信息
如何从 clang 的 FunctionDecl 类中以字符串形式获取参数信息。我正在尝试,但对这么多继承感到困惑。他们的编译器还说 getReturnType() 不是 FunctionDecl 的成员,但 doxygen 文档另有说明。请帮忙。 http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
错误:-
“class clang::FunctionDecl”没有名为“getReturnType”的成员</p>
c++ - CXXRecords getNameAsString,如何获取全名?
CXXRecords
因为D
withgetNameAsString
会返回D
。
我怎样才能得到全名::A::B::C::D
?
我试图递归调用getParent
,但我无法获得命名空间..
c++ - clang libTooling:如何找到 AST 项来自哪个标头?
在网上找到的 clang 工具示例总是在玩具示例上运行,这些示例通常都是非常琐碎的 C 程序。
我正在构建一个对 C++ 代码执行源到源转换的工具,这显然是一项非常非常具有挑战性的任务,但 clang 可以胜任这项任务。
我现在面临的问题是,clang 为任何使用 STL 的 C++ 代码生成的 AST 是巨大的。例如,我有一些 C++ 代码,其中clang++ -ast-dump ... | wc -l
有 67,018 行可怕的 AST gobbledygook!
其中 99% 是标准库的东西,我的目标是在我的源到源元编程任务中忽略它们。所以,为了实现这一点,我想简单地过滤掉文件。假设我只想查看我正在分析的项目头文件中的类定义(并忽略所有标准库头文件的内容),我只需要弄清楚我的每个CXXRecordDecl
's 来自哪个头文件!
这可以做到吗?
编辑:希望这是一种解决方法。现在试试这个......重要的是它必须告诉我decls出来的标题,而不是对应于翻译单元的cpp文件。
macos - 如何在 Mac OS 上构建 clang LibTooling?
我想在 Mac OS X Yosemite 上使用 clang 的 LibTooling。Clang 的文档只展示了如何构建 clang 和 llvm,但我需要的是 LibTooling,而不是整个 clang(xcode 已经提供了 clang 和 llvm)。如何在不构建另一个 clang 的情况下构建 LibTooling?
c - 使用 Clang 在 ac 代码中提取函数调用
我想编写一个程序来分解表达式(在 C 代码中),其中表达式具有函数调用并将每个函数调用提取到变量。例如:
x = A() + B();
应改为:
我正在使用 Clang 和 RecursiveASTVisitor 编写它。这是我的解决方案。首先,我必须查找所有函数并在所有调用所在的主块的第一个处为每个函数声明一个变量。然后查找在两侧都有函数调用的二进制操作。然后提取函数调用并使用变量代替它们。因为我是新手,所以我不知道这样做是否有更好的方法,或者这个解决方案是否有效?
c++ - 使用 Clang 的 libtooling 匹配#includes(或#defines)的正确方法是什么?
我正在编写一个 libtooling 重构工具。我有一个类,比方说Foo
,定义在一个名为foo.h
. 我想看看是否foo.h
包含在文件中。目前,要检查是否bar.cc
包含foo.h
,我只是使用recordDecl(hasName("Foo"))
. 这是有效的,因为在预处理class Foo { ... };
后将存在于bar.cc
的 AST 中,如果bar.cc
包括foo.h
.
bar.cc
但是,例如,如果包含cat.h
which includes ,这将不起作用foo.h
。我想bar.cc
明确包括foo.h
.
此外,我希望能够匹配#define
宏。
我编写工具的方式使这两个目标成为不可能,因为我匹配的 AST 已经过预处理。我想要做的甚至可能吗?我Preprocessor
在 Clang 的 Doxygen 页面上搜索了类参考,但我还没有完全找到我要找的东西。
c++ - 如何通过 Clang 和 LibTooling 使用标准库
我想使用 Clang 和 LibTooling 来创建一些 C++ 源代码分析和转换工具。我已经按照本教程构建了 Clang 和 LibTooling,并且我已经能够使用我构建的 Clang 二进制文件运行和创建一些分析工具并编译 C++ 程序。但是,如果我包含标准库中的头文件(在源文件或我的工具中),我会在编译或运行源文件/工具时遇到问题。例如,如果我对以下 C++ 源文件运行 clang-check:
我收到“致命错误:找不到‘iostream’文件”。(注意:我可以编译 C++ 程序,例如带有用户定义类的程序,但不能编译使用标准库的 C++ 程序。)为了解决这个问题,我构建了 libc++(按照本指南,在 llvm/project 中构建它我构建 LLVM 和 Clang 的目录),但我仍然无法获取 Clang 和使用 libc++ 的工具。现在,如果我尝试使用以下方法编译测试文件:
然后我得到“致命错误:找不到'unistd.h'文件”。所以我的问题是:我如何正确地指出 Clang 和我的工具来使用 libc++?
我正在运行 OS X Yosemite 10.10 并使用 Clang 3.6.0。
c++ - OCLint ASTmatcher 规则。匹配 NS_ENUM
我正在尝试创建一个同时匹配typedef enum
和typedef NS_ENUM
声明的 OCLint 规则,但收效甚微。我有一个 Objective-C 文件(TestClass.m),其中包含以下枚举声明:
使用以下命令转储 AST:
给我这个输出包含这个:
我有一个 ASTMatcherRule (ObjCNsEnumRule),我试图同时匹配这两者typedef enum
,typedef NS_ENUM
这是代码:
但是,当我运行此规则时,我只得到typedef enum
声明的输出。
我在这里做错了什么?两个枚举都出现在 AST 转储中,但在 OCLint 规则中只有一个匹配。
编辑
我认为这可能与显示在不同源文件中定义的 AST 转储有关(可能是因为 NS_ENUM 宏),因为我可以匹配 typedef,但不能匹配 enumdecl EnumDecl
。NS_ENUM
clang - 在重构工具中获取实时变量
我正在用 clang libtooling 编写一个重构工具。
我需要的是根据实时变量信息重写源代码。例如,对于函数中的每个基本块,转储其活出变量。
我知道如果我正在编写分析检查器会很容易。
只需调用 mgr.getAnalysis(D) 即可获取此函数的 LiveVariables。然后,转储每个块。
但是,我正在编写一个独立的重构工具。如何构造 AnalysisManager 对象?
非常感谢。