Перейти к содержанию

BSL Language Server

Actions Status Download Latest release GitHub Releases GitHub All Releases Quality Gate Maintainability Coverage Transifex Benchmark telegram

Реализация протокола language server protocol для языка 1C (BSL) - языка 1С:Предприятие 8 и OneScript.

Замеры производительности - SSL 3.1

Возможности

Каждая возможность языкового сервера — с краткой анимированной демонстрацией (см. полный каталог):

  • Автодополнение кода — Контекстные подсказки по мере ввода: глобальные функции, методы и свойства объектов (с выводом типа), типы после оператора Новый, ключевые слова и локальные переменные.
  • Переход к определению — Переход к объявлению процедуры, функции, переменной или метода из места использования. Работает внутри модуля и между модулями конфигурации.
  • Переход к реализациям — Для классов OneScript, использующих библиотеку наследования extends: переход от метода интерфейса (&Интерфейс) ко всем одноимённым методам реализующих его классов (&Реализует).
  • Поиск использований — Поиск всех мест использования символа по проекту.
  • Всплывающая документация — При наведении на символ показывает сигнатуру, тип и описание из комментариев.
  • Подсказка по параметрам — При вводе вызова метода показывает список параметров и подсвечивает текущий.
  • Диагностики — Подсветка ошибок, потенциальных проблем и нарушений стандартов прямо в коде и в панели Проблемы.
  • Быстрые исправления — Предлагает автоматические исправления диагностик и рефакторинги по сочетанию клавиш у проблемного места.
  • Форматирование — Форматирование всего документа, выделенного фрагмента и по мере набора (отступы, регистр ключевых слов).
  • Переименование — Безопасное переименование символа со всеми его использованиями.
  • Связанное редактирование — Редактирование объявления локального символа (переменной, параметра) одновременно изменяет все его вхождения в модуле — без вызова переименования.
  • Структура документа — Дерево процедур, функций и областей модуля — в панели Структура и в быстром переходе.
  • Поиск символов по проекту — Быстрый переход к любому методу или объекту во всём проекте по имени.
  • Подсветка вхождений — Подсветка всех вхождений символа под курсором, а также парных ключевых слов конструкции (Если…КонецЕсли и т.п.).
  • Иерархия вызовов — Кто вызывает метод и кого вызывает он — в виде разворачиваемого дерева.
  • Иерархия типов — Для классов OneScript, использующих библиотеку наследования extends: дерево супертипов и подтипов по аннотациям &Расширяет и &Реализует.
  • Сворачивание кода — Сворачивание процедур, функций, областей и блоков для удобной навигации.
  • Умное выделение — Пошаговое расширение и сужение выделения по синтаксическим границам.
  • Семантическая подсветка — Точная подсветка на основе разбора кода: переменные, параметры, методы, аннотации, а также язык запросов (SDBL) внутри строк.
  • Подсказки-вставки — Встроенные в код подсказки — например, имена параметров в вызовах.
  • Код-линзы — Информационные строки над процедурами: когнитивная и цикломатическая сложность, запуск тестов и покрытие.
  • Цвета: превью и палитра — Превью цвета для Новый Цвет(...) и WebЦвета.*. Клик по образцу открывает палитру — выбор цвета обновляет код. Для веб-цветов доступна конвертация в RGB-представление (Новый Цвет) и обратно.
  • Гиперссылки в коде — Кликабельные ссылки прямо в тексте модуля: ссылки См./See в документирующих комментариях ведут к упомянутому методу или объекту; URL в комментариях открываются в браузере; а опционально (по умолчанию выключено, documentLink.showDiagnosticDescription) сам диагностируемый фрагмент становится ссылкой на документацию диагностики.

Дополнительно (вне каталога демонстраций — командная строка и рабочие области):

  • Запуск движка диагностик из командной строки
  • Запуск форматирования файлов в каталоге из командной строки
  • Поддержка работы с несколькими рабочими областями (multi-workspace)

Поддерживаемые операции протокола

