Как работает завершение кода?
Многие редакторы и IDE имеют код завершения. Некоторые из них очень «умны» другие не совсем. Я заинтересован в более интеллектуальном типе. Например, я видел IDE, которые предлагают функцию, только если она а) доступна в текущей области b) ее возвращаемое значение является действительным. (Например, после «5 + foo [tab]» он предлагает только функции, которые возвращают что-то, что может быть добавлено к целому числу или имени переменной правильного типа.) Я также видел, что они размещают наиболее часто используемые или самые длинные вариант впереди списка.
Я понимаю, что вам нужно разобрать код. Но обычно при редактировании текущего кода недопустимы синтаксические ошибки. Как вы анализируете что-то, когда оно неполное и содержит ошибки?
Существует также ограничение по времени. Завершение бесполезно, если для составления списка требуется несколько секунд. Иногда алгоритм завершения имеет дело с тысячами классов.
Каковы хорошие алгоритмы и структуры данных для этого?