diff --git a/.vscode/launch.json b/.vscode/launch.json index f14d47d..d91b7e4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,7 +12,15 @@ "args": [], "cwd": "${workspaceRoot}", "env": {}, - "runtimeExecutable": null, + "windows": { + "runtimeExecutable": "${env:OVM_OSCRIPTBIN}/oscript.bat" + }, + "linux": { + "runtimeExecutable": "${env:OVM_OSCRIPTBIN}/oscript" + }, + "osx": { + "runtimeExecutable": "${env:OVM_OSCRIPTBIN}/oscript" + }, "runtimeArgs": [], "debugPort": 2801 } diff --git a/packagedef b/packagedef index 0a87dcb..e003640 100644 --- a/packagedef +++ b/packagedef @@ -14,6 +14,7 @@ .ВключитьФайл("tests") .ВключитьФайл("LICENSE.md") .ВключитьФайл("README.md") + .ЗависитОт("annotations", "0.1.0") .ЗависитОт("asserts", "1.4.0") .ЗависитОт("configor", "0.8.1") .ЗависитОт("logos", "1.4.0") @@ -27,15 +28,12 @@ .РазработкаЗависитОт("fs") .ОпределяетКласс("Поделка", "src/Классы/Поделка.os") - .ОпределяетКласс("РазворачивательАннотаций", "src/Классы/РазворачивательАннотаций.os") .ОпределяетКласс("Завязь", "src/Классы/Завязь.os") .ОпределяетКласс("ОпределениеЖелудя", "src/Классы/ОпределениеЖелудя.os") - .ОпределяетКласс("ОпределениеАннотации", "src/Классы/ОпределениеАннотации.os") .ОпределяетКласс("ПрилепляемаяЧастица", "src/Классы/ПрилепляемаяЧастица.os") .ОпределяетКласс("Табакерка", "src/Классы/Табакерка.os") .ОпределяетКласс("СоветДругогоМастера", "src/Классы/СоветДругогоМастера.os") .ОпределяетМодуль("Осень", "src/Модули/Осень.os") - .ОпределяетМодуль("РаботаСАннотациями", "src/Модули/РаботаСАннотациями.os") .ОпределяетМодуль("ТипыПрилепляемыхЖелудей", "src/Модули/ТипыПрилепляемыхЖелудей.os") .ОпределяетМодуль("ТипыПрилепляемыхЧастиц", "src/Модули/ТипыПрилепляемыхЧастиц.os") .ОпределяетМодуль("ХарактерыЖелудей", "src/Модули/ХарактерыЖелудей.os") diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217.os" deleted file mode 100644 index bfd5e85..0000000 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217.os" +++ /dev/null @@ -1,4 +0,0 @@ -&Аннотация("Аннотация") -Процедура ПриСозданииОбъекта(Значение) - -КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\260.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\260.os" index ea9b60b..759e9bc 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\260.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\260.os" @@ -1,4 +1,5 @@ &Аннотация("Заготовка") +&Спецификация("Инициализация") Процедура ПриСозданииОбъекта(Значение = "") КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\277\320\265\321\206\320\270\321\204\320\270\320\272\320\260\321\206\320\270\321\217.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\277\320\265\321\206\320\270\321\204\320\270\320\272\320\260\321\206\320\270\321\217.os" new file mode 100644 index 0000000..c417d7a --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\277\320\265\321\206\320\270\321\204\320\270\320\272\320\260\321\206\320\270\321\217.os" @@ -0,0 +1,25 @@ +Перем _Значение; + +Функция Значение() Экспорт + Возврат _Значение; +КонецФункции + +&Аннотация("Спецификация") +Процедура ПриСозданииОбъекта(Значение) + + Если Значение = Неопределено Тогда + _Значение = "Выполнение"; + Иначе + _Значение = Значение; + КонецЕсли; + + Если СостоянияПриложения.Значения().Найти(_Значение) = Неопределено Тогда + ТекстСообщения = СтрШаблон( + "Неверное значение спецификации %1", + _Значение + ); + + ВызватьИсключение ТекстСообщения; + КонецЕсли; + +КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\224\321\203\320\261\320\236\321\201\320\265\320\275\320\270.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\224\321\203\320\261\320\236\321\201\320\265\320\275\320\270.os" new file mode 100644 index 0000000..ae27f31 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\224\321\203\320\261\320\236\321\201\320\265\320\275\320\270.os" @@ -0,0 +1,23 @@ +&Завязь +&Спецификация("Инициализация") +Функция КонтейнерАннотаций(&Пластилин Поделка) Экспорт + Рефлектор = Новый Рефлектор(); + КонтейнерАннотаций = Рефлектор.ПолучитьСвойство(Поделка, "КонтейнерАннотаций"); + + Возврат КонтейнерАннотаций; +КонецФункции + +&Завязь +&Спецификация("Инициализация") +Функция РазворачивательАннотаций(&Пластилин Поделка) Экспорт + // TODO: переделать на пластилин, когда можно будет внедрять пластилин в желуди инициализации + Рефлектор = Новый Рефлектор(); + КонтейнерАннотаций = Рефлектор.ПолучитьСвойство(Поделка, "КонтейнерАннотаций"); + + Возврат КонтейнерАннотаций.ПолучитьРазворачивательАннотаций(); +КонецФункции + +&Дуб +&Спецификация("Инициализация") +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" index a35cf82..1e6fa50 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" @@ -1,3 +1,4 @@ +#Использовать annotations #Использовать asserts #Использовать fluent #Использовать reflector @@ -9,11 +10,6 @@ // РазворачивательАннотаций - разворачиватель аннотаций свойств и методов желудей. Перем РазворачивательАннотаций; -// Соответствие, в котором хранятся все определения аннотаций. -// * Ключ - Строка - имя аннотации. -// * Значение - ОпределениеАннотации - определение аннотации. -Перем ОпределенияАннотаций; - // Соответствие, в котором хранятся все определения желудей. // * Ключ - Строка - имя желудя. // * Значение - ОпределениеЖелудя - определение желудя. @@ -43,10 +39,6 @@ Возврат Новый ФиксированноеСоответствие(ОпределенияЖелудейПоИмени); КонецФункции -Функция ПолучитьОпределенияАннотаций() Экспорт - Возврат Новый ФиксированноеСоответствие(ОпределенияАннотаций); -КонецФункции - Функция ПолучитьОпределениеЖелудя(Имя) Экспорт НайденноеОпределение = ОпределенияЖелудейПоИмени.Получить(Имя); Если НайденноеОпределение <> Неопределено Тогда @@ -71,10 +63,6 @@ Возврат НайденноеОпределение; КонецФункции -Функция ПолучитьОпределениеАннотации(Имя) Экспорт - Возврат ОпределенияАннотаций.Получить(НРег(Имя)); -КонецФункции - Функция ПолучитьСписокОпределенийЖелудей(Имя) Экспорт Результат = Новый Массив; @@ -139,7 +127,17 @@ Прозвища = ПрочитатьПрозвища(Аннотации, ИмяЖелудяЗавязи); Порядок = ПрочитатьПорядок(Аннотации); Верховный = ПрочитатьПризнакВерховногоЖелудя(Аннотации); - ВремениИнициализации = Ложь; + Спецификация = ПрочитатьСпецификацию(Аннотации); + + Если Спецификация = СостоянияПриложения.Инициализация() + И НЕ ОпределениеЖелудя.Спецификация() = СостоянияПриложения.Инициализация() Тогда + ТекстСообщения = СтрШаблон( + "Дуб %1 имеет завязь %2, которая имеет &Спецификацию ""Инициализация"", но сам дуб не имеет этой спецификации.", + ОпределениеЖелудя.Имя(), + МетодЗавязи.Имя + ); + ВызватьИсключение ТекстСообщения; + КонецЕсли; ОпределениеЗавязи = Новый ОпределениеЖелудя( РазворачивательАннотаций, @@ -151,7 +149,7 @@ Прозвища, Порядок, Верховный, - ВремениИнициализации + Спецификация ); СохранитьОпределениеЖелудя(ОпределениеЗавязи); @@ -179,12 +177,6 @@ Функция ДобавитьЗаготовку(ТипЗаготовки) Экспорт ОпределениеЗаготовки = ДобавитьЖителяЛеса(ТипЗаготовки, "", "Заготовка"); - Для Каждого ПриклепляемаяЧастица Из ОпределениеЗаготовки.ПрилепляемыеЧастицы() Цикл - Ожидаем - .Что(ПриклепляемаяЧастица.ТипЧастицы(), "К заготовке могут прилепляться только детальки.") - .Равно(ТипыПрилепляемыхЧастиц.Деталька()); - КонецЦикла; - РефлекторОбъекта = Новый РефлекторОбъекта(ТипЗаготовки); Ожидаем @@ -213,58 +205,6 @@ Возврат ОпределениеНапильника; КонецФункции -Функция ДобавитьАннотацию(ТипАннотации) Экспорт - - ИмяТипаАннотации = Строка(ТипАннотации); - - РефлекторОбъекта = Новый РефлекторОбъекта(ТипАннотации); - Методы = РефлекторОбъекта.ПолучитьТаблицуМетодов("Аннотация", Ложь); - Ожидаем.Что( - Методы.Количество(), - "Класс должен иметь ровно один метод с аннотацией &Аннотация" - ).Равно(1); - - Конструктор = Методы[0]; - ОсновнаяАннотация = РаботаСАннотациями.ПолучитьАннотацию(Конструктор, "Аннотация"); - - ИмяАннотации = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(ОсновнаяАннотация, , ИмяТипаАннотации); - - Параметры = Конструктор.Параметры; - КоличествоПараметровСИменемПоУмолчанию = 0; - Для Каждого Параметр Из Параметры Цикл - Если ВРег(Параметр.Имя) = ВРег("Значение") Тогда - КоличествоПараметровСИменемПоУмолчанию = КоличествоПараметровСИменемПоУмолчанию + 1; - - Если КоличествоПараметровСИменемПоУмолчанию > 1 Тогда - ВызватьИсключение СтрШаблон( - "Аннотация %1 имеет более одного параметра с именем ""Значение""", - ИмяАннотации - ); - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Аннотации = Конструктор.Аннотации; - - Для Каждого ВложеннаяАннотация Из Конструктор.Аннотации Цикл - - ОпределениеВложеннойАннотации = ОпределенияАннотаций.Получить(ВложеннаяАннотация.Имя); - Если ОпределениеВложеннойАннотации = Неопределено Тогда - Продолжить; - КонецЕсли; - - ОпределениеВложеннойАннотации.Проверить(ВложеннаяАннотация, ИмяАннотации); - - КонецЦикла; - - ОпределениеАннотации = Новый ОпределениеАннотации(ИмяАннотации, ИмяТипаАннотации, Параметры, Аннотации); - - ОпределенияАннотаций.Вставить(НРег(ИмяАннотации), ОпределениеАннотации); - - Возврат ОпределениеАннотации; - -КонецФункции - Функция НайтиЖелудь(ИмяЖелудя, ПрилепляемыеЧастицы) Экспорт ОпределениеЖелудя = Поделка.ПолучитьОпределениеЖелудя(ИмяЖелудя); @@ -327,7 +267,7 @@ ИндексНапильника = ИнициализируемыеНапильники.Найти(ОпределениеЖелудя.Имя()); ИнициализируемыеНапильники.Удалить(ИндексНапильника); Иначе - Если НЕ ОпределениеЖелудя.ВремениИнициализации() Тогда + Если НЕ ОпределениеЖелудя.Спецификация() = СостоянияПриложения.Инициализация() Тогда Для Каждого ОпределениеНапильника Из ОпределенияНапильников Цикл Если ОпределениеНапильника.Имя() = ОпределениеЖелудя.Имя() Тогда @@ -437,7 +377,7 @@ Прозвища = ПрочитатьПрозвища(Аннотации, ИмяЖелудя); Порядок = ПрочитатьПорядок(Аннотации); Верховный = ПрочитатьПризнакВерховногоЖелудя(Аннотации); - ВремениИнициализации = АннотацияНадКонструктором = "Заготовка"; + Спецификация = ПрочитатьСпецификацию(Аннотации); ОпределениеЖелудя = Новый ОпределениеЖелудя( РазворачивательАннотаций, @@ -449,7 +389,7 @@ Прозвища, Порядок, Верховный, - ВремениИнициализации + Спецификация ); Возврат ОпределениеЖелудя; @@ -576,7 +516,20 @@ КонецФункции Функция ПрочитатьПризнакВерховногоЖелудя(Аннотации) + Возврат РаботаСАннотациями.НайтиАннотацию(Аннотации, "Верховный") <> Неопределено; + +КонецФункции + +Функция ПрочитатьСпецификацию(Аннотации) + + Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Спецификация"); + + ОпределениеАннотации = Поделка.ПолучитьОпределениеАннотации("Спецификация"); + ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация); + + Возврат ОбъектАннотации.Значение(); + КонецФункции Процедура ДобавитьОпределениеНапильника(ОпределениеНапильника, Системный = Ложь) @@ -652,8 +605,7 @@ ОпределенияЖелудейПоПрозвищу = Новый Соответствие(); ИнициализируемыеНапильники = Новый Массив(); - ОпределенияАннотаций = Новый Соответствие(); - + ОпределенияНапильниковПоИмени = Новый Соответствие(); ОпределенияНапильников = Новый Массив(); КонецПроцедуры diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\270\320\273\320\265\320\277\320\273\320\265\320\275\320\270\320\265\320\247\320\260\321\201\321\202\320\270\321\206.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\270\320\273\320\265\320\277\320\273\320\265\320\275\320\270\320\265\320\247\320\260\321\201\321\202\320\270\321\206.os" index dfd9455..e095229 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\270\320\273\320\265\320\277\320\273\320\265\320\275\320\270\320\265\320\247\320\260\321\201\321\202\320\270\321\206.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\270\320\273\320\265\320\277\320\273\320\265\320\275\320\270\320\265\320\247\320\260\321\201\321\202\320\270\321\206.os" @@ -1,3 +1,5 @@ +#Использовать annotations + Функция ДанныеОПрилепляемойЧастице(Свойство, Знач ИмяСвойства = Неопределено) Экспорт Если ИмяСвойства = Неопределено Тогда diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\321\201\321\202\320\276\321\217\320\275\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\321\201\321\202\320\276\321\217\320\275\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index 2ce039d..cc22e9a 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\321\201\321\202\320\276\321\217\320\275\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\321\201\321\202\320\276\321\217\320\275\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -1,3 +1,5 @@ +Перем Значения; + Функция Инициализация() Экспорт Возврат "Инициализация"; КонецФункции @@ -5,3 +7,14 @@ Функция Выполнение() Экспорт Возврат "Выполнение"; КонецФункции + +Функция Значения() Экспорт + Возврат Значения; +КонецФункции + +Значения = Новый Массив; + +Значения.Добавить(Инициализация()); +Значения.Добавить(Выполнение()); + +Значения = Новый ФиксированныйМассив(Значения); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270.os" deleted file mode 100644 index 7e34738..0000000 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270.os" +++ /dev/null @@ -1,260 +0,0 @@ -#Область ОписаниеПеременных - -// Имя аннотации -Перем Имя; - -// Имя типа, к которому применяется аннотация -Перем ИмяТипаАннотации; - -// Параметры аннотации -Перем Параметры; - -// Подчиненные аннотации -Перем Аннотации; - -#КонецОбласти - -#Область ПрограммныйИнтерфейс - -// Имя аннотации. -// -// Возвращаемое значение: -// Строка -// -Функция Имя() Экспорт - Возврат Имя; -КонецФункции - -// Имя типа, к которому применяется аннотация. -// -// Возвращаемое значение: -// Строка -// -Функция ИмяТипаАннотации() Экспорт - Возврат ИмяТипаАннотации; -КонецФункции - -// Параметры аннотации - разобранные параметры конструктора класса аннотации. -// Метод возвращает копию таблицы. -// -// Возвращаемое значение: -// ТаблицаЗначений - таблица параметров аннотации: -// * Имя - Строка - Имя параметра. -// * ПоЗначению - Булево - Признак получения пораметра по значению. -// * ЕстьЗначениеПоУмолчанию - Булево - Признак наличия значения по умолчанию. -// * ЗначениеПоУмолчанию - Произвольный - Значение по умолчанию. -// * Аннотации - ТаблицаЗначений - Таблица аннотаций со следующими колонками: -// ** Имя - Строка - Имя аннотации. -// ** Параметры - ТаблицаЗначений - Таблица параметров аннотации: -// *** Имя - Строка - Имя параметра аннотации. -// *** Значение - Строка - Значение параметра аннотации. -// * Экспорт - Булево - Признак экспорта параметра. -// -Функция Параметры() Экспорт - Возврат Параметры.Скопировать(); -КонецФункции - -// Подчиненные аннотации - список аннотаций над конструктором класса-аннотации. -// Метот возвращает глубокую копию таблицы. -// -// Возвращаемое значение: -// ТаблицаЗначений - Таблица аннотаций: -// * Имя - Строка - Имя аннотации. -// * Параметры - ТаблицаЗначений - Таблица параметров аннотации: -// ** Имя - Строка - Имя параметра аннотации. -// ** Значение - Строка - Значение параметра аннотации. -// -Функция Аннотации() Экспорт - КопияАннотации = Аннотации.Скопировать(); - Для Каждого Аннотация Из КопияАннотации Цикл - Аннотация.Параметры = Аннотация.Параметры.Скопировать(); - КонецЦикла; - Возврат КопияАннотации; -КонецФункции - -// Выполнить проверку корректности аннотации. -// -// Выбрасывает исключение: -// * Когда аннотация не содержит параметр, у которого нет значения по умолчанию. -// * Когда аннотация содержит параметр, которого нет в списке параметров аннотации. -// * Когда аннотация содержит несколько параметров без имени или с именем "Значение". -// -// Параметры: -// Аннотация - СтрокаТаблицыЗначений - Данные аннотации: -// * Имя - Строка - Имя аннотации. -// * Параметры - ТаблицаЗначений - Таблица параметров аннотации: -// ** Имя - Строка - Имя параметра аннотации. -// ** Значение - Строка - Значение параметра аннотации. -// ИмяТипаСАннотацией - Строка - Имя типа, к которому применяется аннотация. -// -Процедура Проверить(Аннотация, ИмяТипаСАннотацией) Экспорт - - ПривестиИменаПараметров(Аннотация); - - АннотацияСодержитОбязательныеПараметры(Аннотация, ИмяТипаСАннотацией); - АннотацияСодержитМаксимумОдинПараметрСИменемПоУмолчанию(Аннотация, ИмяТипаСАннотацией); - АннотацияНеСодержитНеизвестныеПараметры(Аннотация, ИмяТипаСАннотацией); - ПовторяемыеПараметрыЗаданыКорректно(Аннотация, ИмяТипаСАннотацией); - -КонецПроцедуры - -// Создать объект класса аннотации по параметрам аннотации. -// -// Параметры: -// Аннотация - СтрокаТаблицыЗначений - Данные аннотации: -// * Имя - Строка - Имя аннотации. -// * Параметры - ТаблицаЗначений - Таблица параметров аннотации: -// ** Имя - Строка - Имя параметра аннотации. -// ** Значение - Строка - Значение параметра аннотации. -// -// Возвращаемое значение: -// Произвольный - Объект аннотации с заданными параметрами. -// -Функция СоздатьОбъектАннотации(Аннотация) Экспорт - - ПараметрыКонструктора = Новый Массив; - Для Каждого Параметр Из Параметры() Цикл - - Если Параметр.Повторяемый Тогда - ЗначениеПараметра = РаботаСАннотациями.ПолучитьЗначенияПараметраАннотации(Аннотация, Параметр.Имя); - Иначе - ЗначениеПараметра = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( - Аннотация, - Параметр.Имя, - Параметр.ЗначениеПоУмолчанию, - Истина - ); - КонецЕсли; - ПараметрыКонструктора.Добавить(ЗначениеПараметра); - КонецЦикла; - - ОбъектАннотации = Новый(ИмяТипаАннотации(), ПараметрыКонструктора); - - Возврат ОбъектАннотации; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ПривестиИменаПараметров(Аннотация) - - Для Каждого ПараметрАннотации Из Аннотация.Параметры Цикл - Если ПараметрАннотации.Имя = Неопределено Тогда - ПараметрАннотации.Имя = "Значение"; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Процедура АннотацияСодержитОбязательныеПараметры(Аннотация, ИмяТипаСАннотацией) - - Для Каждого ОпределениеПараметраАннотации Из Параметры Цикл - - ПараметрВложеннойАннотации = Аннотация.Параметры.Найти(ОпределениеПараметраАннотации.Имя, "Имя"); - Если НЕ ОпределениеПараметраАннотации.ЕстьЗначениеПоУмолчанию - И ПараметрВложеннойАннотации = Неопределено Тогда - - ВызватьИсключение СтрШаблон( - "Аннотация %1 в классе %2 не содержит параметр %3", - Аннотация.Имя, - ИмяТипаСАннотацией, - ОпределениеПараметраАннотации.Имя - ); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура АннотацияСодержитМаксимумОдинПараметрСИменемПоУмолчанию(Аннотация, ИмяТипаСАннотацией) - - КоличествоПараметровСИменемПоУмолчанию = 0; - Для Каждого ПараметрАннотации Из Аннотация.Параметры Цикл - - ИмяПараметраВложеннойАннотации = ПараметрАннотации.Имя; - Если ВРег(ИмяПараметраВложеннойАннотации) = ВРег("Значение") Тогда - КоличествоПараметровСИменемПоУмолчанию = КоличествоПараметровСИменемПоУмолчанию + 1; - КонецЕсли; - - // Аннотация содержит только один параметр с именем по умолчанию - Если КоличествоПараметровСИменемПоУмолчанию > 1 Тогда - ВызватьИсключение СтрШаблон( - "Аннотация %1 в классе %2 имеет более одного параметра без имени или с именем ""Значение""", - Аннотация.Имя, - ИмяТипаСАннотацией - ); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура АннотацияНеСодержитНеизвестныеПараметры(Аннотация, ИмяТипаСАннотацией) - - Для Каждого ПараметрАннотации Из Аннотация.Параметры Цикл - - ИмяПараметраВложеннойАннотации = ПараметрАннотации.Имя; - ОпределениеПараметраАннотации = Параметры.Найти(ИмяПараметраВложеннойАннотации, "Имя"); - - Если ОпределениеПараметраАннотации = Неопределено Тогда - ВызватьИсключение СтрШаблон( - "Аннотация %1 в классе %2 содержит неизвестный параметр %3", - Аннотация.Имя, - ИмяТипаСАннотацией, - ИмяПараметраВложеннойАннотации - ); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура ПовторяемыеПараметрыЗаданыКорректно(Аннотация, ИмяТипаСАннотацией) - - ИмяАннотацииПовторяемый = "Повторяемый"; - - Для Каждого Параметр Из Параметры Цикл - ЭтоПовторяемыйПараметр = РаботаСАннотациями.ПолучитьАннотацию(Параметр, ИмяАннотацииПовторяемый) <> Неопределено; - ПараметрыАннотации = РаботаСАннотациями.ПолучитьПараметрыАннотации(Аннотация, Параметр.Имя); - - Если ПараметрыАннотации.Количество() > 1 И НЕ ЭтоПовторяемыйПараметр Тогда - ВызватьИсключение СтрШаблон( - "Аннотация %1 в классе %2 содержит несколько значений параметра %3, но параметр не помечен аннотацией ""%4""", - Аннотация.Имя, - ИмяТипаСАннотацией, - Параметр.Имя, - ИмяАннотацииПовторяемый - ); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Процедура ОпределитьПовторяемостьПараметров() - - Параметры.Колонки.Добавить("Повторяемый"); - - Для Каждого Параметр Из Параметры Цикл - Параметр.Повторяемый = НЕ РаботаСАннотациями.НайтиАннотацию(Параметр.Аннотации, "повторяемый") = Неопределено; - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти - -#Область Инициализация - -Процедура ПриСозданииОбъекта(Знач _Имя, Знач _ИмяТипаАннотации, Знач _Параметры, Знач _Аннотации) - - Имя = _Имя; - ИмяТипаАннотации = _ИмяТипаАннотации; - Аннотации = _Аннотации; - Параметры = _Параметры; - - ОпределитьПовторяемостьПараметров(); - -КонецПроцедуры - -#КонецОбласти \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\226\320\265\320\273\321\203\320\264\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\226\320\265\320\273\321\203\320\264\321\217.os" index c1ffc33..2a92608 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\226\320\265\320\273\321\203\320\264\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\226\320\265\320\273\321\203\320\264\321\217.os" @@ -1,3 +1,5 @@ +#Использовать "../internal" +#Использовать annotations #Использовать asserts Перем _Имя; @@ -8,7 +10,7 @@ Перем _Прозвища; Перем _Верховный; Перем _Порядок; -Перем _ВремениИнициализации; +Перем _Спецификация; Перем _РефлекторОбъекта; Перем _РазворачивательАннотаций; @@ -56,8 +58,8 @@ Возврат _Верховный; КонецФункции -Функция ВремениИнициализации() Экспорт - Возврат _ВремениИнициализации; +Функция Спецификация() Экспорт + Возврат _Спецификация; КонецФункции Функция Свойства() Экспорт @@ -96,7 +98,7 @@ Прозвища, Порядок, Верховный, - ВремениИнициализации + Спецификация ) Ожидаем.Что(РазворачивательАннотаций).ИмеетТип("РазворачивательАннотаций"); Ожидаем.Что(ТипЖелудя).ИмеетТип("Тип"); @@ -109,8 +111,20 @@ Ожидаем.Что(Прозвища.Количество()).Больше(0); Ожидаем.Что(Порядок).ИмеетТип("Число"); Ожидаем.Что(Верховный).ИмеетТип("Булево"); - Ожидаем.Что(ВремениИнициализации).ИмеетТип("Булево"); + Ожидаем.Что(Спецификация).ИмеетТип("Строка"); + Если Спецификация = СостоянияПриложения.Инициализация() Тогда + ТекстСообщения = СтрШаблон( + "К желудю времени инициализации %1 можно прилеплять только детальки.", + Имя + ); + Для Каждого ПрилепляемаяЧастица Из ПрилепляемыеЧастицы Цикл + Если (ПрилепляемаяЧастица.ТипЧастицы() <> ТипыПрилепляемыхЧастиц.Деталька()) И (ПрилепляемаяЧастица.ИмяЧастицы() <> "Поделка") Тогда + ВызватьИсключение ТекстСообщения; + КонецЕсли; + КонецЦикла; + КонецЕсли; + _Имя = Имя; _ТипЖелудя = ТипЖелудя; _Характер = Характер; @@ -119,7 +133,7 @@ _Прозвища = Прозвища; _Порядок = Порядок; _Верховный = Верховный; - _ВремениИнициализации = ВремениИнициализации; + _Спецификация = Спецификация; _РазворачивательАннотаций = РазворачивательАннотаций; _РефлекторОбъекта = Новый РефлекторОбъекта(ТипЖелудя); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" index 4deae79..28498af 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" @@ -1,4 +1,5 @@ #Использовать "../internal" +#Использовать annotations #Использовать configor #Использовать logos #Использовать semaphore @@ -6,7 +7,7 @@ #Область ОписаниеПеременных Перем ИнициализированныеЖелудиОдиночки; -Перем РазворачивательАннотаций; +Перем КонтейнерАннотаций; Перем ФабрикаЖелудей; Перем СостояниеПриложения; Перем НапильникиБылиПроинициализированы; @@ -20,12 +21,22 @@ #Область РаботаСЖелудями -Функция ПолучитьОпределенияЖелудей() Экспорт - Возврат ФабрикаЖелудей.ПолучитьОпределенияЖелудей(); +Функция ПолучитьОпределенияЖелудей(Имя = Неопределено) Экспорт + Если Имя = Неопределено Тогда + Возврат ФабрикаЖелудей.ПолучитьОпределенияЖелудей(); + Иначе + ОпределенияЖелудей = Новый Соответствие(); + СписокОпределенийЖелудей = ФабрикаЖелудей.ПолучитьСписокОпределенийЖелудей(Имя); + Для Каждого ОпределениеЖелудя Из СписокОпределенийЖелудей Цикл + ОпределенияЖелудей.Вставить(ОпределениеЖелудя.Имя(), ОпределениеЖелудя); + КонецЦикла; + + Возврат Новый ФиксированноеСоответствие(ОпределенияЖелудей); + КонецЕсли; КонецФункции Функция ПолучитьОпределенияАннотаций() Экспорт - Возврат ФабрикаЖелудей.ПолучитьОпределенияАннотаций(); + Возврат КонтейнерАннотаций.ПолучитьОпределенияАннотаций(); КонецФункции Функция ПолучитьОпределениеЖелудя(Имя) Экспорт @@ -33,7 +44,7 @@ КонецФункции Функция ПолучитьОпределениеАннотации(Имя) Экспорт - Возврат ФабрикаЖелудей.ПолучитьОпределениеАннотации(Имя); + Возврат КонтейнерАннотаций.ПолучитьОпределениеАннотации(Имя); КонецФункции Функция НайтиЖелудь(Имя, ПрилепляемыеЧастицы = Неопределено) Экспорт @@ -49,7 +60,7 @@ ВызватьИсключение СтрШаблон("Не удалось получить определение Желудя по имени Желудя %1", Имя); КонецЕсли; - Если НЕ ОпределениеЖелудя.ВремениИнициализации() Тогда + Если НЕ ОпределениеЖелудя.Спецификация() = СостоянияПриложения.Инициализация() Тогда ПроверитьСостояниеВыполнение(); Если НЕ НапильникиБылиПроинициализированы Тогда @@ -187,7 +198,7 @@ Функция ДобавитьАннотацию(Тип) Экспорт ПроверитьСостояниеИнициализация(); - ФабрикаЖелудей.ДобавитьАннотацию(Тип); + КонтейнерАннотаций.ДобавитьАннотацию(Тип); Возврат ЭтотОбъект; @@ -195,6 +206,8 @@ Функция ПросканироватьКаталог(Каталог) Экспорт + РазворачивательАннотаций = КонтейнерАннотаций.ПолучитьРазворачивательАннотаций(); + Файлы = НайтиФайлы(Каталог, "*.os", Истина); // Двойной проход по файлам для предварительного добавления аннотаций, которые могут быть нужны @@ -330,40 +343,43 @@ КонецПроцедуры Процедура ПриСозданииОбъекта(Знач СоветДругогоМастера = Неопределено) + Если СоветДругогоМастера = Неопределено Тогда СоветДругогоМастера = Новый СоветДругогоМастера(); КонецЕсли; - РазворачивательАннотаций = Новый РазворачивательАннотаций(ЭтотОбъект); + КонтейнерАннотаций = Новый КонтейнерАннотаций(); + РазворачивательАннотаций = КонтейнерАннотаций.ПолучитьРазворачивательАннотаций(); ФабрикаЖелудей = Новый ФабрикаЖелудей(ЭтотОбъект, РазворачивательАннотаций); ИнициализированныеЖелудиОдиночки = Новый Соответствие(); СостояниеПриложения = СостоянияПриложения.Инициализация(); НапильникиБылиПроинициализированы = Ложь; - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияАннотация")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияПорядок")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияПрозвище")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияВерховный")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияХарактер")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияПластилин")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияДеталька")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияБлестяшка")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияТабакерка")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияФинальныйШтрих")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияЖелудь")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияДуб")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияЗавязь")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияНапильник")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияЗаготовка")); - ФабрикаЖелудей.ДобавитьАннотацию(Тип("АннотацияРогатка")); - + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияПорядок")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияПрозвище")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияВерховный")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияХарактер")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияСпецификация")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияПластилин")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияДеталька")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияБлестяшка")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияТабакерка")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияФинальныйШтрих")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияЖелудь")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияДуб")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияЗавязь")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияНапильник")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияЗаготовка")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияРогатка")); + ФабрикаЖелудей.ДобавитьСистемныйНапильник(Тип("ОбработкаНапильникомПластилинаНаПолях")); ФабрикаЖелудей.ДобавитьСистемныйНапильник(Тип("ОбработкаНапильникомФинальныйШтрих")); - ФабрикаЖелудей.ДобавитьЖелудь(Тип("РазворачивательАннотаций"), "РазворачивательАннотаций"); - ФабрикаЖелудей.ДобавитьЖелудь(Тип("ЗапускательПриложения"), "ЗапускательПриложения"); + ФабрикаЖелудей.ДобавитьДуб(Тип("СлужебныйДубОсени")); + ФабрикаЖелудей.ДобавитьЖелудь(Тип("ЗапускательПриложения"), "ЗапускательПриложения"); + Лог = Логирование.ПолучитьЛог("oscript.lib.autumn.application.context"); МенеджерПараметров = Новый МенеджерПараметров(); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\262\320\276\321\200\320\260\321\207\320\270\320\262\320\260\321\202\320\265\320\273\321\214\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\262\320\276\321\200\320\260\321\207\320\270\320\262\320\260\321\202\320\265\320\273\321\214\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\271.os" deleted file mode 100644 index 4f4c9b1..0000000 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\262\320\276\321\200\320\260\321\207\320\270\320\262\320\260\321\202\320\265\320\273\321\214\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\271.os" +++ /dev/null @@ -1,114 +0,0 @@ -// Поделка - Управляющий ioc-контейнер. -Перем _Поделка; -// Рефлектор - стандартный рефлектор OneScript. -Перем _Рефлектор; - -// Развернуть все аннотации переданного свойства рекурсивно. -// Для разворачивания используются данные из определений аннотаций. -// -// Параметры: -// Свойство - Структура - Описание свойства, метода или параметра метода: -// * Аннотации - ТаблицаЗначений - Таблица аннотаций свойства: -// ** Имя - Строка - Имя аннотации. -// ** Параметры - ТаблицаЗначений - Таблица параметров аннотации: -// *** Имя - Строка - Имя параметра аннотации. -// *** Значение - Строка - Значение параметра аннотации. -// ТипВладельцаСвойства - Тип - Тип владельца свойства. -// -Процедура РазвернутьАннотацииСвойства(Свойство, ТипВладельцаСвойства) Экспорт - - ОпределенияАннотаций = _Поделка.ПолучитьОпределенияАннотаций(); - Аннотации = Свойство.Аннотации; - НакопленныеАннотации = Свойство.Аннотации.СкопироватьКолонки(); - - РазвернутьАннотации(ОпределенияАннотаций, Аннотации, НакопленныеАннотации, ТипВладельцаСвойства, Свойство); - - Свойство.Аннотации = НакопленныеАннотации; - -КонецПроцедуры - -// Развернуть все аннотации переданного свойства рекурсивно. -// Для разворачивания используются данные из определений аннотаций. -// -// Параметры: -// Свойства - Массив Из Структура - Описания свойств, методов или параметров метода: -// * Аннотации - ТаблицаЗначений - Таблица аннотаций свойства: -// ** Имя - Строка - Имя аннотации. -// ** Параметры - ТаблицаЗначений - Таблица параметров аннотации: -// *** Имя - Строка - Имя параметра аннотации. -// *** Значение - Строка - Значение параметра аннотации. -// ТипВладельцаСвойств - Тип - Тип владельца свойств. -// -Процедура РазвернутьАннотацииСвойств(Свойства, ТипВладельцаСвойств) Экспорт - - Для Каждого Свойство Из Свойства Цикл - РазвернутьАннотацииСвойства(Свойство, ТипВладельцаСвойств); - КонецЦикла; - -КонецПроцедуры - -Процедура РазвернутьАннотации( - ОпределенияАннотаций, - Аннотации, - НакопленныеАннотации, - ТипВладельцаСвойств, - Свойство, - УровеньВложенности = 1 -) - - Для Каждого Аннотация Из Аннотации Цикл - - ЭтоКорневаяАннотация = НРег(Аннотация.Имя) = НРег("Аннотация"); - - Если НЕ ЭтоКорневаяАннотация Тогда - НоваяАннотация = НакопленныеАннотации.Добавить(); - НоваяАннотация.Имя = Аннотация.Имя; - - НоваяАннотация.Параметры = Аннотация.Параметры.Скопировать(); - КонецЕсли; - - ОпределениеАннотации = ОпределенияАннотаций.Получить(НРег(Аннотация.Имя)); - - Если ОпределениеАннотации = Неопределено Тогда - Продолжить; - КонецЕсли; - - ПодчиненныеАннотации = ОпределениеАннотации.Аннотации(); - - // Проверяем только аннотации на самом верхнем уровне вложенности, - // т.к. остальные проверяются при регистрации аннотации. - Если УровеньВложенности = 1 Тогда - ОпределениеАннотации.Проверить(Аннотация, ТипВладельцаСвойств); - КонецЕсли; - - ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация); - - Если _Рефлектор.МетодСуществует(ОбъектАннотации, "ПриРазворачиванииАннотации") Тогда - ОбъектАннотации.ПриРазворачиванииАннотации( - ОпределениеАннотации, - ПодчиненныеАннотации, - ТипВладельцаСвойств, - Свойство - ); - КонецЕсли; - - Если НЕ ЭтоКорневаяАннотация Тогда - РазвернутьАннотации( - ОпределенияАннотаций, - ПодчиненныеАннотации, - НакопленныеАннотации, - ТипВладельцаСвойств, - Свойство, - УровеньВложенности + 1 - ); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -&Желудь -Процедура ПриСозданииОбъекта(&Пластилин Поделка) - _Поделка = Поделка; - _Рефлектор = Новый Рефлектор(); -КонецПроцедуры \ No newline at end of file diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\274\320\270.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\274\320\270.os" deleted file mode 100644 index 455103d..0000000 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\274\320\270.os" +++ /dev/null @@ -1,156 +0,0 @@ -#Использовать fluent - -Функция ПолучитьАннотацию(Свойство, ИмяАннотации) Экспорт - Аннотация = ОтфильтроватьПервуюАннотациюПоИмени(Свойство.Аннотации, ИмяАннотации); - Возврат Аннотация; -КонецФункции - -Функция НайтиАннотацию(Аннотации, ИмяАннотации) Экспорт - Возврат ОтфильтроватьПервуюАннотациюПоИмени(Аннотации, ИмяАннотации); -КонецФункции - -Функция ПолучитьАннотации(Свойство, ИмяАннотации) Экспорт - Аннотации = ОтфильтроватьАннотацииПоИмени(Свойство.Аннотации, ИмяАннотации); - Возврат Аннотации; -КонецФункции - -Функция НайтиАннотации(Аннотации, ИмяАннотации) Экспорт - Возврат ОтфильтроватьАннотацииПоИмени(Аннотации, ИмяАннотации); -КонецФункции - -Функция НайтиМетодыСАннотацией(Методы, ИмяАннотации) Экспорт - - Результат = Новый Массив(); - - Для Каждого Метод Из Методы Цикл - - Если Метод.Аннотации = Неопределено Тогда - Продолжить; - КонецЕсли; - - Для Каждого Аннотация Из Метод.Аннотации Цикл - - Если НРег(Аннотация.Имя) = Нрег(ИмяАннотации) Тогда - Результат.Добавить(Метод); - КонецЕсли; - - КонецЦикла; - - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция ОтфильтроватьАннотацииПоИмени(Аннотации, ИмяАннотации) - Массив = Новый Массив(); - Для каждого Элемент Из Аннотации Цикл - Если ВРег(Элемент.Имя) = ВРег(ИмяАннотации) Тогда - Массив.Добавить(Элемент); - КонецЕсли; - КонецЦикла; - Возврат Массив; -КонецФункции - -Функция ОтфильтроватьПервуюАннотациюПоИмени(Аннотации, ИмяАннотации) - Для каждого Элемент Из Аннотации Цикл - Если ВРег(Элемент.Имя) = ВРег(ИмяАннотации) Тогда - Возврат Элемент; - КонецЕсли; - КонецЦикла; - Возврат Неопределено; -КонецФункции - -Функция ПолучитьЗначенияПараметраАннотации(Аннотация, ИмяПараметра) Экспорт - - ПараметрыАннотации = ПолучитьПараметрыАннотации(Аннотация, ИмяПараметра); - МассивПараметров = Новый Массив(); - - Если ПараметрыАннотации.Количество() > 0 Тогда - Для каждого ТекПараметр Из ПараметрыАннотации Цикл - МассивПараметров.Добавить(ТекПараметр.Значение); - КонецЦикла; - КонецЕсли; - - Возврат МассивПараметров; -КонецФункции - -Функция ПолучитьЗначениеПараметраАннотации( - Аннотация, - ИмяПараметра = "Значение", - ЗначениеПоУмолчанию = Неопределено, - НеопределеноЭтоКорректноеЗначениеПараметра = Ложь -) Экспорт - - ИмяПараметраПоУмолчанию = "Значение"; - - Если Аннотация = Неопределено ИЛИ Аннотация.Параметры = Неопределено ИЛИ Аннотация.Параметры.Количество() = 0 Тогда - Возврат ЗначениеПоУмолчанию; - КонецЕсли; - - ПараметрАннотации = ПолучитьПараметрАннотации(Аннотация, ИмяПараметра); - - Если ПараметрАннотации <> Неопределено Тогда - Возврат ПараметрАннотации.Значение; - КонецЕсли; - - ЭтоПараметрПоУмолчанию = ИмяПараметра = ИмяПараметраПоУмолчанию; - АннотацияСодержитБольшеОдногоПараметра = Аннотация.Параметры.Количество() > 1; - ЗначениеПараметраПередано = ЗначениеПоУмолчанию <> Неопределено ИЛИ НеопределеноЭтоКорректноеЗначениеПараметра; - Если ЭтоПараметрПоУмолчанию И АннотацияСодержитБольшеОдногоПараметра И НЕ ЗначениеПараметраПередано Тогда - Сообщение = СтрШаблон( - "Аннотация %1 содержит несколько параметров, среди которых нет явного указания имени параметра ""%2""", - Аннотация.Имя, - ИмяПараметраПоУмолчанию - ); - ВызватьИсключение Сообщение; - ИначеЕсли ЭтоПараметрПоУмолчанию И Аннотация.Параметры[0].Имя = Неопределено Тогда - Возврат Аннотация.Параметры[0].Значение; - ИначеЕсли ЗначениеПоУмолчанию <> Неопределено ИЛИ НеопределеноЭтоКорректноеЗначениеПараметра Тогда - Возврат ЗначениеПоУмолчанию; - Иначе - Сообщение = СтрШаблон("Не найден параметр аннотации %1", ИмяПараметра); - ВызватьИсключение Сообщение; - КонецЕсли; - -КонецФункции - -Процедура УстановитьЗначениеПараметраАннотации(Аннотация, ИмяПараметра, ЗначениеПараметра) Экспорт - Параметр = Аннотация.Параметры.Найти(ИмяПараметра, "Имя"); - Если Параметр = Неопределено Тогда - Параметр = Аннотация.Параметры.Добавить(); - Параметр.Имя = ИмяПараметра; - КонецЕсли; - Параметр.Значение = ЗначениеПараметра; -КонецПроцедуры - -Функция ПолучитьПараметрАннотации(Аннотация, ИмяПараметра) Экспорт - Для каждого Элемент Из Аннотация.Параметры Цикл - ИмяЭлемента = Элемент.Имя; - Если ИмяЭлемента = Неопределено Тогда - ИмяЭлемента = "Значение"; - КонецЕсли; - Если ВРег(ИмяЭлемента) = ВРег(ИмяПараметра) Тогда - Возврат Элемент; - КонецЕсли; - КонецЦикла; - Возврат Неопределено; -КонецФункции - -Функция ПолучитьПараметрыАннотации(Аннотация, ИмяПараметра) Экспорт - - Результат = Новый Массив; - - Для каждого Элемент Из Аннотация.Параметры Цикл - ИмяЭлемента = Элемент.Имя; - Если ИмяЭлемента = Неопределено Тогда - ИмяЭлемента = "Значение"; - КонецЕсли; - Если ВРег(ИмяЭлемента) = ВРег(ИмяПараметра) Тогда - Результат.Добавить(Элемент); - КонецЕсли; - КонецЦикла; - - Возврат Результат; - -КонецФункции \ No newline at end of file diff --git "a/tests/\320\222\320\275\320\265\321\210\320\275\320\265\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" "b/tests/\320\222\320\275\320\265\321\210\320\275\320\265\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" index dac6c11..675956a 100644 --- "a/tests/\320\222\320\275\320\265\321\210\320\275\320\265\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" +++ "b/tests/\320\222\320\275\320\265\321\210\320\275\320\265\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" @@ -105,7 +105,7 @@ Ожидаем .Что(Поделка) .Метод("ДобавитьЗаготовку", ПараметрыМетода) - .ВыбрасываетИсключение("К заготовке могут прилепляться только детальки."); + .ВыбрасываетИсключение("К желудю времени инициализации ЗаготовкаСПластилином можно прилеплять только детальки."); КонецПроцедуры diff --git "a/tests/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" "b/tests/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" index 4c3244b..ee96584 100644 --- "a/tests/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" +++ "b/tests/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" @@ -1088,3 +1088,60 @@ Ожидаем.Что(Желудь.Массив[1]).Равно("2"); КонецПроцедуры + +&Тест +Процедура ВсеОпределенияЖелудейПолучаютсяКорректно() Экспорт + + // Дано + Поделка = Новый Поделка(); + Поделка + .ДобавитьЖелудь(Тип("Желудь1")) + .ДобавитьЖелудь(Тип("Желудь3")) + .ЗапуститьПриложение(); + + // Когда + ОпределенияЖелудей = Поделка.ПолучитьОпределенияЖелудей(); + + // Тогда + Ожидаем + .Что(ОпределенияЖелудей.Количество(), "Не удалось получить список определений желудей") + .Больше(0); + + Ожидаем + .Что(ОпределенияЖелудей.Получить("ТестовыйЖелудь"), "Не удалось найти определение ТестовыйЖелудь") + .Не_().Равно(Неопределено); + + Ожидаем + .Что(ОпределенияЖелудей.Получить("Желудь3"), "Не удалось найти определение Желудь1") + .Не_().Равно(Неопределено); + +КонецПроцедуры + + +&Тест +Процедура ОпределенияЖелудейПоПрозвищуПолучаютсяКорректно() Экспорт + + // Дано + Поделка = Новый Поделка(); + Поделка + .ДобавитьЖелудь(Тип("Желудь1")) + .ДобавитьЖелудь(Тип("Желудь3")) + .ЗапуститьПриложение(); + + // Когда + ОпределенияЖелудей = Поделка.ПолучитьОпределенияЖелудей("Кругляш"); + + // Тогда + Ожидаем + .Что(ОпределенияЖелудей.Количество(), "Не удалось получить список определений желудей") + .Больше(0); + + Ожидаем + .Что(ОпределенияЖелудей.Получить("ТестовыйЖелудь"), "Не удалось найти определение ТестовыйЖелудь") + .Не_().Равно(Неопределено); + + Ожидаем + .Что(ОпределенияЖелудей.Получить("Желудь3"), "Не удалось найти определение Желудь1") + .Не_().Равно(Неопределено); + +КонецПроцедуры