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

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

Комментариев нет:

Отправить комментарий