diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index c05aaa4..3e00734 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -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 }} diff --git a/packagedef b/packagedef index 8c2b107..b2c9f4a 100644 --- a/packagedef +++ b/packagedef @@ -1,6 +1,6 @@ // BSLLS:CodeOutOfRegion-off Описание.Имя("decorator") - .Версия("1.5.2") + .Версия("1.6.0") .Автор("Nikita Gryzlov") .АдресАвтора("nixel2007@gmail.com") .Описание("Библиотека для создания декораторов над объектами") diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\215\321\210\320\270\321\200\321\203\320\265\320\274\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\215\321\210\320\270\321\200\321\203\320\265\320\274\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265.os" index 654f2bf..37e4680 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\215\321\210\320\270\321\200\321\203\320\265\320\274\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\215\321\210\320\270\321\200\321\203\320\265\320\274\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265.os" @@ -62,7 +62,23 @@ | | // {Декоратор_ПередВызовомМетода} | -| // {Декоратор_ВыполняемаяСтрока}; +| Попытка +| +| // {Декоратор_ВыполняемаяСтрока}; +| +| Исключение +| +| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда +| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект); +| Иначе +| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект); +| КонецЕсли; +| +| // {Декоратор_ПослеВызоваИсключения} +| +| ВызватьИсключение; +| +| КонецПопытки; | | Если {Декоратор_ЭтоДекорируемыйМетод} Тогда | ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272.os" index 42fec54..b384664 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272.os" @@ -12,7 +12,7 @@ // ИмяПерехватываемогоМетода - Строка - Имя метода для которого предназначен перехватчик // Процедура ПриСозданииОбъекта(ИмяПерехватываемогоМетода) - + ИмяМетода = ИмяПерехватываемогоМетода; КонецПроцедуры @@ -28,7 +28,7 @@ // Перехватчик - Ссылка на текущий инстанс Перехватчик // Функция Тело(ТелоПерехватчика) Экспорт - + Тело = ТелоПерехватчика; Возврат ЭтотОбъект; @@ -44,7 +44,7 @@ // Перехватчик - Ссылка на текущий инстанс Перехватчик // Функция ТипПерехватчика(ТипПерехватчика) Экспорт - + Тип = ТипПерехватчика; Возврат ЭтотОбъект; @@ -64,12 +64,12 @@ // * ТелоПерехватчика - Строка - Исполняемый код перехватчика // Функция Описание() Экспорт - + Возврат Новый Структура( "ИмяМетода, ТипПерехватчика, ТелоПерехватчика", ИмяМетода, Тип, - Тело + Тело ); КонецФункции diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" index 8b65fa6..f8c7b8e 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" @@ -469,24 +469,31 @@ КонецПроцедуры Процедура ДобавитьПерехватчикиМетода(ИмяМетода, ТекстМетода) - + ТекстыПерехватчиков = ТекстыПерехватчиков(ИмяМетода); ЗаменяемаяСтрокаПеред = "// {Декоратор_ПередВызовомМетода}"; ЗаменяемаяСтрокаПосле = "// {Декоратор_ПослеВызоваМетода}"; + ЗаменяемаяСтрокаПередИсключением = "// {Декоратор_ПослеВызоваИсключения}"; ТекстМетода = СтрЗаменить( ТекстМетода, ЗаменяемаяСтрокаПеред, СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.Перед), Символы.ПС) ); - + ТекстМетода = СтрЗаменить( ТекстМетода, ЗаменяемаяСтрокаПосле, СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.После), Символы.ПС) ); - + + ТекстМетода = СтрЗаменить( + ТекстМетода, + ЗаменяемаяСтрокаПередИсключением, + СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.ПослеВызоваИсключения), Символы.ПС) + ); + КонецПроцедуры Функция ТекстыПерехватчиков(ИмяМетода) @@ -495,6 +502,7 @@ Результат.Вставить(ТипыПерехватчиковМетода.Перед, Новый Массив); Результат.Вставить(ТипыПерехватчиковМетода.После, Новый Массив); + Результат.Вставить(ТипыПерехватчиковМетода.ПослеВызоваИсключения, Новый Массив); Для каждого Перехватчик Из ПерехватчикиМетодов Цикл diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264\320\260.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264\320\260.os" index 8900df2..4454082 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264\320\260.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264\320\260.os" @@ -1,5 +1,7 @@ Перем Перед Экспорт; Перем После Экспорт; +Перем ПослеВызоваИсключения Экспорт; Перед = "Перед"; После = "После"; +ПослеВызоваИсключения = "ПослеВызоваИсключения"; diff --git "a/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201.os" "b/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201.os" index a4c406f..c0ecf87 100644 --- "a/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201.os" +++ "b/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201.os" @@ -30,10 +30,24 @@ Поле = НовоеЗначение; КонецПроцедуры +Процедура ИзменитьЗначениеПоляИВызватьИсключение(НовоеЗначение) Экспорт + Поле = НовоеЗначение; + ВызватьИсключение "ЯОжидаемаяОшибка"; +КонецПроцедуры + Процедура ИзменитьЗначениеПриватногоПоля(НовоеЗначение) Экспорт ПриватноеПоле = НовоеЗначение; КонецПроцедуры +Процедура ИзменитьЗначениеПриватногоПоляИВызватьИсключение(НовоеЗначение) Экспорт + ПриватноеПоле = НовоеЗначение; + ВызватьИсключение "ЯОжидаемаяОшибка"; +КонецПроцедуры + Функция ВернутьЭтотОбъект() Экспорт Возврат ЭтотОбъект; КонецФункции + +Процедура ВыброситьИсключение() Экспорт + ВызватьИсключение "Ошибка"; +КонецПроцедуры diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213_\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" "b/tests/\320\242\320\265\321\201\321\202\321\213_\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" index 8864051..86e4a96 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213_\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213_\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" @@ -48,6 +48,24 @@ Ожидаем.Что(Декоратор.Поле).Равно(100); КонецПроцедуры +&Тест +Процедура ПоляОбъектаСинхронизируютсяОбратноПослеИсключения() Экспорт + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + Декоратор = Новый КонструкторДекоратора(МойКласс).Построить(); + + Параметры = Новый Массив; + Параметры.Добавить(100); + + Ожидаем.Что(Декоратор) + .Метод("ИзменитьЗначениеПоляИВызватьИсключение", Параметры) + .ВыбрасываетИсключение("ЯОжидаемаяОшибка"); + + Ожидаем.Что(Декоратор.Поле).Равно(100); + +КонецПроцедуры + &Тест Процедура ФункцияДобавляется() Экспорт МойКласс = Новый МойКласс; diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213_\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" "b/tests/\320\242\320\265\321\201\321\202\321\213_\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" index 16e344e..973cd3e 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213_\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213_\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" @@ -165,6 +165,24 @@ Ожидаем.Что(Декоратор.Поле).Равно(100); КонецПроцедуры +&Тест +Процедура ПоляОбъектаСинхронизируютсяОбратноПослеИсключения() Экспорт + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + Декоратор = Новый КонструкторДекоратора(МойКласс).Построить(); + + Параметры = Новый Массив; + Параметры.Добавить(100); + + Ожидаем.Что(Декоратор) + .Метод("ИзменитьЗначениеПоляИВызватьИсключение", Параметры) + .ВыбрасываетИсключение("ЯОжидаемаяОшибка"); + + Ожидаем.Что(Декоратор.Поле).Равно(100); + +КонецПроцедуры + &Тест Процедура ПриватныеПоляОбъектаСинхронизируютсяОбратно() Экспорт @@ -180,6 +198,27 @@ КонецПроцедуры +&Тест +Процедура ПриватныеПоляОбъектаСинхронизируютсяОбратноПослеИсключения() Экспорт + + МойКласс = Новый МойКласс; + + Рефлектор = Новый Рефлектор(); + Рефлектор.УстановитьСвойство(МойКласс, "ПриватноеПоле", 123); + + Декоратор = Новый ПостроительДекоратора(МойКласс).Построить(); + + Параметры = Новый Массив; + Параметры.Добавить(100); + + Ожидаем.Что(Декоратор) + .Метод("ИзменитьЗначениеПриватногоПоляИВызватьИсключение", Параметры) + .ВыбрасываетИсключение("ЯОжидаемаяОшибка"); + + Ожидаем.Что(Рефлектор.ПолучитьСвойство(Декоратор, "ПриватноеПоле")).Равно(100); + +КонецПроцедуры + &Тест Процедура ФункцияДобавляется() Экспорт @@ -693,4 +732,65 @@ Ожидаем.Что(Декоратор.ТестТест(1)).Равно(1); -КонецПроцедуры \ No newline at end of file +КонецПроцедуры + +&Тест +Процедура ПерехватчикиИсключенийДобавленныхФункцийРаботаютКорректно() Экспорт + + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + ИмяМетода = "ЗначениеПоля"; + + НовыйМетод = Новый Метод(ИмяМетода) + .Публичный() + .ТелоМетода("ВызватьИсключение ""Ошибка"""); + + ПерехватчикПослеВызоваИсключения = Новый Перехватчик(ИмяМетода) + .ТипПерехватчика(ТипыПерехватчиковМетода.ПослеВызоваИсключения) + .Тело( + "КэшПоля = Поле; + |СчетчикПерехватчикаПослеВызоваИсключения = СчетчикПерехватчикаПослеВызоваИсключения + 1;" + ); + + Декоратор = Новый ПостроительДекоратора(МойКласс) + .Поле(Новый Поле("КэшПоля").Публичное()) + .Поле(Новый Поле("СчетчикПерехватчикаПослеВызоваИсключения").Публичное().ЗначениеПоУмолчанию(0)) + .Метод(НовыйМетод) + .Перехватчик(ПерехватчикПослеВызоваИсключения) + .Построить(); + + Ожидаем.Что(Декоратор).Метод("ЗначениеПоля").ВыбрасываетИсключение("Ошибка"); + + Ожидаем.Что(Декоратор.Поле).Равно(123); + Ожидаем.Что(Декоратор.КэшПоля).Равно(123); + Ожидаем.Что(Декоратор.СчетчикПерехватчикаПослеВызоваИсключения).Равно(1); + +КонецПроцедуры + +&Тест +Процедура ПерехватчикиИсключенийДекорируемыхФункцийРаботаютКорректно() Экспорт + + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + ПерехватчикПослеВызоваИсключения = Новый Перехватчик("ВыброситьИсключение") + .ТипПерехватчика(ТипыПерехватчиковМетода.ПослеВызоваИсключения) + .Тело( + "КэшПоля = Поле; + |СчетчикПерехватчикаПослеВызоваИсключения = СчетчикПерехватчикаПослеВызоваИсключения + 1;" + ); + + Декоратор = Новый ПостроительДекоратора(МойКласс) + .Поле(Новый Поле("КэшПоля").Публичное()) + .Поле(Новый Поле("СчетчикПерехватчикаПослеВызоваИсключения").Публичное().ЗначениеПоУмолчанию(0)) + .Перехватчик(ПерехватчикПослеВызоваИсключения) + .Построить(); + + Ожидаем.Что(Декоратор).Метод("ВыброситьИсключение").ВыбрасываетИсключение("Ошибка"); + + Ожидаем.Что(Декоратор.Поле).Равно(123); + Ожидаем.Что(Декоратор.КэшПоля).Равно(123); + Ожидаем.Что(Декоратор.СчетчикПерехватчикаПослеВызоваИсключения).Равно(1); + +КонецПроцедуры