问题标签 [libclang]

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.

0 投票
3 回答
1720 浏览

c++ - 如何使用 libclang 获取枚举元素的数值?

假设我有一个枚举定义,例如:

我想以编程方式从任何给定的枚举定义生成映射,其中键是枚举元素的名称,值是枚举元素的数值(例如myMap["TwoAgain"] == 2

到目前为止,我知道如何使用 遍历源文件clang_visitChildren(),并使用clang_tokenize(). 通过 AST 递归,我按以下顺序获取游标/标记:

  1. “我的枚举”(CXType_Enum)
    • “第一”(CXToken_Identifier)
    • "=" (CXToken_Punctuation)
    • "1" (CXToken_Literal)
  2. “无符号整数”(CXType_UInt)
    • "1" (CXToken_Literal)
  3. “我的枚举”(CXType_Enum)
    • “第二”(CXToken_Identifier)
  4. “我的枚举”(CXType_Enum)
    • “第三”(CXToken_Identifier)
  5. “我的枚举”(CXType_Enum)
    • "TwoAgain" (CXToken_Identifier)
    • "=" (CXToken_Punctuation)
    • “第二”(CXToken_Identifier)
  6. “无符号整数”(CXType_UInt)
    • “第二”(CXToken_Identifier)

我想我可以编写一个算法,使用这些信息来计算每个值。但是,我想知道是否有更简单的方法?我可以直接从 libclang API 获取数值吗?

0 投票
2 回答
291 浏览

python - Parse C Array Size with Python & LibClang

I am currently using Python to parse a C file using LibClang. I've encountered a problem while reading a C-array which size is defined by a define-directive-variable.

With node.get_children i can perfectly read the following array:

As soon as the array size is replaced with a variable, the array won't be read correctly. The following array code can't be read.

Actually the parser stops at MAX and in the dump there is the error: invalid sloc.

How can I solve this?

Thanks

0 投票
0 回答
208 浏览

python - 如何使用 clang 获取变量定义的字面位置

我有以下情况。

some_header.h

源文件.c

现在使用 clang 我可以转储 AST 并查看它是否知道这些变量的字面定义:

我正在尝试使用 libclang 和 python 获取这些信息,但到目前为止我还没有成功。

我需要在哪里查找这些信息?这些信息在 C 接口中是否可用,但可能尚未移植到 Python?

0 投票
1 回答
404 浏览

clang - Libclang 返回不正确的游标类型(stdlib 和命名空间类型)

我正在使用 libclang 来做一些 C++ 的基本反射。我正在为标题创建一个翻译单元,然后使用光标访问所有树元素,在某些情况下,我会退回到 qualtypes 以获取必要的信息。现在的问题是 libclang 返回的游标类型不正确。对于下面的示例头文件:

我使用带有以下输入的clang_parseTranslationUnit2对其进行解析:

参数: “-x”,“c++”

选项: CXTranslationUnit_DetailedPreprocessingRecord | CXTranslationUnit_SkipFunctionBodies | CXTranslationUnit_Incomplete;

现在,当访问 struct BI 的字段时,请获取:

CXType_Int用于光标到 m_vector 而不是CXtype_Unexposed

但是对于std::string成员 m_string,我得到CXType_Unexposed,它允许我访问该字段并提取必要的信息。当访问字符串的字段时,我正确地获得了“命名空间”,然后是“typeref”游标类型。

我完全不知道发生了什么,为什么 lib clang 无法理解 std::vector 类型?

我在 2015 年 6 月 1 日获得了最新的 libclang 版本。

0 投票
0 回答
859 浏览

c++ - 如何使用 Clang C++ API 获取声明的令牌?

我有我自己的递归 AST 访问者类,clang::ASTContext里面有对象:

然后我想访问,例如,所有命名空间声明并着色它们的名称:

这只是一个例子。即使有一种方法可以在没有标记的情况下获取命名空间名称的位置,但我对更全局的方法感兴趣。


有没有办法“跳转”到声明源范围内的标记并遍历它们?

0 投票
1 回答
987 浏览

llvm - 使用 libclang 和 LLVM C 进行即时编译

我有一个能够生成我想在即时编译上下文中使用的 C 代码的软件。据我了解,LLVM/Clang 是要走的路,为了项目的可维护性,我想使用 llvm 和 Clang (libclang) 的 C API。

我开始使用创建 libclang 上下文clang_createIndex和使用翻译单元createTranslationUnitFromSourceFile(如果能够避免通过文件系统并将源代码作为字符串传递,那就太好了)。但我几乎被困在那里。如何从 libclang 翻译单元转到 JIT 似乎需要的 LLVM“执行引擎”?或者这甚至不可能使用 C API?

0 投票
1 回答
730 浏览

c++ - Libclang 解析错误

我将 libclang 与 qt 一起使用,以便为我的自定义 IDE 创建自动完成功能。

我做了这个功能:

但它不起作用。输出显示错误代码 = 1(libclang 文档中的未知错误)。而且,filen是在调用parse函数前后修改的。例子:

C:/Users/Yoann/AppData/Local/Temp/plugin-test.Ns4152

C:\Dev\Qt\Qt5.5.0\Tools\mingw492_32\include\c++\4.9.2

谢谢,

0 投票
2 回答
2928 浏览

c++ - 以clang格式的控制语句后中断

BreakBeforeBraces: Allman在我的.clang-format文件中使用,但控制语句中的大括号(例如if, for, while, ...)没有放在它们自己的行上。

我读过您可以在 中为大括号设置嵌套配置类BraceWrapping,但我无法找出正确的 YAML 语法(以及 sublime 文本插件的 JSON 语法),并且找不到任何现有示例。

有没有办法做到这一点?

0 投票
1 回答
701 浏览

python - get_includes 找不到标准库头文件

我正在玩弄 libclang 的 Python 绑定。目前,我正在尝试执行一些非常简单的任务,例如查找 C++ 文件中包含的所有标头。我使用的代码如下:

该文件hello.cpp如下:

文件hello.h如下:

我认为上面的代码会打印iostream,stdio.h和,如果考虑到传递包含hello.h,可能甚至更多。list但是,它只打印./hello.h,公然忽略标准库头文件。

我在文档中找不到任何关于它是否是设计的东西。是设计使然吗?如果是这样,有什么方法可以实际获取文件包含的所有标题clang.cindex,包括标准库的标题?

0 投票
1 回答
310 浏览

c - libclang ,clang_Cursor_isAnonymous 什么是匿名声明?

我很难理解什么是匿名结构声明(或联合)。

从这个链接: http ://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html#ad2dd151523eecb8d15149cc0937c3dff

这是一个匿名声明

而不是这个

但是如果我做一些测试:

使用被解析的文件(record_decls.c):

我有这个输出:

这意味着我所有的声明都返回相同的值形式clang_Cursor_isAnonymous

这意味着我真的不知道这是标题中的评论: