github 1c-syntax/bsl-language-server v1.0.0
🎉 v1.0.0 🎉

3 hours ago

Версия 1.0.0 — рубежный релиз. Основой стала полностью новая система типов, наделяющая сервер знаниями о доступных типах платформы и движка OneScript, и умеющая выводить типы переменных на основании возвращаемых значений методов. Существенно расширена поддержка протокола LSP — добавлены автодополнение, подсказка по параметрам, иерархия типов и другие запросы (вплоть до возможностей LSP 3.18). Добавлен экспериментальный режим работы в качестве MCP-сервера и собран полноценный каталог возможностей в документации.

Новая система типов

Сердце релиза — заново спроектированная система типов (model, registry, inferencer, TypeService).
Это единый слой, который знает обо всех типах проекта и умеет выводить тип выражения в произвольной точке кода. На нём построены подсказка при наведении, автодополнение, подсказки по параметрам, семантическая подсветка и новые диагностики.

  • Единая модель и реестр типов. Типы собираются из нескольких источников в общий реестр:
    • платформенные типы 1С:Предприятие (через bsl-context) из синтакс-помощника на вашей машине;
    • типы конфигурации (через MDClasses) — менеджеры объектов, реквизиты и т.п.;
    • типы OneScript из синтакс-помощника OneScript 2.1, а также пользовательские OScript-классы.
  • Вывод типов выражений (inference). Сервер определяет тип переменной/выражения под курсором в том числе по присваиванию, по возвращаемому значению функций (включая межмодульный вывод) и по полям структур, формируемых функцией-конструктором.
  • Специализация обобщенных членов. Поддерживаются сложные конструкции вида Справочники.ИмяСправочника.ИмяМетодаВозващающегоСтруктуру().ПолеСтруктуры. На каждом этапе этой цепочки доступны и всплывающие подсказки и автодополнение.
  • Типизация через комментарии. Поддерживаются документирующие комментарии параметров методов, возвращаемых значений, переменных уровня модуля и локальных переменных. Ссылки см. и функции-конструкторы корректно разрешаются в типы.
  • Поля структуры и колонки таблицы значений. Для структур и колонок таблиц значений ведется анализ как объявленных в документирующем комментарии колонок, так и добавленных явно в коде.
  • Специализация элементов коллекций. При использовании цикла Для Каждого выводится тип итератора на основании описания коллекции. Итерация по Массив из Число положит Число в тип переменной-итератора.
  • Билингвальность. Полноценная поддержка русских и английских имён типов и членов: двуязычное отображение в подсказках при наведении, автодополнении и подсказках по параметрам; классификация смешанных имён; показ информации на «своём» языке символа (BSL/OneScript).
  • Конструкторы, async и вариадик-параметры. Отдельное понятие для конструктора OScript-класса; учёт модификатора Асинх у объявлений и вызовов методов; поддержка variadic-параметров в методах (повторяемые параметры, как, например, в СтрШаблон).
  • Поддержка OneScript как языка первого класса. В систему типов заведены понятия Класса и Модуля OneScript, а так же понятие подключаемой "библиотеки" с анализом lib.config и "соглашения о каталогах".
  • Пользовательские коллекции. Классы OneScript с аннотацией &Обходимое регистрируются как коллекции — выводится тип элементов при обходе Для Каждого.
  • Семантическая подсветка на базе системы типов. Подсветка теперь богаче и корректно различает платформенные и пользовательские переменные и методы, асинхронные и статические функции.

Поддержка фреймворка «ОСень» (Autumn)

Поверх новой системы типов добавлена поддержка DI-фреймворка «ОСень» (Autumn) для OneScript: сервер распознаёт аннотации фреймворка, индексирует желуди и точки внедрения, и выводит типы внедряемых зависимостей - благодаря чему на компонентах «ОСени» работают автодополнение, всплывающие подсказки и переходы.

  • Вывод типов внедряемых зависимостей (DI). Вывод типов для аннотаций &Пластилин, как в режиме внедрения одиночного желудя, так и при внедрении коллекций.
  • Аннотации компонентов и внедрения Мета-аннотации (&Лог, &Контроллер, killjoy и др.) распознаются и выводятся в соответствующие типы.
  • &ПсевдонимДля (AliasFor) учитывается при разрешении типов внедряемых зависимостей.
  • Навигация по желудям. Двунаправленный переход между объявлением желудя или завязи, и точками его внедрения: новые код-линзы и быстрые действия.

