Skip to content
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

Теперь владельцем свойств при разворачивании аннотаций может выступать не только тип но и экземпляр сценария #7

Merged
merged 4 commits into from
Jan 16, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,10 @@
// * Параметры - ТаблицаЗначений - Таблица параметров аннотации:
// ** Имя - Строка - Имя параметра аннотации.
// ** Значение - Строка - Значение параметра аннотации.
// ИмяТипаСАннотацией - Строка - Имя типа, к которому применяется аннотация.
// ПредставлениеВладельцаАннотации - Строка - Строковое представление типа или объекта
// к которому применяется аннотация.
//
Процедура Проверить(Аннотация, ИмяТипаСАннотацией) Экспорт
Процедура Проверить(Аннотация, ПредставлениеВладельцаАннотации) Экспорт
nixel2007 marked this conversation as resolved.
Show resolved Hide resolved
```

### СоздатьОбъектАннотации
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@
// ** Параметры - ТаблицаЗначений - Таблица параметров аннотации:
// *** Имя - Строка - Имя параметра аннотации.
// *** Значение - Строка - Значение параметра аннотации.
// ТипВладельцаСвойства - Тип - Тип владельца свойства.
// ВладелецСвойства - Тип - Тип владельца свойства.
// - Сценарий - Экземпляр владельца свойства.
//
Процедура РазвернутьАннотацииСвойства(Свойство, ТипВладельцаСвойства) Экспорт
Процедура РазвернутьАннотацииСвойства(Свойство, ВладелецСвойства) Экспорт
```

