Skip to content

Commit

Permalink
Добавлена догрузка типов в момент старта приложения, для регистрации …
Browse files Browse the repository at this point in the history
…жителей леса которые были динамически зарегистрированы в системе типов заготовками
  • Loading branch information
sfaqer committed Oct 21, 2023
1 parent 2634ab3 commit d743fa4
Show file tree
Hide file tree
Showing 3 changed files with 142 additions and 122 deletions.
1 change: 1 addition & 0 deletions packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
.ЗависитОт("fluent", "0.5.0")
.ЗависитОт("reflector", "0.7.1")
.ЗависитОт("semaphore", "1.1.0")
.ЗависитОт("collectionos", "0.3.0")

.РазработкаЗависитОт("1testrunner")
.РазработкаЗависитОт("asserts")
Expand Down
136 changes: 136 additions & 0 deletions src/internal/Классы/Осенизатор.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
#Использовать collectionos
#Использовать annotations

#Область ОписаниеПеременных

Перем ФабрикаЖелудей;
Перем КонтейнерАннотаций;
Перем Поделка;
Перем СистемныеНапильники;
Перем ПросканированныеТипы;
Перем Рефлектор;

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

Процедура ПросканироватьИзвестныеТипы() Экспорт

ПросканироватьТипы(
Рефлектор.ИзвестныеТипы(Новый Структура("Пользовательский", Истина))
.ВыгрузитьКолонку("Значение")
);

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ПросканироватьТипы(Типы)

РазворачивательАннотаций = КонтейнерАннотаций.ПолучитьРазворачивательАннотаций();

// Двойной проход по типам для предварительного добавления аннотаций, которые могут быть нужны
// для добавления остальных типов желудей.
Для Каждого ТипЖелудя Из Типы Цикл

Если ПросканированныеТипы.Содержит(ТипЖелудя) Тогда
Продолжить;
КонецЕсли;

Методы = Рефлектор.ПолучитьТаблицуМетодов(ТипЖелудя);

Если РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Аннотация").Количество() > 0 Тогда
ДобавитьАннотацию(ТипЖелудя);
ПросканированныеТипы.Добавить(ТипЖелудя);
КонецЕсли;

КонецЦикла;

Для Каждого ТипЖелудя Из Типы Цикл

Если ПросканированныеТипы.Содержит(ТипЖелудя) Тогда
Продолжить;
КонецЕсли;

Методы = Рефлектор.ПолучитьТаблицуМетодов(ТипЖелудя);

Если РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Аннотация").Количество() > 0 Тогда
Продолжить;
КонецЕсли;

РазворачивательАннотаций.РазвернутьАннотацииСвойств(Методы, ТипЖелудя);

Если РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Желудь").Количество() > 0 Тогда
ДобавитьЖелудь(ТипЖелудя);
ИначеЕсли РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Дуб").Количество() > 0 Тогда
ДобавитьДуб(ТипЖелудя);
ИначеЕсли РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Напильник").Количество() > 0 Тогда
ДобавитьНапильник(ТипЖелудя);
ИначеЕсли РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Рогатка").Количество() > 0 Тогда
ДобавитьРогатку(ТипЖелудя);
ИначеЕсли РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Заготовка").Количество() > 0 Тогда
ДобавитьЗаготовку(ТипЖелудя);
Иначе // BSLLS:EmptyCodeBlock-off
// no-op
КонецЕсли;

ПросканированныеТипы.Добавить(ТипЖелудя);

КонецЦикла;

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

Процедура ДобавитьЖелудь(Тип, Имя = "")
ФабрикаЖелудей.ДобавитьЖелудь(Тип, Имя);
КонецПроцедуры

Процедура ДобавитьДуб(Тип)
ФабрикаЖелудей.ДобавитьДуб(Тип);
КонецПроцедуры

Процедура ДобавитьНапильник(Тип)

