Сегодня вышла первая версия плагина для 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. Начать я собирался именно с него в связи с наличием формализованной грамматики. Но возникли аргументы против: языка я не знаю совсем, он еще не вышел (хоть и вот-вот), производительность его на данный момент оставляет желать лучшего. Но, почему бы нет?

Ссылки