Skip to content

feat(types): bilingual ru/en + hover/inlay i18n + фиксы локализации#3926

Merged
nixel2007 merged 1 commit into
1c-syntax:feature/type-system-v2from
sfaqer:feature/type-system-v2-fixes
May 21, 2026
Merged

feat(types): bilingual ru/en + hover/inlay i18n + фиксы локализации#3926
nixel2007 merged 1 commit into
1c-syntax:feature/type-system-v2from
sfaqer:feature/type-system-v2-fixes

Conversation

@sfaqer
Copy link
Copy Markdown
Member

@sfaqer sfaqer commented May 21, 2026

Summary

  • Bilingual-абстракция BilingualString(ru, en) и переезд на неё всех дескрипторов платформы: MemberDescriptor, ParameterDescriptor, SignatureDescriptor, PlatformMetadata, TypeDecl. displayName(lang)/displayDescription(lang) для hover/inlay, matches(c) — bilingual lookup.
  • Локализация hover/inlay через resource bundles (ru/en) для всех меток: PlatformMemberHoverBuilder, ConstructorHoverBuilder, CollectionHoverHints, SyntheticSymbolMarkupContentBuilder, PlatformMethodCallInlayHintSupplier, HoverProvider.
  • GlobalScopeProvider.keywordDescriptions — bilingual; findKeywordDescription(name, Language) + fallback ru↔en.
  • BslContextPlatformTypesProvider упрощён: убран @EventListener + pickPrimary + language-параметр из internal-методов (локаль выбирается на render-time).
  • Зависимость bsl-context обновлена до jitpack hash 3e04130 (см. PR в bsl-context: feat: bilingual ru/en attachments + расширенный merge en-страниц).

Зависимый PR (bsl-context)

  • 1c-syntax/bsl-context@3e04130EnAttachments + BilingualMerger + en-маркеры в HtmlParser/ShlangParser + PageSource.escapeBarePlaceholders + greedy-match sigs по числу параметров.

Что фиксит на UI

  • Hover платформенных типов/методов/конструкторов теперь учитывает LS-локаль — нет «полу-русских» подсказок на EN. Параметры ТаблицаЗначений.Скопировать рендерятся по-английски при ru→en split-варианте (ru=2 sigs, en=3 sigs).
  • Hover BSL-keyword'ов локализован: Истина/True, Если/If, Функция/Function, Процедура/Procedure показывают описание из синтакс-помощника на выбранной локали (с fallback ru↔en, если описание есть только на одной стороне — например, Ждать/Await без RU HTML-страницы).
  • Inlay-подсказки параметров платформенных методов локализованы.

Test plan

  • BslContextPlatformTypesProviderTest, GlobalScopeProviderBslContextTest, ConfigurationTypesProviderTest, TypeRegistrySpecializationTest, HoverProvider* — зелёные.
  • Ручная проверка hover в IDE на EN-локали: Функция, Процедура, Если, Истина, Ждать, ТаблицаЗначений.Скопировать(...).
  • Ручная проверка hover в IDE на RU-локали: те же кейсы.

Известные ограничения (backlog)

  • PackBlock в shlang_*.hbk использует deflate с preset-dictionary, который стандартный Inflater/Deflate64CompressorInputStream не открывают. RU-описания у snippet-only keyword'ов (Ждать и т.п.) пока недоступны → fallback на EN через BilingualString.forLanguage.
  • Body-keywords Async/Val/Export/Return/EndFunction сейчас получают шаблонное «Часть конструкции …»/«Part of … construct»; родительская страница содержит полные описания, извлечение — отдельная задача.
  • Async/EndFunction встречаются на странице Функция И Процедура — сейчас публикуется один, по первому encounter. Merge — отдельная задача.
  • Конфигурационные типы (СправочникМенеджер.КонтрагентыCatalogManager.Контрагенты) пока не bilingual.

🤖 Generated with Claude Code

BilingualString record (ru, en) — единая bilingual-абстракция.
forLanguage(lang) — детерминированно отдаёт ru или en; если поле для
запрошенной локали пусто — fallback на непустое. matches(c) —
case-insensitive по обеим локалям.

Модель:
- MemberDescriptor/ParameterDescriptor — bilingualName + bilingualDescription;
  displayName(lang)/displayDescription(lang) для hover. matches(c) bilingual.
- SignatureDescriptor.bilingualDescription + displayDescription(lang).
- PlatformMetadata: returnValueDescription/notes как BilingualString,
  examples/seeAlso как List<BilingualString>; displayXxx(lang) accessors.
- TypeDecl: name как BilingualString (вместо отдельных aliases), description/
  forEachDescription/indexAccessDescription bilingual. qualifiedName()
  computed accessor.

Registry:
- TypeRegistry — displayNames/typeDescriptionsBilingual/
  forEachDescriptions/indexAccessDescriptions: Map<TypeRef, BilingualString>;
  geters с overload (ref, Language).
- BslContextPlatformTypesProvider: убран @eventlistener на configuration-change
  и pickPrimary — bilingual читается по запросу через displayXxx(lang).
  Конструктор сведён к (BslContextHolder). enLookupOf(provider) →
  Function<Object, EnAttachments>. zipBilingual(ru, en) для парных списков.
- GlobalScopeProvider: keywordDescriptions: Map<String, BilingualString>;
  findKeywordDescription(name, Language) с локализацией.

Hover-сторона:
- HoverProvider.tryKeywordHover — передаёт configuration.getLanguage()
  в findKeywordDescription; label («ключевое слово»/keyword) через resource
  bundle.
