Я не могу точно сказать, какие алгоритмы используются какой-либо конкретной реализацией, но я могу сделать некоторые обоснованные предположения. trie - очень полезная структура данных для этой проблемы: IDE может поддерживать большой объем памяти в памяти всех символов в вашем проекте с некоторыми дополнительными метаданными на каждом узле.
Когда вы набираете символ, он идет по пути в дереве.Все потомки конкретного узла Trie являются возможными дополнениями.Затем в среде IDE просто необходимо отфильтровать их по тем, которые имеют смысл в текущем контексте, но нужно только вычислить столько, сколько можно отобразить во всплывающем окне завершения вкладок.
Более продвинутыйЗавершение табуляции требует более сложной процедуры.Например, Visual Assist X имеет функцию, с помощью которой вам нужно всего лишь вводить заглавные буквы символов CamelCase - например, если вы набираете SFN, он показывает символ SomeFunctionName
в своем окне завершения табуляции.
Для вычисления дерева (или других структур данных) требуется анализ всего вашего кода, чтобы получить список всех символов в вашем проекте.Visual Studio хранит это в своей базе данных IntelliSense, файле .ncb
, который хранится рядом с вашим проектом, так что ему не нужно повторно анализировать все при каждом закрытии и повторном открытии проекта.В первый раз, когда вы открываете большой проект (скажем, тот, который вы только что синхронизировали с управлением исходным кодом), VS займет время, чтобы проанализировать все и сгенерировать базу данных.
Я не знаю, как он обрабатывает постепенные изменения.Как вы уже сказали, когда вы пишете код, 90% времени он имеет неправильный синтаксис, и повторная обработка всего, когда вы бездействуете, приведет к огромным налогам на ваш ЦП с очень небольшой выгодой, особенно если вы изменяете заголовочный файл, включенныйбольшое количество исходных файлов.
Я подозреваю, что он либо (а) выполняет повторный анализ, только когда вы на самом деле строите свой проект (или, возможно, когда вы закрываете / открываете его), либо (б) выполняет какой-то локальныйсинтаксический анализ, где он анализирует только тот код, где вы только что отредактировали, ограниченным образом, просто чтобы получить имена соответствующих символов.Поскольку C ++ имеет такую чрезвычайно сложную грамматику, она может вести себя странно в темных углах, если вы используете тяжелое шаблонное метапрограммирование и тому подобное.