Салют!
Есть такая старая шутка каждый программист должен написать свою базу данных, текстовый редактор и язык программирования
Я хочу сегодня рассказать про свой опыт с закрытием пункта про язык программирования
Собственно, на прошлой неделе я написал плагин для intelliJ-based ides добавляющий минималистичную, но уже, поддержку нового языка
Как появилась идея? Что вдохновило?
На работе я делаю систему для визуализации статистики по git-репозиторию
Да, все вот эти, кто сколько строчек поменял, сколько коммитов сделал, по каким дням чаще открывает пуллреквесты и все в таком же духе, в виде графиков красивых
Продукт нужный и полезный, но не для людей для корпоратов
А хочется делать что-то более близкое "к народу", чем сам бы мог пользоваться
В какой-то момент, увидел в клубе пост про язык для рецептов и тут понеслось
Что вошло в прототип и сколько времени на него было потрачено?
Не уверен, сколько времени потратил. Две ночи точно, ну и еще, наверное, часов 10-15 на протяжении недели
Пока сделал две фичи
- Подсветка синтаксиса, чтоб быть не хуже остального доступного тулинга
- Поиск рецептов, где тоже используется этот ингредиент
Какой технологический стек вы использовали? Почему?
Проект написан на Kotlin
, потому что с одной стороны это официально рекомендуемый язык для написания intellij-плагинов, а с другой стороны люблю я его
Собирается все это дело через Gradle
средствами GitHub Actions
С какими самыми неожиданными трудностями пришлось столкнуться?
Глобально, трудность была одна - слабое знание матчасти в вопросах парсеров и формальных грамматик. Однако, не сказать, чтоб она была совсем неожиданная.
Концептуально, поддержка языка в IDEA очень простая штука.
Надо просто реализовывать несколько десятков доступных плагин поинтов
Коварный нюанс, что для их реализации нужно иметь PSI, оно же, описание твоего языка в терминах, понятных IDE
Вот тут в игру и вступают лексеры, парсеры и деревья, которыми принято вращать на собесах
Практически, надо сделать два файла
- описание грамматики в формате
bnf
- описание лексера в формате
flex
А потом, отдельным плагином сгенерировать код самих классов, представляющих тот самый PSI и еще один код парсера, который эти самые PSI сделает из поступившего на вход текстового файла.
Как показал мой опыт, для простых кейсов понимание теории, в принципе, не особо нужно. Достаточно внимательно раскурить полдесятка исходников похожих плагинов и сделать по аналогии
Какие планы на будущее?
В целом, я планирую на примере этого проекта прокачивать свои навыки в создании тулинга для IDEA и ведении opensource-проекта (раньше, пару раз коммитил в языковые плагины)
В доке есть туториал, что можно сделать, чтоб запилить крутую поддержку языка, хочу сделать все пункты
Из ближайшего, точно можно сделать красивый просмотр рецепта и переименование ингредиентов, посуды, таймеров
Нужны ли какие-то советы или помощь Клуба?
А накидайте пользовательских сценариев, а :)
Да, вот вы, обладатели коллекции рецептов, размеченных специальным языком. Чем бы вам могла помочь настоящая IDE в вопросах обслуживания этой коллекции?
Ибо, при всей технической крутости проекта, по сути, он вещь в себе и, пока что, обслуживает только эго своего автора в стиле "смотри, чо могу!"
Надо ли кому-то, во всех своих рецептах, удобно переименовывать все помидоры в томаты и обратно?