пятница, 22 января 2016 г.

Релиз версии 1.0

Вышла 1-я версия I-Pascal, которую можно назвать стабильной.


Исправлены ошибки с "потерей" существующих ppu-модулей, а также идентификаторов - тут, возможно, еще остались проблемы.
Улучшена работа с условной компиляцией и поддержка инклудов.
Увеличена производительность.
Добавлено большое количество автоисправлений для ошибки типа "не найден идентификатор":
помимо переменной, типа и константы теперь можно добавить поле класса, метод, формальный параметр и даже свойство.




Немного о проекте и перспективах


I-Pascal разрабатывается с 2012 года и из экспериментальной поделки перерос во вполне себе полноценное IDE для Паскаля, в области редактирования кода превосходящее по удобству и функциональности аналоги.
Я уже довольно давно использую I-Pascal в качестве редактора кода. Ранее приходилось использовать Delphi, что довольно проблематично в Ubuntu.
24854 скачиваний на текущий момент из официального репозитория плагинов говорит о том, что продукт интересен людям.

В какую сторону будет развиваться I-Pascal?


Возможные и очевидные варианты:
  • импорт проектов из Delphi и Lazarus
  • обнаружение и подсветка большего количества ошибок
  • анализ и подсветка сомнительных мест в коде (варнингов)
  • набор автоматических исправлений для всего вышеперечисленного
  • завершение конструкций - очень удобная штука, кстати
  • еще более интеллектуальный code completion, в т.ч. автоматически добавляющий необходимые модули
  • вывод типов для автоматической подстановки и проверки ошибок
  • семантическая подсветка - например, точки выхода из подпрограммы, или все идентификаторы из данного модуля
  • настройка форматирования кода
  • предложение имен
  • поддержка объявлений во включаемых файлах (инклудах)
  • рефакторинги: перенос переменных/полей между классами/модулями, выделение подпрограмм и т.д.
  • поддержка отладки под Android


На направление дальнейшего развития можете повлиять и вы, оставляя фичреквесты в трекере задач.
Ну и конечно немалую помощь окажут багрепорты туда же.

воскресенье, 17 января 2016 г.

Рефакторинг: превосходи ожидания

Такая история:
Жила-была функция: VirtualFile trySearchPath(Module module, String name)
строк на 15-20 и где-то рядом был копипаст из нее, отличающийся значением локальной переменной.

воскресенье, 23 августа 2015 г.

Навигация по модулю

Поговорим о навигации в пределах модуля.

Намедни, прочитал про плагин Navigator для Delphi от компании Parnassus.
Он позволяет открыть окно со всем, что есть в модуле - переменные, классы, методы и т.д., и использовать инкрементальный поиск по всему этому.
Также он включает этакую "миникарту" - уменьшенную копию кода модуля, которую можно использовать для навигации, вместо обычного скролбара.
Стоит все это удовольствие 40 евро.

Есть ли альтернативы?

Просмотр структуры модуля в I-Pascal
Просмотр структуры модуля в I-Pascal
Еще в Delphi 7 был Code Explorer, правда поиска нормального там нет.
В Delphi XE (возможно и раньше) есть окно "Structure", в котором инкрементальный поиск реализован. Правда, он не включается при открытии окна, надо кликать на поле ввода. Что убивает удобство поиска.

Современная IDE должна обеспечивать удобную навигацию по модулю. Желательно, "из коробки".
В IntelliJ, на базе которой создан I-Pascal, есть как окно Structure (Alt+7), так и быстрый диалог, открывающийся по горячей клавише (Ctrl+F12).

А что касается инкрементального поиска, то он там работает практически во всех окнах и диалогах. И никуда не надо кликать мышью.




Маркеры кода в I-Pascal
Маркеры кода в I-Pascal
По поводу "миникарты" могу сказать, что в том виде, в каком она представлена в плагине "Navigator", от неё мало пользы - слишком много места и мало функционала. Да и зачем нужна уменьшенная копия кода?
Вот маркеры всякого интересного под скроллбаром - результатов поиска, вхождений идентификатора, на котором стоит курсор, ошибок, TODOшек - это полезно. И такие маркеры есть в IntelliJ, а значит и в I-Pascal.

вторник, 18 августа 2015 г.

I-Pascal, начало

Друзья, всем привет!

В этом блоге я буду рассказывать о разработке редактора кода 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 и других языков
Многое еще предстоит сделать, но начало положено.

Комментарии и багрепорты приветствуются.