Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@
//
Перем Конвертеры;

// Кэш обработчиков для каждого типа
//
Перем КэшОбработчиков;

// Кэш свойств типов
//
Перем КэшСвойствТипов;

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

#Область ОбработчикиСобытий
Expand Down Expand Up @@ -55,6 +63,9 @@
Конвертеры = пКонвертеры;
КонецЕсли;

КэшОбработчиков = Новый Соответствие();
КэшСвойствТипов = Новый Соответствие();

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

#КонецОбласти
Expand Down Expand Up @@ -207,36 +218,35 @@

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

Функция ПреобразоватьПользовательскийТип(Объект, ТипОбъекта)

Check failure on line 221 in src/BenchmarkOneScript/core/custom-jason/Классы/ДесериализаторJsonBench.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/core/custom-jason/Классы/ДесериализаторJsonBench.os#L221

Уменьшите когнитивную сложность "ПреобразоватьПользовательскийТип" с 17 до 15

Результат = Новый(ТипОбъекта);
СвойстваОбъекта = Рефлектор.ПолучитьТаблицуСвойств(ТипОбъекта, Истина);
СвойстваПоИменамПолей = Новый Соответствие();

Для Каждого Свойство Из СвойстваОбъекта Цикл
АннотацияСериализуемое = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Сериализуемое");
ИмяСвойства = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Значение", Свойство.Имя);

СвойстваПоИменамПолей.Вставить(ИмяСвойства, Свойство);
КонецЦикла;

Если ЭтоСтруктураИлиСоответствие(Объект) Тогда


СвойстваТипа = КэшСвойствТипов[ТипОбъекта];
Если СвойстваТипа = Неопределено Тогда
СвойстваТипа = ПрочитатьСвойстваТипа(ТипОбъекта);
КонецЕсли;

Для Каждого КлючИЗначение Из Объект Цикл

Свойство = СвойстваПоИменамПолей[КлючИЗначение.Ключ];
Если Свойство = Неопределено Тогда
ОписаниеСвойства = СвойстваТипа[КлючИЗначение.Ключ];
Если ОписаниеСвойства = Неопределено Тогда
Продолжить;
КонецЕсли;

ИмяСвойства = Свойство.Имя;
ЗначениеСвойства = КлючИЗначение.Значение;

ТипыСвойства = ПолучитьТипыСвойства(Свойство, ЗначениеСвойства);
ТипСвойства = ТипыСвойства.БазовыйТип;
ТипЭлементов = ТипыСвойства.ТипЭлементов;
ИмяСвойства = ОписаниеСвойства.ИмяСвойства;
ТипСвойства = ОписаниеСвойства.БазовыйТип;
ТипЭлементов = ОписаниеСвойства.ТипЭлементов;
ДесериализуемыеКлючи = ОписаниеСвойства.ДесериализуемыеКлючи;

Если Не ЗначениеЗаполнено(ТипСвойства) Тогда
ТипСвойства = ТипЗнч(ЗначениеСвойства);
КонецЕсли;