Поддержка библиотеки наследования extends (OneScript)

Поверх новой системы типов реализована поддержка библиотеки наследования extends для OneScript: сервер распознаёт её аннотации и строит модель отношений типов, на которой работают переход к реализациям и иерархия типов.

  • Аннотации наследования. Распознаются &Расширяет (extends), &Реализует (implements) и &Интерфейс (interface); по ним выстраиваются связи «супертип ↔ подтип» и «интерфейс ↔ реализация».
  • Переход к реализациям (textDocument/implementation) — от метода интерфейса (&Интерфейс) ко всем одноимённым методам реализующих его классов (&Реализует).
  • Иерархия типов (textDocument/prepareTypeHierarchy, typeHierarchy/supertypes, typeHierarchy/subtypes) — дерево супертипов и подтипов по &Расширяет/&Реализует, с SymbolKind.Interface для интерфейсов.

Поддержка протокола LSP

Добавлен каталог возможностей в документации docs/capabilities.
Сама поддержка протокола существенно расширена — реализованы новые запросы и улучшены существующие, вплоть до возможностей LSP 3.17/3.18.

Новые обрабатываемые запросы

  • Добавлена обработка запроса textDocument/completion и completionItem/resolve — автодополнение кода: глобальные функции, методы и свойства объектов (с выводом типа), типы после Новый, ключевые слова и локальные переменные; нечёткий поиск (подстрока и подпоследовательность), ранжирование через sortText, сигнатура и тип в labelDetails (LSP 3.17), commitCharacters, отложенная документация через resolve, размещение курсора после скобок.
  • Добавлена обработка запроса textDocument/signatureHelp — подсказка по параметрам вызываемого метода с подсветкой текущего параметра и учётом клиентских возможностей (labelOffset, documentationFormat, контекст retrigger).
  • Добавлена обработка запроса inlayHint/resolve — отложенное наполнение подсказки-вставки (в v0.29.0 не поддерживался).
  • Добавлена обработка запроса textDocument/implementation — переход к реализациям (поддержка LocationLink); подробности — в разделе «Поддержка библиотеки наследования extends».
  • Добавлена обработка запросов textDocument/prepareTypeHierarchy, typeHierarchy/supertypes и typeHierarchy/subtypes — иерархия типов; подробности — в разделе «Поддержка библиотеки наследования extends».
  • Добавлена обработка запроса textDocument/linkedEditingRange — одновременное редактирование объявления локального символа и всех его вхождений без вызова переименования.
  • Добавлена обработка запроса textDocument/onTypeFormatting — форматирование по мере набора (флаг useOnTypeFormatting).
  • Добавлена обработка запроса textDocument/rangesFormatting — форматирование нескольких диапазонов (LSP 3.18).
  • Добавлена обработка запроса textDocument/prepareRename — подготовка переименования с PrepareRenameResult и placeholder.
  • Объявлена поддержка нескольких рабочих пространств — workspace/didChangeWorkspaceFolders (workspaceFolders.supported и changeNotifications): динамическое добавление и удаление workspace folders (см. раздел «Поддержка нескольких рабочих пространств»).
  • Добавлена поддержка операций над файлами workspace/didCreateFiles, workspace/didRenameFiles, workspace/didDeleteFiles (фильтры **/*.bsl, **/*.os, каталоги) и динамическая регистрация наблюдателей за файлами (didChangeWatchedFiles) через RelativePattern.
  • Явно декларируется positionEncoding = utf-16.

