是否有一些隐藏文档如何实现clang的代码完成部分?到目前为止我发现的是一个特殊的标记(tok :: code_completion)被注入到词法分析器中并在解析器中处理。在观察到这样的标记后,解析器可以填写可能的完成字符串。
我不明白:
如果被调用的功能决定我们可以插入当前上下文中可用的变量。这样的案件是如何处理的?
struct FooBar {
void foo() {
ba<<code completion here>>
}
void bar() {
}
};
解析器没有看到bar但是调用它是有效的。
答案 0 :(得分:4)
正如我所看到的,这是在解析结构中的方法定义时的一般问题,并不是特定于代码完成。在任何情况下,解析器中都有精确处理此案例的特殊处理,您可以在the ParseCXXInlineMethods.cpp file中找到它。
来自对Parser::ParseCXXInlineMethodDef()
的评论:
/// ParseCXXInlineMethodDef - We parsed and verified that the specified
/// Declarator is a well formed C++ inline method definition. Now lex its body
/// and store its tokens for parsing after the C++ class is complete.
Parser::DeclPtrTy
Parser::ParseCXXInlineMethodDef(...
后来,用于解析方法定义的代码:
/// ParseLexedMethodDefs - We finished parsing the member specification of a top
/// (non-nested) C++ class. Now go over the stack of lexed methods that were
/// collected during its parsing and parse them all.
void Parser::ParseLexedMethodDefs(...
因此,只有在解析了类的其余部分之后,才会解析函数体的词法分析器生成的标记。