Disclaimer: Данный топик не содержит реализации того, что указано в заголовке, и не содержит технических деталей. Тут всего лишь перечислены проблемы, которые я собираюсь решать и краткий план как это должно быть реализовано. Учитывая новизну темы и неплохой уровень сложности для меня, я не ручаюсь что эта статья не будет первой и последней. Но мне честно хотелось-бы довести это начинание до конца, паралельно освещая его здесь. Эта статья выступает, в том числе, и дополнительной мотивацией.
Вступление к вступлению
Так уж сложилось что несколько недель назад мне пришлось переучиваться с C# разработчика на Salesforce разработчика. И я бы не прочь сказать что это оказалось просто и увлекательно (хотя это во многом так и есть), но один факт регулярно продолжает мне портить настроение и заставляет вспоминать любимый .NET. Последние 5 лет я работал исключительно с VisualStudio — раработка WinForms приложений, SIlverlight, чисто C# бекенд, TypeScript в качестве хобби. И я воспринимал сей инструмент как то, что будет со мной всегда, как то, что делает разработку комфортной, и глупо считал что остальные IDE находятся примерно на том же уровне развития (я упорно старался забыть свой опыт работы с каким-то Flex IDE на базе Eclipse).
И тут бац… Force.com IDE — IDE на базе Eclipse для работы с Salesforce либо Mavensmate плагин к Sublime Text.
Краткий ликбез
Разработка под Salesforce ведётся с использованием двух основных языков/технологий — Apex code на базе Java, и VisualForce — фреймворком для построения кастомной веб-части «приложений».
Особенность использования всей платформы Salesforce — облачность головного
Ну ок, классно, бери любой IDE для Java и работай в нём. Нельзя, ибо язык действительно отличается, а вышеуказанная ОГМ обязывает нас каждый чих сохранять в облако и компилировать его там.
Зачем?
Вполне резонный вопрос — а почему, собственно, не переучиться на новую IDE как нормальный человек? Тут, для меня, всё довольно просто:
- Глупая привычка к хорошему инструменту
- Возможность выучить что-то новое
- Идея part-time проекта, которая не будет «проект ради проекта»
- Возможность попробовать свои силы
- Возможность сделать мир лучше?
- Неудобство доступных инструментов
Последний пункт стоит рассмотреть немного детальнее — так как я всего пару недель как начал этим интересоваться, список у меня накопился небольшой, но достаточный для меня:
- Отсутствие достойной альтернативы IntelliSense в Force.com IDE — ищет по первым буквам, сильно тормозит, не очень в курсе про кастомные классы и их свойства/методы (тут может быть я что-то и неправильно сказал, но у меня получилось именно так). Зато более-менее неплохо работает в Mavensmate
- Отсутствие подсветки синтаксических ошибок в Mavensmate — сохраняем, отправляем в облако, ждём секунд 20-30 и узнаём что забыли точку с запятой. В следующий раз мы узнаём что забыли ещё одну точку с запятой парой строк ниже. Зато неплохо работает в Force.com IDE
- Полное остутствие возможности группировать файлы (классы/триггеры/страницы в их терминологии) хотя-бы по папкам — есть три системных папки в которых файлы лежат согласно их категории, ВСЁ. Действительно глупо видеть в 2014м году названия файлов вида "AAAAClassName", "AAALessImportantClassName" и т.п… Такова структура кода в Salesforce, но раз уж у нас отдельный софт — можно было бы и побороться с этим (хотя-бы с помощью симлинков).
- Каждое сохранение файла приводит к тому что он отправляется в Salesforce и там компилируется. Извините, но у меня есть дурацкая привычка нажимать Ctrl+S после каждой строчки. А если я задумаюсь о чём-то в середине строки — я могу нажимать Ctrl+S пока не вернусь в реальность. Извините, но компиляция и сохранение файлов это не одно и тоже в моём мире.
- Неадекватный механизм взаимодействия с Salesforce у Mavensmate — генерируемые странички, которые открываются в браузере и отображают результаты взаимодействия с SF (запуски тестов, логи и т.п.)
В качестве темы для обсуждения было-бы интересно узнать — а как Вы относитесь к подобным особенностям IDE?
И как мы это будем решать?
Из заголовка и предыстории потяне общий вектор — расширение для Visual Studio, которое позволит нам полноценно работать с Salesforce кодом. Если разобрать концепцию на принципиальные блоки — я бы выделил вот что (именно в таком порядке):
- Подсветка синтаксиса Apex
- Подсветка синтаксиса VisualForce
- Поддержка «проектов» Salesforce (включая разделение понятий Save и Compile)
- Имплементация IntelliSense
- Отображение синтаксических ошибок
- Панели для работы с юнит-тестами и логами Salesforce
- Сборка Visual Studio for Salesforce на базе Visual Studio Shell для свободного standalon распостранения
- Остальной сахар по мере сил и возможностей
Интересные задачи на первые этапы
Одной из самых интересных проблем (спасибо Salesforce) является отсутствие где-либо грамматики как самого Apex так и VisualForce. Да, Apex построен на базе Java, но изменений там прилично и строить грамматику основываясь на оной из Java и текстовом reference Apex'a долгая и нудная задача… Но иных вариантов я не нашёл, поэтому процесс запущен.
Что важно при формализации грамматики — на чём в дальнейшем будет строиться лексер — ANTLR либо Irony (два самых интересных проекта). У ANTLR мне намного больше нравится формат задания грамматики (он намного более привычен для меня, ибо не смешивается с кодом), но подход самого проекта мне не нравится — Java приложение которое генерирует лексер автоматически (на Java либо C#). Irony намного более гибок и свободен в выборе как и что реализовывать, но задание грамматики мне не нравится — ужасный микс кода и BNF правил.
Буду благодарен за любую дополнительную информацию по подобным инструментам для .Net в комментариях
Вторая проблема с которой я столкнулся за неделю изучения материалов и неспешного ковыряния во внутреностях VS SDK — документация и примеры. Я серьёзно всегда считал документацию на msdn одним из лучших примеров. Всё есть, отличные туториалы, примеры, детальная информация. В данном же случае — полная фигня. Примеры из статей msdn не компилируются (ну фиг с ними), после банального исправления тупых ошибок код просто не работает. Информация (которой кот наплакал) размазана по разным местам и важные нюансы можно собирать по десятку разных материалов. VS SDK 2013 (а именно под эту версию я собираюсь разрабатывать расширение) примерами не снабжается, а примеры из VS SDK 2010 неполные и устаревшие (используются старые подходы без Managed Package Framework а сам лексер так вообще не включён в пример — приходится использовать .NET Reflector для выковыривания кода.
Следующие шаги
Как я уже писал — я не уверен в том, что смогу довести данный проект до адекватного вида, но, надеюсь, это случится. Сейчас я выковыриваю информацию по Syntax Highlighting и, паралельно, работаю над грамматикой Apex. При хорошем стечении обстоятельств примерно через месяц я бы хотел поделиться с вами прогрессом, если же через месяц ничего не произойдёт, знайте — я пал под давлением Apex либо Visual Studio :)
Буду благодарен за полезные ресурсы, статьи, советы, примеры реализации Language Service для Visual Studio 2010+ (IronPython не вариант) и вообще по теме.
Спасибо за внимание.
Автор: Bick