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