Друзья, всем привет!
В этом блоге я буду рассказывать о разработке
редактора кода I-Pascal,
a также делиться мыслями о программировании и не только.
Что и зачем такое I-Pascal?
Когда пишу код в Delphi, часто замечаю, что приходится тратить время на то, на что совсем не хотелось бы.
Автодополнение и даже просто ctrl+click позволяют себе не срабатывать, class completion расставялет методы как ему вздумается, а не в том порядке, в котором они объявлены.
Приходится прибирать за ним вручную.
Юзабельность (usability) хромает на обе ноги - например, постоянно возникают модальные диалоги. При поиске-то зачем?
Все это отнимает массу времени и нервов.
Да и просто отсутствуют многие функции, давно облегчающие написание и анализ кода в других IDE.
Например, подсветка ошибок/варнингов и быстрое их исправление, легкая навигация по иерархии классов, генерация конструкторов и специальных методов и т.д. и т.п.
Посмотрев на все это безобразие и познакомившись с замечательной платформой
IntelliJ,
начал думать, как интегрировать в неё поддержку Паскаля.
IntelliJ, если кто не знает, это платформа для создания IDE, на которой основаны
такие продукты, как IDEA, Android Studio, WebStorm и другие.
Интеграцией Паскаля в платформу IntelliJ начал заниматься где-то в 2012 году.
Только сейчас появилось что-то, что можно считать чем-то рабочим и полезным.
Это и есть
I-Pascal - редактор кода для Delphi/Pascal.
В идеале, IDE должна подсвечивать все ошибки и варнинги и предлагать автоматические исправления для них.
Тоже самое для выявленных в результате статического анализа кода потенциальных проблем.
От неинициализированных или неиспользуемых сущностей до мертвых или бессмысленных веток кода.
Автоматическое создание методов (и не только) с выводом типов и названий параметров.
Рефакторинги: помимо переименования еще как минимум перемещение по модулям/классам,
выделение переменной/константы/метода, изменение сигнатуры и другие.
Плюс видятся некоторые вкусности, такие как подсветка точек выхода из методов,
отображение FQN для переменных - будет полезно при использовании WITH. И так далее.
Есть, конечно, и трудности. Главная это то, что IntelliJ ничего не знает ни о каком Паскале.
Другая в том, что платформа не понимает и не принимает такую вроде несложную концепцию, как инклуды.
Это происходит потому, что требуется однозначное соответствие между каждым токеном от парсера и позицией в исходном файле. А исходный файл должен быть один.
Первая проблема решается написанием лексера, парсера и построением соответствующего синтаксического дерева.
Что, конечно, не просто, но, по крайней мере, понятно как и уже в сделано.
А вот вторая "растет" из архитектуры платформы и пока решить её удалось лишь частично.
Условную компиляцию IntelliJ тоже не любит, т.к., например, подсветка синтаксиса работает инкрементально, т.е. только с тем кодом, который был изменен.
В общем, работы невпроворот!
Итак, что I-Pascal уже умеет:
- подсвечивать ряд ошибок - синтаксические, не объявленные идентификаторы и отсутствующие объявления/реализации методов.
- предлагать варианты автоматического исправления для найденных ошибок. Например, добавить объявление переменной, типа или метода.
- контекстнозависимое автодополнение
- искать места использований идентификатора
- безопасно переименовывать идентификаторы основываясь на предыдущем пункте
- перемещаться между интерфейсом и реализацией (по crtl+вверх/вниз и по маркерам слева)
- перемещаться к реализациям/наследникам интерфейса/класса
- перемещаться к предкам класса
- декомпилировать интерфейсы модулей - .ppu "из коробки" (используется ppudump), для .dcu нужен этот декомпилятор
- интегрироваться с компиляторами - FPC и Delphi
- запускать приложение и показывать его консольный вывод
- форматировать код
- подсвечивать синтаксис (настраиваемо), фолдинг и прочие необходимые мелочи
Сама платформа даёт:
- удобный, современный интерфейс - для Windows, Linux и OSX!
- поиск с регэкспами, как по файлу так и по проекту
- инкрементальный поиск практически в любом окне (результаты поиска, структура файла и т.д.)
- удобные маркеры справа в редакторе кода, показывающие ошибки, результаты поиска, закладки и т.п.
- отличная интеграция со многими системами контроля версий
- поддержка XML, SQL и других языков
Многое еще предстоит сделать, но начало положено.
Комментарии и багрепорты приветствуются.