Skip to content

Commit

Permalink
Merge pull request nixel2007#14 from sfaqer/feature/ExceptionInterceptor
Browse files Browse the repository at this point in the history
Добавлен новый тип перехватчика "ПослеВызоваИсключения"
  • Loading branch information
nixel2007 authored Oct 8, 2023
2 parents eb72ced + e82bd70 commit 533f967
Show file tree
Hide file tree
Showing 9 changed files with 170 additions and 12 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:

# Установка OneScript конкретной версии
- name: Установка OneScript
uses: otymko/setup-onescript@v1.1
uses: otymko/setup-onescript@v1.3
with:
version: ${{ matrix.oscript_version }}

Expand Down
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// BSLLS:CodeOutOfRegion-off
Описание.Имя("decorator")
.Версия("1.5.2")
.Версия("1.6.0")
.Автор("Nikita Gryzlov")
.АдресАвтора("[email protected]")
.Описание("Библиотека для создания декораторов над объектами")
Expand Down
18 changes: 17 additions & 1 deletion src/internal/Модули/КэшируемыеДанные.os
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,23 @@
|
| // {Декоратор_ПередВызовомМетода}
|
| // {Декоратор_ВыполняемаяСтрока};
| Попытка
|
| // {Декоратор_ВыполняемаяСтрока};
|
| Исключение
|
| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
| Иначе
| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);
| КонецЕсли;
|
| // {Декоратор_ПослеВызоваИсключения}
|
| ВызватьИсключение;
|
| КонецПопытки;
|
| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
Expand Down
10 changes: 5 additions & 5 deletions src/Классы/Перехватчик.os
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
// ИмяПерехватываемогоМетода - Строка - Имя метода для которого предназначен перехватчик
//
Процедура ПриСозданииОбъекта(ИмяПерехватываемогоМетода)

ИмяМетода = ИмяПерехватываемогоМетода;

КонецПроцедуры
Expand All @@ -28,7 +28,7 @@
// Перехватчик - Ссылка на текущий инстанс Перехватчик
//
Функция Тело(ТелоПерехватчика) Экспорт

Тело = ТелоПерехватчика;

Возврат ЭтотОбъект;
Expand All @@ -44,7 +44,7 @@
// Перехватчик - Ссылка на текущий инстанс Перехватчик
//
Функция ТипПерехватчика(ТипПерехватчика) Экспорт

Тип = ТипПерехватчика;

Возврат ЭтотОбъект;
Expand All @@ -64,12 +64,12 @@
// * ТелоПерехватчика - Строка - Исполняемый код перехватчика
//
Функция Описание() Экспорт

Возврат Новый Структура(
"ИмяМетода, ТипПерехватчика, ТелоПерехватчика",
ИмяМетода,
Тип,
Тело
Тело
);

КонецФункции
Expand Down
14 changes: 11 additions & 3 deletions src/Классы/ПостроительДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -469,24 +469,31 @@
КонецПроцедуры

Процедура ДобавитьПерехватчикиМетода(ИмяМетода, ТекстМетода)

ТекстыПерехватчиков = ТекстыПерехватчиков(ИмяМетода);

ЗаменяемаяСтрокаПеред = "// {Декоратор_ПередВызовомМетода}";
ЗаменяемаяСтрокаПосле = "// {Декоратор_ПослеВызоваМетода}";
ЗаменяемаяСтрокаПередИсключением = "// {Декоратор_ПослеВызоваИсключения}";

ТекстМетода = СтрЗаменить(
ТекстМетода,
ЗаменяемаяСтрокаПеред,
СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.Перед), Символы.ПС)
);

ТекстМетода = СтрЗаменить(
ТекстМетода,
ЗаменяемаяСтрокаПосле,
СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.После), Символы.ПС)
);


ТекстМетода = СтрЗаменить(
ТекстМетода,
ЗаменяемаяСтрокаПередИсключением,
СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.ПослеВызоваИсключения), Символы.ПС)
);

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

