clang代码完成 - 实现设计

时间:2013-07-08 18:49:00

标签: c++ compiler-construction clang llvm code-completion

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

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

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

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

1 个答案:

答案 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(...

因此,只有在解析了类的其余部分之后,才会解析函数体的词法分析器生成的标记。