Workspace
Операция Поддержка Комментарий
didChangeWorkspaceFolders yes Динамическое добавление и удаление рабочих областей
didChangeConfiguration yes с ограничениями, см. #1431
didChangeWatchedFiles yes
didCreateFiles yes Фильтры: **/*.bsl, **/*.os, каталоги
didRenameFiles yes Фильтры: **/*.bsl, **/*.os, каталоги
didDeleteFiles yes Фильтры: **/*.bsl, **/*.os, каталоги
symbol yes
executeCommand yes
diagnostic/refresh yes отправляется при изменении конфигурации
applyEdit no
willCreateFiles no
Text Synchronization
Операция Поддержка Комментарий
didOpen yes
didChange yes textDocumentSyncKind = Incremental
didClose yes
didSave yes
willSave no
willSaveWaitUntil no
Textdocument
Операция Поддержка Комментарий Конфигурируется?
publishDiagnostics yes tagSupport = true
versionSupport = true
список диагностик
да
diagnostic yes interFileDependencies = true
workspaceDiagnostics = false
нет
completion yes resolveProvider = true
triggerCharacters = .
completionItem.labelDetailsSupport = true
Предлагает методы, функции и конструкторы с сигнатурами, члены типов после точки, локальные переменные и ключевые слова
completionItem/resolve yes Ленивое дотягивание documentation (описание члена/функции) при поддержке клиентом
hover yes contentFormat = MarkupContent
signatureHelp yes triggerCharacters = (, ,
retriggerCharacters = ,
declaration no не применимо в 1С:Предприятие
definition yes linkSupport = true
typeDefinition no
implementation yes только для интерфейсов OneScript библиотеки extends (&Реализует)
references yes
documentHighlight yes Подсветка связанных конструкций: if/elsif/else/endif, try/except/endtry, циклы, регионы, скобки
documentSymbol yes hierarchicalDocumentSymbolSupport = true
codeAction yes codeActionKinds = ? (см. #1433)
isPreferredSupport = true
да
codeAction/resolve no
codeLens yes resolveProvider = true да
codeLens/resolve yes
codeLens/refresh yes
documentLink yes Показ гиперссылок на документацию по диагностикам.
tooltipSupport = true
resolveProvider = false
да
documentLink/resolve no
documentColor yes
colorPresentation yes
formatting yes
rangeFormatting yes
onTypeFormatting yes firstTriggerCharacter = \n
moreTriggerCharacter = ;
rename yes
prepareRename yes
foldingRange yes
selectionRange yes
prepareCallHierarchy yes
callHierarchy/incomingCalls yes
callHierarchy/outgoingCalls yes
prepareTypeHierarchy yes только для OneScript-классов библиотеки extends
typeHierarchy/supertypes yes только для OneScript-классов библиотеки extends
typeHierarchy/subtypes yes только для OneScript-классов библиотеки extends
semanticTokens/full yes multilineTokenSupport = true
semanticTokens/full/delta yes
semanticTokens/range yes
linkedEditingRange yes
moniker no
inlayHint yes resolveProvider = true да
inlayHint/resolve yes
inlayHint/refresh yes

Запуск из командной строки

Запуск jar-файлов осуществляется через java -jar path/to/file.jar.

java -jar bsl-language-server.jar --help

BSL language server
Usage: bsl-language-server [-h] [-c=<path>] [COMMAND [ARGS]]
  -c, --configuration=<path>
               Path to language server configuration file
  -h, --help   Show this help message and exit
Commands:
  analyze, -a, --analyze      Run analysis and get diagnostic info
  format, -f, --format        Format files in source directory
  version, -v, --version      Print version
  lsp, --lsp                  LSP server mode (default)
  websocket, -w, --websocket  Websocket server mode

При запуске BSL Language Server в обычном режиме будет запущен сам Language Server, взаимодействующий по протоколу LSP. Для взаимодействия используются stdin и stdout.

Ключ -c (--configuration) задаёт путь к конфигурационному файлу. Если ключ не указан, BSL Language Server автоматически ищет файл .bsl-language-server.json сначала в текущем каталоге, а затем в домашнем каталоге пользователя. Подробнее — на странице Конфигурационный файл.

По умолчанию тексты диагностик выдаются на русском языке. Для переключения языка сообщений от движка диагностик необходимо настроить параметр language в конфигурационном файле или вызвав событие workspace/didChangeConfiguration:

{
  "language": "en"
}

Запуск в режиме websocket

По умолчанию взаимодействие с сервером идет через стандартные потоки ввода/вывода. Но вы можете запустить BSL Language Server со встроенным веб-сервером и взаимодействовать с ним через websocket.

Для этого необходимо запустить BSL Language Server с ключом --websocket или -w:

Usage: bsl-language-server websocket [-h] [--app.websocket.lsp-path=<path>]
                                     [-c=<path>] [--server.port=<port>]
Websocket server mode
      --app.websocket.lsp-path=<path>
                             Path to LSP endpoint. Default is /lsp
  -c, --configuration=<path> Path to language server configuration file
  -h, --help                 Show this help message and exit
      --server.port=<port>   Port to listen. Default is 8025

После запуска BSL Language Server будет доступен по адресу ws://localhost:8025/lsp.

Для переопределения порта к LSP-серверу необходимо использовать параметр --server.port, за которым следует номер желаемого порта. Для переопределения пути к LSP-серверу необходимо использовать параметр --app.websocket.lsp-path, за которым следует желаемый путь, начинающийся с /.

Пример строки запуска BSL Language Server в режиме websocket с указанием порта 8080:

java -jar bsl-language-server.jar --websocket --server.port=8080

При работе с большим проектом рекомендуется дополнительно указывать параметр -Xmx, отвечающий за предел оперативной памяти для java процесса. Размер выделяемой памяти зависит от размера анализируемой кодовой базы.

java -Xmx4g -jar bsl-language-server.jar ...остальные параметры

Запуск в режиме анализатора

Для запуска в режиме анализа используется параметр --analyze (сокращенно -a).

Usage: bsl-language-server analyze [-hq] [-c=<path>] [-o=<path>] [-s=<path>]
                                   [-r=<keys>]...
Run analysis and get diagnostic info
  -c, --configuration=<path>
                           Path to language server configuration file
  -h, --help               Show this help message and exit
  -o, --outputDir=<path>   Output report directory
  -q, --silent             Silent mode
  -r, --reporter=<keys>    Reporter key (console, junit, json, tslint, generic)
  -s, --srcDir=<path>      Source directory
  -w, --workspaceDir=<path> 
                           Workspace directory

Для указания каталога расположения анализируемых исходников используется параметр --srcDir (сокращенно -s), за которым следует путь (относительный или абсолютный) к каталогу исходников. Для формирования отчета об анализе требуется указать один из "репортеров". Для указания репортера используется параметр --reporter (сокращенно -r), за которым следует ключ репортера. Допустимо указывать несколько репортеров. Список репортетов см. в разделе Репортеры.

Пример строки запуска анализа:

java -jar bsl-language-server.jar --analyze --srcDir ./src/cf --reporter json

При анализе больших исходников рекомендуется дополнительно указывать параметр -Xmx, отвечающий за предел оперативной памяти для java процесса. Размер выделяемой памяти зависит от размера анализируемой кодовой базы.

java -Xmx4g -jar bsl-language-server.jar ...остальные параметры

Запуск в режиме форматтера

Для запуска в режиме форматтера используется параметр --format (сокращенно -f).

Usage: bsl-language-server format [-hq] [-s=<path>]
Format files in source directory
  -h, --help            Show this help message and exit
  -q, --silent          Silent mode
  -s, --src=<path>      Source directory or file

Для указания каталога расположения форматируемых исходников (или файла) используется параметр --src (сокращенно -s), за которым следует путь (относительный или абсолютный) к каталогу исходников (или файлу).

Пример строки запуска форматирования:

java -jar bsl-language-server.jar --format --src ./src/cf

Конфигурационный файл

Подробное описание конфигурационного файла приведено на этой странице

Благодарности

Огромное спасибо всем контрибьюторам проекта, всем участвовавшим в обсуждениях, помогавшим с тестированием.

Вы потрясающие!

Спасибо компаниям, поддерживающим проекты с открытым исходным кодом, а особенно тем, кто поддержали нас:


JetBrains

Создатель профессиональных инструментов разработки программного обеспечения, инновационных и мощных, JetBrains поддержал наш проект, предоставив лицензии на свои продукты, в том числе на IntelliJ IDEA Ultimate.

IntelliJ IDEA Ultimate один из лучших инструментов в своем классе.


Digilabs

Digilabs - авторы Алькир- программного комплекса по мониторингу производительности систем на базе 1С:Предприятие 8. Digilabs предоставляет нам серверные мощности для проведения постоянного тестирования производительности BSL Language Server.