Не мога да кажа какви точно алгоритми се използват от някоя конкретна реализация, но мога да направя някои обосновани предположения. trie е много полезна структура от данни за този проблем: IDE може да поддържа голям trie в паметта на всички символи във вашия проект, с някои допълнителни метаданни във всеки възел.
Когато въвеждате символ, той върви по пътека в опита. Всички наследници на конкретен trie възел са възможни завършвания. След това IDE просто трябва да ги филтрира по тези, които имат смисъл в текущия контекст, но трябва да изчисли само толкова, колкото могат да бъдат показани в изскачащия прозорец за завършване на раздели.
По-усъвършенстваното довършване на раздели изисква по-сложен опит. Например Visual Assist X има функция, чрез която трябва да въвеждате само главните букви на символите CamelCase -- напр. , ако въведете SFN, той ви показва символа SomeFunctionName
в своя прозорец за завършване на раздели.
Изчисляването на trie (или други структури от данни) изисква анализиране на целия ви код, за да получите списък с всички символи във вашия проект. Visual Studio съхранява това в своята база данни IntelliSense, файл .ncb
, съхраняван заедно с вашия проект, така че да не се налага да анализира всичко всеки път, когато затворите и отворите отново проекта си. Първият път, когато отворите голям проект (да речем, такъв, който току-що сте синхронизирали с източник контрол на формата), VS ще отдели време, за да анализира всичко и да генерира базата данни.
Не знам как се справя с постепенните промени. Както казахте, когато пишете код, той е невалиден синтаксис в 90% от времето и повторното анализиране на всичко, когато не работите, би поставило огромен данък върху вашия процесор за много малка полза, особено ако модифицирате заглавен файл, включен от голям брой изходни файлове.
Подозирам, че или (а) прави повторен анализ само когато всъщност създавате проекта си (или евентуално когато го затваряте/отваряте), или (б) прави някакъв вид локален анализ, при който анализира само кода около мястото, където току-що сте редактиран по някакъв ограничен начин, само за да получите имената на съответните символи. Тъй като C++ има толкова изключително сложна граматика, той може да се държи странно в тъмните ъгли, ако използвате тежко шаблонно метапрограмиране и други подобни.
person
Adam Rosenfield
schedule
02.08.2009