我正在研究使用Clang的代码补全机制时的潜在加速方法。下面描述的流程是我在Anders Bakken的rtags中发现的。
翻译单元由监控文件更改的守护程序解析。这是通过调用clang_parseTranslationUnit
和相关函数(reparse*
,dispose*
)完成的。当用户在源文件的给定行和列请求完成时,守护进程将最后保存版本的缓存翻译单元和当前源文件传递给clang_codeCompleteAt
。(Clang CodeComplete文档)。
从CompletionThread::process,第271行传递给clang_parseTranslationUnit
的标志为CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
。 从CompletionThread::process,第305行传递给clang_codeCompleteAt
的标志为CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
。
clang_codeCompleteAt
的调用非常缓慢 - 即使在完成位置是合法成员访问代码的情况下,也需要大约3-5秒才能获得完成结果,这是clang_codeCompleteAt
文档中提到的预期用例子集的一部分。按照IDE代码完成标准来看,这似乎太慢了。有没有加速的方法?
CXTranslationUnit_SkipFunctionBodies
、CXCodeComplete_IncludeMacros
、CXCodeComplete_IncludeCodePatterns
的组合,并没有在我工作的代码库中看到显著的差异。它们的平均完成时间都在4秒左右。我猜这只是因为TUs的大小。CXTranslationUnit_PrecompiledPreamble
可以确保reparseTU
很快。然而,即使使用了CXTranslationUnit_CacheCompletionResults
,对于我的用例来说,clang_codeCompleteAt
速度非常慢。 - Pradhan