Функция ТекстыПерехватчиков(ИмяМетода)
Expand All @@ -495,6 +502,7 @@

Результат.Вставить(ТипыПерехватчиковМетода.Перед, Новый Массив);
Результат.Вставить(ТипыПерехватчиковМетода.После, Новый Массив);
Результат.Вставить(ТипыПерехватчиковМетода.ПослеВызоваИсключения, Новый Массив);

Для каждого Перехватчик Из ПерехватчикиМетодов Цикл

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
Перем Перед Экспорт;
Перем После Экспорт;
Перем ПослеВызоваИсключения Экспорт;

Перед = "Перед";
После = "После";
ПослеВызоваИсключения = "ПослеВызоваИсключения";
14 changes: 14 additions & 0 deletions tests/fixtures/Классы/МойКласс.os
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,24 @@
Поле = НовоеЗначение;
КонецПроцедуры

Процедура ИзменитьЗначениеПоляИВызватьИсключение(НовоеЗначение) Экспорт
Поле = НовоеЗначение;
ВызватьИсключение "ЯОжидаемаяОшибка";
КонецПроцедуры

Процедура ИзменитьЗначениеПриватногоПоля(НовоеЗначение) Экспорт
ПриватноеПоле = НовоеЗначение;
КонецПроцедуры

Процедура ИзменитьЗначениеПриватногоПоляИВызватьИсключение(НовоеЗначение) Экспорт
ПриватноеПоле = НовоеЗначение;
ВызватьИсключение "ЯОжидаемаяОшибка";
КонецПроцедуры

Функция ВернутьЭтотОбъект() Экспорт
Возврат ЭтотОбъект;
КонецФункции

Процедура ВыброситьИсключение() Экспорт
ВызватьИсключение "Ошибка";
КонецПроцедуры
18 changes: 18 additions & 0 deletions tests/Тесты_КонструкторДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,24 @@
Ожидаем.Что(Декоратор.Поле).Равно(100);
КонецПроцедуры

&Тест
Процедура ПоляОбъектаСинхронизируютсяОбратноПослеИсключения() Экспорт
МойКласс = Новый МойКласс;
МойКласс.Поле = 123;

Декоратор = Новый КонструкторДекоратора(МойКласс).Построить();

Параметры = Новый Массив;
Параметры.Добавить(100);

Ожидаем.Что(Декоратор)
.Метод("ИзменитьЗначениеПоляИВызватьИсключение", Параметры)
.ВыбрасываетИсключение("ЯОжидаемаяОшибка");

Ожидаем.Что(Декоратор.Поле).Равно(100);

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

&Тест
Процедура ФункцияДобавляется() Экспорт
МойКласс = Новый МойКласс;
Expand Down
102 changes: 101 additions & 1 deletion tests/Тесты_ПостроительДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,24 @@
Ожидаем.Что(Декоратор.Поле).Равно(100);
КонецПроцедуры

&Тест
Процедура ПоляОбъектаСинхронизируютсяОбратноПослеИсключения() Экспорт
МойКласс = Новый МойКласс;
МойКласс.Поле = 123;

Декоратор = Новый КонструкторДекоратора(МойКласс).Построить();

Параметры = Новый Массив;
Параметры.Добавить(100);

Ожидаем.Что(Декоратор)
.Метод("ИзменитьЗначениеПоляИВызватьИсключение", Параметры)
.ВыбрасываетИсключение("ЯОжидаемаяОшибка");

Ожидаем.Что(Декоратор.Поле).Равно(100);

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

&Тест
Процедура ПриватныеПоляОбъектаСинхронизируютсяОбратно() Экспорт

Expand All @@ -180,6 +198,27 @@

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

&Тест
Процедура ПриватныеПоляОбъектаСинхронизируютсяОбратноПослеИсключения() Экспорт