Улучшения существующих запросов

  • textDocument/inlayHint — новые виды подсказок-вставок: имена параметров платформенных методов и конструкторов (Новый Класс()), выводимые типы переменных, значения по умолчанию пропущенных аргументов; кликабельные части подписи (LabelPart); ускорен расчёт подсказок имён параметров (устранён квадратичный обход AST).
  • textDocument/foldingRange — сворачивание ветвей ИначеЕсли/Иначе и блока Исключение, блоков #Вставка/#Удаление расширений, осмысленный collapsedText, соблюдение клиентского rangeLimit.
  • textDocument/documentLink — кликабельные ссылки в комментариях - См./See к упомянутому методу/объекту, к известному типу, открытие http(s)-ссылок.
  • textDocument/documentHighlight — подсветка вхождений идентификаторов с видом Read/Write, kind=Text для парных лексем.
  • textDocument/documentSymboldetail с сигнатурой параметров метода.
  • workspace/symbol — поиск символов по проекту полностью переработан:
    • инкрементальный индекс символов с ранжированием по релевантности; выдача больше не усекается «вслепую»;
    • префиксный поиск как по началу полного имени, так и по началу любого слова: запрос Док находит ПровестиДокумент (имена 1С пишутся в CamelCase, кириллица поддержана);
    • многословный camel-hump-поиск («тайтл-кейс-хоп») — запрос ПрДок находит ПровестиДокумент (Провести + Документ); совпадения «по порядку слов» ранжируются выше совпадений «вразброс»;
    • порядок релевантности: точное имя → префикс полного имени → многословное совпадение по порядку → префикс слова из середины имени → многословное совпадение не по порядку;
    • потоковая выдача результатов (partial results, $/progress): сначала быстрый набор из индекса, затем нижнеранжированный fuzzy-хвост (подстрока внутри слова и разбросанная подпоследовательность) досылается чанками; для клиентов без потоковой выдачи — флаг workspaceSymbol.syncFuzzySearch (по умолчанию выключен);
    • поиск выполняется сразу по всем зарегистрированным workspace folders (см. раздел «Поддержка нескольких рабочих пространств»);
    • заполнение containerName, отмена запроса через CancelChecker, безопасный откат на буквальный поиск при невалидном regex.
  • textDocument/codeAction — поддержка source.fixAll (автопочинка при сохранении) и учёт context.triggerKind.
  • textDocument/renameWorkspaceEdit на documentChanges и ChangeAnnotation, валидация нового имени, защита от переименования символов-модулей.
  • textDocument/formatting — поддержка insertFinalNewline и trimFinalNewlines.
  • textDocument/references — учёт context.includeDeclaration.
  • textDocument/definition — учёт клиентской возможности linkSupport (LocationLink).
  • textDocument/prepareCallHierarchy — раскрытие узла кода модуля в иерархии вызовов.
  • textDocument/hover — показ выводимого типа переменной/выражения, признака необязательности параметра («?»), состава возвращаемых структур и признака устаревания методов из исходников.

Поддержка нескольких рабочих пространств (multi-workspace)

Сервер работает сразу с несколькими каталогами-рабочими пространствами (workspace folders) — например, когда в одном окне редактора открыто несколько конфигураций, расширений или пакетов OneScript.

  • Изолированный контекст на каждое рабочее пространство. Каждая папка анализируется в собственном контексте: метаданные, символы и индексы одной папки не «протекают» в другую. К каждой папке применяется своя конфигурация — настройки и состав диагностик задаются для каждого рабочего пространства отдельно.
  • Управление составом рабочих пространств. Папки передаются серверу при инициализации, а их добавление и удаление во время сеанса обрабатывается запросом workspace/didChangeWorkspaceFolders - переоткрывать редактор не нужно.
  • Поиск по всем папкам. Запрос workspace/symbol выполняет поиск символов сразу по всем зарегистрированным workspace folders, а не только в активной.

Режим MCP (экспериментально)

Сервер умеет работать как сервер Model Context Protocol (MCP), открывая возможности анализа кода 1С (BSL) и OneScript AI-агентам. Инструменты MCP работают поверх того же движка, что и LSP-режим. Рабочие пространства задаются через MCP roots — прямой аналог workspace folders.

  • Режимы запуска: отдельный MCP-сервер (команда mcp с транспортом stdio/sse/streamable) либо совместно с LSP по флагу --mcp (рядом с stdio- или websocket-LSP, по Streamable HTTP).
  • Инструменты: analyze_file, document_symbols, find_references, call_hierarchy, hover, definition, type_info (свойства и методы типа по имени), type_at_position (выведенный тип выражения под курсором), global_member_info. Поддержан параметр fileType (BSL/OS).
  • Основан на Spring AI 2.0; API и поведение могут меняться.

Новые диагностики

