Skip to content

Commit

Permalink
Merge pull request #11 from autumn-library/feature/repeatableDefaultP…
Browse files Browse the repository at this point in the history
…aram

Добавлена возможность указывать &Повторяемый параметр `Значение` для аннотаций
  • Loading branch information
nixel2007 authored Feb 16, 2025
2 parents dbf57ed + 3983f0f commit 1851194
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 27 deletions.
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Описание.Имя("annotations")
.Версия("1.2.0")
.Версия("1.3.0")
.Автор("Nikita Fedkin")
.АдресАвтора("[email protected]")
.Описание("Аннотации как объекты первого класса")
Expand Down
24 changes: 0 additions & 24 deletions src/Классы/ОпределениеАннотации.os
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@
ПривестиИменаПараметров(Аннотация);

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

Expand Down Expand Up @@ -169,29 +168,6 @@

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

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

КоличествоПараметровСИменемПоУмолчанию = 0;
Для Каждого ПараметрАннотации Из Аннотация.Параметры Цикл

ИмяПараметраВложеннойАннотации = ПараметрАннотации.Имя;
Если ВРег(ИмяПараметраВложеннойАннотации) = ВРег("Значение") Тогда
КоличествоПараметровСИменемПоУмолчанию = КоличествоПараметровСИменемПоУмолчанию + 1;
КонецЕсли;

// Аннотация содержит только один параметр с именем по умолчанию
Если КоличествоПараметровСИменемПоУмолчанию > 1 Тогда
ВызватьИсключение СтрШаблон(
"Аннотация %1 в классе %2 имеет более одного параметра без имени или с именем ""Значение""",
Аннотация.Имя,
ПредставлениеВладельцаАннотации
);
КонецЕсли;

КонецЦикла;

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

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

Для Каждого ПараметрАннотации Из Аннотация.Параметры Цикл
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
&Аннотация("ТестоваяАннотацияСПовторяемымЗначением")
Процедура ПриСозданииОбъекта(&Повторяемый Значение)
КонецПроцедуры
10 changes: 9 additions & 1 deletion tests/Классы/ВладелецАннотаций.os
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,12 @@
&Метод("1")
Процедура МетодЭкспортный() Экспорт

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

&ТестоваяАннотация(1, 2)
Процедура МетодСНесколькимиНеПовторяемымиЗначениями()
КонецПроцедуры

&ТестоваяАннотацияСПовторяемымЗначением(1, 2)
Процедура МетодСНесколькимиПовторяемымиЗначениями()
КонецПроцедуры
2 changes: 1 addition & 1 deletion tests/РаботаСАннотациями.os
Original file line number Diff line number Diff line change
Expand Up @@ -195,4 +195,4 @@
// Тогда
Ожидаем.Что(АннотацияКонструктора.Параметры[1].Значение).Равно("999");

КонецПроцедуры
КонецПроцедуры
56 changes: 56 additions & 0 deletions tests/РазворачивательАннотаций.os
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,59 @@
Ожидаем.Что(Аннотации[2].Параметры[0].Значение).Равно(1);

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

&Тест
Процедура МетодСНесколькимиНеПовторяемымиЗначениями() Экспорт

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

Параметры = Новый Массив();
Параметры.Добавить(Методы);
Параметры.Добавить(ВладелецАннотаций);

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

// Тогда
Ожидаем.Что(РазворачивательАннотаций)
.Метод("РазвернутьАннотацииСвойств", Параметры)
.ВыбрасываетИсключение(
"Аннотация ТестоваяАннотация в классе ВладелецАннотаций содержит несколько значений параметра Значение, "
+ "но параметр не помечен аннотацией ""Повторяемый"""
);

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

&Тест
Процедура МетодСНесколькимиПовторяемымиЗначениями() Экспорт

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

Параметры = Новый Массив();
Параметры.Добавить(Методы);
Параметры.Добавить(ВладелецАннотаций);

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

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

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

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

0 comments on commit 1851194

Please sign in to comment.