feat(types): bilingual ru/en + hover/inlay i18n + фиксы локализации#3926
Conversation
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.
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
| if (!supportsForEach && !supportsIndex) { | ||
| return; | ||
| } | ||
| var lang = configuration.getLanguage(); |
There was a problem hiding this comment.
Он тут вроде как и не нужен больше
| if (items == null || items.isEmpty()) { | ||
| return; | ||
| } | ||
| var resolved = new java.util.ArrayList<String>(items.size()); |
|
7db5c9b
into
1c-syntax:feature/type-system-v2
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.




Summary
BilingualString(ru, en)и переезд на неё всех дескрипторов платформы:MemberDescriptor,ParameterDescriptor,SignatureDescriptor,PlatformMetadata,TypeDecl.displayName(lang)/displayDescription(lang)для hover/inlay,matches(c)— bilingual lookup.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 hash3e04130(см. PR в bsl-context:feat: bilingual ru/en attachments + расширенный merge en-страниц).Зависимый PR (bsl-context)
1c-syntax/bsl-context@3e04130—EnAttachments+BilingualMerger+ en-маркеры вHtmlParser/ShlangParser+PageSource.escapeBarePlaceholders+ greedy-match sigs по числу параметров.Что фиксит на UI
ТаблицаЗначений.Скопироватьрендерятся по-английски при ru→en split-варианте (ru=2 sigs, en=3 sigs).Истина/True,Если/If,Функция/Function,Процедура/Procedureпоказывают описание из синтакс-помощника на выбранной локали (с fallback ru↔en, если описание есть только на одной стороне — например,Ждать/Awaitбез RU HTML-страницы).Test plan
BslContextPlatformTypesProviderTest,GlobalScopeProviderBslContextTest,ConfigurationTypesProviderTest,TypeRegistrySpecializationTest,HoverProvider*— зелёные.Функция,Процедура,Если,Истина,Ждать,ТаблицаЗначений.Скопировать(...).Известные ограничения (backlog)
shlang_*.hbkиспользует deflate с preset-dictionary, который стандартныйInflater/Deflate64CompressorInputStreamне открывают. RU-описания у snippet-only keyword'ов (Ждатьи т.п.) пока недоступны → fallback на EN черезBilingualString.forLanguage.Async/Val/Export/Return/EndFunctionсейчас получают шаблонное «Часть конструкции …»/«Part of … construct»; родительская страница содержит полные описания, извлечение — отдельная задача.СправочникМенеджер.Контрагенты↔CatalogManager.Контрагенты) пока не bilingual.🤖 Generated with Claude Code