На основе системы типов:

  • UnknownMember — обращение к неизвестному методу или свойству.
  • UnavailableMemberCall — использование метода/свойства, недоступного в целевой версии платформы.
  • AssignToReadOnlyProperty — присвоение значения свойству, доступному только для чтения.

Прочие:

  • CommonModuleVariables — объявление переменных (Перем) в общем модуле.
  • CompareWithBoolean — сравнение с булевой константой.
  • BadExceptionCategory — недопустимая категория исключений в ВызватьИсключение.
  • EventHandlerInvalidSignature - несоответствие сигнатуры обработчика платформенного события (с быстрыми исправлениями).
  • EventHandlerOutsideEventRegion — обработчик события вне стандартной области (с быстрыми исправлениями).

Механизм устаревания и недоступности платформенных членов переведён на data-driven модель: вместо жёстко зашитых диагностик DeprecatedMethods8310/DeprecatedMethods8317 устаревание и доступность членов теперь определяются по версии платформы из данных типов.

Прочие новые возможности

  • Исключение путей из анализа — параметр excludePaths в конфигурационном файле: список glob-паттернов (например, **/.git/**, build/, *.tmp), файлы и каталоги по которым не анализируются. Действует и в режиме LSP, и при пакетном анализе/форматировании из командной строки.
  • Фильтрация диагностик по авторству Git — параметр ignoredAuthors в секции diagnostics конфигурационного файла: список email-адресов авторов, строки кода которых (по данным git blame) исключаются из анализа. По умолчанию список пуст — фильтрация по авторству не выполняется. Удобно, чтобы не разбирать унаследованный или чужой код и сосредоточиться на замечаниях по своим изменениям.
  • Семантическая подсветка лямбд библиотеки lambdas внутри строковых литералов.
  • Виртуальные потоки для исполнителей LSP-запросов.
  • Поддержка нового объекта метаданных «Цвет палитры» (ЦветПалитры).
  • Проект переведён на JDK 21 как базовую версию Java;

Исправлены общие ошибки

  • Устранено ложное срабатывание ServerCallsInFormEvents на директиву &НаСервереБезКонтекста.
  • Устранено ложное срабатывание MissingCommonModuleMethod на цепочках вызовов через общий модуль.
  • Устранено ложное срабатывание MissingTemporaryFileDeletion при асинхронном удалении файлов.
  • Исправлена работа VirtualTableCallWithoutParameters на КритерийОтбора.
  • Устранены ложные срабатывания диагностик метаданных на объектах, заблокированных поддержкой.
  • Исправлены падения при построении графа потока управления (CFG): IllegalArgumentException на "висячей" директиве препроцессора перед циклом и сбой при директивах препроцессора, пересекающих границы ИначеЕсли.
  • Устранено ложное срабатывание QueryParseError на запросе с функцией СТРОКА.
  • Исправлен StringIndexOutOfBoundsException в QueryComputer для соседних строковых токенов после разрыва строки.
  • Исправлен NullPointerException в WebColorInformationSupplier при неизвестном имени цвета.
  • ColorProvider больше не показывает ложный чёрный образец цвета для нелитеральных аргументов конструктора Цвет.
  • Пропускаются объявления переменных без имени при построении структуры документа.

Обновления значимых зависимостей

Библиотеки 1c-syntax:

  • io.github.1c-syntax:bsl-parser: 0.32.0 → 0.37.1;
  • io.github.1c-syntax:mdclasses: 0.18.0 → 0.19.1;
  • io.github.1c-syntax:bsl-context: новая зависимость, 0.7.0;
  • io.github.1c-syntax:bsl-common-library: 0.10.0 → 0.11.0;
  • io.github.1c-syntax:utils: 0.7.0 → 0.7.2.

Внешние библиотеки:

  • org.eclipse.lsp4j (lsp4j core + websocket.jakarta): 0.24.0 → 1.0.0;
  • org.springframework.boot: 4.0.1 → 4.1.0;
  • org.springframework.ai:spring-ai-bom: новая зависимость, 2.0.0 (режим MCP);
  • LanguageTool: 6.7 → 6.8.

Сборка и инструменты:

Спасибо!

Full Changelog: v0.29.0...v1.0.0

Don't miss a new bsl-language-server release

NewReleases is sending notifications on new releases.