## РазвернутьАннотацииСвойств
Expand All @@ -40,8 +41,9 @@
// ** Параметры - ТаблицаЗначений - Таблица параметров аннотации:
// *** Имя - Строка - Имя параметра аннотации.
// *** Значение - Строка - Значение параметра аннотации.
// ТипВладельцаСвойств - Тип - Тип владельца свойств.
// ВладелецСвойства - Тип - Тип владельца свойства.
nixel2007 marked this conversation as resolved.
Show resolved Hide resolved
// - Сценарий - Экземпляр владельца свойства.
//
Процедура РазвернутьАннотацииСвойств(Свойства, ТипВладельцаСвойств) Экспорт
Процедура РазвернутьАннотацииСвойств(Свойства, ВладелецСвойства) Экспорт
```

4 changes: 2 additions & 2 deletions packagedef
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
Описание.Имя("annotations")
.Версия("1.0.1")
.Версия("1.1.0")
.Автор("Nikita Fedkin")
.АдресАвтора("[email protected]")
.Описание("Аннотации как объекты первого класса")
.ВерсияСреды("1.8.3")
.ВерсияСреды("1.9.2")
nixel2007 marked this conversation as resolved.
Show resolved Hide resolved
.ВключитьФайл("src")
.ВключитьФайл("docs")
.ВключитьФайл("tasks")
Expand Down
31 changes: 16 additions & 15 deletions src/Классы/ОпределениеАннотации.os
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
// Возвращаемое значение:
// ТаблицаЗначений - таблица параметров аннотации:
// * Имя - Строка - Имя параметра.
// * ПоЗначению - Булево - Признак получения пораметра по значению.
// * ПоЗначению - Булево - Признак получения параметра по значению.
// * ЕстьЗначениеПоУмолчанию - Булево - Признак наличия значения по умолчанию.
// * ЗначениеПоУмолчанию - Произвольный - Значение по умолчанию.
// * Аннотации - ТаблицаЗначений - Таблица аннотаций со следующими колонками:
Expand Down Expand Up @@ -85,16 +85,17 @@
// * Параметры - ТаблицаЗначений - Таблица параметров аннотации:
// ** Имя - Строка - Имя параметра аннотации.
// ** Значение - Строка - Значение параметра аннотации.
// ИмяТипаСАннотацией - Строка - Имя типа, к которому применяется аннотация.
// ПредставлениеВладельцаАннотации - Строка - Строковое представление типа или объекта
// к которому применяется аннотация.
//
Процедура Проверить(Аннотация, ИмяТипаСАннотацией) Экспорт
Процедура Проверить(Аннотация, ПредставлениеВладельцаАннотации) Экспорт

ПривестиИменаПараметров(Аннотация);

АннотацияСодержитОбязательныеПараметры(Аннотация, ИмяТипаСАннотацией);
АннотацияСодержитМаксимумОдинПараметрСИменемПоУмолчанию(Аннотация, ИмяТипаСАннотацией);
АннотацияНеСодержитНеизвестныеПараметры(Аннотация, ИмяТипаСАннотацией);
ПовторяемыеПараметрыЗаданыКорректно(Аннотация, ИмяТипаСАннотацией);
АннотацияСодержитОбязательныеПараметры(Аннотация, ПредставлениеВладельцаАннотации);
АннотацияСодержитМаксимумОдинПараметрСИменемПоУмолчанию(Аннотация, ПредставлениеВладельцаАннотации);
АннотацияНеСодержитНеизвестныеПараметры(Аннотация, ПредставлениеВладельцаАннотации);
ПовторяемыеПараметрыЗаданыКорректно(Аннотация, ПредставлениеВладельцаАннотации);

КонецПроцедуры

Expand Down Expand Up @@ -148,7 +149,7 @@

КонецПроцедуры

Процедура АннотацияСодержитОбязательныеПараметры(Аннотация, ИмяТипаСАннотацией)
Процедура АннотацияСодержитОбязательныеПараметры(Аннотация, ПредставлениеВладельцаАннотации)

Для Каждого ОпределениеПараметраАннотации Из Параметры Цикл

Expand All @@ -159,7 +160,7 @@
ВызватьИсключение СтрШаблон(
"Аннотация %1 в классе %2 не содержит параметр %3",
Аннотация.Имя,
ИмяТипаСАннотацией,
ПредставлениеВладельцаАннотации,
ОпределениеПараметраАннотации.Имя
);
КонецЕсли;
Expand All @@ -168,7 +169,7 @@

КонецПроцедуры

Процедура АннотацияСодержитМаксимумОдинПараметрСИменемПоУмолчанию(Аннотация, ИмяТипаСАннотацией)
Процедура АннотацияСодержитМаксимумОдинПараметрСИменемПоУмолчанию(Аннотация, ПредставлениеВладельцаАннотации)

КоличествоПараметровСИменемПоУмолчанию = 0;
Для Каждого ПараметрАннотации Из Аннотация.Параметры Цикл
Expand All @@ -183,15 +184,15 @@
ВызватьИсключение СтрШаблон(
"Аннотация %1 в классе %2 имеет более одного параметра без имени или с именем ""Значение""",
Аннотация.Имя,
ИмяТипаСАннотацией
ПредставлениеВладельцаАннотации
);
КонецЕсли;

КонецЦикла;

КонецПроцедуры

Процедура АннотацияНеСодержитНеизвестныеПараметры(Аннотация, ИмяТипаСАннотацией)
Процедура АннотацияНеСодержитНеизвестныеПараметры(Аннотация, ПредставлениеВладельцаАннотации)

Для Каждого ПараметрАннотации Из Аннотация.Параметры Цикл

Expand All @@ -202,7 +203,7 @@
ВызватьИсключение СтрШаблон(
"Аннотация %1 в классе %2 содержит неизвестный параметр %3",
Аннотация.Имя,
ИмяТипаСАннотацией,
ПредставлениеВладельцаАннотации,
ИмяПараметраВложеннойАннотации
);
КонецЕсли;
Expand All @@ -211,7 +212,7 @@

КонецПроцедуры

Процедура ПовторяемыеПараметрыЗаданыКорректно(Аннотация, ИмяТипаСАннотацией)
Процедура ПовторяемыеПараметрыЗаданыКорректно(Аннотация, ПредставлениеВладельцаАннотации)

ИмяАннотацииПовторяемый = "Повторяемый";

Expand All @@ -223,7 +224,7 @@
ВызватьИсключение СтрШаблон(
"Аннотация %1 в классе %2 содержит несколько значений параметра %3, но параметр не помечен аннотацией ""%4""",
Аннотация.Имя,
ИмяТипаСАннотацией,
ПредставлениеВладельцаАннотации,
Параметр.Имя,
ИмяАннотацииПовторяемый
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,16 @@
// ** Параметры - ТаблицаЗначений - Таблица параметров аннотации:
// *** Имя - Строка - Имя параметра аннотации.
// *** Значение - Строка - Значение параметра аннотации.
// ТипВладельцаСвойства - Тип - Тип владельца свойства.
// ВладелецСвойства - Тип - Тип владельца свойства.
// - Сценарий - Экземпляр владельца свойства.
//
Процедура РазвернутьАннотацииСвойства(Свойство, ТипВладельцаСвойства) Экспорт
Процедура РазвернутьАннотацииСвойства(Свойство, ВладелецСвойства) Экспорт

ОпределенияАннотаций = _КонтейнерАннотаций.ПолучитьОпределенияАннотаций();
Аннотации = Свойство.Аннотации;
НакопленныеАннотации = Свойство.Аннотации.СкопироватьКолонки();

РазвернутьАннотации(ОпределенияАннотаций, Аннотации, НакопленныеАннотации, ТипВладельцаСвойства, Свойство);
РазвернутьАннотации(ОпределенияАннотаций, Аннотации, НакопленныеАннотации, ВладелецСвойства, Свойство);

Свойство.Аннотации = НакопленныеАннотации;

Expand All @@ -43,12 +44,13 @@
// ** Параметры - ТаблицаЗначений - Таблица параметров аннотации:
// *** Имя - Строка - Имя параметра аннотации.
// *** Значение - Строка - Значение параметра аннотации.
// ТипВладельцаСвойств - Тип - Тип владельца свойств.
// ВладелецСвойства - Тип - Тип владельца свойства.
// - Сценарий - Экземпляр владельца свойства.
//
Процедура РазвернутьАннотацииСвойств(Свойства, ТипВладельцаСвойств) Экспорт
Процедура РазвернутьАннотацииСвойств(Свойства, ВладелецСвойства) Экспорт

Для Каждого Свойство Из Свойства Цикл
РазвернутьАннотацииСвойства(Свойство, ТипВладельцаСвойств);
РазвернутьАннотацииСвойства(Свойство, ВладелецСвойства);
КонецЦикла;

КонецПроцедуры
Expand All @@ -57,7 +59,7 @@
ОпределенияАннотаций,
Аннотации,
НакопленныеАннотации,
ТипВладельцаСвойств,
ВладелецСвойства,
Свойство,
УровеньВложенности = 1
)
Expand All @@ -77,9 +79,9 @@

Если ОпределениеАннотации = Неопределено Тогда
_Лог.Отладка(
"Обнаружена незарегистрированная аннотация ""%1"" в типе ""%2"" на свойстве ""%3""",
"Обнаружена незарегистрированная аннотация ""%1"" у владельца ""%2"" на свойстве ""%3""",
Аннотация.Имя,
ТипВладельцаСвойств,
ВладелецСвойства,
Свойство.Имя
);

Expand All @@ -91,7 +93,7 @@
// Проверяем только аннотации на самом верхнем уровне вложенности,
// т.к. остальные проверяются при регистрации аннотации.
Если УровеньВложенности = 1 Тогда
ОпределениеАннотации.Проверить(Аннотация, ТипВладельцаСвойств);
ОпределениеАннотации.Проверить(Аннотация, Строка(ВладелецСвойства));
КонецЕсли;

ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация);
Expand All @@ -100,7 +102,7 @@
ОбъектАннотации.ПриРазворачиванииАннотации(
ОпределениеАннотации,
ПодчиненныеАннотации,
ТипВладельцаСвойств,
ВладелецСвойства,
Свойство
);
КонецЕсли;
Expand All @@ -110,7 +112,7 @@
ОпределенияАннотаций,
ПодчиненныеАннотации,
НакопленныеАннотации,
ТипВладельцаСвойств,
ВладелецСвойства,
Свойство,
УровеньВложенности + 1
);
Expand Down
20 changes: 14 additions & 6 deletions tests/РазворачивательАннотаций.os
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,33 @@
#Использовать asserts

&Тест
Процедура РазвернутьАннотацииСвойств() Экспорт

&Параметры(Ложь)
&Параметры(Истина)
Процедура РазвернутьАннотацииСвойств(ВладелецОбъект) Экспорт

Если ВладелецОбъект Тогда
ВладелецАннотаций = Новый ВладелецАннотаций();
Иначе
ВладелецАннотаций = Тип("ВладелецАннотаций");
КонецЕсли;

// Дано
КонтейнерАннотаций = Новый КонтейнерАннотаций();
Рефлектор = Новый Рефлектор();
ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(Тип("ВладелецАннотаций"));
ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(ВладелецАннотаций);
Методы = РаботаСАннотациями.НайтиМетодыСАннотацией(ТаблицаМетодов, "АннотацияВерхнеуровневая");

nixel2007 marked this conversation as resolved.
Show resolved Hide resolved
// Когда
КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияТестоваяАннотация"));
КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияВерхнеуровневая"));
РазворачивательАннотаций = КонтейнерАннотаций.ПолучитьРазворачивательАннотаций();
РазворачивательАннотаций.РазвернутьАннотацииСвойств(Методы, Тип("ВладелецАннотаций"));
РазворачивательАннотаций.РазвернутьАннотацииСвойств(Методы, ВладелецАннотаций);

Аннотации = Методы[0].Аннотации;

// Тогда
Ожидаем.Что(Аннотации.Количество()).Равно(3);
Ожидаем.Что(Аннотации[2].Имя).Равно("тестоваяаннотация");
Ожидаем.Что(Аннотации[2].Параметры[0].Значение).Равно(1);

КонецПроцедуры
Loading