Я исследую потенциальное ускорение завершения кода при использовании механизма завершения кода clang. Описанный ниже поток - это то, что я нашел в rtags Андерса Баккена.
Единицы перевода анализируются демоном, отслеживающим файлы на предмет изменений. Это делается с помощью вызываемых clang_parseTranslationUnit
и связанных функций ( reparse*
, dispose*
). Когда пользователь запрашивает завершение для данной строки и столбца в исходном файле, демон передает кэшированную единицу перевода для последней сохраненной версии исходного файла и текущего исходного файла в clang_codeCompleteAt
. ( Документы Clang CodeComplete ).
Флаги , передаваемые clang_parseTranslationUnit
(от CompletionThread :: процесса, строка 271 ) являются CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
. Флаги , передаваемые clang_codeCompleteAt
(от CompletionThread :: процесса, строка 305 ) являются CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
.
Вызов clang_codeCompleteAt
выполняется очень медленно - для получения завершения требуется около 3-5 секунд даже в тех случаях, когда местом завершения является допустимый код доступа к члену, подмножество предполагаемого варианта использования, упомянутого в документации clang_codeCompleteAt
. Это кажется слишком медленным по стандартам завершения кода IDE. Есть ли способ ускорить это?
CXTranslationUnit_SkipFunctionBodies
, CXCodeComplete_IncludeMacros
, CXCodeComplete_IncludeCodePatterns
и не вижу существенную разницу на кодовом я работаю с. Все они в среднем составляют около 4 секунд на выполнение. Я предполагаю, что это просто из-за размера ЕП. CXTranslationUnit_PrecompiledPreamble
гарантирует reparseTU
очень быстро. Однако даже с CXTranslationUnit_CacheCompletionResults
, clang_codeCompleteAt
мучительно медленно для моего случая использования.