- PlatformMemberHoverBuilder, ConstructorHoverBuilder, CollectionHoverHints,
  SyntheticSymbolMarkupContentBuilder, PlatformMethodCallInlayHintSupplier —
  через displayName(lang)/displayDescription(lang) + resource bundles ru/en
  для всех меток («Доступно с:», «Параметры:», «Новый»/«New», role-имена и
  т.д.).

JSON-fallback:
- builtin-platform-types.json — поддерживает опц. nameRu/nameEn
  (read'er реализован), пилот: Массив.Добавить(Значение).

build.gradle.kts: bsl-context подключён по jitpack hash 3e04130.

Тесты: legacy locale-dependent (memberNamesPickedByConfiguredLanguageRu/En,
cachedRebuildsOnConfigurationChangeEvent) заменены на bilingual-determined
(memberNameIsBilingualIndependentOfConfig). Регрессии:
jsonNameRuAndNameEnPropagateToMemberDescriptor (JSON-fallback bilingual),
keywordDescriptionPropagatesToFindKeywordDescription, emptyRefOnManagerReturnsSpecializedRef.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 21, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: fbc3a3a9-2660-46d9-a464-e3719f986be7

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

if (!supportsForEach && !supportsIndex) {
return;
}
var lang = configuration.getLanguage();
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Он тут вроде как и не нужен больше

if (items == null || items.isEmpty()) {
return;
}
var resolved = new java.util.ArrayList<String>(items.size());
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Опус, импорты бдд!

@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
64.2% Coverage on New Code (required ≥ 80%)
7.0% Duplication on New Code (required ≤ 3%)
C Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@nixel2007 nixel2007 merged commit 7db5c9b into 1c-syntax:feature/type-system-v2 May 21, 2026
19 of 20 checks passed
nixel2007 pushed a commit that referenced this pull request May 22, 2026
Review-замечания nixel2007 на PR #3926:
- CollectionHoverHints: убрано избыточное поле configuration:
  LanguageServerConfiguration — локаль через Resources.getLanguage()
  (новый accessor; Resources уже инжектил LSC внутри).
- PlatformMemberHoverBuilder: импорт ArrayList, заменён FQN java.util.ArrayList.
- GlobalScopeProvider, TypeRegistry: добавлены импорты Function/
  PlatformLanguageKeyword/LinkedHashSet, заменены FQN.

Body-keyword'ы (Async/Знач/Возврат/Экспорт/КонецФункции/КонецПроцедуры)
встречаются на нескольких parent-страницах (def_Func/def_Proc/def_Var)
с разными описаниями. Чтобы hover показывал правильное:
- KeywordDescription record: (primary, byParent: Map<parentRu, BilingualString>).
- findKeywordDescription(name, language, parentContext) — overload.
  forContext(parent) сначала ищет точный match в byParent, иначе
  возвращает любой непустой byParent (вместо мусорной primary
  «Часть конструкции X»), и только если byParent пуст — primary.
- HoverProvider.findKeywordParentContext поднимается по AST от keyword-
  токена, ищет FuncDeclarationContext/FunctionContext → «Функция»,
  ProcDeclarationContext/ProcedureContext → «Процедура», Module|Sub
  VarDeclarationContext → «Перем».

Онлайн-переключение языка:
- Resources теперь читает локаль из GlobalLanguageServerConfiguration
  (где живёт language) вместо workspace-scoped LanguageServerConfiguration.
  Workspace LSC дублирует поле language, которое заполняется только
  при init из конфиг-файла; runtime-перезагрузка глобального файла
  обновляет только Global LSC, и потребители видели stale-значение —
  hover/inlay/диагностики не реагировали на смену языка без перезапуска
  workspace.
- HoverProvider, PlatformMemberHoverBuilder, ConstructorHoverBuilder,
  CollectionHoverHints, PlatformMethodCallInlayHintSupplier теперь
  читают локаль через resources.getLanguage().
- ConfigurationFileSystemWatcher.propagateGlobalChangeToWorkspaces:
  при изменении глобального конфиг-файла WatchService теперь не только
  обновляет Global LSC, но и прокидывает изменение во все workspace
  LSC, у которых configurationFile указывает на тот же глобальный файл.
  File-paths нормализуются через getAbsoluteFile() — relative '.bsl-
  language-server.json' и absolute path физически тот же файл, но
  File.equals() сравнивает path как строку и не видит их равенство.
  Без этого workspace-level настройки (inlayHintOptions,
  diagnosticsOptions и т.д.) оставались замороженными с момента init,
  даже если global LSC уже обновился.

Объединение флагов inlay-hint методов:
- AbstractMethodCallInlayHintSupplier — базовый класс для обоих
  методных сапплаеров (SourceDefinedMethodCall, PlatformMethodCall).
  Оба рендерят одни и те же подсказки (имя параметра рядом с
  передаваемым значением), отличаясь лишь источником метаданных —
  пользователь не должен управлять «одним и тем же» поведением двумя
  флагами для разных типов методов. Поэтому
  showParametersWithTheSameName / showDefaultValues читаются из
  единого ключа inlayHint.parameters.methodCall (с fallback на legacy
  sourceDefinedMethodCall для совместимости с существующими конфигами).
- schema.json: добавлен ключ methodCall с обоими флагами;
  sourceDefinedMethodCall помечен deprecated.

build.gradle.kts: bsl-context обновлён до 0.3.0
(в Maven Central, релиз https://github.com/1c-syntax/bsl-context/releases/tag/v0.3.0)
— robust readZip даёт ru-описание оператора Ждать, per-parent описания
body-keyword'ов делают возможным контекстно-зависимый hover.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants