Расширение VSCode с LSP сервером
Готова предварительная версия расширения для VSCode (также в будущем можно будет использовать LSP сервер из расширения для нового QGen или других редакторов). В данный момент функциональность несколько ограничена и возможны ошибки (поэтому выкладываю на форуме).
Общие сведения:
- Расширение должно работать на Windows / Linux / MacOS.
- Работает даже на больших файлах (особое внимание уделено производительности).
- Поддерживается “режим проекта”, когда несколько .qsps файлов рассматриваются как связанные.
Что уже умеет
Подсветка синтаксиса
- Парсинг файлов .qsps учитывая грамматику QSP 5.9.5
-
Семантическая подсветка — ключевые слова, переменные, строки, метки, локации, операторы и т.д. включая подвыражения в строках
<<>>и блоки кода{} - Грамматика TextMate — резервная подсветка синтаксиса
Навигация
- Go to Definition — переход к определению локации / метки / переменной / действия / предмета
- Find All References — поиск всех использований переменной, локации, метки, действия или предмета
- Document Symbols — структура локаций, меток, действий (Ctrl+Shift+O)
- Go to Location — быстрый выбор локации через Command Palette (Ctrl+Shift+L)
- Подсветка всех вхождений символа под курсором
- Подсветка ключевых слов для выбранного многострочного оператора
- Подсветка начала / конца локации
Редактирование
- Автодополнение — встроенные ключевые слова QSP, функции, переменные, имена локаций, имена меток
- Подсказка при наведении — документация по встроенным функциям / операторам / системным переменным
- Переименование — переименование локаций / переменных / меток / действий / предметов
- Действия с кодом — быстрые исправления из диагностик
- Форматирование всего документа / выделения / текущей локации
- Сворачивание блоков локаций, многострочных act / if / loop
Команды
- Новая локация — вставка нового блока локации
-
Вставить разделитель — вставка
---(Ctrl+Shift+-) - Сортировка локаций (A -> Z / Z -> A)
- Дублировать локацию — копирование текущей локации с новым именем
- Удалить локацию — удаление локации под курсором
- Переименовать локацию — переименование через LSP (обновляет все ссылки)
- Переместить локацию вверх/вниз — перестановка порядка локаций (Alt+Up / Alt+Down)
- Комментирование — закомментировать / раскомментировать строки
Другое
- Строка состояния показывает имя текущей локации на позиции курсора (клик открывает быстрый выбор)
- Окно “Outline” показывает список локаций, действия на локации, метки на локации
- Список ошибок / предупреждений в окне “Problems”
Типы диагностики, которые сейчас поддерживаются
-
Синтаксические ошибки (включая блоки кода
{}) -
Незакрытые локации (нет
--) - Слишком длинные локации (настраивается, 500 строк по умолчанию)
- Дублирование локаций / меток / действий
- Переменные, которые используются, но присвоение / инициализация не найдена
- Ссылки на несуществующие локации / метки / действия / предметы
- Неверный префикс типа для функции
- Смешанные префиксы переменных
- Неиспользуемые переменные (присвоение / инициализация есть, но использования нет)
- Неиспользуемые метки / предметы / локации
Планируется добавить
- Поддержка импорта / экспорта QSP файлов (через специальную встраиваемую версию TXT2GAM)
- Построение графа локаций
- Новые типы рефакторинга
- Новые типы диагностики
- Улучшение текущих возможностей
Надо бы ещё рассказать, как устанавливать.))
Установка расширения
- Открываете VS Code или Cursor
- Открываете панель “Расширения” (Extensions)
-
Перетаскиваете файл
.vsixна панель.
По расширению
Отсутствие пробела после запятой ломает подсветку:
Скриншот

Причём для встроенных функций пробелы роли не играют, а для пользовательских - да.
Первый аргумент подсвечивается странно. Но не везде. Пока не понимаю, почему:
Скриншот

Проблемы со скобками, или с многострочностью. Этот код валиден для 5.7.0 (в плане многострочности):
Скриншот

^upd: тут наверное из-за тех же отсутствующих пробелов после запятых.
Скобки в тексте между локациями наверное сам Курсор подсвечивает.
Скриншот

(Может зря я сразу в Курсоре проверяю…)
Нет, разницы между Курсором и ВСкод нет. Смотрим дальше. Подсветка текста между локациями всё таки сломана.
Скриншот

Многострочные скобки требуют закрытия на той же строке, где стоит последний аргумент.
Скриншот

Больше пока не вижу ничего. Но надо взять какой-то чужой код и проверить на нём.
Информация о том, что используются одноимённые переменные для разных типов, это очень полезно! Как понимаю, надо ещё области видимости доделывать, чтобы глобальные не путались с локальными, и локальные из разных локаций не влияли друг на друга.
Ну и присоединяюсь к хотелкам, которые со времён расширения Агента витают. Хочется, чтобы расширение работало со всеми файлами проекта. ))
Выложил версию 0.1.1:
- Исправлены найденные ошибки
- Добавлен “режим проекта”, когда несколько .qsps файлов рассматриваются как связанные - поддерживается диагностика, а также поиск / переименования по всем файлам проекта
Выложил версию 0.1.2: в “Go to location” локации сортируются по алфавиту.
Попробовал на разных своих проектах. Всё отлично.
Находит неиспользуемые локации, находит локации с повторяющимися именами, подсвечивает переменные с миксованными префиксами, находит вызовы несуществующих в проекте локаций.
Неиспользуемые массивы находит — это вообще шикарно! Правда у меня получилось, что это не совсем верно, там как раз из-за необходимости генерировать префикс в copyarr подставляется первым аргументом '<<$args[21]>>em_arr_sort_result_array_'. 😅 Ну, это мелочь несущественная.
Попробовал дать задание Курсору на исправление ошибки с префиксом. Он даже это сделал, нарушив правда логику. 😂
И тут началось. Предупреждение о смешивании префиксов не скинулось, а ещё появилось предупреждение, что дублируется название локации, причём пять минут назад я это название исправлял, и оно не дублировалось.
После перезапуска Курсора предупреждение о смешивании префиксов пропало. А вот предупреждение о дублировании имени локации — нет, хотя локация точно в папке такая одна.
Скриншот

Ещё мне сначала показалось, что большая нагрузка на процессор долго сохраняется, но потом всё выровнялось, сейчас тише, чем линтер для python работает.
У меня пока не получается повторить ситуацию с ошибкой о дублировании локации. Правда, я использую VSCode, а не Cursor.
Обновил до версии 0.1.3:
- Улучшено обновление диагностики при изменении файлов
- Добавлено предупреждение о слишком длинных локациях (настраивается, 500 строк по умолчанию)
Нужно ли добавить получение списков локаций, предметов, переменных (можно показывать в новом документе)?
Byte:
Нужно ли добавить получение списков локаций, предметов, переменных (можно показывать в новом документе)?
Я думаю, было бы неплохо.
Я и второй раз так смог сделать в версии 0.1.3 в VS Code.
Скриншот

Делаю очень просто. Сначала делаю две одноимённые локации в разных файлах. Потом просто стираю старое название, пишу новое, не вызывая диалог переименования.
Причём видишь в скриншоте расширение пишет, что локация с таким названием так же определена в файле “[start].qsps”, а файл с таким названием только один. То есть оно то же самое название считает дубликатом.
Более того, оно теперь название каждой локации считает дубликатом):
Скриншот

Эту я не переименовывал. ))
Aleks Versus:
Делаю очень просто. Сначала делаю две одноимённые локации в разных файлах. Потом просто стираю старое название, пишу новое, не вызывая диалог переименования.
Пока что не повторяется. Пробовал много раз с разными местами в файле, с несколькими локациями в файле и с 1 файл - 1 локация. Переименовывал по-разному - и полностью название менял, и частично менял - все работает.
Может, версия VSCode сильно отличается? У меня сейчас 1.108.2.
Обновил до 0.1.4:
- Улучшение синхронизации состояния (должно корректнее показывать ошибки / предупреждения)
- Улучшение производительности