Я исследую потенциальное ускорение завершения кода при использовании механизма завершения кода 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мучительно медленно для моего случая использования.