Задумался о толковом автодополнении для питона и что можно получить в максимально идеальном случае.
(далее идёт отсылка к модулям на питоне, которые помогают сделать автодополнение в виме, имаксе, но их можно использовать и для других редакторов, если написать плагин)
Хорошему автокомплиту мешает то, что питон язык динамический, и чтобы получить корректный список методов и полей для какого объекта, нужно выполнить код. Код не всегда можно выполнить, этому могут мешать как ошибки в самом коде, так и необходимость специфического окружения для его работы.
Получается, что для получения более-менее адекватного автодополнения нужно скомпилировать код, сохранить AST, а потом из этого дерева выбирать поля объектов.
Что плохо:
• если в коде есть ошибка, то придётся пользоваться AST, сгенерированным, когда код был валидным последний раз.
• постоянно парсить AST, что может занимать значительное время.
• хранить AST в отдельном файле.
• если дополнять не только объекты из файлов проекта, но и объекты из стандартной библиотеки (модуль — это тоже объект, а функции — его поля), то хранить такое AST может быть накладно, а парсить его — долго.
Что-то подобное я увидел в pysmell.
Есть ещё вариант искать совпадения по именам модулей и полям, как это делает pydiction или на основе ctags. Но такой подход меня не устраивает в корне.
Механизм работе ropevim, который работает поверх rope в данный момент изучаю, но как пользователя он меня не устроил по скорости работы — порой мой вим подвисал на пару минут при попытке подсказать мне функцию из стандартной библиотеки. Вполне вероятно, что я неправильно его использовал, но до прочтения исходников никаких выводов я делать не могу.
Какие ещё могут быть способы организации автодополнения?