Perl5 плагин для IntelliJ IDEA
Сегодня вышла первая версия плагина для IntelliJ IDEA – Camelcade. Плагин добавляет поддержку Perl5 в эту чудесную IDE. Плагин бесплатен и опенсорсен. В настоящее время работает в IntelliJ IDEA и специализированных IDE от JetBrains.
Подробнее о плагине смотрите под катом.
Предыстория
Я – программист с длительным стажем и разнообразным опытом. Очень давно пишу на Perl5 и до недавнего времени писал в NP++ (трудно поверить). В какой-то момент захотелось большего, но ничего подходящего не оказалось. Пробы того что есть показали, что все плохо:
- Sublime — просто NP++ c автокомплитом.
- Eclipse+EPIC — постоянные баги с запуском, или установкой. Проблем лично я получил больше, чем пользы.
- Padre – отличное начинание, но заброшен и так же крайне нестабилен. Вылеты, зависания, связанные с UI частью wxWidgets.
- Komodo – самое лучшее из того что было. Но, ощущение что Perl5 направление не развивается и то, что есть, довольно быстро перестало удовлетворять. Аппетит пришел во время еды.
- Vim — извините, не мое. Дитя Windows и все такое.
Помимо хорошей поддержки Perl5 хотелось иметь возможность расширять функционал, т.к. приходится работать с проектами, работающими на кастомных движках с кастомными шаблонизаторами (и да, в Vim это наверняка можно сделать).
Какое-то время доводилось работать над задачами на Python и, соответственно, в PyCharm. Это было просто прекрасно. Лучшая из виденных мной IDE. Отсюда возникло решение попробовать написать плагин для поддержки Perl5. Java я не знал практически совсем…
… здесь может быть развернутое сочинение на тему – «Как это было», которое я мог бы изложить, если это будет интересно…
Итог
Первая версия плагина предоставляет следующие возможности:
- Создание Perl5 модуля и выбор Perl5 интерпретатора
- Парсинг Perl5 (без source-фильтров), POD, Mojolicious шаблонов и Embedded Perl (Это как php только с Perl5 внутри)
- Подсветка синтаксиса
- Подсветка и дополнение скобок, кавычек, разделителей для регулярных выражений.
- Интерполяция строк, here-doc-ов и регулярных выражений
- Авто-комплит для функций, методов, пакетов, констант и переменных
- Переход для функций, переменных, классов и констант (Go to symbol/class)
- Просмотр структуры файла и иерархии классов (Structure view/Hierarchy view)
- Поддержка наследования с DFS/C3
- Поддержка импортов функций и переменных
- Навигация и рефакторинг для функций, констант, глобов, пакетов, неймспейсов, лексических и глобальных переменных
- Разрешение AUTOLOADed методов
- Шаблоны (File templates) для скриптов, пакетов и Mojolicious шаблонов
- Шаблоны (Live templates) для compound конструкций (съешь лишние скобки, Komodo)
- Поддержка объявления глобальных переменных через use vars
- Рефакторинг маркеров для here-doc
- Поддержка IntelliLang для here-doc и автоматическое инжектирование другого языка в зависимости от текста маркера
- Аннотации для функций: #@deprecated, #@method, #@returns (последняя необходима для корректного разрешения типа возвращаемого значения)
- Аннотация для неймспейсов: #@deprecated
- Поддержка типизации переменных при объявлении
- Intentions: конвертация строки в here-doc
- Inspections:
- Пакеты: отсутствующий файл пакета, неизвестный namespace, множественное объявление namespace, пересечение с core namespace, отсутствующие strict/warnings.
- Функции: deprecated, неизвестная фунция, множественные определения, модный вызов (new Foo::Bar), неиспользуемые функции/константы/глобы.
- Переменные: неиспользуемые переменные, неопределенные переменные, затенения переменной, объявление встроенной переменной как лексической или глобальной.
- Extension point для реализации процессоров пакетов. Позволяет описать функционал нестандартных модулей. Например Mojo::Base, являющимся одновременно и strict, и warnings, и base и feature.
Все не идеально и скорее всего будет допилено. Сделан необходимый для работы минимум. Более подробно можно посмотреть на wiki проекта: github.com/hurricup/Perl5-IDEA/wiki
Благодарности
- JetBrains за чудесную IDE и не менее чудесную платформу для разработки. Это было очень интересное приключение.
- Сотрудникам JetBrains и особенно Петру Громову за помощь и подсказки на форуме, которые так необходимы на старте.
- Хабра-юзеру VISTALL за ценные советы и код-ревью.
- Создателю Erlang плагина, который часто использовался как образец.
- Всем кто присылал свои фидбеки и фичреквесты.
Планы
Тут можно много всего понаписать, поскольку на каждую реализованную фичу рождалось две новых идеи. Все ходы записаны, но дальнейшая судьба плагина будет зависеть от массы различных факторов. Концептуально запланированы:
- Улучшение парсера (особенно error-recovery).
- Улучшение уже реализованного функционала.
- Оптимизация производительности
- Написание тестов.
- Интеграция с известными Perl5 фреймворками и шаблонизаторами.
- Интеграция с PerlBrew.
- Интеграция с библиотеками вроде PerlTidy, PerlCritic, CPAN.
- Дебаггер.
- Perl6. Начать я собирался именно с него в связи с наличием формализованной грамматики. Но возникли аргументы против: языка я не знаю совсем, он еще не вышел (хоть и вот-вот), производительность его на данный момент оставляет желать лучшего. Но, почему бы нет?
Ссылки
- Плагин в репозитории JetBrains: plugins.jetbrains.com/plugin/7796
- Плагин на GitHub: github.com/hurricup/Perl5-IDEA