Если СистемныеНапильники.Содержит(Тип) Тогда
ФабрикаЖелудей.ДобавитьСистемныйНапильник(Тип);
Иначе
ФабрикаЖелудей.ДобавитьНапильник(Тип);
КонецЕсли;

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

Процедура ДобавитьЗаготовку(Тип)

ОпределениеЗаготовки = ФабрикаЖелудей.ДобавитьЗаготовку(Тип);

Заготовка = Поделка.НайтиЖелудь(ОпределениеЗаготовки.Имя());
Заготовка.ПриИнициализацииПоделки(Поделка);

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

Процедура ДобавитьРогатку(Тип)
ФабрикаЖелудей.ДобавитьРогатку(Тип);
КонецПроцедуры

Процедура ДобавитьАннотацию(Тип)
КонтейнерАннотаций.ДобавитьАннотацию(Тип);
КонецПроцедуры

#КонецОбласти

Процедура ПриСозданииОбъекта(пПоделка, пФабрикаЖелудей, пКонтейнерАннотаций)

ФабрикаЖелудей = пФабрикаЖелудей;
КонтейнерАннотаций = пКонтейнерАннотаций;
Поделка = пПоделка;

СистемныеНапильники = Новый МножествоСоответствие;
СистемныеНапильники.Добавить(Тип("ОбработкаНапильникомПластилинаНаПолях"));
СистемныеНапильники.Добавить(Тип("ОбработкаНапильникомФинальныйШтрих"));

ПросканированныеТипы = Новый МножествоСоответствие;

Рефлектор = Новый Рефлектор;

КонецПроцедуры
127 changes: 5 additions & 122 deletions src/Классы/Поделка.os
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
Перем ФабрикаЖелудей;
Перем СостояниеПриложения;
Перем НапильникиБылиПроинициализированы;
Перем СистемныеНапильники;
Перем Осенизатор;

Перем Лог;
Перем МенеджерПараметров;
Expand Down Expand Up @@ -192,7 +192,7 @@
Процедура ЗапуститьПриложение() Экспорт

ПроверитьСостояниеИнициализация();

Осенизатор.ПросканироватьИзвестныеТипы();
СостояниеПриложения = СостоянияПриложения.Выполнение();

ЗапускательПриложения = НайтиЖелудь("ЗапускательПриложения");
Expand All @@ -204,65 +204,6 @@

#Область СлужебныеПроцедурыИФункции

Функция ДобавитьЖелудьСлужебный(Тип, Имя = "")
ПроверитьСостояниеИнициализация();
ФабрикаЖелудей.ДобавитьЖелудь(Тип, Имя);

Возврат ЭтотОбъект;
КонецФункции

Функция ДобавитьДубСлужебный(Тип)
ПроверитьСостояниеИнициализация();
ФабрикаЖелудей.ДобавитьДуб(Тип);

Возврат ЭтотОбъект;
КонецФункции

Функция ДобавитьНапильникСлужебный(Тип)

Если СистемныеНапильники.Найти(Тип) <> Неопределено Тогда
ФабрикаЖелудей.ДобавитьСистемныйНапильник(Тип);
Иначе
ПроверитьСостояниеИнициализация();
ФабрикаЖелудей.ДобавитьНапильник(Тип);
КонецЕсли;

Возврат ЭтотОбъект;

КонецФункции

Функция ДобавитьЗаготовкуСлужебный(Тип)

ПроверитьСостояниеИнициализация();

ОпределениеЗаготовки = ФабрикаЖелудей.ДобавитьЗаготовку(Тип);

Заготовка = НайтиЖелудь(ОпределениеЗаготовки.Имя());
Заготовка.ПриИнициализацииПоделки(ЭтотОбъект);

Возврат ЭтотОбъект;

КонецФункции

Функция ДобавитьРогаткуСлужебный(Тип)

ПроверитьСостояниеИнициализация();

ФабрикаЖелудей.ДобавитьРогатку(Тип);

Возврат ЭтотОбъект;

КонецФункции

