-
Notifications
You must be signed in to change notification settings - Fork 24
Чтение описание типов реквизитов и метаданных #519
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…ствующие колонки + добавлен список ссылок на реквизиты документов - доработан конвертор типов - корректировка тестов
- рефакторинг, фикс тестов
WalkthroughДобавлены модели и конвертеры для описаний типов значений (ValueType, ValueTypeDescription, Qualifiers); введён интерфейс Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor XML as XML Reader
participant Unm as Unmarshaller
participant VTD as ValueTypeDescriptionConverter
participant VTC as ValueTypeConverter
participant VQC as ValueTypeQualifierConverter
participant MDO as MDO (ValueTypeOwner)
XML->>Unm: node "valueType"/TypeSet
Unm->>VTD: unmarshal → ValueTypeDescription
VTD->>VTC: resolve each type string
VTC-->>VTD: ValueType (builtin/metadata/unknown)
VTD->>VQC: parse qualifiers (if present)
VQC-->>VTD: Qualifier
VTD-->>Unm: ValueTypeDescription(types, composite, qualifiers)
Unm->>MDO: assign to field "type"
MDO-->>Caller: getValueType()
sequenceDiagram
autonumber
actor Designer as Designer XML
participant FAC as FormAttributeConverter
participant Ctx as FormElementReaderContext
participant Unm as Unmarshaller
participant FA as FormAttribute
Designer->>FAC: form attribute node
FAC->>Ctx: collect id/name
FAC->>Unm: unmarshal content (including valueType)
Unm-->>Ctx: filled context
Ctx-->>FAC: build() -> FormAttribute
FAC-->>Designer: return FormAttribute
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing touches
🧪 Generate 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. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (13)
build.gradle.kts (1)
47-47
: Рассмотрите использование более стабильного репозитория для производственного кода.Добавление репозитория для снапшот-версий может привести к нестабильности в production-среде. Снапшоты по определению являются нестабильными версиями.
Рекомендую:
- Использовать релизные версии в основной ветке
- Ограничить использование снапшотов только для feature-веток или dev-окружения
- Добавить комментарий о временном характере использования снапшота
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeQualifierConverter.java (3)
73-91
: Рассмотрите возможность вынесения парсинга в отдельные методы.Текущая логика парсинга содержит много условий в одном цикле, что усложняет читаемость и тестирование.
Предлагаю разделить парсинг на отдельные методы:
while (reader.hasMoreChildren()) { reader.moveDown(); - if (LENGTH_NODE_NAME.equalsIgnoreCase(reader.getNodeName())) { - length = Integer.parseInt(reader.getValue()); - } else if (ALLOWED_LENGTH_NODE_NAME.equalsIgnoreCase(reader.getNodeName())) { - allowedLength = AllowedLength.valueOf(reader.getValue().toUpperCase(Locale.ROOT)); - } else if (DATE_FRACTIONS_NODE_NAME.equalsIgnoreCase(reader.getNodeName())) { - dateFractions = DateFractions.valueOf(reader.getValue().toUpperCase(Locale.ROOT)); - } else if (SCALE_NODE_NAME.equalsIgnoreCase(reader.getNodeName()) - || FRACTION_DIGITS_NODE_NAME.equalsIgnoreCase(reader.getNodeName())) { - scale = Integer.parseInt(reader.getValue()); - } else if (PRECISION_NODE_NAME.equalsIgnoreCase(reader.getNodeName()) - || DIGITS_NODE_NAME.equalsIgnoreCase(reader.getNodeName())) { - precision = Integer.parseInt(reader.getValue()); - } else if (NON_NEGATIVE_NODE_NAME.equalsIgnoreCase(reader.getNodeName())) { - nonNegative = Boolean.parseBoolean(reader.getValue()); - } else if (ALLOWED_SIGN_NODE_NAME.equalsIgnoreCase(reader.getNodeName())) { - nonNegative = NONNEGATIVE_VALUE.equalsIgnoreCase(reader.getValue()); - } + parseNode(reader, /* передать контекст с переменными */); reader.moveUp(); }
74-74
: Добавьте обработку ошибок при парсинге чисел.Методы
Integer.parseInt()
могут выброситьNumberFormatException
при некорректном вводе.-length = Integer.parseInt(reader.getValue()); +try { + length = Integer.parseInt(reader.getValue()); +} catch (NumberFormatException e) { + LOGGER.warn("Invalid length value: {}", reader.getValue()); + length = 0; +}То же самое применимо для
scale
(строка 81) иprecision
(строка 84).Also applies to: 81-81, 84-84
76-76
: Добавьте обработку ошибок при парсинге enum-значений.Метод
valueOf()
может выброситьIllegalArgumentException
при некорректном значении.-allowedLength = AllowedLength.valueOf(reader.getValue().toUpperCase(Locale.ROOT)); +try { + allowedLength = AllowedLength.valueOf(reader.getValue().toUpperCase(Locale.ROOT)); +} catch (IllegalArgumentException e) { + LOGGER.warn("Unknown AllowedLength value: {}", reader.getValue()); + allowedLength = AllowedLength.VARIABLE; +}Аналогично для
DateFractions
(строка 78).Also applies to: 78-78
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/FormAttributeConverter.java (2)
42-45
: TODO: добавлена временная заглушка для ConditionalAppearanceКомментарий указывает на необходимость доработки обработки условного оформления. Рекомендуется создать задачу для отслеживания этой доработки.
Хотите, чтобы я создал issue для отслеживания необходимости реализации чтения ConditionalAppearance?
48-53
: Потенциальная потеря данных при ошибке парсингаПри ошибке парсинга идентификатора возвращается
null
, что может привести к потере данных реквизита формы. Стоит рассмотреть использование значения по умолчанию или более явной обработки ошибки.Рассмотрите возможность продолжения обработки с дефолтным значением id вместо возврата null:
try { readerContext.setValue("id", Integer.parseInt(reader.getAttribute("id"))); } catch (NumberFormatException e) { LOGGER.debug("Unknown type {} in file {}", reader.getNodeName(), ExtendXStream.getCurrentPath(reader).toString()); - return null; + LOGGER.warn("Failed to parse id for FormAttribute {}, using default value -1", reader.getAttribute("name")); + readerContext.setValue("id", -1); }src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java (2)
56-62
: Проверка композитности может быть неполнойЛогика определения композитного типа проверяется только при
!composite
. Если composite уже установлен вtrue
, последующие проверки пропускаются. Это может привести к некорректному определению для смешанных типов.Рассмотрите упрощение логики для большей ясности:
- if (!composite) { - if (result instanceof MetadataValueType metadataValueType) { - composite = metadataValueType.isComposite(); - } else if (result == V8ValueType.ANY_REF) { - composite = true; - } + if (result instanceof MetadataValueType metadataValueType && metadataValueType.isComposite()) { + composite = true; + } else if (result == V8ValueType.ANY_REF) { + composite = true; }
68-68
: Использование уровня логирования INFO для неизвестных полейУровень INFO может засорить логи в продуктивной среде. Рекомендуется использовать DEBUG для подобных информационных сообщений.
- LOGGER.info("Unknown type description field {}", nodeName); + LOGGER.debug("Unknown type description field {}", nodeName);src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttributeValueType.java (1)
31-31
: Сделать класс finalСемантически набор закрыт, наследование не требуется. Это упростит рассуждения о типе и предотвратит расширение.
Применить:
-public class FormAttributeValueType implements ValueType { +public final class FormAttributeValueType implements ValueType {src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java (3)
90-92
: Уточнить сигнатуру и проверку совместимости в canConvertИспользуйте дженерики и isAssignableFrom для устойчивости к подтипам.
Применить:
- public boolean canConvert(Class type) { - return type == ValueType.class; - } + public boolean canConvert(Class<?> type) { + return ValueType.class.isAssignableFrom(type); + }
100-114
: Единообразно нормализовать ключи в кешеДля читаемости приводите ВСЕ литеральные ключи к lowerCase одинаково.
Применить:
- types.put("xs:decimal", PrimitiveValueType.NUMBER); - types.put("xs:dateTime".toLowerCase(Locale.ROOT), PrimitiveValueType.DATE); + types.put("xs:decimal".toLowerCase(Locale.ROOT), PrimitiveValueType.NUMBER); + types.put("xs:dateTime".toLowerCase(Locale.ROOT), PrimitiveValueType.DATE); @@ - types.put("xs:base64Binary".toLowerCase(Locale.ROOT), V8ValueType.VALUE_STORAGE); - types.put("cfg:AnyIBRef".toLowerCase(Locale.ROOT), V8ValueType.ANY_REF); + types.put("xs:base64Binary".toLowerCase(Locale.ROOT), V8ValueType.VALUE_STORAGE); + types.put("cfg:AnyIBRef".toLowerCase(Locale.ROOT), V8ValueType.ANY_REF); @@ - types.put("v8:ValueListType".toLowerCase(Locale.ROOT), FormAttributeValueType.VALUE_LIST); - types.put("d5p1:FlowchartContextType".toLowerCase(Locale.ROOT), FormAttributeValueType.GRAPHICAL_SCHEMA); + types.put("v8:ValueListType".toLowerCase(Locale.ROOT), FormAttributeValueType.VALUE_LIST); + types.put("d5p1:FlowchartContextType".toLowerCase(Locale.ROOT), FormAttributeValueType.GRAPHICAL_SCHEMA);
62-73
: Повторное кэширование алиасов: всё ок, но добавьте тесты на префиксыЛогика с отсечением namespace корректна. Рекомендую тесты для пар:
xs:string
,xs:dateTime
,v8:ValueListType
.Нужны кейсы, подтверждающие кэширование оригинальной строки и эквивалентность без префикса.
src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java (1)
228-236
: Микро‑нит: явное приведение типов в computeAllProvidedTypesVariantsПриведение
(MetadataValueType) valueType
безопасно, но можно подсказать компилятору через дженерик‑сигнатуруbuiltinTypes(): List<MetadataValueType>
и возвращатьList<? extends ValueType>
с ковариантностью на вызывающей стороне. Не блокер.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (72)
src/test/resources/fixtures/external/ТестоваяВнешняяОбработка.json
is excluded by!**/*.json
src/test/resources/fixtures/external/ТестоваяВнешняяОбработка_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/external/ТестовыйВнешнийОтчет.json
is excluded by!**/*.json
src/test/resources/fixtures/external/ТестовыйВнешнийОтчет_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/AccountingRegisters.РегистрБухгалтерии1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/AccumulationRegisters.РегистрНакопления1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/CalculationRegisters.РегистрРасчета1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/CalculationRegisters.РегистрРасчета1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Catalogs.Справочник1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Catalogs.Справочник1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/ChartsOfAccounts.ПланСчетов1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/ChartsOfAccounts.ПланСчетов1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/ChartsOfCharacteristicTypes.ПланВидовХарактеристик1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/ChartsOfCharacteristicTypes.ПланВидовХарактеристик1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/CommonAttributes.ОбщийРеквизит1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Configuration.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Configuration_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Constants.Константа1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Constants.Константа1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/DataProcessors.Обработка1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/DataProcessors.Обработка1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/DefinedTypes.ОпределяемыйТип1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/DocumentJournals.ЖурналДокументов1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/DocumentJournals.ЖурналДокументов1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Documents.Документ1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Documents.Документ1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/EventSubscriptions.ПодпискаНаСобытие1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/ExternalDataSources.ТекущаяСУБД.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/ExternalDataSources.ТекущаяСУБД_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/InformationRegisters.РегистрСведений1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/InformationRegisters.РегистрСведений1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Reports.Отчет1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Reports.Отчет1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Sequences.Последовательность1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Sequences.Последовательность1_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/SessionParameters.ПараметрСеанса1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses/Tasks.Задача1.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses_3_18/Configuration.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses_3_18/Configuration_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses_3_24/Configuration_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses_5_1/Configuration.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses_ext/Configuration.json
is excluded by!**/*.json
src/test/resources/fixtures/mdclasses_ext/Configuration_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/BusinessProcesses.Задание.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/BusinessProcesses.Задание_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/Catalogs.Заметки.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/Catalogs.Заметки_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/ChartsOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/ChartsOfCharacteristicTypes.ДополнительныеРеквизитыИСведения_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/CommonAttributes.ОбластьДанныхВспомогательныеДанные.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/CommonForms.Вопрос.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/CommonForms.Вопрос_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/Constants.ЗаголовокСистемы.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/DataProcessors.ЗагрузкаКурсовВалют.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/DataProcessors.ЗагрузкаКурсовВалют_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/DefinedTypes.ВладелецФайлов.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/DocumentJournals.Взаимодействия.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/DocumentJournals.Взаимодействия_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/Documents.Анкета.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/Documents.Анкета_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/EventSubscriptions.ВариантыОтчетовПередУдалениемИдентификатораОбъектаМетаданных.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/ExchangePlans.ОбновлениеИнформационнойБазы.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/ExchangePlans.ОбновлениеИнформационнойБазы_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/FilterCriteria.ФайлыВТоме.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/FilterCriteria.ФайлыВТоме_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/InformationRegisters.ЭлектронныеПодписи.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/InformationRegisters.ЭлектронныеПодписи_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/SessionParameters.ТекущийПользователь.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/SettingsStorages.ХранилищеВариантовОтчетов.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/SettingsStorages.ХранилищеВариантовОтчетов_edt.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/Tasks.ЗадачаИсполнителя.json
is excluded by!**/*.json
src/test/resources/fixtures/ssl_3_1/Tasks.ЗадачаИсполнителя_edt.json
is excluded by!**/*.json
📒 Files selected for processing (38)
build.gradle.kts
(2 hunks)src/main/java/com/github/_1c_syntax/bsl/mdclasses/Configuration.java
(2 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/AccumulationRegister.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/Attribute.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/BusinessProcess.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/CalculationRegister.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/Catalog.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/CommonAttribute.java
(6 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/Constant.java
(4 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/DefinedType.java
(2 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/Document.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/EventSubscription.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/ExchangePlan.java
(2 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/ExternalDataSource.java
(2 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/InformationRegister.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/Register.java
(0 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/SessionParameter.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/Task.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/ValueTypeOwner.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/children/AccountingFlag.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/children/Dimension.java
(4 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/children/DocumentJournalColumn.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/children/ExtDimensionAccountingFlag.java
(4 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/children/ExternalDataSourceTable.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/children/ExternalDataSourceTableField.java
(3 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/children/ObjectAttribute.java
(5 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/children/Resource.java
(5 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/children/TaskAddressingAttribute.java
(5 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttribute.java
(2 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttributeValueType.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeQualifierConverter.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/FormAttributeConverter.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/FormElementConverter.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/ManagedFormDataConverter.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java
(3 hunks)
💤 Files with no reviewable changes (1)
- src/main/java/com/github/_1c_syntax/bsl/mdo/Register.java
🧰 Additional context used
🧬 Code graph analysis (7)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeQualifierConverter.java (1)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java (1)
Slf4j
(41-79)
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/FormAttributeConverter.java (4)
src/main/java/com/github/_1c_syntax/bsl/reader/designer/DesignerReader.java (1)
Slf4j
(79-267)src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/MetaDataObjectConverter.java (1)
Slf4j
(35-61)src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/FormElementConverter.java (1)
DesignerConverter
(36-58)src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/ManagedFormDataConverter.java (1)
DesignerConverter
(33-47)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java (2)
src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java (1)
MetadataValueType
(39-272)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeQualifierConverter.java (1)
Slf4j
(42-111)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java (2)
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttributeValueType.java (1)
FormAttributeValueType
(31-102)src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java (1)
MetadataValueType
(39-272)
src/main/java/com/github/_1c_syntax/bsl/mdo/DefinedType.java (3)
src/main/java/com/github/_1c_syntax/bsl/mdo/CommonAttribute.java (2)
Value
(45-201)Value
(185-200)src/main/java/com/github/_1c_syntax/bsl/mdo/Constant.java (1)
Value
(41-125)src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttribute.java (1)
Value
(37-72)
src/main/java/com/github/_1c_syntax/bsl/mdo/children/DocumentJournalColumn.java (3)
src/main/java/com/github/_1c_syntax/bsl/mdo/CommonAttribute.java (2)
Value
(45-201)Value
(185-200)src/main/java/com/github/_1c_syntax/bsl/mdo/children/AccountingFlag.java (1)
Value
(44-90)src/main/java/com/github/_1c_syntax/bsl/mdo/children/ObjectAttribute.java (1)
Value
(44-134)
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttribute.java (2)
src/main/java/com/github/_1c_syntax/bsl/mdo/DefinedType.java (1)
Value
(37-78)src/main/java/com/github/_1c_syntax/bsl/mdo/CommonAttribute.java (2)
Value
(45-201)Value
(185-200)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
- GitHub Check: build (23, macOS-latest)
- GitHub Check: build (23, ubuntu-latest)
- GitHub Check: build (23, windows-latest)
- GitHub Check: build (21, windows-latest)
- GitHub Check: build (17, macOS-latest)
- GitHub Check: build (21, macOS-latest)
- GitHub Check: build (17, ubuntu-latest)
- GitHub Check: build (21, ubuntu-latest)
- GitHub Check: build (17, windows-latest)
- GitHub Check: QA
🔇 Additional comments (81)
src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/ManagedFormDataConverter.java (1)
1-22
: Обновлен заголовок файла с изменением года в копирайте.Изменения касаются только форматирования заголовка — обновлен год в копирайте с "2019 - 2024" на "2019 - 2025". Функциональность не изменена.
src/main/java/com/github/_1c_syntax/bsl/mdo/CalculationRegister.java (3)
1-22
: Обновлен заголовок файла с изменением года в копирайте.Стандартное обновление года в копирайте — хорошая практика для поддержания актуальности лицензионной информации.
53-53
: Исправлена опечатка в названии метода для инициализации POSSIBLE_RIGHTS.Теперь используется корректное название метода
computePossibleRights()
вместоcomputePossibleRighs()
.
144-151
: Исправлена опечатка в названии приватного статического метода.Переименование
computePossibleRighs()
вcomputePossibleRights()
устраняет орфографическую ошибку. Логика и возвращаемые права доступа остаются неизменными.src/main/java/com/github/_1c_syntax/bsl/mdo/ExchangePlan.java (2)
51-51
: Исправлена опечатка в названии метода для инициализации POSSIBLE_RIGHTS.Теперь используется корректное название метода
computePossibleRights()
вместоcomputePossibleRighs()
.
203-227
: Исправлена опечатка в названии приватного статического метода.Переименование
computePossibleRighs()
вcomputePossibleRights()
устраняет орфографическую ошибку. Логика и перечень прав доступа остаются неизменными.src/main/java/com/github/_1c_syntax/bsl/mdo/Catalog.java (3)
1-22
: Обновлен заголовок файла с изменением года в копирайте.Стандартное обновление года в копирайте для поддержания актуальности лицензионной информации.
50-50
: Исправлена опечатка в названии метода для инициализации POSSIBLE_RIGHTS.Теперь используется корректное название метода
computePossibleRights()
вместоcomputePossibleRighs()
.
159-187
: Исправлена опечатка в названии приватного статического метода.Переименование
computePossibleRighs()
вcomputePossibleRights()
устраняет орфографическую ошибку. Возвращаемый набор прав доступа для каталогов остается полным и корректным.src/main/java/com/github/_1c_syntax/bsl/mdo/AccumulationRegister.java (3)
1-22
: Обновлен заголовок файла с изменением года в копирайте.Изменения касаются только форматирования заголовка — обновлен год в копирайте для поддержания актуальности.
52-52
: Исправлена опечатка в названии метода для инициализации POSSIBLE_RIGHTS.Теперь используется корректное название метода
computePossibleRights()
вместоcomputePossibleRighs()
.
140-148
: Исправлена опечатка в названии приватного статического метода.Переименование
computePossibleRighs()
вcomputePossibleRights()
устраняет орфографическую ошибку. Набор прав доступа для регистров накопления (READ, UPDATE, VIEW, EDIT, TOTALS_CONTROL) остается корректным.src/main/java/com/github/_1c_syntax/bsl/mdo/Task.java (3)
1-22
: Обновлен заголовок файла с изменением года в копирайте.Стандартное обновление года в копирайте с "2019 - 2024" на "2019 - 2025".
51-51
: Исправлена опечатка в названии метода для инициализации POSSIBLE_RIGHTS.Теперь используется корректное название метода
computePossibleRights()
вместоcomputePossibleRighs()
.
165-192
: Исправлена опечатка в названии приватного статического метода.Переименование
computePossibleRighs()
вcomputePossibleRights()
устраняет орфографическую ошибку. Полный набор прав доступа для задач остается неизменным.src/main/java/com/github/_1c_syntax/bsl/mdo/BusinessProcess.java (3)
1-22
: Обновлен заголовок файла с изменением года в копирайте.Стандартное обновление года в копирайте для поддержания актуальности лицензионной информации.
50-50
: Исправлена опечатка в названии метода для инициализации POSSIBLE_RIGHTS.Теперь используется корректное название метода
computePossibleRights()
вместоcomputePossibleRighs()
.
164-191
: Исправлена опечатка в названии приватного статического метода.Переименование
computePossibleRighs()
вcomputePossibleRights()
устраняет орфографическую ошибку. Набор прав доступа для бизнес-процессов включает все необходимые права, включая специфичные для бизнес-процессов (START, INTERACTIVE_START).src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/FormElementConverter.java (1)
56-56
: Упрощена логика проверки типа в canConvert.Удалена поддержка
FormAttribute
из конвертера элементов формы. Теперь конвертер обрабатывает толькоFormItem
. Это правильное разделение ответственности, посколькуFormAttribute
теперь обрабатывается специализированным конвертером.src/main/java/com/github/_1c_syntax/bsl/mdo/children/ExternalDataSourceTable.java (1)
59-59
: Исправление опечатки в названии метода.Хорошо, что исправлена опечатка в названии метода с
computePossibleRighs
наcomputePossibleRights
.Also applies to: 163-163
src/main/java/com/github/_1c_syntax/bsl/mdo/Attribute.java (2)
28-29
: Грамматическая корректировка в документации.Исправление грамматической ошибки в Javadoc улучшает качество документации.
31-31
: Добавление интерфейса ValueTypeOwner к Attribute.Расширение интерфейса
Attribute
интерфейсомValueTypeOwner
логично, так как атрибуты должны иметь описание типа значения.src/main/java/com/github/_1c_syntax/bsl/mdo/Document.java (1)
50-50
: Исправление опечатки в названии метода.Корректировка названия метода с
computePossibleRighs
наcomputePossibleRights
устраняет опечатку и улучшает читаемость кода.Also applies to: 164-164
build.gradle.kts (1)
61-65
: Проверьте совместимость bsl-common-library (SNAPSHOT) и исключение транзитивной зависимостиsupportconf:0.14.3 в POM содержит зависимость io.github.1c-syntax:bsl-common-library:0.8.1 (compile), а в build.gradle.kts явно подключается io.github.1c-syntax:bsl-common-library:0.9.0.9-SNAPSHOT с исключением транзитивной зависимости — это может привести к API/бинарной несовместимости.
- Действия: либо согласовать версии (использовать стабильную 0.8.1), либо обновить supportconf на версию, совместимую с 0.9.x (если доступна), либо сохранить исключение, добавив в build.gradle.kts комментарий с обоснованием и покрыв изменения CI/регрессионными тестами.
- Избегать SNAPSHOT в релизных сборках, если нет строгой необходимости.
Файл: build.gradle.kts, строки 61–65.
src/main/java/com/github/_1c_syntax/bsl/mdo/ExternalDataSource.java (1)
48-48
: Исправлена орфографическая ошибка в названии метода.Переименование
computePossibleRighs()
→computePossibleRights()
исправляет очевидную опечатку в названии и делает код более читаемым.Also applies to: 110-110
src/main/java/com/github/_1c_syntax/bsl/mdo/ValueTypeOwner.java (1)
1-34
: LGTM! Хорошо спроектированный интерфейс.Интерфейс
ValueTypeOwner
предоставляет четкий контракт для классов, которые владеют описанием типа значения. Javadoc комментарии на русском языке соответствуют стилю проекта.src/main/java/com/github/_1c_syntax/bsl/mdclasses/Configuration.java (1)
116-116
: Исправлена орфографическая ошибка в названии метода.Переименование
computePossibleRighs()
→computePossibleRights()
исправляет опечатку. Это изменение является частью системной корректировки по всей кодовой базе.Also applies to: 409-409
src/main/java/com/github/_1c_syntax/bsl/mdo/children/Dimension.java (1)
75-78
: Корректная реализация интерфейса ValueTypeOwner.Добавлен тип значения с подавлением Lombok-геттера и корректной реализацией метода
getValueType()
. Инициализация значением по умолчаниюValueTypeDescription.EMPTY
следует паттерну, используемому в проекте.Also applies to: 106-109
src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java (1)
57-58
: Добавлена поддержка десериализации valueType.Реализовано корректное преобразование XML-элемента
valueType
в полеtype
типаValueTypeDescription
. Логика соответствует существующему паттерну обработки полей в методеreadNode
.Also applies to: 97-100
src/main/java/com/github/_1c_syntax/bsl/mdo/children/Resource.java (2)
51-51
: Обновлен комментарий для большей точности.Изменение с "Для MDChild" на "Для Attribute" лучше отражает назначение секции, поскольку класс реализует интерфейс
Attribute
.
75-77
: Корректная реализация ValueTypeOwner.Добавление поля
type
и методаgetValueType()
соответствует паттерну, используемому в других классах проекта. Подавление Lombok-геттера через@Getter(AccessLevel.NONE)
позволяет использовать кастомную реализацию.Also applies to: 90-93
src/main/java/com/github/_1c_syntax/bsl/mdo/InformationRegister.java (1)
52-52
: Исправлена орфографическая ошибка в названии метода.Переименование
computePossibleRighs()
→computePossibleRights()
является частью системной корректировки по всей кодовой базе для исправления опечатки.Also applies to: 141-141
src/main/java/com/github/_1c_syntax/bsl/mdo/children/ObjectAttribute.java (2)
53-53
: Обновлен комментарий для большей точности.Изменение с "Для MDChild" на "Для Attribute" точнее отражает назначение секции в контексте реализации интерфейса
Attribute
.
77-79
: Корректная реализация поддержки типа значения.Добавление поля
type
с подавлением Lombok-геттера и реализация методаgetValueType()
соответствуют контракту интерфейсаValueTypeOwner
. ИнициализацияValueTypeDescription.EMPTY
следует установленному в проекте паттерну.Also applies to: 130-133
src/main/java/com/github/_1c_syntax/bsl/mdo/children/TaskAddressingAttribute.java (4)
33-33
: Импорты согласованы с добавленной функциональностью.Добавлены необходимые импорты для
ValueTypeDescription
иlombok.Getter
в соответствии с реализацией интерфейсаValueTypeOwner
.Also applies to: 38-38
51-51
: Улучшено описание блока комментария.Обновлено описание с "Для MDChild" на "Для Attribute", что точнее отражает назначение этого класса.
75-77
: Правильная реализация паттерна ValueTypeOwner.Поле
type
правильно объявлено с аннотацией@Getter(AccessLevel.NONE)
для сокрытия автоматически генерируемого геттера, что соответствует паттерну, используемому в других классах проекта.
140-143
: Корректная реализация интерфейса ValueTypeOwner.Метод
getValueType()
правильно переопределен и возвращает полеtype
, следуя единообразному паттерну, принятому в рамках данного PR.src/main/java/com/github/_1c_syntax/bsl/mdo/EventSubscription.java (4)
29-29
: Импорты согласованы с реализацией ValueTypeOwner.Добавлены необходимые импорты для новой функциональности работы с типами значений.
Also applies to: 34-34
42-42
: Правильно добавлен интерфейс ValueTypeOwner.Класс теперь реализует
ValueTypeOwner
в дополнение кMDObject
, что обеспечивает единообразие с другими классами в проекте.
67-69
: Корректная реализация поля source для ValueTypeOwner.Поле
source
с типомValueTypeDescription
правильно объявлено со значением по умолчанию и скрытым геттером, следуя установленному паттерну.
87-90
: Правильная реализация метода getValueType().Метод корректно переопределен и возвращает поле
source
, что соответствует контракту интерфейсаValueTypeOwner
.src/main/java/com/github/_1c_syntax/bsl/mdo/children/ExtDimensionAccountingFlag.java (3)
33-33
: Импорты соответствуют добавленной функциональности.Корректно добавлены импорты для
ValueTypeDescription
иlombok.Getter
.Also applies to: 38-38
75-77
: Единообразная реализация паттерна ValueTypeOwner.Поле
type
реализовано согласно установленному в проекте паттерну с использованием@Getter(AccessLevel.NONE)
.
86-89
: Корректная реализация метода getValueType().Метод правильно переопределен для соответствия интерфейсу
ValueTypeOwner
.src/main/java/com/github/_1c_syntax/bsl/mdo/SessionParameter.java (4)
29-29
: Импорты корректно добавлены.Добавлены необходимые импорты для реализации ValueTypeOwner.
Also applies to: 34-34
44-44
: Правильное добавление интерфейса ValueTypeOwner.Класс теперь реализует
ValueTypeOwner
наряду с существующими интерфейсами, обеспечивая единообразие архитектуры.
67-73
: Корректная реализация блока ValueTypeOwner.Добавлен отдельный блок документации для ValueTypeOwner с правильно объявленным полем
type
.
75-78
: Правильная реализация метода getValueType().Метод корректно переопределен для соответствия контракту интерфейса.
src/main/java/com/github/_1c_syntax/bsl/mdo/DefinedType.java (4)
28-28
: Импорты соответствуют новой функциональности.Добавлены необходимые импорты для поддержки ValueTypeOwner.
Also applies to: 33-33
41-41
: Корректное добавление интерфейса ValueTypeOwner.Класс правильно расширен для реализации ValueTypeOwner.
62-68
: Единообразная реализация блока ValueTypeOwner.Блок ValueTypeOwner реализован согласно паттерну, используемому в других классах проекта.
74-77
: Правильная реализация метода getValueType().Метод корректно переопределен для возврата поля
type
.src/main/java/com/github/_1c_syntax/bsl/mdo/children/AccountingFlag.java (3)
33-33
: Импорты согласованы с изменениями.Корректно добавлены импорты для новой функциональности ValueTypeOwner.
Also applies to: 38-38
75-77
: Правильная реализация поля типа.Поле
type
объявлено согласно установленному паттерну с использованием@Getter(AccessLevel.NONE)
.
86-89
: Корректная реализация метода getValueType().Метод правильно переопределен для соответствия интерфейсу ValueTypeOwner.
src/main/java/com/github/_1c_syntax/bsl/mdo/Constant.java (6)
29-29
: Импорты корректно обновлены.Добавлены необходимые импорты для реализации ValueTypeOwner.
Also applies to: 34-34
45-45
: Правильное добавление интерфейса ValueTypeOwner.Класс теперь реализует ValueTypeOwner в дополнение к существующим интерфейсам.
47-47
: Исправлена опечатка в названии метода.Название метода изменено с
computePossibleRighs()
наcomputePossibleRights()
, что исправляет опечатку и улучшает читаемость кода.
75-81
: Единообразная реализация блока ValueTypeOwner.Блок ValueTypeOwner реализован согласно установленному в проекте паттерну.
98-101
: Корректная реализация метода getValueType().Метод правильно переопределен для возврата поля
type
.
110-110
: Исправлена опечатка в названии приватного метода.Название метода корректно изменено на
computePossibleRights()
.src/main/java/com/github/_1c_syntax/bsl/mdo/children/DocumentJournalColumn.java (4)
31-31
: Импорты обновлены для новой функциональности.Добавлены импорты для
ValueTypeDescription
иlombok.Singular
в соответствии с новыми возможностями класса.Also applies to: 35-35, 39-39
76-80
: Добавлена полезная функциональность для работы со ссылками.Поле
references
с аннотацией@Singular("addReferences")
позволяет удобно собирать ссылки на реквизиты документов через билдер.
82-86
: Правильная реализация метода isPasswordMode().Переопределение метода
isPasswordMode()
с возвратомfalse
логично для колонок журнала документов, которые не могут иметь режим пароля.
88-92
: Логичная реализация getValueType() для колонок.Возврат
ValueTypeDescription.EMPTY
обоснован комментарием - колонки не имеют собственного типа, а наследуют его из ссылок на реквизиты.src/main/java/com/github/_1c_syntax/bsl/mdo/children/ExternalDataSourceTableField.java (2)
1-22
: Обновлен год в копирайтеИзменения корректны - год обновлен на 2025 в соответствии с текущими изменениями.
33-33
: Корректная реализация интерфейса ValueTypeOwnerРеализация следует общему паттерну, используемому в других классах проекта (CommonAttribute, DefinedType и др.): поле
type
с подавленным геттером и публичный методgetValueType()
для доступа к описанию типа.Also applies to: 78-80, 88-91
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/FormAttributeConverter.java (1)
1-22
: Обновлен год в копирайтеИзменения корректны - год обновлен на 2025 в соответствии с текущими изменениями.
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttribute.java (2)
1-22
: Обновлен год в копирайтеИзменения корректны - год обновлен на 2025 в соответствии с текущими изменениями.
39-39
: Корректная реализация интерфейса ValueTypeOwnerРеализация интерфейса ValueTypeOwner выполнена правильно и согласованно с другими классами в проекте. Использование
@NonNull
для методаgetValueType()
гарантирует возврат ненулевого значения.Also applies to: 59-71
src/main/java/com/github/_1c_syntax/bsl/mdo/CommonAttribute.java (3)
1-22
: Обновлен год в копирайтеИзменения корректны - год обновлен на 2025 в соответствии с текущими изменениями.
49-49
: Корректная реализация интерфейса ValueTypeOwnerКласс теперь реализует интерфейс ValueTypeOwner, добавлено поле
type
с подавленным геттером и методgetValueType()
для доступа к описанию типа - все согласно общему паттерну проекта.Also applies to: 72-79, 149-152
171-176
: Улучшенная реализация метода useMode()Рефакторинг с использованием Optional делает код более читаемым и идиоматичным для Java. Логика сохранена корректно.
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java (2)
1-22
: Обновлен год в копирайтеИзменения корректны - год обновлен на 2025 в соответствии с текущими изменениями.
38-44
: Класс хорошо документированJavadoc комментарий четко описывает назначение конвертера. Константа TYPE_NODE_NAMES содержит все необходимые варианты имен узлов для типов.
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttributeValueType.java (3)
68-76
: LGTM: корректный реестр встроенных типовСписок полно инициализирован, порядок и значения консистентны. List.of возвращает неизменяемую коллекцию — это подходит.
78-86
: LGTM: инкапсуляция и доступорыЗакрытые поля + @Getter и приватный конструктор — верно для одноэкземплярных констант.
94-101
: LGTM: API builtinTypes()Возвращение неизменяемого списка без копирования — ок, побочных эффектов нет.
src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java (2)
96-142
: LGTM: перечень встроенных MDO‑типов инициализирован корректноНабор покрывает менеджеры/объекты/ссылки/наборы записей; именование и Ru‑имена согласованы.
177-195
: LGTM: разбор составных вариантов и кэшированиеАлгоритм с
ALL_VARIANTS
иPROVIDED_TYPES
выглядит корректно и потокобезопасно.Проверьте тестами случаи:
InformationRegister.List
,InformationRegister.RecordManager
,Characteristic.*
,ExternalDataSource.Table*
.
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (6)
docs/ru/examples.md (2)
12-12
: Синхронизировать название пункта в оглавлении с заголовком секции.В оглавлении: «Анализ описания типов данных», в секции: «Анализ типов данных». Лучше унифицировать формулировку (оставить «Анализ типов данных»).
Предлагаемый патч:
- - [Анализ описания типов данных](#анализ-типов-данных) + - [Анализ типов данных](#анализ-типов-данных)
273-404
: Опечатки и мелкие неточности в новой секции; корректировки комментариев к примерам.Исправления: орфография, согласование, уточнение названий типов в комментариях (в примере указан Number, а в тексте — «СТРОКА»).
Предлагаемый патч (фрагменты):
-## Анализ типов данных +## Анализ типов данных @@ -При чтении описания метаданных для объектов и их атрибутов вычисляются описания типов. Все сущности, имеющие описания типов данных, реализуют интерфейс `ValueTypeOwner`. +При чтении описания метаданных для объектов и их атрибутов вычисляются описания типов. Все сущности, имеющие описания типов данных, реализуют интерфейс `ValueTypeOwner`. @@ - // описание типа `getValueType` + // описание типа доступно через getValueType() assertThat(objectAttribute.getValueType()).isNotNull(); - // убеимся в наличии примитивного типа СТРОКА в составе описания + // убедимся в наличии примитивного типа ЧИСЛО в составе описания assertThat(objectAttribute.getValueType().contains(PrimitiveValueType.NUMBER)).isTrue(); - // убедимся, что тип не составно + // убедимся, что тип не составной assertThat(objectAttribute.getValueType().isComposite()).isFalse(); @@ - // убаимся, что квалификатор числа содожержит верную информацию + // убедимся, что квалификатор числа содержит верную информацию var numberQualifiers = (NumberQualifiers) qualifier; @@ - // создадим типа по имени + // создадим тип по имени var typeContains = MetadataValueType.fromString("EnumRef.ДополнительныеЗначенияДоступа"); @@ - // полученый тип относится к перечислению + // полученный тип относится к перечислению assertThat(typeContains.getKind()).isEqualTo(MDOType.ENUM); @@ - // убедимся, что второй тип нпе входит в состав + // убедимся, что второй тип не входит в состав assertThat(definedType.getValueType().contains(typeNotContains)).isFalse();Дополнительно: в начале файла (ранее в примерах) используется
attribute.getType().getDescription()
, а в новой секции —getValueType()
. Проверьте и, при необходимости, унифицируйте API в примерах, чтобы избежать путаницы.src/test/java/com/github/_1c_syntax/bsl/examples/ValueTypeTest.java (4)
42-49
: Предложение: улучшить читаемость констант путей.Использование
ArgumentsAccessor
может снизить читаемость тестового кода. Константы путей можно сделать более читаемыми.Примените этот diff для улучшения читаемости:
- private static final String EXAMPLES_PATH = "src/test/resources/ext"; - private static final String EDT_PATH = "edt"; - private static final String DESIGNER_PATH = "designer"; - private static final String DESIGNER_CF_PATH = "src/cf"; - private static final String EDT_CF_PATH = "configuration"; + private static final Path EXAMPLES_BASE_PATH = Path.of("src/test/resources/ext"); + private static final String EDT_SUBPATH = "edt"; + private static final String DESIGNER_SUBPATH = "designer"; + private static final String DESIGNER_CONFIG_PATH = "src/cf"; + private static final String EDT_CONFIG_PATH = "configuration";
50-66
: Рекомендация: рассмотреть упрощение параметризации тестов.ArgumentsAccessor может снизить читаемость, и доступны альтернативы для агрегирования аргументов. Для простых случаев с булевым флагом и строкой можно использовать прямые параметры.
Примените этот diff для упрощения:
- void testCatalog(ArgumentsAccessor argumentsAccessor) { - var isEDT = argumentsAccessor.getBoolean(0); - var examplePackName = argumentsAccessor.getString(1); + void testCatalog(boolean isEDT, String examplePackName) {
61-66
: Предложение: извлечь логику построения путей в отдельный метод.Дублирование логики построения путей между тестами можно устранить.
Добавьте вспомогательный метод:
private Path buildConfigurationPath(boolean isEDT, String examplePackName) { if (isEDT) { return Path.of(EXAMPLES_PATH, EDT_PATH, examplePackName, EDT_CF_PATH); } else { return Path.of(EXAMPLES_PATH, DESIGNER_PATH, examplePackName, DESIGNER_CF_PATH); } }Затем используйте его в обоих тестах:
- Path configurationPath; - if (isEDT) { - configurationPath = Path.of(EXAMPLES_PATH, EDT_PATH, examplePackName, EDT_CF_PATH); - } else { - configurationPath = Path.of(EXAMPLES_PATH, DESIGNER_PATH, examplePackName, DESIGNER_CF_PATH); - } + var configurationPath = buildConfigurationPath(isEDT, examplePackName);
97-113
: То же замечание по параметризации и дублированию.Применимы те же рекомендации по упрощению
ArgumentsAccessor
и извлечению логики построения путей.Примените аналогичные изменения:
- void testDefinedType(ArgumentsAccessor argumentsAccessor) { - var isEDT = argumentsAccessor.getBoolean(0); - var examplePackName = argumentsAccessor.getString(1); + void testDefinedType(boolean isEDT, String examplePackName) { + var configurationPath = buildConfigurationPath(isEDT, examplePackName);
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
docs/ru/examples.md
(2 hunks)docs/ru/features.md
(1 hunks)src/test/java/com/github/_1c_syntax/bsl/examples/ValueTypeTest.java
(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- docs/ru/features.md
🧰 Additional context used
🧬 Code graph analysis (1)
src/test/java/com/github/_1c_syntax/bsl/examples/ValueTypeTest.java (1)
src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java (1)
MetadataValueType
(39-271)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
- GitHub Check: QA
- GitHub Check: build (17, ubuntu-latest)
- GitHub Check: build (23, windows-latest)
- GitHub Check: build (17, windows-latest)
- GitHub Check: build (21, windows-latest)
- GitHub Check: build (21, ubuntu-latest)
- GitHub Check: build (23, macOS-latest)
- GitHub Check: build (23, ubuntu-latest)
- GitHub Check: build (21, macOS-latest)
- GitHub Check: build (23, macOS-latest)
- GitHub Check: build (17, ubuntu-latest)
- GitHub Check: build (23, windows-latest)
- GitHub Check: build (23, ubuntu-latest)
- GitHub Check: build (21, ubuntu-latest)
- GitHub Check: build (17, windows-latest)
- GitHub Check: build (17, macOS-latest)
- GitHub Check: build (21, macOS-latest)
- GitHub Check: build (21, windows-latest)
🔇 Additional comments (3)
src/test/java/com/github/_1c_syntax/bsl/examples/ValueTypeTest.java (3)
1-143
: LGTM! Тест хорошо структурирован и покрывает функциональность типов значений.Тестовый класс правильно проверяет:
- Загрузку конфигурации из путей EDT и Designer
- Получение атрибутов из каталогов
- Проверку типов значений и их квалификаторов
- Работу с определяемыми типами и их составными типами
- Методы
MetadataValueType.fromString()
и проверку содержимого типовРеализация соответствует целям PR по добавлению поддержки чтения описаний типов значений для метаданных.
75-94
: Отличная проверка атрибута каталога и его типа значения.Тест правильно проверяет:
- Наличие атрибута "Реквизит2"
- Тип значения и его свойства (содержит
NUMBER
, не составной)- Квалификаторы числа (точность 10, разряды 0, может быть отрицательным)
Это хорошо покрывает функциональность чтения описаний типов значений для реквизитов.
122-141
: Превосходная проверка определяемых типов.Тест отлично проверяет:
- Определяемый тип "ЗначениеДоступа" как составной тип
- Что он не содержит примитивные числовые типы
- Правильную работу
MetadataValueType.fromString()
- Проверку содержимости типов через
contains()
- Метаданные типов (вид, имена на русском и английском)
Это демонстрирует полную функциональность новых возможностей чтения типов значений.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (3)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java (1)
67-69
: Уточнить уровень логирования для неизвестных полей
LOGGER.warn("Unknown type description field {}"…)
может зашумлять логи при новых версиях формата. Рассмотрите понижение доdebug
или добавление контекста (путь, родительский узел).src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java (2)
55-87
: Нормализовать входную строку (trim) перед кэшированием и разборомБез
trim()
разные по форме, но одинаковые значения будут расходиться в кеше и плодить ложные "unknown" предупреждения.Примените патч:
@Override public Object fromString(String string) { - // сначала из кеша - var type = getType(string); + // нормализуем вход: убираем пробелы по краям + var input = string.trim(); + // сначала из кеша + var type = getType(input); if (type != null) { return type; } @@ - var trimString = string; - var posColon = string.indexOf(":"); + var trimString = input; + var posColon = input.indexOf(":"); if (posColon > 0) { - trimString = string.substring(posColon + 1); + trimString = input.substring(posColon + 1); type = getType(trimString); if (type != null) { - putType(string, type); + putType(input, type); return type; } } @@ type = MetadataValueType.fromString(trimString); if (type != null) { - putType(string, type); + putType(input, type); return type; } // Тип нам неизвестен, выведем ворнинг и создадим неизвестный тип - LOGGER.warn(WARN_TEMPLATE, string, string); - type = new UnknownValueType(string); - putType(string, type); + LOGGER.warn(WARN_TEMPLATE, input, input); + type = new UnknownValueType(input); + putType(input, type); return type; }
52-53
: Потенциальный неограниченный рост кеша для неизвестных типов
ALL_TYPES
пополняется для каждого неизвестного значения. Если вход управляем внешними данными, возможен рост памяти. Минимально — ввести верхнюю границу для кэширования неизвестных значений или метрику/счетчик для мониторинга.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttributeValueType.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java
(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java
(1 hunks)src/test/java/com/github/_1c_syntax/bsl/examples/ValueTypeTest.java
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- src/test/java/com/github/_1c_syntax/bsl/examples/ValueTypeTest.java
- src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttributeValueType.java
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2025-09-19T07:56:27.155Z
Learnt from: theshadowco
PR: 1c-syntax/mdclasses#519
File: src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java:82-86
Timestamp: 2025-09-19T07:56:27.155Z
Learning: В проекте mdclasses параметр lombok.log.fieldName установлен в "LOGGER" в файле lombok.config, поэтому Lombok Slf4j генерирует поле с именем LOGGER, а не стандартное "log".
Applied to files:
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java
📚 Learning: 2025-09-19T07:56:27.155Z
Learnt from: theshadowco
PR: 1c-syntax/mdclasses#519
File: src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java:82-86
Timestamp: 2025-09-19T07:56:27.155Z
Learning: В проекте mdclasses имя поля логгера для Lombok Slf4j определяется в файле lombok.config через параметр lombok.log.fieldName, а не использует стандартное имя "log".
Applied to files:
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java
🧬 Code graph analysis (2)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java (3)
src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java (1)
MetadataValueType
(39-271)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java (1)
Slf4j
(41-125)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeQualifierConverter.java (1)
Slf4j
(42-111)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeConverter.java (4)
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/form/FormAttributeValueType.java (1)
FormAttributeValueType
(31-121)src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java (1)
MetadataValueType
(39-271)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java (1)
Slf4j
(41-79)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeQualifierConverter.java (1)
Slf4j
(42-111)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
- GitHub Check: QA
- GitHub Check: build (21, ubuntu-latest)
- GitHub Check: build (21, windows-latest)
- GitHub Check: build (21, macOS-latest)
- GitHub Check: build (23, macOS-latest)
- GitHub Check: build (17, ubuntu-latest)
- GitHub Check: build (23, ubuntu-latest)
- GitHub Check: build (23, windows-latest)
- GitHub Check: build (17, windows-latest)
- GitHub Check: build (21, windows-latest)
- GitHub Check: build (17, macOS-latest)
- GitHub Check: build (17, ubuntu-latest)
- GitHub Check: build (23, macOS-latest)
- GitHub Check: build (17, windows-latest)
- GitHub Check: build (21, macOS-latest)
- GitHub Check: build (23, ubuntu-latest)
- GitHub Check: build (23, windows-latest)
- GitHub Check: build (21, ubuntu-latest)
🔇 Additional comments (2)
src/main/java/com/github/_1c_syntax/bsl/mdo/support/MetadataValueType.java (1)
39-270
: Реестр типов и разрешение вариантов выглядят корректно
- Кеши потокобезопасны (
ConcurrentHashMap
), ключи нормализуются черезLocale.ROOT
.- Логика
fromString
с разбором варианта до точки и маркировкойcomposite
у встроенных типов — ожидаемая.Проверьте тестами кейсы с вариантами вида
ExternalDataSource.TableRef
иInformationRegister.List.*
, чтобы зафиксировать поведениеnameRu
при конкатенации суффикса.src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java (1)
35-37
: Сделать разбор узлов регистронезависимым и покрыть вариант "Types"Нормализовать nodeName через nodeName.toLowerCase(Locale.ROOT); использовать Set TYPE_NODE_NAMES = Set.of("types", "type", "typeset") вместо List для O(1); выполнять суффиксную проверку на нормализованной строке (nn.endsWith("qualifiers")); добавить импорты java.util.Set и java.util.Locale. Файл: src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/ValueTypeDescriptionConverter.java (стр. 35–37; аналогично 44, 55, 65–66). Поиск по репозиторию не вернул совпадений — подтвердить вручную применимость правки и учесть, что Set.of не допускает дубликатов.
Описание
Для всех MD, имеющих описание типа значения, добавлен интерфейс
Связанные задачи
Closes #277
Чеклист
Общие
gradlew precommit
)Дополнительно