- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解如何使用 libclang 完成代码。我看过“超越编译器的思考”,并且查看了 c-index-test,我发现了一个简单的示例程序 here
我编译了该程序,并在我制作的示例文件上运行它,该文件类似于视频中的文件:
struct List {
int Data;
struct List *Next;
};
int sumListNode(struct List *Node) {
int result = 0;
for (; Node; Node = Node->Next)
result = result + Node->
}
void test() {
sumLi
}
如果我将程序指向 Node-> 之后的第一个不完整的空格,它会输出一些 C 关键字,但不会像视频中所说的那样输出 Next 或 Data。
如果我将其指向 sumLi 之后的空格,它会打印出相同的 C 关键字。如果我将它指向 sumLi 中具有“s”的列,我可以让它打印出 sumListNode,但即使如此,它也会将其分配为与其他关键字相同的优先级值,因此它实际上只是打印出我所输入的所有内容可以放在那里,而不是阅读光标下的内容并尝试做出明智的猜测。我只是捕获救命稻草,希望将光标放在片段的开头而不是结尾会有所帮助。
我已经从 doxygen 和 c-index-test 中学到了很多关于 libclang 可以提供的数据类型以及如何使用它进行操作的知识,但我只是还没学会如何制作它给我相关数据,以便我有工作可做。
最佳答案
首先,您应该尝试打印任何 CXDiagnostic
由翻译单元输出,因为任何错误都可能导致 clang 在您的代码中丢失(在您提到的非常简单的情况下这不太可能)。
其次,请注意 libclang 定义行号和列号的方式可能与您习惯的方式不同(即,如果您从文本编辑器获取行/列信息,则可能需要将列号加 1与 clang 的定义保持同步)。
第三,您可以使用 clang 编译器本身来测试编译选项和行/列信息的有效性。这样您就可以消除基于 libclang 的代码带来的不确定性。您可以例如使用以下命令行:
clang++ -cc1 -fsyntax-only -code-completion-at FILENAME:LINE:COL CLANG_ARGS
<小时/>
另请注意 clang_codeCompleteAt仅在 token 开头调用,并生成所有可能 token 的列表,客户端负责使用已在文本编辑器中输入的潜在部分 token 来过滤结果。
来自文档(重点是我的):
Perform code completion at a given location in a translation unit.
This function performs code completion at a particular file, line, and column within source code, providing results that suggest potential code snippets based on the context of the completion. The basic model for code completion is that Clang will parse a complete source file, performing syntax checking up to the location where code-completion has been requested. At that point, a special code-completion token is passed to the parser, which recognizes this token and determines, based on the current location in the C/Objective-C/C++ grammar and the state of semantic analysis, what completions to provide. These completions are returned via a new CXCodeCompleteResults structure.
Code completion itself is meant to be triggered by the client when the user types punctuation characters or whitespace, at which point the code-completion location will coincide with the cursor. For example, if p is a pointer, code-completion might be triggered after the "-" and then after the ">" in p->. When the code-completion location is afer the ">", the completion results will provide, e.g., the members of the struct that "p" points to. The client is responsible for placing the cursor at the beginning of the token currently being typed, then filtering the results based on the contents of the token. For example, when code-completing for the expression p->get, the client should provide the location just after the ">" (e.g., pointing at the "g") to this code-completion hook. Then, the client can filter the results based on the current token text ("get"), only showing those results that start with "get". The intent of this interface is to separate the relatively high-latency acquisition of code-completion results from the filtering of results on a per-character basis, which must have a lower latency.
以修改后的第二个示例为例:
int main (int argc, char **argv) {
int i = sumLi
// ^
}
应在标记位置(即标记的开头)调用代码完成。然后,Clang 可以给出一长串结果,例如:
argc
sumListNode(<# struct List *Node #>)
然后您可以根据部分输入的 sumLi
过滤此列表。 token 并保留唯一相关的完成:sumListNode
.
如果您了解 elisp,clang 的源代码包含 Emacs 的自动完成库,这是这种两级实现的一个很好的示例:
关于llvm - 为什么 libclang 不返回有意义的完成结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15875800/
我有一张 table People (First_Name, Last_Name)。此表包含与示例中一样重复的记录(并非所有行都重复): First_Name Last_Name John
我用 Java 编写过很多程序,之前也涉足过 C++。我在各种 C++ 书籍中阅读了有关指针的内容,并完成了书籍中的各种示例。 我了解指针的基础知识,但有一件事我一直不清楚。指针在现实世界中的应用是什
线 .Mappings(m => m.FluentMappings.AddFromAssemblyOf() 它有什么作用?它会在派生自 ClassMap 的 Product 类的程序集中查找任
我有用于打印数字的自定义打印功能。我制作了一个 ASCII 版本和一个 UTF-16LE 版本。 UTF-16LE 版本对 0-9 使用全角代码/字符,对十六进制使用 A-F。在调试我的函数时,我注意
这是我的代码片段: float ab(float); 以后 if(ab(temp)
我在一个项目文件中包含以下代码: //begin of the file ((window) => { 'use strict'; class View extends GSM.Event
我一直在到处寻找关于 ? 用法的正确解释。和 *。我注意到我可以使用以下方法拒绝所有用户的访问: 如果我想允许某个组,我应该在其上方添加下一行: 但是当我看到人们使用 ? 时,我开始忘记什么意思,
我正在关注 melon js tutorial .这是在我的 HUD.js 文件的顶部。 game.HUD = game.HUD || {} 我以前在其他例子中见过这个。 namespace.some
我正在处理一个包含数千行代码的文件。我正在第 700 行实现一个算法。我经常不得不离开这些行来检查文件中的其他方法。 导航回到我实际编码的地方通常很痛苦。如果我可以在第 700 行设置一个航路点并为其
我遇到了这段代码 do { if (higherQuality && w > targetWidth) { w /= 2; if (w &
uint8_t * const LCDMem = (uint8_t *) &LCDM3; 此代码在 msp430fg4618 培训套件中用于 lcd 配置。谁能解释一下上述代码的含义? 它允许使用 a
上下文 阅读一些内核代码。 问题 我不明白这行是什么意思 *(void **) &(int[2]){0,PAGE_SIZE}; 还有更多,这是什么意思 {0,PAGE_SIZE} 对我来说,它看起来不
我正在查看 Underscore.js 的源代码库,专门用于 map方法(该页面第 85 行左右,并复制到此处): _.map = function(obj, iterator, context)
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我是一名优秀的程序员,十分优秀!