Последние несколько месяцев мы совершенствовали различные подсистемы нашего продукта, чтобы сделать его максимально удобным для пользователей. Читайте ниже о новой функциональности в MPS 2021.1 или посмотрите это видео:
Редактор
Масштабирование
Размер шрифта теперь можно быстро настроить в открытом окне редактора — просто зажмите клавишу CTRL и прокрутите колесико мыши. Размер шрифта не запоминается — когда вы снова откроете файл, будет использовано значение по умолчанию. Вы можете включить/отключить эту опцию в разделе Preferences | Editor | General: Change font size with Ctrl/Cmd+Mouse Wheel.
Улучшение производительности форматирования с отступами
Для наиболее частых сценариев реализация форматирования с отступами (indent layout) стала инкрементальной — это ускорит отрисовку редакторов больших моделей, которые используют форматирование с отступами (например, BaseLanguage). Вы можете отключить эту опцию при помощи параметра VM mps.indent_layout.disable_incremental.
Настройки толщины шрифта
При длительной работе над кодом важно подобрать шрифт, который бы не сильно утомлял глаза. Мы добавили настройки типографики, чтобы вы могли подобрать идеальные размеры шрифта. Версия 2021.1 позволяет настраивать толщину обычных и жирных шрифтов через меню Preferences | Editor | Fonts.
Система контроля версий
Улучшения аннотирования кода
Использование дополнительной информации от системы контроля версий позволило нам улучшить аннотацию кода. Новый алгоритм вычисления изменений ревизии отслеживает перемещение узлов в модели. Цвет строк/ячеек с аннотациями определяется только на основе тех ревизий, где были фактически произведены изменения. Если столбец с аннотациями раскрыт, то в контекстном меню ячеек в основном редакторе появится новая группа опций, таких как Copy Revision Number, Show Diff и другие.
Окно Diff для коммитов слияния
Для коммитов, уже слитых с основной веткой, в Git-логе доступно окно Diff. Оно включает три панели: левая и правая — отображают ветки, которые подверглись слиянию, центральная — демонстрирует результат слияния.
Синхронизация прокрутки в редакторе Diff
Мы добавили кнопку, позволяющую выключить синхронизацию прокрутки в окне редактора Diff.
Использование графа ревизий в алгоритмах для аннотации и истории кода
Раньше алгоритмы для аннотации кода и истории кода или фрагмента брали за основу упорядоченный список ревизий файла и вычисляли изменения, сравнивая две соседние ревизии. Однако эти две ревизии могли принадлежать разным веткам — в таком случае найденные изменения становились бессмысленными. Аналогично ревизии слияния могли ошибочно отображать изменения более ранних ревизий. Использование графа ревизий при анализе истории изменений позволило исправить такие ошибки.
Действие Save to Shelf
Новое действие Save to Shelf копирует изменения на вкладку Shelf, сохраняя их в локальной истории изменений. Чтобы запустить это действие, нажмите ⇧⌘A на macOS или Ctrl+Shift+A на Windows или Linux и введите Safe to Shelf.
Генератор
Упрощенный доступ к параметрам макроса $LOOP$
Теперь вы можете обратиться к входному узлу макроса LOOP при помощи выражения LOOP.inputNode — вам не нужно использовать макрос VAR. В том же пространстве имен можно получить доступ к индексу LOOP: используя LOOP.index вместо необходимой ранее контекстной переменной.
Обновленный оператор Transform в объявлении GenPlan
Для улучшения расширяемости планов генерации теперь есть новый механизм, позволяющий подключить заранее неизвестный набор языков и генераторов. Вы можете использовать оператор transform для подключения языка, расширяющего текущий язык или считающего его целевым. Говоря, что язык Б считает язык А «целевым», мы подразумеваем, что генератор языка Б производит конструкции языка А.
Улучшение скомпилированных шаблонов
В IDE в настройках генератора имеется опция Warn when child cannot be placed into role, которая проверяет, может ли создаваемый образец узла быть использован в указанной роли родительского узла. Эта опция также доступна в настройках сборки проектов. Генератор может показать предупреждение, которое обычно означает, что в шаблонах имеются несоответствия, например неправильно размещенные фрагменты шаблона или аннотация COPY-SRC.
Такая проверка отсутствовала при использовании скомпилированных шаблонов. В MPS 2021.1 при включении соответствующей опции скомпилированные шаблоны проверяют, правильно ли дочерние узлы размещены в родительских.
Разное
Java-компилятор для модулей MPS с фасетом Java
Мы существенно изменили подход к компиляции модулей MPS в Java. Это напрямую связано с задачей по поддержке обработки аннотаций, получившей большое количество голосов. Мы перевели инфраструктуру Java-компилятора для MPS на набор API javax.tools.JavaCompiler — теперь MPS может использовать любой компилятор, который реализует стандартный API javax.tools. На данный момент MPS применяет тот компилятор, который назначен стандартным для данного API. При желании вы можете выбрать Eclipse Compiler for Java (ECJ), если он доступен. Когда в classpath есть библиотеки ECJ, можно переключить MPS на использование ECJ, задав mps.compiler.java=ecj в качестве свойства системы (например, изменив mps.vmpoptions). Следует отметить, что если при использовании инфраструктуры нового компилятора возникнут неустраняемые проблемы, то можно задействовать устаревший механизм API прямой компиляции ECJ, изменив конфигурацию на mps.compiler.java=ecjlegacy в качестве свойства системы.
Кроме того, сейчас мы запускаем компилятор с опцией -release с версией, указанной в настройках проекта (Preferences -> Java Compiler). Эта опция строже, чем сочетание -source/-target, которое использовалось MPS в предыдущих релизах, поскольку она контролирует применение API библиотек, которые были доступны в определенных релизах. Если из-за использования API, недоступных в некоторых релизах, вы столкнетесь с проблемами компиляции, возможно, придется обновить версию Java в проекте.
Исходная версия MPS для миграции проекта
При создании проекта теперь сохраняется значение «исходной» версии MPS. Миграции с версий MPS, предшествующих исходной, не применяются. Это дает авторам возможность назначить «исходный» порог для миграций проекта (версию можно изменить в интерфейсе для миграции проектов, используя метод «getBaselineVersion():int»).
Если для проекта отсутствует версия, при миграции версией по умолчанию будет 2018.1. Миграцию любого проекта можно запустить вручную из меню Migrations.
Улучшения рефакторинга Method signature
В окне рефакторинга Method Signature теперь можно указать значения по умолчанию для новых аргументов или аргументов, у которых поменялись типы. Если вы удалите параметр метода, но в коде останутся его использования, MPS введет новую локальную переменную и таким образом восстановит связь. Кроме того, теперь обрабатываются параметры типа vararg.
Когда вызов метода не соответствует его сигнатуре, MPS предложит поправить сигнатуру метода в соответствии с вызовом при помощи intention-действия. Мы усовершенствовали это intention-действие: теперь оно более грамотно сопоставляет существующие параметры, при этом повторно используется их максимальное количество и сохраняются их ссылки.
Новые возможности для комментариев BaseLanguage
Язык lang.text получил несколько новых возможностей — это напрямую улучшило работу с однострочными и многострочными комментариями в BaseLanguage.
- Выделяя текст сверху вниз или снизу вверх, вы теперь можете захватывать строки частично.
- Теперь вы можете сделать жирным, выделить курсивом или подчеркиванием выделенный текст.
- Работает копирование/вставка обычного текста.
- Вы можете добавлять маркированные и нумерованные списки.
Улучшенные выражения lang.smodel
Выражения model.roots(), model.rootsIncludingImported() и model.nodesIncludingImported() теперь, аналогично model.nodes(), поддерживают #expression для указания концептов.
Управление видимостью модулей плагина
Долгое время в MPS считалось, что конечному пользователю видны все модули из языковых плагинов. Из-за увеличения числа языков и усложнения плагинов бывают случаи, когда разработчики языков хотят скрыть определенные модули, чтобы не запутать и не перегрузить конечного пользователя огромным количеством невостребованных языков или функций. Плагины сообщают MPS о том, какие модули они затрагивают, при помощи расширения com.intellij.mps.LanguageLibrary. Теперь у расширений есть опциональный атрибут hide=«true», который разрешает фильтровать модули плагина на основе образца, указанного в com.intellij.mps.VisibleModuleMask. У большинства плагинов MPS появился флажок для удобства фильтрации собственных языков MPS, если разработчику языков необходимо их скрыть. MPS обеспечивает для своих модулей маски в составе плагина jetbrains.mps.ide.devkit, причем разработчики собственных IDE обычно не включают этот плагин в дистрибутив и полностью контролируют отображаемые модули своего продукта.
Другие улучшения
Предварительный просмотр HTML-файлов
Мы добавили встроенное превью для HTML-файлов. Чтобы его открыть, нажмите на логотип MPS в виджете в правом верхнем углу редактора. Превью обновляется в реальном времени, когда вы редактируете HTML-код или изменяете связанные CSS и JavaScript-файлы.
Поддержка Apple Silicon
Теперь вы можете пользоваться MPS на Mac-устройствах с чипом M1. Скачать установщик JetBrains MPS для Apple Silicon можно с нашего сайта либо из Toolbox App.
Автоматический импорт настроек
Раньше окно Import Settings появлялось каждый раз, когда вы устанавливали новую версию MPS. Теперь, если IDE найдет необходимые конфигурационные файлы, окно не появится.
Специальные возможности
В этом выпуске мы добавили больше меток к элементам интерфейса начального экрана, панели Project Structure и VCS-лога. Теперь эти элементы, как и значки на полях редактора, корректно обрабатываются программами чтения с экрана. Мы также занимаемся расширением поддержки специальных возможностей для пользователей macOS.
Незначительные изменения
- Теперь показывается выполнение intention-действия макроса Call-Site. (MPS-32928)
- Внесены изменения в диалоговое окно новой модели. (MPS-30787)
Кроме того, исправлен ряд ошибок. Поделитесь с нами своими впечатлениями о новой функциональности. Мы очень рассчитываем на ваши отзывы в комментариях ниже. Напоминаем, что в нашем баг-трекере можно оставлять запросы о добавлении новой функциональности и голосовать за любые существующие запросы. Это помогает нам определиться, какие функциональности следует включить в ближайшие релизы.
Ваша команда JetBrains MPS
The Drive to Develop