ДесериализуемыеКлючи = ПолучитьДесериализуемыеКлючи(Свойство);
ЗначениеСвойства = ПреобразоватьОбъектДесериализации(ЗначениеСвойства,
ТипСвойства,
ТипЭлементов,
Expand All @@ -263,11 +273,46 @@

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

Функция ПолучитьТипыСвойства(Свойство, ЗначениеСвойства)
Функция ПрочитатьСвойстваТипа(Тип)

ОписаниеСвойств = Новый Соответствие();

СвойстваОбъекта = Рефлектор.ПолучитьТаблицуСвойств(Тип, Истина);

Для Каждого Свойство Из СвойстваОбъекта Цикл

АннотацияСериализуемое = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Сериализуемое");
Имя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Значение", Свойство.Имя);

Если Не ЗначениеЗаполнено(Имя) Тогда
Имя = Свойство.Имя;
КонецЕсли;

ТипыСвойства = ПолучитьТипыСвойства(Свойство);

ДесериализуемыеКлючи = ПолучитьДесериализуемыеКлючи(Свойство);

ОписаниеСвойства = Новый Структура();
ОписаниеСвойства.Вставить("ИмяСвойства", Свойство.Имя);
ОписаниеСвойства.Вставить("БазовыйТип", ТипыСвойства.БазовыйТип);
ОписаниеСвойства.Вставить("ТипЭлементов", ТипыСвойства.ТипЭлементов);
ОписаниеСвойства.Вставить("ДесериализуемыеКлючи", ДесериализуемыеКлючи);

ОписаниеСвойств.Вставить(Имя, ОписаниеСвойства);

КонецЦикла;

КэшСвойствТипов.Вставить(Тип, ОписаниеСвойств);

ОписаниеСвойства = Новый Структура();
ОписаниеСвойства.Вставить("БазовыйТип", ТипЗнч(ЗначениеСвойства));
ОписаниеСвойства.Вставить("ТипЭлементов");
Возврат ОписаниеСвойств;

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

Функция ПолучитьТипыСвойства(Свойство)

ТипыСвойства = Новый Структура();
ТипыСвойства.Вставить("БазовыйТип");
ТипыСвойства.Вставить("ТипЭлементов");

КонтейнерАннотаций = Новый КонтейнерАннотаций;
КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияТип"));
Expand All @@ -294,16 +339,16 @@
ТипСвойства = ОбъектАннотации.ТипЗначения();

Если ТекущийРежимДляКаждого = Неопределено Тогда
ОписаниеСвойства.БазовыйТип = ТипСвойства;
ТипыСвойства.БазовыйТип = ТипСвойства;
ИначеЕсли ТекущийРежимДляКаждого = "Значение" Тогда
ОписаниеСвойства.ТипЭлементов = ТипСвойства;
ТипыСвойства.ТипЭлементов = ТипСвойства;
КонецЕсли;

КонецЕсли;

КонецЦикла;

Возврат ОписаниеСвойства;
Возврат ТипыСвойства;

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

Expand All @@ -325,14 +370,18 @@

Процедура ВызватьМетодПослеДесериализации(ПользовательскийОбъект, ПрочитанныеСвойства)

ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(ТипЗнч(ПользовательскийОбъект));
Тип = ТипЗнч(ПользовательскийОбъект);

Для Каждого СвойстваМетода Из ТаблицаМетодов Цикл
Обработчики = КэшОбработчиков[Тип];
Если Обработчики = Неопределено Тогда
Обработчики = ПрочитатьОбработчикиТипа(Тип);
КонецЕсли;

АннотацияПослеДесериализации = РаботаСАннотациями.НайтиАннотацию(СвойстваМетода.Аннотации, "ПослеДесериализации");
Если АннотацияПослеДесериализации = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Обработчики["ПослеДесериализации"] = Неопределено Тогда
Возврат;
КонецЕсли;

Для Каждого СвойстваМетода Из Обработчики["ПослеДесериализации"] Цикл

ПараметрыМетода = Новый Массив();

Expand All @@ -349,6 +398,42 @@

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

Функция ПрочитатьОбработчикиТипа(Тип)

ИменаОбработчиков = Новый Массив();
ИменаОбработчиков.Добавить("ПослеДесериализации");

Обработчики = Новый Соответствие();

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

Для Каждого СвойстваМетода Из ТаблицаМетодов Цикл

Для Каждого ИмяОбработчика Из ИменаОбработчиков Цикл

СвойстваМетодов = Обработчики[ИмяОбработчика];

Если СвойстваМетодов = Неопределено Тогда
СвойстваМетодов = Новый Массив();
Обработчики[ИмяОбработчика] = СвойстваМетодов;
КонецЕсли;

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

КонецЦикла;

КонецЦикла;

КэшОбработчиков.Вставить(Тип, Обработчики);

Возврат Обработчики;

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

Функция ЭтоСтруктураИлиСоответствие(Значение)
Возврат ТипЗнч(Значение) = Тип("Структура") Или ТипЗнч(Значение) = Тип("Соответствие");
КонецФункции
Expand Down
Loading
Loading