Skip to content

Commit

Permalink
Merge pull request #7 from sfaqer/feature/annotationOwnerObject
Browse files Browse the repository at this point in the history
Теперь владельцем свойств при разворачивании аннотаций может выступать не только тип но и экземпляр сценария
  • Loading branch information
nixel2007 authored Jan 16, 2025
2 parents 614e809 + d4559e8 commit c85a93b
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,10 @@
// * Параметры - ТаблицаЗначений - Таблица параметров аннотации:
// ** Имя - Строка - Имя параметра аннотации.
// ** Значение - Строка - Значение параметра аннотации.
// ИмяТипаСАннотацией - Строка - Имя типа, к которому применяется аннотация.
// ПредставлениеВладельцаАннотации - Строка - Строковое представление типа или объекта
// к которому применяется аннотация.
//
Процедура Проверить(Аннотация, ИмяТипаСАннотацией) Экспорт
Процедура Проверить(Аннотация, ПредставлениеВладельцаАннотации) Экспорт
```

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

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

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")
.ВключитьФайл("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

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

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

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

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

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

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

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

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

0 comments on commit c85a93b

Please sign in to comment.