МойКласс = Новый МойКласс;

Рефлектор = Новый Рефлектор();
Рефлектор.УстановитьСвойство(МойКласс, "ПриватноеПоле", 123);

Декоратор = Новый ПостроительДекоратора(МойКласс).Построить();

Параметры = Новый Массив;
Параметры.Добавить(100);

Ожидаем.Что(Декоратор)
.Метод("ИзменитьЗначениеПриватногоПоляИВызватьИсключение", Параметры)
.ВыбрасываетИсключение("ЯОжидаемаяОшибка");

Ожидаем.Что(Рефлектор.ПолучитьСвойство(Декоратор, "ПриватноеПоле")).Равно(100);

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

&Тест
Процедура ФункцияДобавляется() Экспорт

Expand Down Expand Up @@ -693,4 +732,65 @@

Ожидаем.Что(Декоратор.ТестТест(1)).Равно(1);

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

&Тест
Процедура ПерехватчикиИсключенийДобавленныхФункцийРаботаютКорректно() Экспорт

МойКласс = Новый МойКласс;
МойКласс.Поле = 123;

ИмяМетода = "ЗначениеПоля";

НовыйМетод = Новый Метод(ИмяМетода)
.Публичный()
.ТелоМетода("ВызватьИсключение ""Ошибка""");

ПерехватчикПослеВызоваИсключения = Новый Перехватчик(ИмяМетода)
.ТипПерехватчика(ТипыПерехватчиковМетода.ПослеВызоваИсключения)
.Тело(
"КэшПоля = Поле;
|СчетчикПерехватчикаПослеВызоваИсключения = СчетчикПерехватчикаПослеВызоваИсключения + 1;"
);

Декоратор = Новый ПостроительДекоратора(МойКласс)
.Поле(Новый Поле("КэшПоля").Публичное())
.Поле(Новый Поле("СчетчикПерехватчикаПослеВызоваИсключения").Публичное().ЗначениеПоУмолчанию(0))
.Метод(НовыйМетод)
.Перехватчик(ПерехватчикПослеВызоваИсключения)
.Построить();

Ожидаем.Что(Декоратор).Метод("ЗначениеПоля").ВыбрасываетИсключение("Ошибка");

Ожидаем.Что(Декоратор.Поле).Равно(123);
Ожидаем.Что(Декоратор.КэшПоля).Равно(123);
Ожидаем.Что(Декоратор.СчетчикПерехватчикаПослеВызоваИсключения).Равно(1);

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

&Тест
Процедура ПерехватчикиИсключенийДекорируемыхФункцийРаботаютКорректно() Экспорт

МойКласс = Новый МойКласс;
МойКласс.Поле = 123;

ПерехватчикПослеВызоваИсключения = Новый Перехватчик("ВыброситьИсключение")
.ТипПерехватчика(ТипыПерехватчиковМетода.ПослеВызоваИсключения)
.Тело(
"КэшПоля = Поле;
|СчетчикПерехватчикаПослеВызоваИсключения = СчетчикПерехватчикаПослеВызоваИсключения + 1;"
);

Декоратор = Новый ПостроительДекоратора(МойКласс)
.Поле(Новый Поле("КэшПоля").Публичное())
.Поле(Новый Поле("СчетчикПерехватчикаПослеВызоваИсключения").Публичное().ЗначениеПоУмолчанию(0))
.Перехватчик(ПерехватчикПослеВызоваИсключения)
.Построить();

Ожидаем.Что(Декоратор).Метод("ВыброситьИсключение").ВыбрасываетИсключение("Ошибка");

Ожидаем.Что(Декоратор.Поле).Равно(123);
Ожидаем.Что(Декоратор.КэшПоля).Равно(123);
Ожидаем.Что(Декоратор.СчетчикПерехватчикаПослеВызоваИсключения).Равно(1);

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

0 comments on commit 533f967

Please sign in to comment.