问题标签 [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 投票
1 回答
1694 浏览

c++ - C++ libclang:从返回错误光标的 CXSourceLocation 检索光标?

我目前正在使用带有 C++ 的 libclang 编写一个简单的克隆检测器。

该程序使用结构存储游标,其中包含指向翻译单元的指针和通过调用 clang_getCursorLocation(cursor) 获得的 CXSourceLocation。

为了这个错误,子访问者函数访问每个节点并从每个游标创建一个结构。使用 t_cursorLocation 类型的结构,我编写了这个函数来检索相应的光标:

但是,对于某些游标,当我创建 t_cursorLocation 结构并使用它来检索从中创建的游标时,检索到的游标不等于它源自的游标。例如,查看子访问者函数:

我的主要功能如下:

我运行它的虚拟源代码如下:

但是输出是一致的,这表明这只发生在某些游标类型上。

这是一个错误还是我遗漏了什么或做错了什么?

在此先感谢,雅各布

0 投票
1 回答
1600 浏览

llvm - 为什么 libclang 不返回有意义的完成结果?

我正在尝试了解如何使用 libclang 完成代码。我看过“Thinking beyond the compiler”,也看过 c-index-test,我在这里找到了一个简单的示例程序

我编译了该程序并在这个示例文件上运行它,我将它制作成类似于视频中的那个:

如果我将程序指向 Node-> 之后的第一个不完整空间,它会吐出一些 C 关键字,但不会像视频所说的那样吐出 Next 或 Data。

如果我将它指向 sumLi 之后的空格,它会打印出相同的 C 关键字。如果我将 sumListNode 指向 sumLi 中具有“s”的列,我可以让它打印出 sumListNode,但即便如此,它也会将其分配为与其他关键字相同的优先级值,所以它实际上只是打印出我的所有内容可以放在那里而不是阅读光标下的内容并尝试做出明智的猜测。我只是抓住稻草,希望将光标放在片段的开头而不是结尾会有所帮助。

我已经学到了很多关于 libclang 可以给我的数据类型以及如何从 doxygen 以及在 c-index-test 中进行操作的知识,但我只是还没有学会如何让它给我相关数据,以便我可以处理一些事情。

0 投票
2 回答
525 浏览

compiler-construction - 使用 libclang 从字符串构造 AST

我生成了一些 c++ 代码,并将其存储在字符串中,我想使用 libclang 从字符串构造一个 AST 树。怎么做?我不想串成额外的文件。

0 投票
1 回答
371 浏览

compiler-construction - libclang 中是否有任何 api 来简化 BinaryOperator

我想对我的代码进行转换,它简化了二进制运算符,例如“1+ a+ 2”到“a+3”,那么 libclang 中是否有任何 api 可以做这样的事情?

0 投票
1 回答
547 浏览

c++ - 如何从 clang::ASTContext 生成代码

我需要一个示例代码来学习如何从 clang::ASTContext 生成 C++ 代码。

我从 c++ 代码创建了 ast,并在 AST 中进行了一些更改,现在我想再次生成代码。

0 投票
3 回答
1597 浏览

python - 如何使用 libclang 的 python 绑定跳过 AST 遍历中的子树

我刚刚开始通过 python 绑定使用libclang 。我知道我可以使用 遍历整个语法树 (AST) get_children,但我无法找到一个get_next_sibling()(或任何可能被调用的)函数,以便我可以跳过不感兴趣的子树。有这样的功能吗?

0 投票
1 回答
2299 浏览

clang - 使用 libclang 获取原始(未扩展的)宏文本

使用 libclang,我在 AST 中有一个游标,它对应于宏扩展产生的语句。我想检索原始的、未扩展的宏文本。

我一直在寻找一个 libclang API 来执行此操作,但找不到。我错过了什么吗?

假设不存在这样的 API,我看到了几种方法可以做到这一点,它们都基于使用 clang_getCursorExtent() 来获取光标的源范围——大概是原始文本的范围。

第一个想法是使用 clang_getFileLocation() 获取文件名和位置以及范围开始和结束,并直接从文件中读取文本。如果我是从未保存的文件编译的,那么我需要处理这个问题,但我对这种方法的主要担忧是,当我确定 clang 在内部保存所有这些信息时,似乎不适合到文件系统之外. 如果 AST 已经加载而不是生成,或者源文件在解析后被修改,也会产生影响。

第二种方法是在游标范围上调用 clang_tokenize()。我尝试这样做,发现它无法为 AST 中的大多数游标生成令牌列表。跟踪代码,发现内部 clang_tokenize() 操作了提供的范围并最终得出结论它跨越多个文件(可能是由于宏扩展的某些影响),然后中止。这对我来说似乎不正确,但我确实觉得无论如何我都在滥用 clang_tokenize() 试图做到这一点。

那么,最好的方法是什么?

0 投票
1 回答
222 浏览

compiler-construction - 如何在 libclang 中刷新 AST

我的代码访问了 libclang 生成的 AST,并在其中插入了一些代码。我想获得新的 AST,同时我想避免将代码写入文件,libclang 中有没有 api 可以做到这一点?

0 投票
1 回答
129 浏览

compiler-construction - LLVM 中是否有任何接口可以将内联函数编译为内部表示?

我正在开发基于 llvm 的东西,并且我想在运行代码时执行 JIT,在代码 jited 中,我在未 jited 的代码中使用了一些函数(生成 jit 代码的程序代码)。但我发现它很昂贵,运行代码需要花费大量时间。有没有办法将原始代码中的函数编译为内部表示,并将其粘贴到 jited 代码中,比如内联函数。例如:原始代码:

------------抖动代码

我想要的是:--------------------jitted 代码

最难的是如果我直接粘贴c++代码,那么我要解析f使用的函数和类,还要粘贴,我不想这样做。

0 投票
2 回答
1923 浏览

objective-c - libclang 从游标中获取类名

我正在尝试将参数的类名提取到 Objective-C 中的方法调用。我正在解析的代码是:

我需要的结果是 helpmeh 的类的类型,即“DFDemoDataModelOne”。

到目前为止,我有以下代码,它输出:"[(DFDataModelContainer).dataModels addObject:helpmeh]"

我对如何从游标中提取信息有点迷茫——当我 AST 转储我的课程时,我可以看到我需要的信息都在那里(见最后一行):

任何指针都非常感谢!