我正在研究使用clang的代码完成机制时潜在的代码完成加速。下面描述的流程是我在Anders Bakken的rtags中找到的。
守护程序监视文件分析转换单元的更改。这是通过调用clang_parseTranslationUnit
和相关函数(reparse*
,dispose*
)完成的。当用户请求源文件中给定行和列的完成时,守护程序会将源文件的最后保存版本和当前源文件的缓存翻译单元传递给clang_codeCompleteAt
。(Clang CodeComplete docs)。
传递给clang_parseTranslationUnit
(从CompletionThread :: process,第271行的)标志是CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
。传递给clang_codeCompleteAt
(从CompletionThread :: process,行305)的标志是CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
。
调用clang_codeCompleteAt
非常慢-即使完成位置是合法的成员访问代码(的文档中提到的预期用例的子集),也要花费3-5秒才能获得完成clang_codeCompleteAt
。根据IDE代码完成标准,这似乎太慢了。有加速的方法吗?
CXTranslationUnit_SkipFunctionBodies
,CXCodeComplete_IncludeMacros
,CXCodeComplete_IncludeCodePatterns
并没有看到我一起工作的代码库显著差异。每次完成平均耗时约4秒。我想这仅仅是因为TU的大小。CXTranslationUnit_PrecompiledPreamble
确保reparseTU
非常快。但是,即使使用CXTranslationUnit_CacheCompletionResults
,clang_codeCompleteAt
在我的用例中也很慢。