Функция ДобавитьАннотациюСлужебный(Тип)

ПроверитьСостояниеИнициализация();
КонтейнерАннотаций.ДобавитьАннотацию(Тип);

Возврат ЭтотОбъект;

КонецФункции

Функция ИнициализироватьКомпанейскийЖелудь(Имя, ПрилепляемыеЧастицы)

Желудь = Неопределено;
Expand Down Expand Up @@ -322,62 +263,6 @@

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

Функция ПросканироватьИзвестныеТипы()

Рефлектор = Новый Рефлектор;

ПросканироватьТипы(Рефлектор.ИзвестныеТипы(Новый Структура("Пользовательский", Истина)).ВыгрузитьКолонку("Значение"));

Возврат ЭтотОбъект;

КонецФункции

Процедура ПросканироватьТипы(Типы)

РазворачивательАннотаций = КонтейнерАннотаций.ПолучитьРазворачивательАннотаций();

// Двойной проход по типам для предварительного добавления аннотаций, которые могут быть нужны
// для добавления остальных типов желудей.
Для Каждого ТипЖелудя Из Типы Цикл

РефлекторОбъекта = Новый РефлекторОбъекта(ТипЖелудя);
Методы = РефлекторОбъекта.ПолучитьТаблицуМетодов(, Ложь);

Если РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Аннотация").Количество() > 0 Тогда
ДобавитьАннотациюСлужебный(ТипЖелудя);
КонецЕсли;

КонецЦикла;

Для Каждого ТипЖелудя Из Типы Цикл

РефлекторОбъекта = Новый РефлекторОбъекта(ТипЖелудя);
Методы = РефлекторОбъекта.ПолучитьТаблицуМетодов(, Ложь);

Если РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Аннотация").Количество() > 0 Тогда
Продолжить;
КонецЕсли;

РазворачивательАннотаций.РазвернутьАннотацииСвойств(Методы, ТипЖелудя);

Если РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Желудь").Количество() > 0 Тогда
ДобавитьЖелудьСлужебный(ТипЖелудя);
ИначеЕсли РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Дуб").Количество() > 0 Тогда
ДобавитьДубСлужебный(ТипЖелудя);
ИначеЕсли РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Напильник").Количество() > 0 Тогда
ДобавитьНапильникСлужебный(ТипЖелудя);
ИначеЕсли РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Рогатка").Количество() > 0 Тогда
ДобавитьРогаткуСлужебный(ТипЖелудя);
ИначеЕсли РаботаСАннотациями.НайтиМетодыСАннотацией(Методы, "Заготовка").Количество() > 0 Тогда
ДобавитьЗаготовкуСлужебный(ТипЖелудя);
Иначе // BSLLS:EmptyCodeBlock-off
// no-op
КонецЕсли;

КонецЦикла;

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

Процедура ИнициализироватьМенеджерПараметров(СоветДругогоМастера)

МенеджерПараметров = Новый МенеджерПараметров();
Expand Down Expand Up @@ -413,10 +298,6 @@

Процедура ПриСозданииОбъекта(Знач СоветДругогоМастера = Неопределено)

СистемныеНапильники = Новый Массив;
СистемныеНапильники.Добавить(Тип("ОбработкаНапильникомПластилинаНаПолях"));
СистемныеНапильники.Добавить(Тип("ОбработкаНапильникомФинальныйШтрих"));

Если СоветДругогоМастера = Неопределено Тогда
СоветДругогоМастера = Новый СоветДругогоМастера();
КонецЕсли;
Expand All @@ -433,7 +314,9 @@

ИнициализироватьМенеджерПараметров(СоветДругогоМастера);

ПросканироватьИзвестныеТипы();
Осенизатор = Новый Осенизатор(ЭтотОбъект, ФабрикаЖелудей, КонтейнерАннотаций);

Осенизатор.ПросканироватьИзвестныеТипы();

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

Expand Down

0 comments on commit d743fa4

Please sign in to comment.