4

是否有一些隐藏的文档是如何实现 clang 的代码完成部分的?到目前为止,我发现一个特殊的令牌(tok::code_completion)被注入到词法分析器中并在解析器中处理。在观察到这样的标记之后,解析器可以填写可能的完成字符串。

我不明白的是:
如果被调用的功能决定我们可以插入一个在当前上下文中可用的变量。这样的案件如何处理?

struct FooBar {
    void foo() {
        ba<<code completion here>>
    }
    void bar() {
    }
};

解析器没有看到 bar 但调用它是有效的。

4

1 回答 1

4

正如我所看到的,这是解析结构内的方法定义时的普遍问题,而不是特定于代码完成。无论如何,解析器中有专门针对这种情况的特殊处理,您可以在ParseCXXInlineMethods.cpp 文件中找到。

从评论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(...

因此,函数体的词法分析器生成的标记仅在类的其余部分被解析后才被解析。

于 2013-07-09T08:19:35.053 回答